User:Magnus Manske/consistency check.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.
var consistency_check = {

	p_prefix : 'P' ,
	q_prefix : 'Q' ,
	
	running : false ,

	reciproke : {
		'P47' : [ 'P47' ] , // shares border with
		'P26' : [ 'P26' ] , // spouse
		'P40' : [ 'P22', 'P25' ] , // mother, father
		'P9' : [ 'P9', 'P7' ] // brother, sister
	} ,

	init : function () {
		var self = this ;
		
		$.each ( self.reciproke , function ( k , v ) {
			$.each ( v , function ( k2 , v2 ) {
				if ( undefined === self.reciproke[v2] ) self.reciproke[v2] = [] ;
				if ( -1 == $.inArray ( k , self.reciproke[v2] ) ) self.reciproke[v2].push ( k ) ;
			} ) ;
		} ) ;
		
//		console.log ( self.reciproke ) ;
		
		var portletLink = mw.util.addPortletLink( 'p-tb', '#', 'Consistency','t-consistency_check');
		$(portletLink).click ( function () {
			self.run() ;
			return false ;
		} ) ;
	} ,
	
	run : function () {
		var self = this ;
		if ( self.running ) return ;
		self.running = true ;
		var q = mw.config.get('wgPageName').toLowerCase() ;

		$.getJSON ( '//www.wikidata.org/w/api.php?callback=?' , {
			action : 'wbgetentities' ,
			ids : q ,
			format : 'json' ,
			props : 'claims'
		} , function ( data ) {

			var check = [] ;
			var header = "<h2 class='wb-section-heading'>Consistency</h2>" ;
			var h = '' ;
			var found_claims = false ;
			
			if ( undefined !== data.entities[q].claims ) {
				h += "<div><table border=1>" ;
				$.each ( data.entities[q].claims , function ( k , v ) {
					if ( undefined === self.reciproke[k] ) return ; // No need to check
					$.each ( v , function ( k2 , v2 ) {
						var q2 = self.q_prefix + v2.mainsnak.datavalue.value['numeric-id'] ;
						var id = 'consistency_' + k + '_' + q2 ;
						h += "<tr><th class='label_"+k+"'>" + k + "</th><td id='" + id + "_c' style='text-align:center'>?</td><td id='" + id + "_v'><a href='/wiki/" + q2.toUpperCase() + "'>" + q2.toUpperCase() + "</a></td></tr>" ;
						check.push ( { prop:k , orig:q , target:q2 , any:self.reciproke[k] , id:id } ) ;
						found_claims = true ;
					} ) ;
				} ) ;
				h += "</table></div>" ;
			}
			
			if ( found_claims ) {
				h = header + h ;
			} else {
				h = header + "<div>No claims found for " + q + "</div>" ;
			}
			
			$($('div.wb-claims-section').get(0)).before ( "<div class='consistency'>" + h + "</div>" ) ;
			
			$.each ( check , function ( k , v ) {
				self.checkReciproke ( v ) ;
			} ) ;
			
			
		} ) ;
	
	} ,
	
	checkReciproke : function ( d ) {

		$.getJSON ( '//www.wikidata.org/w/api.php?callback=?' , {
			action : 'wbgetentities' ,
			ids : d.target ,
			format : 'json' ,
			props : 'claims'
		} , function ( data ) {
		
			var oneway = "<span style='color:red;font-weight:bold'>&rarr;</span>" ;
			var bothways = "<span style='color:green'>&harr;</span>"

			var found = false ;

			if ( undefined !== data.entities[d.target].claims ) {
				$.each ( data.entities[d.target].claims , function ( k , v ) {
					if ( -1 == $.inArray ( k , d.any ) ) return ;
					$.each ( v , function ( k2 , v2 ) {
						var q2 = self.q_prefix + v2.mainsnak.datavalue.value['numeric-id'] ;
						if ( q2 == d.orig ) found = true ;
						
					} ) ;
				} ) ;
			}
			
			if ( found ) {
				$('#'+d.id+'_c').html ( bothways ) ;
			} else {
				$('#'+d.id+'_c').html ( oneway ) ;
			}
			
		} ) ;
		
	} ,
	
	the_end : ''
} ;

jQuery(document).ready ( function() {
	consistency_check.init () ;
});