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("<div class='visualClear'></div>")                             .prepend($(html).wrap("<div id='prevBodyContent'></div>"))                             .prepend("<h1 id='prevFirstHeading' class='firstHeading'>" +                                      "<span dir='auto'>" + title + "</span>" +                                      "</h1>");            hideNewFangledFeatures();        };                /**         * Inserts the contents of the next article above the original one.         */        function insertNextArticle(title, html) {            $("#bodyContent").append("<h1 id='nextFirstHeading' class='firstHeading'>" +                                     "<span dir='auto'>" + title + "</span>" +                                     "</h1>")                             .append($(html).wrap("<div id='nextBodyContent'></div>"))                             .append("<div class='visualClear'></div>");            hideNewFangledFeatures();        };                $(function () {            fetchAdjacentArticle(false, insertPreviousArticle);            fetchAdjacentArticle(true, insertNextArticle);        });    });}