MediaWiki:Gadget-relateditems.js

From Wikibase Personal data
Jump to navigation Jump to search

Note: After saving, 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: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/*************************************************************************************************
* This script displays related items on an item page.                                            *
* This script is taken from https://www.wikidata.org/w/index.php?title=MediaWiki:Gadget-relateditems.js *
* Modifications made: change of namespace 0 --> 120 (TWICE)                                      *
* Change from {query,www}.wikidata.org to equivalent on personaldata.io                          *
* wdt:P7087 ---> pdiot:P254 and wd: ---> pdio:                                                   * 
* introduction prefixes in query                                                                 *
**************************************************************************************************/
(function(mw, $, wb) {
    "use strict";

    if (mw.config.get('wgNamespaceNumber') !== 120 || !mw.config.exists('wbEntityId')) {
        return;
    }

    var lang = mw.config.get('wgUserLanguage');
    
    var messages, entityid = mw.config.get('wbEntityId');
    var api = new mw.Api();
    messages = (function () {
        var translations = {
            de: {
                'title': 'Abgeleitete Aussagen',
                'more': 'mehr',
                'inverse': 'invers',
                'show-inverse': 'zeige abgeleitete Aussagen',
                'no-result': 'kein Ergebnis',
                'loading': 'laden...'
            },
            en: {
                'title': 'Derived statements',
                'more': 'more',
                'inverse': 'inverse',
                'show-inverse': 'show derived statements',
                'no-result': 'no result',
                'loading': 'loading...'
            },
            fr: {
               'title': 'Déclarations dérivées',
               'more': 'plus',
               'inverse': 'inverse',
               'show-inverse': 'voir les déclarations dérivées',
               'no-result': 'pas de résultats',
               'loading': 'chargement...'
           }            
        },
        chain = mw.language.getFallbackLanguageChain(),
        len = chain.length,
        ret = {},
        i = len - 1;
        while (i >= 0) {
            if (translations.hasOwnProperty(chain[i])) {
                $.extend(ret, translations[chain[i]]);
            }
            i = i - 1;
        }
        return ret;
    }());

    var html = '\
        <h2 class="wb-section-heading section-heading wikibase-statements" dir="auto"><span id="inverseclaims" class="mw-headline"></span></h2>\
        <div class="wikibase-statementgrouplistview" id="inversesection"> \
             <div class="wikibase-listview"></div> \
             <div class="wikibase-showinverse" style="padding:10px;overflow:hidden;"></div> \
        </div>';

    function loaditems() {
        $('span#inverseclaims').text(messages.title);
        $('#inversesection').find('.wikibase-showinverse').html(messages.loading);
        var api = new mw.Api({
            ajax: {
                url: 'https://query.personaldata.io/proxy/wdqs/bigdata/namespace/wdq/sparql?',
                dataType: 'json',
                cache: true
            }
        });
        api.get({
		    query: 'PREFIX pdio: <https://wiki.personaldata.io/entity/>\
                PREFIX pdiot: <https://wiki.personaldata.io/prop/direct/>\
		        SELECT ?subject ?subjectLabel ?property ?inversepropertyLabel ?rank WHERE {{\
				SELECT ?subject ?property ?inverseproperty ?rank WHERE { \
		       	?subject ?claimpred ?statement .\
				?statement ?valpred pdio:' + entityid + ' ;\
				          wikibase:rank ?rank .\
				?property wikibase:claim ?claimpred;\
				          wikibase:statementProperty ?valpred;\
				          pdiot:P254 ?inverseproperty .\
				} LIMIT 300 }\
				SERVICE wikibase:label {bd:serviceParam wikibase:language "' + lang + ',en" .}\
			} ORDER BY ?property'
        }).done(function(data) {
        	var stid = false;
            for (var k in data.results.bindings) {
                var page = data.results.bindings[k];
                var rank = page.rank.value.replace('http://wikiba.se/ontology#', '').replace('Rank', '').toLowerCase();
                var pid = page.property.value.replace('https://wiki.personaldata.io/entity/', 'i');
                if (pid != stid){
	                var statementgroup = '\
	                        <div id="' + pid + '" class="wikibase-statementgroupview listview-item"> \
	                            <div class="wikibase-statementgroupview-property"> \
	                                <div class="wikibase-statementgroupview-property-label" dir="auto"> \
	                                    <a href="' + page.property.value + '">' + page.inversepropertyLabel.value + '</a> \
	                                </div> \
	                            </div> \
	                            <div class="wikibase-statementlistview"> \
	                                <div class="wikibase-statementlistview-listview"> \
	                                </div> \
	                            </div> \
	                        </div>';
					$('#inversesection').find('.wikibase-listview').append(statementgroup);
					stid = pid;
                }
                var statement = '<div class="wikibase-statementview wb-normal listview-item wikibase-toolbar-item"> \
					<div class="wikibase-statementview-rankselector"><div class="wikibase-rankselector ui-state-disabled"> \
						<span class="ui-icon ui-icon-rankselector wikibase-rankselector-' + rank + '"></span> \
					</div></div>  \
                    <div class="wikibase-statementview-mainsnak-container"> \
                        <div class="wikibase-statementview-mainsnak" dir="auto"> \
                            <div class="wikibase-snakview"> \
                                <div class="wikibase-snakview-property-container"> \
                                    <div class="wikibase-snakview-property" dir="auto"> \
                                    </div> \
                                </div> \
                                <div class="wikibase-snakview-value-container" dir="auto"> \
                                    <div class="wikibase-snakview-value wikibase-snakview-variation-valuesnak"> \
                                        <a href="' + page.subject.value + '">' + page.subjectLabel.value + '</a>\
                                    </div> \
                                </div> \
                            </div> \
                        </div> \
                    </div> \
                </div>';
                $('.wikibase-statementgroupview').last().find('.wikibase-statementlistview-listview').append(statement);
            }
            if (data.results.bindings.length == 300) {
                $('#inversesection').find('.wikibase-showinverse').html('<a href="https://wiki.personaldata.io/w/index.php?title=Special:WhatLinksHere&target=' + entityid + '&namespace=120">' + messages.more + '</a>');
            } else if (data.results.bindings.length === 0) {
            	$('#inversesection').find('.wikibase-showinverse').html(messages['no-result']);
            } else {
                $('#inversesection').find('.wikibase-showinverse').html('');
            }
        });
    }
    function init() {
        $('.wikibase-entityview-main').append(html);
        $('#inversesection').find('.wikibase-showinverse').append(
            $( '<a>' )
            .attr( 'href', '#' )
            .attr( 'style', 'border:1px solid #AAA;padding:10px 80px;' )
            .text( messages['show-inverse'] )
            .click( function ( event ) {
                event.preventDefault();
                loaditems();
            })
        );
    }

    $(init);

}(mediaWiki, jQuery, wikibase));