Benutzer:Magnus Manske/wdlinks.js
Zur Navigation springen
Zur Suche springen
Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/*
Benutzung / Usage:
importScript('Benutzer:Magnus Manske/wdlinks.js'); //[[Benutzer:Magnus Manske/wdlinks.js]]
*/
var wdlinks = {
color : '#1FCB4A' ,
count : 0 ,
markLinks : function ( titles , outgoing ) {
$.each ( titles , function ( k , v ) {
var href = '/wiki/'+encodeURIComponent(k) ;
$('a[href="'+href+'"]').each ( function () {
var o = $(this) ;
var h = "<sup><a class='wdlink' style='color:" + wdlinks.color + "' href='//wikidata.org/wiki/" + v[0] + "' title='" + v[0].toLowerCase() ;
if ( !outgoing ) h += "; links here" ;
if ( v[1] == 0 ) h += ";, via redirect'>WD!" ;
else h += "'>WD" ;
h += "</a></sup>" ;
if ( outgoing ) {
o.append ( h ) ;
} else {
o.prepend ( h ) ;
}
} ) ;
wdlinks.done() ;
} ) ;
} ,
markOutgoingLinks : function ( title , q ) { // Marks links on the current page that go to title, directly or via redirect
title = title.replace(/ /g,'_') ;
var titles = {} ;
titles[title] = [q,1] ;
$.getJSON ( '/w/api.php?callback=?' , {
action:'query',
list:'backlinks',
bltitle:title,
format:'json',
bllimit:500,
blfilterredir:'redirects'
} , function ( d ) {
$.each ( d.query.backlinks||[] , function ( k , v ) {
titles[v.title.replace(/ /g,'_')] = [q,0] ; // 0 for redirect
} ) ;
wdlinks.markLinks ( titles , true ) ;
} ) ;
} ,
markBacklinks : function ( titles ) {
// TODO: Add redirects. Later.
$.each ( titles , function ( t , tv ) {
wdlinks.counter++ ;
$.post ( '/w/api.php' , {
action:'query',
list:'backlinks',
bltitle:t,
format:'json',
bllimit:500,
blfilterredir:'redirects'
} , function ( d ) {
wdlinks.done() ;
if ( d.query.backlinks.length == 0 ) return ;
var t2 = {} ;
$.each ( d.query.backlinks , function ( k , v ) {
t2[v.title.replace(/ /g,'_')] = [tv[0],0] ;
} ) ;
wdlinks.markLinks ( t2 , false ) ;
// console.log ( t2 ) ;
// console.log ( titles ) ;
// console.log ( d ) ;
// $.each ( d.query.backlinks||[] , function ( k , v ) {
// titles[v.title.replace(/ /g,'_')] = 1 ;
// } ) ;
// console.log ( titles ) ;
} , 'json' ) ;
} ) ;
wdlinks.markLinks ( titles , false ) ;
wdlinks.done() ;
} ,
checkLinks : function ( q ) { // q is a Wikidata item that the Wikidata item for the current page links to
var site = mw.getConfig("wgDBname") ;
$.getJSON ( '//www.wikidata.org/w/api.php?callback=?' , {
action : 'wbgetentities' ,
format : 'json' ,
ids : q ,
props : 'sitelinks'
} , function ( d ) {
$.each ( d.entities||{} , function ( q , v ) { // Should be only one
if ( undefined === v.sitelinks || undefined === v.sitelinks[site] ) return ;
wdlinks.count++ ;
var title = v.sitelinks[site].title ; // Title of the Wikipedia page the Wikidata item for the current page links to
wdlinks.markOutgoingLinks ( title , q ) ; // Check for links to title, and links to redirects to title, on current page
} ) ;
wdlinks.done() ;
} ) ;
} ,
done : function () {
wdlinks.count-- ;
if ( wdlinks.count == 0 ) $('#wdlinks').hide() ;
} ,
checkBacklinks : function ( q ) {
var max_bl = 50 ;
var site = mw.getConfig("wgDBname") ;
wdlinks.count++ ;
$.getJSON ( '//www.wikidata.org/w/api.php?callback=?' , {
action : 'query' ,
list : 'backlinks' ,
bltitle : q ,
bllimit : 500 ,
blnamespace : '0' ,
format : 'json'
} , function ( d ) {
var bl = [] ;
$.each ( d.query.backlinks||{} , function ( q , v ) { bl.push ( v.title ) ; } ) ;
if ( bl.length == 0 ) return wdlinks.done() ; // Nothing to do
if ( bl.length > max_bl ) {
wdlinks.count = -999999 ;
$('#wdlinks').html ( "Wikidata:Excessive backlinks (" + bl.length + ">" + max_bl + "), no backlinks shown" ) .show() ;
setTimeout ( function(){$('#wdlinks').hide();} , 10000 ) ; // 10 second display
return ;
}
// bl now contains Wikidata items that link to the
$.getJSON ( '//www.wikidata.org/w/api.php?callback=?' , {
action : 'wbgetentities' ,
format : 'json' ,
ids : bl.join('|') ,
props : 'info|claims|sitelinks'
} , function ( d ) {
var titles = {} ;
$.each ( d.entities||{} , function ( q , v ) {
if ( undefined === v.sitelinks || undefined === v.sitelinks[site] ) return ;
var title = v.sitelinks[site].title ; // The Wikidata item for this title on Wikipedia links to the Wikidata item for the current page
titles[title.replace(/ /g,'_')] = [q,1] ;
} ) ;
// titles now contain the titles of the Wikipedia pages potentially linking to this one
wdlinks.markBacklinks ( titles ) ;
} ) ;
} ) ;
} ,
init : function () {
var h = "<span style='margin-left:20px;color:" + wdlinks.color + "' id='wdlinks'>Wikidata links loading...</span>" ;
h += "<a style='margin-left:5px;color:" + wdlinks.color + "' href='#' title='Toggle WD links' onclick='$(\"a.wdlink\").toggle()'>WD</a></span>" ;
$('#siteSub').append ( h ) ;
wdlinks.count = 0 ;
$.getJSON ( '//www.wikidata.org/w/api.php?callback=?' , {
action : 'wbgetentities' ,
format : 'json' ,
sites : mw.getConfig("wgDBname") ,
titles : mw.getConfig("wgTitle") ,
props : 'info|claims|sitelinks'
} , function ( d ) {
$.each ( d.entities||{} , function ( q , v ) { // There should only be one
wdlinks.checkBacklinks ( q ) ;
$.each ( v.claims||[] , function ( p , v2 ) {
$.each ( v2||[] , function ( dummy , v3 ) {
if ( undefined === v3.mainsnak ) return ;
if ( undefined === v3.mainsnak.datavalue ) return ;
if ( undefined === v3.mainsnak.datavalue.value ) return ;
if ( undefined === v3.mainsnak.datavalue.value['numeric-id'] ) return ;
var q2 = v3.mainsnak.datavalue.value['numeric-id'] ;
wdlinks.count++ ;
wdlinks.checkLinks ( "q"+q2 ) ;
} ) ;
} ) ;
} ) ;
} ) ;
}
} ;
$(document).ready ( function () {
wdlinks.init() ;
} ) ;