User:Splarka/randab.js

/* Random Dab Finder, version [0.0.0]

Originally from: http://en.wikipedia.org/wiki/User:Splarka/randab.js

Based on http://en.wikibooks.org/w/index.php?title=MediaWiki:Common.js/RandomBook.js&oldid=1496500

Grabs 10 random pages from the API, checks if any are disambiguations. Repeats until it finds a match.

Notes:

  • Don't grab more than 10 random pages. Logged in users can get more, but anon users cannot.
  • Since this uses callback, all users are limited to 10 anyway.
  • Automatically re-queries until it finds a page in "Category:All disambiguation pages".
  • As 5.4% of pages are in this category, most queries should take only 2 or 3 iterations.
  • Setting window.location.href eats history in some browsers.
  • To show a link instead use: var ranDabAsLink = true; (users can set this in their monobook individually too).
  • Uses curid links, I usually trust these more than trying to generate /wiki links.
  • /

var ranDabAsLink = false;

var rbrqid = 0;

var rburl = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&indexpageids=1&generator=random&grnnamespace=0&grnlimit=10&prop=categories&cllimit=max&format=json&callback=showRanDabCB&requestid=rb';

function showRanDab() {

injectSpinner(document.getElementById('n-randab').firstChild,'ranDabSpinner');

mw.loader.load(rburl + rbrqid);

rbrqid++;

}

function showRanDabCB(obj) {

if(!obj['query'] || !obj['query']['pages'] || !obj['query']['pageids']) {

document.getElementById('n-randab').appendChild(document.createTextNode(' error'));

removeSpinner('ranDabSpinner');

return false;

}

var id = obj['query']['pageids'];

var found;

for(var i=0;i

var cats = obj['query']['pages'][id[i]]['categories'];

if(!cats) continue

for(var j=0;j

var ct = cats[j]['title'];

if(ct == 'Category:All disambiguation pages') {

found = obj['query']['pages'][id[i]];

break;

}

}

if(found) break

}

if(!found) {

// didn't find any, try again

mw.loader.load(rburl + rbrqid);

rbrqid++;

} else {

removeSpinner('ranDabSpinner');

var link = mw.config.get('wgServer') + mw.config.get('wgScript') + '?curid=' + found['pageid'];

if(window.ranDabAsLink) {

var a = document.createElement('a');

a.setAttribute('href',link);

a.style.display = 'block';

a.appendChild(document.createTextNode(' \u2022\u00A0' + found['title']))

document.getElementById('n-randab').appendChild(a);

} else if(window.location.assign) {

window.location.assign(link);

} else {

window.location.href = link;

}

}

return true;

}

function showRanDabLink() {

mw.util.addPortletLink('p-navigation','javascript:showRanDab();','Random dab','n-randab','Show me a random disambiguation page');

}

$(showRanDabLink);