Jump to content

User:Opencooper/lastEdit.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Opencooper (talk | contribs) at 16:15, 11 December 2016 (code link). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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 reimpliments the last edit banner used on mobile
// TODO: standardize on either single or double quotes

function requestRevision() {
    // If we're not reading an article, do nothing
    if (!(mw.config.get( 'wgAction' ) === 'view'
          && mw.config.get( 'wgIsArticle' )
          && mw.config.get("wgPageName") !== "Main_Page")) {
        return;
    }

    // API docs: https://www.mediawiki.org/wiki/API:Revisions
    $.ajax({
        url: "https://en.wikipedia.org/w/api.php?action=query&prop=revisions&format=json&titles="
             + mw.config.get('wgPageName')
             + "&rvprop=timestamp%7Cuser%7Ccomment%7Ctags%7Cids",
        success: displayEdit
    });
}

// Display the last edit info to the right of the site subhead
function displayEdit(response) {
    var pageId = mw.config.get('wgArticleId');
    var pageInfo = response.query.pages[pageId].revisions[0];
    var relativeTimestamp = calculateRelativeTimestamp(pageInfo.timestamp);
    var editComment = $('<div>').text(pageInfo.comment).html(); // HTML encode
    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 notice = lastEdit + " by " + lastEditor + pageTags;

    // [[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) {
        var target = document.querySelector('#siteSub');
        var observer = new MutationObserver(function(mutations) { // IE 11+
            $('#siteSub').append("<div style='float: right;'>" + notice + "</div>");
            observer.disconnect();
        });

        observer.observe(target, {childList: true});
    } else {
        $('#siteSub').append("<div style='float: right;'>" + notice + "</div>");
    }

    // Unfortunately [[Template:Coords]] absolutely positions itself so we have
    // to move it down so we don't get obscured
    var sheet = window.document.styleSheets[0];
    sheet.insertRule('#coordinates { top: 2em !important; }', sheet.cssRules.length);
}

// 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 > limits[i + 1] ) {
        ++i;
    }
    var delta  = Math.round(timestampDelta / limits[i]);
    var deltaUnit = units[i];
    // Pluralize units
    if (delta > 1) {
        deltaUnit += "s";
    }

    return delta + " " + deltaUnit;
}

$(requestRevision);