Benutzer:Magnus Manske/wdlinks.js

aus Wikipedia, der freien Enzyklopädie
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() ;
} ) ;