User:Magnus Manske/suggestor.js
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)+" ↠ "+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 + "×)" ;
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 ;
} ) ;
});