User:Mormegil/fullSearchEntitySelector.js
Jump to navigation
Jump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
$(() => {
const mwApi = new mw.Api();
mw.hook('wikibase.entityselector.search').add(function (query, addResultPromise) {
if (query.options.type !== 'item' || !query.term || query.term[0] === ' ' || /^(https?:\/\/www.wikidata.org\/(wiki|entity)\/)?[Qq][1-9][0-9]*$/.test(query.term)) {
return;
}
const def = $.Deferred();
addResultPromise(def.promise());
const language = query.options.language;
mwApi.get({
action: 'query',
list: 'search',
srsearch: query.term,
srlimit: 5
}).done(searchResult => {
const results = searchResult.query.search.map(result => ({
id: result.title,
display: {
label: { value: result.title, language: language },
description: { value: result.snippet, language: language }
},
label: result.title,
description: result.snippet,
url: '//www.wikidata.org/wiki/' + result.title,
concepturi: 'http://www.wikidata.org/entity/' + result.title
}));
const qids = results.map(result => result.id);
return mwApi.get({
action: 'wbgetentities',
ids: qids,
props: 'labels|descriptions',
languages: language,
languagefallback: 1
}).then(entityResults => {
const labels = {};
const descriptions = {};
for (const qid in entityResults.entities) {
const entityInfo = entityResults.entities[qid];
labels[qid] = entityInfo.labels[language] && entityInfo.labels[language].value;
descriptions[qid] = entityInfo.descriptions[language] && entityInfo.descriptions[language].value;
}
for (const result of results) {
const resultLabel = labels[result.id] || result.label;
const resultDescription = descriptions[result.id] || result.description;
result.display.label.value = result.label = resultLabel;
result.display.description.value = result.description = resultDescription;
}
def.resolve(results);
});
});
});
});