From 22e36be4f23eb662fd2d3ffa8c70be433c47516b Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Tue, 4 Dec 2018 23:13:42 -0500 Subject: [PATCH] WIP on replacing documentation with direct calls to OSM wikibase --- modules/services/index.js | 3 ++ modules/services/osm_wikibase.js | 74 ++++++++++++++++++++++++++++++ modules/ui/tag_reference.js | 56 +++++++++++----------- test/spec/services/osm_wikibase.js | 49 ++++++++++++++++++++ 4 files changed, 155 insertions(+), 27 deletions(-) create mode 100644 modules/services/osm_wikibase.js create mode 100644 test/spec/services/osm_wikibase.js diff --git a/modules/services/index.js b/modules/services/index.js index 59c9d9524..cc2a3d729 100644 --- a/modules/services/index.js +++ b/modules/services/index.js @@ -3,6 +3,7 @@ import serviceMapRules from './maprules'; import serviceNominatim from './nominatim'; import serviceOpenstreetcam from './openstreetcam'; import serviceOsm from './osm'; +import serviceOsmWikibase from './osm_wikibase'; import serviceStreetside from './streetside'; import serviceTaginfo from './taginfo'; import serviceVectorTile from './vector_tile'; @@ -15,6 +16,7 @@ export var services = { mapillary: serviceMapillary, openstreetcam: serviceOpenstreetcam, osm: serviceOsm, + osmWikibase: serviceOsmWikibase, maprules: serviceMapRules, streetside: serviceStreetside, taginfo: serviceTaginfo, @@ -29,6 +31,7 @@ export { serviceNominatim, serviceOpenstreetcam, serviceOsm, + serviceOsmWikibase, serviceStreetside, serviceTaginfo, serviceVectorTile, diff --git a/modules/services/osm_wikibase.js b/modules/services/osm_wikibase.js new file mode 100644 index 000000000..ef1d2eafa --- /dev/null +++ b/modules/services/osm_wikibase.js @@ -0,0 +1,74 @@ +import _debounce from 'lodash-es/debounce'; +import _forEach from 'lodash-es/forEach'; + +import { json as d3_json } from 'd3-request'; + +import { utilQsString } from '../util'; +import { currentLocale } from '../util/locale'; + + +var apibase = 'https://wiki.openstreetmap.org/w/api.php'; +var _inflight = {}; +var _wikibaseCache = {}; + + +var debouncedRequest = _debounce(request, 500, { leading: false }); + +function request(url, callback) { + if (_inflight[url]) return; + + _inflight[url] = d3_json(url, function (err, data) { + delete _inflight[url]; + callback(err, data); + }); +} + + +export default { + + init: function() { + _inflight = {}; + _wikibaseCache = {}; + }, + + + reset: function() { + _forEach(_inflight, function(req) { req.abort(); }); + _inflight = {}; + }, + + + docs: function(params, callback) { + var doRequest = params.debounce ? debouncedRequest : request; + + // if (params.value) path = 'tag/wiki_pages?'; + // else if (params.rtype) path = 'relation/wiki_pages?'; + + var obj = { + action: 'wbgetentities', + sites: 'wiki', + titles: 'Tag:amenity=parking', + languages: 'en', + origin: '*', + formatversion: 2, + format: 'json' + } + var url = apibase + '?' + utilQsString(obj); + doRequest(url, function(err, d) { + if (err) { + callback(err); + } else { + _wikibaseCache[url] = d.data; + callback(null, d.data); + } + }); + }, + + + apibase: function(_) { + if (!arguments.length) return apibase; + apibase = _; + return this; + } + +}; diff --git a/modules/ui/tag_reference.js b/modules/ui/tag_reference.js index 03f625019..a1dcf15d9 100644 --- a/modules/ui/tag_reference.js +++ b/modules/ui/tag_reference.js @@ -13,7 +13,8 @@ import { svgIcon } from '../svg'; export function uiTagReference(tag) { - var taginfo = services.taginfo; + // var taginfo = services.taginfo; + var wikibase = services.osmWikibase; var tagReference = {}; var _button = d3_select(null); @@ -22,44 +23,45 @@ export function uiTagReference(tag) { var _showing; - function findLocal(data) { - var locale = utilDetect().locale.toLowerCase(); - var localized; + // function findLocal(data) { + // var locale = utilDetect().locale.toLowerCase(); + // var localized; - if (locale !== 'pt-br') { // see #3776, prefer 'pt' over 'pt-br' - localized = _find(data, function(d) { - return d.lang.toLowerCase() === locale; - }); - if (localized) return localized; - } + // if (locale !== 'pt-br') { // see #3776, prefer 'pt' over 'pt-br' + // localized = _find(data, function(d) { + // return d.lang.toLowerCase() === locale; + // }); + // if (localized) return localized; + // } - // try the non-regional version of a language, like - // 'en' if the language is 'en-US' - if (locale.indexOf('-') !== -1) { - var first = locale.split('-')[0]; - localized = _find(data, function(d) { - return d.lang.toLowerCase() === first; - }); - if (localized) return localized; - } + // // try the non-regional version of a language, like + // // 'en' if the language is 'en-US' + // if (locale.indexOf('-') !== -1) { + // var first = locale.split('-')[0]; + // localized = _find(data, function(d) { + // return d.lang.toLowerCase() === first; + // }); + // if (localized) return localized; + // } - // finally fall back to english - return _find(data, function(d) { - return d.lang.toLowerCase() === 'en'; - }); - } + // // finally fall back to english + // return _find(data, function(d) { + // return d.lang.toLowerCase() === 'en'; + // }); + // } function load(param) { - if (!taginfo) return; + if (!wikibase) return; _button .classed('tag-reference-loading', true); - taginfo.docs(param, function show(err, data) { + wikibase.docs(param, function show(err, data) { var docs; if (!err && data) { - docs = findLocal(data); + // docs = findLocal(data); + debugger; } _body.html(''); diff --git a/test/spec/services/osm_wikibase.js b/test/spec/services/osm_wikibase.js new file mode 100644 index 000000000..1c87a6f8e --- /dev/null +++ b/test/spec/services/osm_wikibase.js @@ -0,0 +1,49 @@ +describe('iD.serviceOsmWikibase', function() { + var server, wikibase; + + + before(function() { + iD.services.osmWikibase = iD.serviceOsmWikibase; + }); + + after(function() { + delete iD.services.osmWikibase; + }); + + beforeEach(function() { + wikibase = iD.services.osmWikibase; + wikibase.init(); + server = sinon.fakeServer.create(); + }); + + afterEach(function() { + server.restore(); + }); + + + function query(url) { + return iD.utilStringQs(url.substring(url.indexOf('?') + 1)); + } + + + describe('#docs', function() { + it('calls the given callback with the results of the docs query', function() { + var callback = sinon.spy(); + wikibase.docs({key: 'amenity', value: 'parking'}, callback); + + server.respondWith('GET', /\/tag\/wiki_page/, + [200, { 'Content-Type': 'application/json' }, + '{"data":[{"on_way":false,"lang":"en","on_area":true,"image":"File:Car park2.jpg"}]}'] + ); + server.respond(); + + expect(query(server.requests[0].url)).to.eql( + {key: 'amenity', value: 'parking'} + ); + expect(callback).to.have.been.calledWith( + null, [{'on_way':false,'lang':'en','on_area':true,'image':'File:Car park2.jpg'}] + ); + }); + }); + +});