mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-25 23:13:42 +00:00
WIP on replacing documentation with direct calls to OSM wikibase
This commit is contained in:
committed by
Yuri Astrakhan
parent
7c192a2e36
commit
22e36be4f2
@@ -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,
|
||||
|
||||
74
modules/services/osm_wikibase.js
Normal file
74
modules/services/osm_wikibase.js
Normal file
@@ -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;
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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('');
|
||||
|
||||
49
test/spec/services/osm_wikibase.js
Normal file
49
test/spec/services/osm_wikibase.js
Normal file
@@ -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'}]
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user