WIP on replacing documentation with direct calls to OSM wikibase

This commit is contained in:
Bryan Housel
2018-12-04 23:13:42 -05:00
committed by Yuri Astrakhan
parent 7c192a2e36
commit 22e36be4f2
4 changed files with 155 additions and 27 deletions

View File

@@ -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,

View 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;
}
};

View File

@@ -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('');

View 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'}]
);
});
});
});