User:Opencooper/lastEdit.js

// This script reimplements the last edit banner used on mobile// License: CC0function 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.pages[pageId].revisions[0];    } catch (e) {      return;    }    var relativeTimestamp = calculateRelativeTimestamp(pageInfo.timestamp);    var editComment = pageInfo.comment;    if (!editComment) {        editComment = "[No edit summary]";    }    editComment = editComment.replace(/'/g, "&#39;"); // 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.jsfunction 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;}// Display the last edit info to the right of the site subheadfunction 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.styleSheets[0];    sheet.insertRule('#coordinates { top: 2em !important; }',                      sheet.cssRules.length);}if (mw.config.get( 'skin' ) != "minerva") {    $(requestRevision);}