User:Opencooper/wikidataDescription.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// This script shows some basic wikidata information for a page
// Clicking toggles more advanced information

// Inspired by mobile: https://www.mediawiki.org/wiki/Reading/web/Projects/Wikidata_Descriptions
// See also: https://www.wikidata.org/wiki/Help:Description

// Alternate endpoint?: https://www.mediawiki.org/w/api.php?action=help&modules=query%2Bpageterms
// Example pages: https://en.wikipedia.org/wiki/Namaiki_Zakari
//                https://en.wikipedia.org/wiki/Eastern_Standard_Time_(album)

// License: CC0

function setup() {
    // If we're not reading an article, do nothing
    if (!(mw.config.get( 'wgAction' ) === 'view'
          && mw.config.get( 'wgIsArticle' )
          && !mw.config.get("wgIsMainPage")
          && window.location.hostname != "www.wikidata.org")) {
        return;
    }

	var header;
    if ($("#firstHeading").length) { // Vector
    	header = $("#firstHeading");
    } else if ($('.page-heading').length) { // Minerva
    	header =  $('.page-heading');
    } else {
    	console.error("wikidataDescription.js: Couldn't find a page heading. This skin ("
    	              + mw.config.get( 'skin' ) + ") might not be supported.");
    	return;
    }

    header.append("<div id='wikidataDescription'"
                  + " style='font-size:45%; color: black; padding-left: 1em; display: none;'>"
                  + "</div>");

    displayLocalDescription();

    $("#wikidataDescription").click(function(){
    	$(this).children().toggle();
    });

    if (wikidataId === null) {
    	displayWikidataLabel("[No Wikidata]");
        displayWikidataDescription("[No Wikidata]");
        return;
    }

    getWikidataDescription();
}

function getWikidataDescription() {
	// API docs: https://www.wikidata.org/w/api.php?action=help&modules=wbgetentities
    // Tutorial: https://www.mediawiki.org/wiki/API:Presenting_Wikidata_knowledge
    $.ajax({
        url: "https://www.wikidata.org/w/api.php",
        data: {
            action: "wbgetentities",
            ids: wikidataId,
            props: "labels|descriptions",
            languages: "en",
            format: "json",
            origin: "*"
        },
        success: parseWikidataDescription
    });
}

function parseWikidataDescription(response) {
    var wikidataInfo = response.entities[wikidataId];

	var wikidataLabel = "[None]";
    if (!jQuery.isEmptyObject(wikidataInfo.labels)) {
        wikidataLabel = wikidataInfo.labels.en.value;	
    }

    if (wikidataLabel != "[None]" && wikidataLabel == mw.config.get("wgTitle")) {
    	wikidataLabel = "[Same]";
    }

    displayWikidataLabel(wikidataLabel);

    var wikidataDescription = "[None]";
    if (!jQuery.isEmptyObject(wikidataInfo.descriptions)) {
        wikidataDescription = wikidataInfo.descriptions.en.value;	
    }

    displayWikidataDescription(wikidataDescription);
}

function displayWikidataLabel(text) {
    $("#wikidataDescription").append("<div id='wikidataLabelInfo' style='display: none;'>"
                                     + "<small>Wikidata Label: </small><i>"
                                     + text + "</i></div>");
}

function displayWikidataDescription(text) {
	var displayText = text;
	if (displayText == "[None]") {
		displayText = "[No Wikidata desc.]";
	}
	
	if (text != "[None]"
        && shortDescription.toLowerCase() == text.toLowerCase()) {
    	displayText = "[Same]";
    }
    
    if (shortDescription == "[None]" && text != "[None]") {
    	$("#descriptionBasic").text(text);
    	$("#descriptionBasic").attr("title", "Wikidata");
    }

	$("#wikidataDescription").append("<div id='wikidataDescriptionText' style='display: none;'><small>Wikidata Description: </small><i>"
                                     + displayText + "</i></div>");
    getWikidataInstanceOf();
}

function displayLocalDescription() {
    // If local {{short description}} exists, use it as well
    if ($('.shortdescription').length) {
        shortDescription = $('.shortdescription').first().text();
    }
    
    $("#wikidataDescription").append("<div id='descriptionBasic' title='{{short description}}'><i>"
                                     + shortDescription + "</i></div>");
    $("#wikidataDescription").append("<div id='shortDescriptionInfo' style='display: none;'>"
                                     + "<small>Short Description: </small><i>"
                                     + shortDescription + "</i></div>");
}

function getWikidataInstanceOf() {
	if (wikidataId === null) {
		displayWikidataInstance("[No Wikidata]");
		return;
	}

	// API docs: https://www.wikidata.org/w/api.php?action=help&modules=wbgetclaims
    $.ajax({
        url: "https://www.wikidata.org/w/api.php",
        data: {
            action: "wbgetclaims",
            entity: wikidataId,
            format: "json",
            origin: "*"
        },
        success: parseWikidataInstance
    });
}

function parseWikidataInstance(response) {
	if (response.claims.P31) {
		var id = response.claims.P31[0].mainsnak.datavalue.value.id;

		if (id == "Q5" && response.claims.P106) { // Human
			id = response.claims.P106[0].mainsnak.datavalue.value.id; // Occupation 
		}

		getInstanceOfLabel(id);
	} else {
		displayWikidataInstance("[None]");
	}
}

function getInstanceOfLabel(id) {
	// API docs: https://www.wikidata.org/w/api.php?action=help&modules=wbgetentities
	$.ajax({
        url: "https://www.wikidata.org/w/api.php",
        data: {
            action: "wbgetentities",
            ids: id,
            props: "labels",
            languages: "en",
            format: "json",
            origin: "*"
        },
        success: function(response) {parseInstanceLabel(response, id);}
    });
}

function parseInstanceLabel(response, id) {
    var wikidataInfo = response.entities[id];

    var wikidataDescription = "";
    if (!jQuery.isEmptyObject(wikidataInfo.labels)) {
        wikidataDescription = wikidataInfo.labels.en.value;	
    }

    displayWikidataInstance(wikidataDescription);
}

function displayWikidataInstance(text) {
	$("#wikidataDescription").append("<div id='wikidataInstanceOfInfo' style='display: none;'>"
	                                 + "<small>Instance Of: </small><i>"
                                     + text + "</i></div>");

    // Show advanced if we're not on enwiki
    if (mw.config.get( 'wgPageContentLanguage' ) != "en") {
	    $("#wikidataDescription").children().toggle();
    }
    
    $("#wikidataDescription").show();
}

var wikidataId = mw.config.get( 'wgWikibaseItemId' );
var shortDescription = "[None]";
$(setup);