User:Magnus Manske/sourcerer.js

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)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 (c) 2013 by Magnus Manske
 Licensed under GPL 2.0 or above
 USAGE : Add the following line to your [[Special:Mypage/common.js]] page:
 importScript( 'User:Magnus_Manske/sourcerer.js' );
*/

var wd_sourcerer = {

	init : function () {
		var self = this ;
 		$('body').append ( "<div id='sourcerer-dialog' style='display:none'></div>" ) ;
		var portletLink = mw.util.addPortletLink( 'p-tb', 'javascript:;', 'Sourcerer','t-wd_sourcerer');
		$(portletLink).click ( function () {
			self.run() ;
			return false ;
		} ) ;
//		setTimeout ( function(){self.run()} , 500 ) ; // TESTING
	} ,
	
	run : function () {
		$('#sourcerer').remove() ;
		var h = '<div id="sourcerer" style="clear:both"><i>Checking external links... <span id="sourcerer_count"></span> to go</i></div>' ;
		$($('#sitelinks-wikipedia').get(0)).before ( h ) ;
		var self = this ;
		self.urls = {} ;
		self.todo = 0 ;
		$('td.wb-sitelinks-link a').each ( function ( k , v ) {
			self.todo++ ;
			var m = $(v).attr('href').match ( /^\/*(.+?)\/wiki\/(.+)$/ ) ;
			var proj = m[1] ;
			var page = m[2] ;
			$.getJSON ( 'https://'+proj+'/w/api.php?callback=?' , {
				action:'parse',
				format:'json',
				prop:'externallinks',
				page:page
			} , function ( d ) {
				if ( d.parse === undefined || d.parse.externallinks === undefined ) return self.show() ;
				
				$.each ( d.parse.externallinks , function ( k , url ) {
					if ( self.urls[url] === undefined ) self.urls[url] = [] ;
					self.urls[url] .push ( proj.replace(/\.wikipedia\.org/g,'') ) ;
				} ) ;
				
				self.show() ;
			} ) ;
		} ) ;
	} ,

	show : function () {
		var self = this ;
		self.todo-- ;
		$('#sourcerer_count').html(self.todo);
		if ( self.todo > 0 ) return ; // Not yet
		
		var keys = [] ;
		$.each ( self.urls , function ( k , v ) { keys.push ( k ) } ) ;
		keys = keys.sort ( function ( a , b ) {
			return ( (self.urls[b].length) - (self.urls[a].length) ) ;
		} ) ;
		
		var h = '' ;
		h += "<table cellspacing='0' cellpadding='2' border='1px solid #DDDDDD'><thead><tr><th>URL</th><th>Link</th><th>Count</th><th>Projects</th></tr></thead><tbody>";
		$.each ( keys , function ( dummy , url ) {
			h += "<tr><td style='max-width:500px'><small>" + url + "</small></td><td><a target='_blank' href='" + url + "'>link</a></td><td>" + self.urls[url].length + "</td><td>" ;
			h += self.urls[url].sort().join(', ') ;
			h += "</td></tr>" ;
		} ) ;
		h += "</tbody></table>";
		$('#sourcerer').html ( h )
	} ,

	fin : ''

} ;

$ ( function() {
	if ( mw.config.get('wgNamespaceNumber') != 0 ) return ;
	if ( mw.config.get('wgAction') != 'view' ) return ;
 
	wd_sourcerer.init () ;
});