User:Opencooper/lastEdit.js

// 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.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, "'"); // HTML encode quotes

var lastEdit = " Last edited "

+ relativeTimestamp + " ago";

var lastEditor = "" + pageInfo.user + "";

// Can be filtered if needed

var pageTags = "";

if (pageInfo.tags.length > 0) {

pageTags = " (" + pageInfo.tags

+ ")";

}

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

var notice = "

" + noticeText

+ "

"

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 > 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 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.styleSheets[0];

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

sheet.cssRules.length);

}

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

$(requestRevision);

}