User:Magnus Manske/suggestor.js

From Wikidata
Jump to navigation Jump to search

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.
jQuery(document).ready ( function() {
	if ( mw.config.get('wgNamespaceNumber') !== 0 ) return ;
	if ( mw.config.get('wgAction') != 'view' ) return ;
	if ( mw.config.get('wbIsEditView') === false ) return ;
	
	var api = '/w/api.php' ;

	function run () {
		$('#suggestor').remove() ;
		var h = "<div id='suggestor'><i>Loading statement suggestions...</i></div>" ;
		$('h2.wikibase-statements').before ( h ) ;
		var q = mw.config.get('wgTitle') ;
		$.get('//www.wikidata.org/w/api.php?action=wbgetentities&format=json&ids='+q,function(d){
			var sl = d.entities[q].sitelinks ;
			if ( typeof sl == 'undefined' ) {
				$('#suggestor').html ( "Sorry, no sites, no suggestions!" ) ;
				return false ;
			}
			var running = 0 ;
			var results = {} ;
			var labels = {} ;
			
			function getLabel ( q ) {
				if ( typeof labels[q] == 'undefined' ) {
					return q ;
				} else {
					return "<span>" + labels[q] + " <small>" + q + "</small></span>" ;
				}
			}
			
			function getLink ( q ) {
				var ret = "<a target='_blank' href='/wiki/" ;
				if ( q.match(/^Q\d+/i) ) ret += q ;
				else ret += "Property:" + q
				ret += "'>" + getLabel(q) + "</a>" ;
				return ret ;
			}


			function createClaim ( entity , property , value ) {
				console.log ( "Creating " + entity + " / " + property + " / " + value ) ;
				$.post ( api , {
					action : 'query' ,
					prop : 'info' ,
					intoken : 'edit' ,
					titles : entity ,
					format : 'json'
				} , function ( data ) {
					var token , lastrevid ;
					$.each ( (data.query.pages||[]) , function ( k , v ) {
						token = v.edittoken ;
						lastrevid = v.lastrevid ;
					} ) ;
					
					if ( undefined === token ) {
						console.log ( "Cannot get edit token for " + entity ) ;
						return ;
					}
					
					property = property.replace(/\D/g,'') ;
					entity = entity.replace(/\D/g,'') ;
		
					$.post ( api , {
						action : 'wbcreateclaim' ,
						entity : 'Q'+entity ,
						snaktype : 'value' ,
						property : 'P'+property ,
						value : JSON.stringify ( value ) ,
						token : token ,
						baserevid : lastrevid ,
						format : 'json'
					} , function ( data ) {
						$('div.wikibase-statementgrouplistview').append("<div>Added "+getLink('P'+property)+" &Rarr; "+getLink('Q'+value['numeric-id'])+"</div>") ;
					} , 'json' ) ;
					
					
					
				} , 'json' ) ;
			
			}
			
			function finish () {
				running-- ;
				if ( running > 0 ) return ;
				h = '<h2>Statements suggested based on items in similar categories on other Wikis</h2>' ;
				h += "<table border='1px solid #DDD' cellspacing=0 cellpadding=2><tbody>" ;
				var found = false ;
				$.each ( results , function ( p , qs ) {
					found = true ;
					h += "<tr>" ;
					h += "<th>" + getLink(p) + "</th>"
					h += "<td>" ;
					$.each ( qs , function ( q , cnt ) {
						h += "<div>" ;
						h += "<span class='suggestor_p' v='" + q + "'>" + getLink(q) + "</span>" ;
						h += " (" + cnt + "&times;)" ;
						h += " <a href='#' class='suggestor_add' p='"+p+"' q='"+q+"'>[+]</a>"
						h += "</div>" ;
					})
					h += "</td>" ;
					h += "</tr>" ;
				})
				h += "</tbody></table>" ;
				if ( !found ) h = "Sorry, no suggestions!" ;
				$('#suggestor').html ( h ) ;
				$('#suggestor').css({border:'1px solid #DDD'}) ;
				
				$('a.suggestor_add').click ( function () {
					var o = $(this) ;
					var p = o.attr('p') ;
					var q = o.attr('q') ;
					var myq = mw.config.get('wgTitle') ;
					createClaim ( myq , p , {"entity-type":"item","numeric-id":q.replace(/\D/g,'')*1} ) ;
					return false ;
				})
			}
			
			var tried = false ;
			$.each ( sl , function ( k , v ) {
				tried = true ;
				running++ ;
				$.getJSON ( '//tools.wmflabs.org/wikidata-todo/suggestor.php?callback=?',{
					wiki : k ,
					article : v.title
				},function(d2){
					$.each ( d2.labels , function ( q , l ) {
						labels[q] = l ;
					})
					$.each ( d2.data , function (p,qs) {
						if ( typeof results[p] == 'undefined' ) results[p] = {} ;
						$.each ( qs , function ( q , cnt ) {
							if ( typeof results[p][q] == 'undefined' ) results[p][q] = 0 ;
							results[p][q] += cnt ;
						} ) ;
					} ) ;
											
					finish();
				})
			})
			
			if ( !tried ) $('#suggestor').html ( "Sorry, no suggestions!" ) ;
		},'json')
	}


	var portletLink = mw.util.addPortletLink( 'p-tb', '#', 'Suggestor','t-wd_suggestor');
	$(portletLink).click ( function () {
		run() ;
		return false ;
	} ) ;
});