User:Opencooper/lastEdit-dev.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"); var pageInfo = response.query.pages[pageId].revisions[0]; 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 = " 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 // Could also just do mw.loader.load("moment") 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); }