User:Splarka/randbook.js
Jump to navigation
Jump to search
Note: After saving, changes may not occur immediately. Click here to learn how to bypass your browser's cache.
- Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac);
- Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5;
- Konqueror: simply click the Reload button, or press F5;
- Opera users may need to completely clear their cache in Tools→Preferences.
Warning: Malicious code can compromise your account. Page preview will cause your web browser to execute this page's content as code under some skins, including Monobook. If you have any questions about any code you plan to add, you can ask at the appropriate reading room. |
Documentation for this script can be added at User:Splarka/randbook. |
/* Random Book Finder, version [0.0.3a]
Originally from: http://en.wikibooks.org/wiki/User:Splarka/randbook.js
Based roughly on http://en.wikibooks.org/w/index.php?title=MediaWiki:RandomBook.js&oldid=1209572 by Darklama.
Grabs 10 random pages from the API, checks if any are books. Repeats until it finds a book.
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 one of the 38 Category:Alphabetical\ categories.
** As 10.5% of pages are in this category, most queries should take only 1 or 2 iterations.
* Setting window.location.href eats history in some browsers.
** To show a link instead use: var randBookAsLink = 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 randBookAsLink = 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=100&format=json&callback=showRandBookCB&requestid=rb';
function showRandBook() {
injectSpinner(document.getElementById('n-randbook').firstChild,'randBookSpinner');
mw.loader.load(rburl + rbrqid);
rbrqid++;
}
function showRandBookCB(obj) {
if(!obj['query'] || !obj['query']['pages'] || !obj['query']['pageids']) {
document.getElementById('n-randbook').appendChild(document.createTextNode(' error'));
removeSpinner('randBookSpinner');
return;
}
var id = obj['query']['pageids'];
var found;
for(var i=0;i<id.length;i++) {
var cats = obj['query']['pages'][id[i]]['categories'];
if(!cats) continue
for(var j=0;j<cats.length;j++) {
var ct = cats[j]['title'];
if(ct.indexOf('Category:Alphabetical/') == 0) {
found = obj['query']['pages'][id[i]];
break;
}
}
}
if(!found) {
// didn't find any, try again
mw.loader.load(rburl + rbrqid);
rbrqid++;
} else {
removeSpinner('randBookSpinner');
var link = mw.config.get('wgServer') + mw.config.get('wgScript') + '?curid=' + found['pageid'];
if(window.randBookAsLink) {
var a = document.createElement('a');
a.setAttribute('href',link);
a.style.display = 'block';
a.appendChild(document.createTextNode(' \u2022\u00A0' + found['title']))
document.getElementById('n-randbook').appendChild(a);
} else {
window.location.href = link;
}
}
}
function showRandBookLink() {
mw.util.addPortletLink('p-Navigation','javascript:showRandBook();','Random book (alt)','n-randbook','Show me a random book!','x');
}
$(showRandBookLink);