User:TomT0m/wdqslabels.js

From Wikidata
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.
// ==UserScript==
// @name         Item Labels
// @namespace    http://tampermonkey.net/
// @version      0.1.1
// @description  Show items labels in Wikidata Query Service web results view in the navigator user language without calling the Label Service in the sparql code
// @author       TomT0m
// @match        https://query.wikidata.org/
// @grant        none
// ==/UserScript==

(function($) {
    'use strict';

    const base_url="http://www.wikidata.org/"
    const entity_prefix = base_url + "entity/"
    const lang="en"

    function gen_wdapi_queryurl(ids){
        let api = "https://www.wikidata.org/w/api.php?"

        var searchParams = new URLSearchParams("");
        searchParams.set("action","wbgetentities")
        searchParams.set("sites","wikidatawiki")
        searchParams.set("ids",ids)
        searchParams.set("props", "labels")

        searchParams.set("languages", lang)
        searchParams.set("format","json")
        searchParams.set("origin","*")
        return api + searchParams.toString()
    }

    function listifyReqJson(json) {
        return Object.entries(json.entities)
            .filter(([k, v] , i) => v.labels[lang] ) // keep only entities with an actual label in language
            .map( ([k, v] , i) => [k, v.labels])
    }

    function render_label(label){
        return $("<span/>", {
            "lang":label.language
        }).append(document.createTextNode(label.value));
    }
    const lclass = "itemLabels-labellized"
    const queried_class = "itemLabels-queried"

    function LabellizeQitems () {

        let links = $( '#query-result' ).find( `a.item-link:not(.${queried_class})` )

        if (!links.length){return}
        if (links.attr("checked")) {return}

        links.addClass(queried_class)

        let ids = links.map(
               (o, v) => { if(/\/entity\/(.*)$/.exec(v.href)){
                   return /\/entity\/(.*)$/.exec(v.href)[1]}
                   else {return "K" }
            }
            ).filter((k,v) => v[0]=="Q")
            .toArray()

        let plop = ""

        while( ids.length > 0){
            fetch(gen_wdapi_queryurl(ids.splice(0,50).join("|")))
            .then(
                     response => response.json()
            ).then(json => listifyReqJson(json).forEach(
                ([k, labels]) => {
                    let link=$(`.item-link[href='${entity_prefix}${k}']:not(.${lclass})`)
                    link.append(" – ").append(render_label(labels[lang]))
                    link.addClass(lclass)
                }
            )
            )
        }

    }
    setInterval(LabellizeQitems, 3000);
})(window.$)