User:Mxn/serendipity.js
/**
* Serendipity
*
* Endows Wikipedia with the “sense of wonder” and “serendipitous discoveries”
* that proud owners of the print Encyclopædia Britannica find sorely lacking on
* the Internet. Now, whenever you look up an entry in this ephemeral reference,
* “lose yourself” in the alphabetically adjacent bounty of knowledge that any
* self-respecting encyclopedia should offer by default.
*
* :-P
*/
if (mw.config.get("wgAction") == "view" && mw.config.get("wgNamespaceNumber") == 0) {
mw.loader.using("mediawiki.api", function () {
var api = new mw.Api();
/**
* Retrieves the rendered HTML content of an alphabetically adjacent
* article and passes the content to a callback function.
*
* @param forward {boolean} True to get the next page; false to get
* the previous one.
* @param ok {function} A callback function that takes two
* arguments: title, html.
*/
function fetchAdjacentArticle(forward, ok) {
api.get({
list: "allpages",
apfrom: mw.config.get("wgPageName"),
apnamespace: 0,
apfilterredir: "nonredirects",
aplimit: 2,
apdir: forward ? "ascending" : "descending",
}).done(function (data) {
var pages = data.query && data.query.allpages;
var page = pages && data.query.allpages[1];
if(!page) return;
$.get(mw.util.wikiScript("index"), {
title: page.title,
action: "render",
}, function (html) {
if (ok) ok(page.title, html);
}, "html");
});
}
/**
* Hides content features that facilitate user contributions, multimedia
* experiences, non-linear navigation, or fact-checking.
*/
function hideNewFangledFeatures() {
// Links
$("#bodyContent a").unbind("click").click(function (evt) {
evt.preventDefault();
evt.stopPropagation();
});
var extLinkHeadings = $("h2:contains('xternal link')");
extLinkHeadings.hide().nextAll("ul").hide();
if (extLinkHeadings) {
$(".toctext:contains('xternal link')").parent().hide();
}
// Cite extension
var refHeadings = $(".reflist").prev("h2:contains('eference')");
refHeadings.hide();
if (refHeadings) $(".toctext:contains('eference')").parent().hide();
// WikiMiniAtlas
wma_settings = {enabled: false};
// Stylesheets only need to be applied once.
if (hideNewFangledFeatures.stylesAdded) return;
hideNewFangledFeatures.stylesAdded = true;
// Links
mw.util.addCSS("#bodyContent a {" +
"background: transparent !important; cursor: inherit;" +
"color: inherit; padding-right: 0 !important;" +
"text-decoration: inherit;" +
"}");
// Abbreviations
mw.util.addCSS("#bodyContent abbr, #bodyContent acronym," +
"#bodyContent .explain {" +
"border-bottom: none; cursor: inherit;" +
"}");
// Software-powered features
mw.util.addCSS("#mw-articlefeedback, #catlinks, .mw-editsection," +
".magnify, .toctoggle {display: none;}");
// Cite extension
mw.util.addCSS(".reference, .reflist {display: none;}");
// Template-powered features
mw.util.addCSS("#coordinates, img[alt='play'], .navbox, .stub" +
"{display: none;}");
}
/**
* Inserts the contents of the previous article above the original one.
*/
function insertPreviousArticle(title, html) {
// Stuff the main article’s title inside its body element.
$("#bodyContent").prepend($("#firstHeading"));
$("#firstHeading").css({
"font-size": 1.25 * parseFloat($("#firstHeading").css("font-size")),
});
$("#bodyContent").prepend("
").prepend($(html).wrap("
")).prepend("
" +
"" + title + "" +
"");
hideNewFangledFeatures();
};
/**
* Inserts the contents of the next article above the original one.
*/
function insertNextArticle(title, html) {
$("#bodyContent").append("
" +
"" + title + "" +
"")
.append($(html).wrap("
")).append("
");hideNewFangledFeatures();
};
$(function () {
fetchAdjacentArticle(false, insertPreviousArticle);
fetchAdjacentArticle(true, insertNextArticle);
});
});
}