From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

// This script reimplements the last edit banner used on mobile



// License: CC0



function requestRevision() {

    // If we're not reading an article, do nothing

    if (!(mw.config.get("wgAction") === "view"

          && mw.config.get("wgIsArticle")

          && !mw.config.get("wgIsMainPage"))) {

        return;

    }



    // API docs: https://www.mediawiki.org/wiki/API:Revisions

    var apiUrl = location.origin + "/w/api.php";

    $.ajax({

        url: apiUrl,

        data: {

            action: "query",

            prop: "revisions",

            format: "json",

            titles: mw.config.get("wgPageName"),

            rvprop: "timestamp|user|comment|tags|ids"

        },

        success: parseEdit

    });

}



function parseEdit(response) {

    var pageId = mw.config.get("wgArticleId");

    try {

      var pageInfo = response.query.pagespageId].revisions0];

    } catch (e) {

      return;

    }

    var relativeTimestamp = calculateRelativeTimestamp(pageInfo.timestamp);



    var editComment = pageInfo.comment;

    if (!editComment) {

        editComment = "[No edit summary]";

    }

    editComment = editComment.replace(/'/g, "'"); // HTML encode quotes



    var lastEdit = "<a href='/wiki/Special:Diff/" + pageInfo.revid

                   + "' title='" + editComment + "'> Last edited "

                   + relativeTimestamp + " ago</a>";

    var lastEditor = "<a href='/wiki/Special:Contributions/" + pageInfo.user

                     + "'>" + pageInfo.user + "</a>";

    // Can be filtered if needed

    var pageTags = "";

    if (pageInfo.tags.length > 0) {

        pageTags = "<span class='mw-tag-markers'> (" + pageInfo.tags

                   + ")</span>";

    }



    var noticeText = lastEdit + " by " + lastEditor + pageTags;

    var notice = "<div id='lastEdit' style='float: right;'>" + noticeText

                 + "</div>"



    displayEdit(notice);

}



// Adapted from https://github.com/wikimedia/mediawiki-extensions-MobileFrontend/blob/master/resources/mobile.modifiedBar/time.js

function calculateRelativeTimestamp(timestamp) {

    // Supposedly Date parsing is a bit wonky with respect to browsers and

    // timezones, but since we have an ISO-6801 date we can risk it

    var editTimestamp = new Date(timestamp).getTime() / 1000;

    var currentTimestamp = Math.round( new Date().getTime() / 1000);

    var timestampDelta = currentTimestamp - editTimestamp;

    

    var units =  'second', 'minute', 'hour', 'day', 'month', 'year' ],

        limits =  1, 60, 3600, 86400, 2592000, 31536000 ];



    var i = 0;

    while ( i < limits.length && timestampDelta > limitsi + 1 ) {

        ++i;

    }

    var delta  = Math.round(timestampDelta / limitsi]);

    var deltaUnit = unitsi];

    // Pluralize units

    if (delta > 1) {

        deltaUnit += "s";

    }



    return delta + " " + deltaUnit;

}



// Display the last edit info to the right of the site subhead

function displayEdit(notice) {

    // [[MediaWiki:Gadget-metadata.js]] replaces the siteSub element so wait

    // for it to run first

    // Check if script is enabled and if it hasn't ran already

    if ($("script").text().search("ext.gadget.metadata") != -1

        && !$(".assess-article-rating").length

        && mw.config.get("wgNamespaceNumber") == 0) {

        var target = document.querySelector("#siteSub");

        var observer = new MutationObserver(function(mutations) { // IE 11+

            $("#siteSub").append(notice);

            observer.disconnect();

        });



        observer.observe(target, {childList: true});

    } else {

        $("#siteSub").append(notice);

    }



    // Unfortunately [[Template:Coords]] absolutely positions itself so we

    // have to move it down so we don't get obscured

    var sheet = window.document.styleSheets0];

    sheet.insertRule('#coordinates { top: 2em !important; }',

                      sheet.cssRules.length);

}



if (mw.config.get( 'skin' ) != "minerva") {

    $(requestRevision);

}