User:Mormegil/fullSearchEntitySelector.js

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)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: 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);
            });
        });
    });
});