User:Celeste/common.js: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
Loading my own JS scripts |
This is a long one |
||
Line 1: | Line 1: | ||
// Highlight admins |
|||
mw.loader.load('//en.uncyclopedia.co/w/index.php?title=User:Charlie/common.js&action=raw&ctype=text/javascript'); |
|||
;(function($, mw){ |
|||
$.getJSON(mw.config.get('wgScriptPath')+'/index.php?action=raw&ctype=application/json&title=User:Amalthea_(bot)/userhighlighter.js/sysop.js', function(data){ |
|||
ADMINHIGHLIGHT_EXTLINKS = window.ADMINHIGHLIGHT_EXTLINKS || false; |
|||
ADMINHIGHLIGHT_NAMESPACES = [-1,2,3]; |
|||
mw.loader.using(['mediawiki.util','mediawiki.Uri', 'mediawiki.Title'], function() { |
|||
mw.util.addCSS(".userhighlighter_sysop.userhighlighter_sysop {background-color: #00FFFF !important}"); |
|||
$('#bodyContent a').each(function(index,linkraw){ |
|||
try { |
|||
var link = $(linkraw); |
|||
var url = link.attr('href'); |
|||
if (!url || url.charAt(0) === '#') return; // Skip <a> elements that aren't actually links; skip anchors |
|||
if (url.lastIndexOf("http://", 0) != 0 && url.lastIndexOf("https://", 0) != 0 && url.lastIndexOf("/", 0) != 0) return; //require http(s) links, avoid "javascript:..." etc. which mw.Uri does not support |
|||
var uri = new mw.Uri(url); |
|||
if (!ADMINHIGHLIGHT_EXTLINKS && !$.isEmptyObject(uri.query)) return; // Skip links with query strings if highlighting external links is disabled |
|||
if (uri.host == 'en.wikipedia.org') { |
|||
var mwtitle = new mw.Title(mw.util.getParamValue('title',url) || decodeURIComponent(uri.path.slice(6))); // Try to get the title parameter of URL; if not available, remove '/wiki/' and use that |
|||
if ($.inArray(mwtitle.getNamespaceId(), ADMINHIGHLIGHT_NAMESPACES)>=0) { |
|||
var user = mwtitle.getMain().replace(/_/g," "); |
|||
if (mwtitle.getNamespaceId() === -1) user = user.replace('Contributions/',''); // For special page "Contributions/<username>" |
|||
if (data[user] == 1) { |
|||
link.addClass('userhighlighter_sysop'); // Override the above color by using `a.userhighlighter_sysop.userhighlighter_sysop {background-color: COLOR !important}` |
|||
} |
|||
} |
|||
} |
|||
} catch (e) { |
|||
// Sometimes we will run into unparsable links, so just log these and move on |
|||
window.console && console.error('Admin highlighter recoverable error',e.message); |
|||
} |
|||
}); |
|||
}); |
|||
}); |
|||
}(jQuery, mediaWiki)); |
|||
/** |
|||
* SkinSwitcher.js |
|||
* @file Allows for easy switching between seven main skins, and Timeless |
|||
* @author Eizzen <en.wikipedia.org/wiki/User_talk:Eizzen> |
|||
* @timeless added by Zombiebaron |
|||
* @license Apache-2.0 |
|||
* @external "jQuery" |
|||
* @external "mediawiki.util" |
|||
*/ |
|||
/*jslint browser, this:true */ |
|||
/*global mw, jQuery, window */ |
|||
mw.loader.using("mediawiki.util", function () { |
|||
"use strict"; |
|||
/** |
|||
* @class SkinSwitcher |
|||
* @classdesc The central SkinSwitcher class |
|||
*/ |
|||
var SkinSwitcher = { |
|||
lang: { |
|||
script: "Skin Switcher", |
|||
viewIn: "View this page in $1 skin" |
|||
}, |
|||
skins: { |
|||
"vector": "Vector", |
|||
"monobook": "MonoBook", |
|||
"modern": "Modern", |
|||
"minerva": "Minerva", |
|||
"minervaneue": "MinervaNeue", |
|||
"cologneblue": "CologneBlue", |
|||
"apioutput": "ApiOutput", |
|||
"timeless": "Timeless" |
|||
}, |
|||
/** |
|||
* @method constructElement |
|||
* @param {string} $selectedSkin |
|||
* @param {string} $itemText |
|||
* @returns {html} |
|||
*/ |
|||
constructElement: function ($selectedSkin, $itemText) { |
|||
var $href = window.location.href; |
|||
var $param = (window.location.search) |
|||
? "&" |
|||
: "?"; |
|||
return mw.html.element("li", { |
|||
"id": "skinSwitcher-li-" + $selectedSkin, |
|||
"class": "skinSwitcher-li" |
|||
}, new mw.html.Raw( |
|||
mw.html.element("a", { |
|||
"href": $href.replace(/#.*/, "") + |
|||
$param + jQuery.param({useskin: $selectedSkin}), |
|||
"title": this.lang.viewIn.replace("$1", $itemText), |
|||
"id": "skinSwitcher-a-" + $selectedSkin, |
|||
"class": "skinSwitcher-a" |
|||
}, $itemText) |
|||
)); |
|||
}, |
|||
/** |
|||
* @method assembleElements |
|||
* @returns {string[] } $elementsArray |
|||
*/ |
|||
assembleElements: function () { |
|||
var $elementsArray = []; |
|||
Object.keys(this.skins).forEach(function ($property) { |
|||
$elementsArray.push( |
|||
this.constructElement($property, this.skins[$property]) |
|||
); |
|||
}, this); |
|||
return $elementsArray; |
|||
}, |
|||
/** |
|||
* @method cloneMenu |
|||
* @param {string} $template |
|||
* @returns {void} |
|||
*/ |
|||
cloneMenu: function ($template) { |
|||
jQuery($template) |
|||
.clone() |
|||
.attr("id", "skinSwitcher") |
|||
.insertAfter($template); |
|||
jQuery("#skinSwitcher h3") |
|||
.html("<span>" + this.lang.script + "</span>"); |
|||
jQuery("#skinSwitcher ul").empty(); |
|||
}, |
|||
/** |
|||
* @method experimentalPlacement |
|||
* @returns {void} |
|||
*/ |
|||
experimentalPlacement: function () { |
|||
// Experimental CSS to center links horizontally in header |
|||
mw.util.addCSS( |
|||
"#skinSwitcher {" + |
|||
"display: flex;" + |
|||
"justify-content: center;" + |
|||
"flex-direction: row;" + |
|||
"align-items: center;" + |
|||
"}" + |
|||
".skinSwitcher-li {" + |
|||
"display:inline-block;" + |
|||
"margin:5px 25px 0 25px;" + |
|||
"}" |
|||
); |
|||
jQuery("<ul>", { |
|||
id: "skinSwitcher" |
|||
}).prependTo(".mw-body"); |
|||
}, |
|||
/** |
|||
* @method determinePlacement |
|||
* @param {string[] } $assembledElements |
|||
* @returns {void} |
|||
*/ |
|||
determinePlacement: function ($assembledElements) { |
|||
var $appendLocation; |
|||
switch (this.currentSkin) { |
|||
case "vector": |
|||
case "monobook": |
|||
case "modern": |
|||
case "cologneblue": |
|||
this.cloneMenu("#p-tb"); |
|||
$appendLocation = jQuery("#skinSwitcher ul"); |
|||
break; |
|||
case "minerva": |
|||
case "minervaneue": |
|||
case "apioutput": |
|||
this.experimentalPlacement(); |
|||
$appendLocation = jQuery("#skinSwitcher"); |
|||
break; |
|||
case "timeless": |
|||
} |
|||
$assembledElements.forEach(function ($element) { |
|||
jQuery($element).appendTo($appendLocation); |
|||
}); |
|||
}, |
|||
/** |
|||
* @method init |
|||
* @returns {void} |
|||
*/ |
|||
init: function () { |
|||
if ( |
|||
window.isSkinSwitcherLoaded || |
|||
jQuery("#skinSwitcher").length |
|||
) { |
|||
return; |
|||
} |
|||
window.isSkinSwitcherLoaded = true; |
|||
this.currentSkin = mw.config.get("skin"); |
|||
if (this.skins.hasOwnProperty(this.currentSkin)) { |
|||
delete this.skins[this.currentSkin]; |
|||
this.determinePlacement(this.assembleElements()); |
|||
} |
|||
} |
|||
}; |
|||
jQuery(document).ready(function () { |
|||
SkinSwitcher.init(); |
|||
}); |
|||
}); |
|||
// Creates a link and an html class to invert the screen |
|||
// Documentation at [[w:User:BrandonXLF/Invert]] |
|||
mw.loader.load('//en.uncyclopedia.co/w/index.php?title=User:Zombiebaron/Invert.css&action=raw&ctype=text/css', 'text/css'); // Import stylesheet |
|||
$(function() { |
|||
function update(){ // Function to update filter |
|||
if(mw.storage.get('InvertPage') == 'true'){ |
|||
$(document.body).addClass('inverted-colors'); // Add CSS |
|||
}else{ |
|||
$(document.body).removeClass('inverted-colors'); // Remove CSS |
|||
} |
|||
} |
|||
function set(e){ // Function to set web storage and update filter |
|||
e.preventDefault(); // Pervent default action |
|||
if(mw.storage.get('InvertPage') == 'true'){ |
|||
mw.storage.set('InvertPage','false'); |
|||
}else{ |
|||
mw.storage.set('InvertPage','true'); |
|||
} |
|||
update(); // Update fiter |
|||
} |
|||
var node = mw.util.addPortletLink( // Add link |
|||
'p-personal', |
|||
"https://en.wikipedia.org/wiki/User:BrandonXLF/Invert/select", // Backup link to URL |
|||
'🌛', |
|||
'night mode', |
|||
'enter night mode', |
|||
'n', |
|||
'#pt-mytalk' |
|||
); |
|||
update(); |
|||
$(node).on('click',function(e){ // Make the dark mode link work |
|||
set(e); |
|||
}); |
|||
$('#ToggleWikiInvert').click(function(e){ // Allow for id to toggle dark mode |
|||
set(e); |
|||
}); |
|||
$('.ToggleWikiInvert').click(function(e){ // Allow to CSS class to toggle dark mode |
|||
set(e); |
|||
}); |
|||
}); |
|||
mw.loader.using(['mediawiki.api', 'mediawiki.Title'], function () { |
|||
"use strict"; |
|||
var config = mw.config.get(['wgNamespaceNumber', 'wgTitle', 'wgUserGroups', 'skin']); |
|||
function removeBlanks(arr) { |
|||
var ret = []; |
|||
var i, len; |
|||
for (i = 0, len = arr.length; i < len; i++) { |
|||
var s = arr[i]; |
|||
s = s.trim(); |
|||
if (s) { |
|||
ret.push(s); |
|||
} |
|||
} |
|||
return ret; |
|||
} |
|||
function doMassDelete() { |
|||
document.getElementById("wpMassDeleteSubmit").disabled = true; |
|||
var articles = document.getElementById("wpMassDeletePages").value.split("\n"); |
|||
articles = removeBlanks(articles); |
|||
if (!articles.length) { |
|||
return; |
|||
} |
|||
var |
|||
api = new mw.Api(), |
|||
wpMassDeleteReasons = document.getElementById("wpMassDeleteReasons").value, |
|||
wpMassDeleteReason = document.getElementById("wpMassDeleteReason").value, |
|||
deleted = 0, |
|||
failed = [], |
|||
error = [], |
|||
deferreds = [], |
|||
reason = wpMassDeleteReasons == "other" ? |
|||
wpMassDeleteReason : |
|||
wpMassDeleteReasons + (wpMassDeleteReason ? " (" + wpMassDeleteReason + ")" : ""), |
|||
onSuccess = function () { |
|||
deleted++; |
|||
document.getElementById("wpMassDeleteSubmit").value = "(" + deleted + ")"; |
|||
}; |
|||
function makeDeleteFunc(article) { |
|||
return function () { |
|||
return $.Deferred(function (deferred) { |
|||
var promise = api.postWithToken('delete', { |
|||
format: 'json', |
|||
action: 'delete', |
|||
title: article, |
|||
reason: reason |
|||
}); |
|||
promise.done(onSuccess); |
|||
promise.fail(function (code, obj) { |
|||
failed.push(article); |
|||
error.push(obj.error.info); |
|||
}); |
|||
promise.always(function () { |
|||
deferred.resolve(); |
|||
}); |
|||
}); |
|||
}; |
|||
} |
|||
// Make a chain of deferred objects. We chain them rather than execute them in |
|||
// parallel so that we don't make 1000 simultaneous delete requests and bring the |
|||
// site down. We use deferred objects rather than the promise objects returned |
|||
// from the API request so that the chain continues even if some articles gave |
|||
// errors. |
|||
var deferred = makeDeleteFunc(articles[0])(); |
|||
for (var i = 1, len = articles.length; i < len; i++) { |
|||
deferred = deferred.then(makeDeleteFunc(articles[i])); |
|||
} |
|||
// Show the output and do cleanup once all the requests are done. |
|||
$.when(deferred).then(function () { |
|||
document.getElementById("wpMassDeleteSubmit").value = "Done (" + deleted + ")"; |
|||
if (failed.length) { |
|||
var $failedList = $('<ul>'); |
|||
for(var x = 0; x < failed.length; x++) { |
|||
// Link the titles in the "failed" array |
|||
var failedTitle = mw.Title.newFromText(failed[x]); |
|||
var $failedItem = $('<li>'); |
|||
if (failedTitle) { |
|||
$failedItem.append( $('<a>') |
|||
.attr('href', failedTitle.getUrl()) |
|||
.text(failed[x]) |
|||
); |
|||
} else { |
|||
$failedItem.text(failed[x]); |
|||
} |
|||
$failedItem.append(document.createTextNode(': ' + error[x])); |
|||
$failedList.append($failedItem); |
|||
} |
|||
$('#wpMassDeleteFailedContainer') |
|||
.append($('<br />')) |
|||
.append($('<b>') |
|||
.text('Failed deletions:') |
|||
) |
|||
.append($failedList); |
|||
} |
|||
}); |
|||
} |
|||
function massdeleteform() { |
|||
var bodyContent = (config.skin == "cologneblue" ? "article" : "bodyContent"); |
|||
document.getElementsByTagName("h1")[0].textContent = "Animum's mass-deletion tool"; |
|||
document.title = "Animum's mass-deletion tool - Wikipedia, the free encyclopedia"; |
|||
document.getElementById(bodyContent).innerHTML = '<h3 id="siteSub">From Wikipedia, the free encyclopedia</h3><br /><br />' + |
|||
'<form id="wpMassDelete" name="wpMassDelete">' + |
|||
'<b>If you abuse this tool, it\'s <i>your</i> fault, not mine.</b>' + |
|||
'<div id="wpMassDeleteFailedContainer"></div>' + |
|||
'<br /><br />' + |
|||
'Pages to delete (one on each line, please):<br />' + |
|||
'<textarea tabindex="1" accesskey="," name="wpMassDeletePages" id="wpMassDeletePages" rows="10" cols="80"></textarea>' + |
|||
'<br /><br /><table style="background-color:transparent">' + |
|||
'<tr><td>Common reasons:</td>' + |
|||
'<td><select id="wpMassDeleteReasons">' + |
|||
'<optgroup label="Other reason">' + |
|||
'<option value="other">Other reason</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="Criteria for speedy deletion">' + |
|||
'<optgroup label="General criteria">' + |
|||
'<option value="[[WP:CSD#G1|G1]]: [[WP:PN|Patent nonsense]], meaningless, or incomprehensible">G1: Patent nonsense</option>' + |
|||
'<option value="[[WP:CSD#G2|G2]]: Test page">G2: Test page</option>' + |
|||
'<option value="[[WP:CSD#G3|G3]]: [[WP:Vandalism|Vandalism]]">G3: Vandalism</option>' + |
|||
'<option value="[[WP:CSD#G3|G3]]: Blatant [[WP:Do not create hoaxes|hoax]]">G3: Hoax</option>' + |
|||
'<option value="[[WP:CSD#G4|G4]]: Recreation of a page that was [[WP:DEL|deleted]] per a [[WP:XFD|deletion discussion]]">G4: Repost</option>' + |
|||
'<option value="[[WP:CSD#G5|G5]]: Creation by a [[WP:BLOCK|blocked]] or [[WP:BAN|banned]] user in violation of block or ban">G5: Banned</option>' + |
|||
'<option value="[[WP:CSD#G6|G6]]: Housekeeping and routine (non-controversial) cleanup">G6: Maintenance</option>' + |
|||
'<option value="[[WP:CSD#G7|G7]]: One author who has requested deletion or blanked the page">G7: Author</option>' + |
|||
'<option value="[[WP:CSD#G8|G8]]: Page dependent on a deleted or nonexistent page">G8: Orphaned talk page</option>' + |
|||
'<option value="[[WP:CSD#G10|G10]]: [[WP:ATP|Attack page]] or negative unsourced [[WP:BLP|BLP]]">G10: Attack page</option>' + |
|||
'<option value="[[WP:CSD#G11|G11]]: Unambiguous [[WP:NOTADVERTISING|advertising]] or promotion">G11: Advertising</option>' + |
|||
'<option value="[[WP:CSD#G12|G12]]: Unambiguous [[WP:CV|copyright infringement]]">G12: Copyvio</option>' + |
|||
'<option value="[[WP:CSD#G13|G13]]: Abandoned draft or [[WP:AFC|Articles for Creation]] submission – to retrieve it, see [[WP:REFUND/G13]]">G13: Abandoned draft</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="Articles">' + |
|||
'<option value="[[WP:CSD#A1|A1]]: Short article without enough context to identify the subject">A1: No context</option>' + |
|||
'<option value="[[WP:CSD#A2|A2]]: Article in a foreign language that exists on another project">A2: Foreign</option>' + |
|||
'<option value="[[WP:CSD#A3|A3]]: Article that has no meaningful, substantive content">A3: No content</option>' + |
|||
'<option value="[[WP:CSD#A5|A5]]: Article that has been transwikied to another project">A5: Transwiki</option>' + |
|||
'<option value="[[WP:CSD#A7|A7]]: No credible indication of importance (individuals, animals, organizations, web content, events)">A7: Non-notable individual, animal, organization, web content, or event</option>' + |
|||
'<option value="[[WP:CSD#A9|A9]]: Music recording by redlinked artist and no indication of importance or significance">A9: Non-notable recording by redlinked artist</option>' + |
|||
'<option value="[[WP:CSD#A10|A10]]: Recently created article that duplicates an existing topic">A10: Recently created article that duplicates an existing topic</option>' + |
|||
'<option value="[[WP:CSD#A11|A11]]: [[Wikipedia:Wikipedia is not for things made up one day|Made up]] by article creator or an associate, and no indication of importance/significance">A11: Made up</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="Redirects">' + |
|||
'<option value="[[WP:CSD#R2|R2]]: Cross-[[WP:NS|namespace]] [[WP:R|redirect]] from mainspace">R2: Cross-namespace</option>' + |
|||
'<option value="[[WP:CSD#R3|R3]]: Recently created, implausible [[WP:R|redirect]]">R3: Implausible redirect</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="Images and other media">' + |
|||
'<option value="[[WP:CSD#F1|F1]]: File redundant to another on Wikipedia">F1: Redundant</option>' + |
|||
'<option value="[[WP:CSD#F2|F2]]: Corrupt or empty file, or a file description page for a file on Commons">F2: Corrupt, empty. or Commons</option>' + |
|||
'<option value="[[WP:CSD#F3|F3]]: File with improper license">F3: File with improper license</option>' + |
|||
'<option value="[[WP:CSD#F4|F4]]: Lack of licensing information">F4: Lack of licensing information</option>' + |
|||
'<option value="[[WP:CSD#F5|F5]]: Unused non-free media">F5: Unfree and unused</option>' + |
|||
'<option value="[[WP:CSD#F6|F6]]: Non-free file without [[WP:RAT|fair-use rationale]]">F6: No rationale</option>' + |
|||
'<option value="[[WP:CSD#F7|F7]]: [[WP:NFCC|Invalid]] fair-use claim">F7: Bad fair use rationale</option>' + |
|||
'<option value="[[WP:CSD#F8|F8]]: Media file available on Commons">F8: On Commons</option>' + |
|||
'<option value="[[WP:CSD#F9|F9]]: File [[WP:COPYVIO|copyright violation]]">F9: File copyvio</option>' + |
|||
'<option value="[[WP:CSD#F10|F10]]: Useless media file">F10: Useless media file</option>' + |
|||
'<option value="[[WP:CSD#F11|F11]]: No evidence of permission">F11: No permission</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="Categories">' + |
|||
'<option value="[[WP:CSD#C1|C1]]: Empty category">C1: Empty</option>' + |
|||
'<option value="[[WP:CSD#C2|C2]]: Speedy renaming">C2: Speedy rename</option>' + |
|||
'<option value="[[WP:CSD#G8|G8]]: Populated by deleted or retargeted template">G8: Populated by deleted or retargeted template</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="User namespace">' + |
|||
'<option value="[[WP:CSD#U1|U1]]: User request to delete page in own userspace">U1: User requests deletion</option>' + |
|||
'<option value="[[WP:CSD#U2|U2]]: Userpage or subpage of a nonexistent user">U2: Non-existent user</option>' + |
|||
'<option value="[[WP:CSD#U3|U3]]: [[WP:NFC|Non-free]] [[Help:Gallery|gallery]]">U3: Fair use gallery</option>' + |
|||
'<option value="[[WP:CSD#U5|U5]]: [[WP:NOTWEBHOST|Misuse of Wikipedia as a web host]]">U5: Misuse as webhost</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="Templates">' + |
|||
'<option value="[[WP:CSD#T3|T3]]: Unused, redundant template">T3: Redundant and unused</option>' + |
|||
'<option value="[[WP:CSD#G8|G8]]: Component or documentation of a deleted template">G8: component of deleted template</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="Portals">' + |
|||
'<option value="[[WP:CSD#P1|P1]]: [[WP:P|Portal]] page that would be subject to speedy deletion as an article">P1: Deletion as article</option>' + |
|||
'<option value="[[WP:CSD#P2|P2]]: [[WP:P|Portal]] without a substantial topic base">P2: Underpopulated</option>' + |
|||
'</optgroup>' + |
|||
'<optgroup label="Other">' + |
|||
'<option value="[[WP:PROD]]: Nominated for seven days with no objection">PRODded for more than 7 days without objection</option>' + |
|||
'<option value="[[WP:BLPPROD]]: Nominated for seven days with no reliable sources present in the article">BLPPRODded for more than seven days without a source</option>' + |
|||
'<option value="Listed at [[Wikipedia:Copyright problems]] for over seven days">Listed at Copyright problems for over seven days</option>' + |
|||
'</optgroup>' + |
|||
'</optgroup>' + |
|||
'</select></td></tr>' + |
|||
'<tr><td>Other/additional reason:</td>' + |
|||
'<td><input type="text" id="wpMassDeleteReason" name="wpMassDeleteReason" maxlength="255" /></td></tr>' + |
|||
'<tr><td><input type="button" id="wpMassDeleteSubmit" name="wpMassDeleteSubmit" value="Delete" /></td>' + |
|||
'</form>'; |
|||
document.getElementById("wpMassDeleteReasons").onchange = function() { |
|||
var maxlength = (document.getElementById("wpMassDeleteReasons").value == "other" ? 255 : 252-document.getElementById("wpMassDeleteReasons").value.length); //It's 252 because of the three characters (" ()") in addition to the selected summary. |
|||
document.getElementById("wpMassDeleteReason").setAttribute("maxlength", maxlength); |
|||
}; |
|||
document.getElementById("wpMassDeleteSubmit").addEventListener("click", function (e) { |
|||
doMassDelete(); |
|||
}); |
|||
} |
|||
if (config.wgNamespaceNumber == -1 && |
|||
config.wgTitle.toLowerCase() == "massdelete" && |
|||
/sysop/.test(config.wgUserGroups) |
|||
) { |
|||
massdeleteform(); |
|||
} |
|||
}); |
|||
/** This script contains the code required for loading [[User:Joeytje50/JWB.js]]. |
|||
* All other code is located at that page. |
|||
*/ |
|||
//Idea by [[User:Epicgenius]] |
|||
$.when(mw.loader.using(['mediawiki.util'], $.ready)).done( function() { |
|||
mw.util.addPortletLink("p-tb", mw.config.get('wgArticlePath').replace('$1', "Project:AutoWikiBrowser/Script"), "JS Wiki Browser", "tb-awbscript", "Run Javascript Wiki Browser"); |
|||
}); |
|||
if (mw.config.get('wgCanonicalNamespace')+':'+mw.config.get('wgTitle') === 'Project:AutoWikiBrowser/Script' && mw.config.get('wgAction') == 'view') |
|||
mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js&action=raw&ctype=text/javascript'); |
|||
function DateSub(Date1,Date2) { |
|||
var timeDifference = Date2 - Date1; |
|||
var minutesAgo = Math.round(timeDifference / 1000 / 60); |
|||
var hoursAgo = 0 |
|||
var daysAgo = 0 |
|||
var hoursText = 'hour' |
|||
var daysText = 'day' |
|||
while (minutesAgo >= 60) { |
|||
minutesAgo = minutesAgo-60; |
|||
hoursAgo++; |
|||
} |
|||
while (hoursAgo >= 24) { |
|||
hoursAgo = hoursAgo-24; |
|||
daysAgo++; |
|||
} |
|||
if (hoursAgo!=1) |
|||
hoursText = hoursText + 's'; |
|||
if (daysAgo!=1) |
|||
daysText = daysText + 's'; |
|||
if (daysAgo > 0) { |
|||
if (hoursAgo > 0) { |
|||
if (minutesAgo <=1 ) { |
|||
minutesAgo = daysAgo + ' ' + daysText + ', ' + hoursAgo + ' ' + hoursText; |
|||
} |
|||
else { |
|||
minutesAgo = daysAgo + ' ' + daysText + ', ' + hoursAgo + ' ' + hoursText + ', ' + minutesAgo + ' minutes'; |
|||
} |
|||
} |
|||
else { |
|||
if (minutesAgo <=1 ) { |
|||
minutesAgo = daysAgo + ' ' + daysText; |
|||
} |
|||
else { |
|||
minutesAgo = daysAgo + ' ' + daysText + ', ' + minutesAgo + ' minutes'; |
|||
} |
|||
} |
|||
} |
|||
else { |
|||
if (hoursAgo > 0) { |
|||
if (minutesAgo <=1 ) { |
|||
minutesAgo = hoursAgo + ' ' + hoursText; |
|||
} |
|||
else { |
|||
minutesAgo = hoursAgo + ' ' + hoursText + ', ' + minutesAgo + ' minutes'; |
|||
} |
|||
} |
|||
else { |
|||
if (minutesAgo <=1 ) { |
|||
minutesAgo = 'Less than a minute'; |
|||
} |
|||
else { |
|||
minutesAgo = minutesAgo + ' minutes'; |
|||
} |
|||
} |
|||
} |
|||
return minutesAgo; |
|||
} |
|||
if (document.getElementById('mw-diff-otitle1') || document.getElementById('mw-diff-ntitle1')) { |
|||
function convertTimestampStringToDate(id) { |
|||
var timestamp = document.getElementById(id).firstChild.firstChild.firstChild.nodeValue; |
|||
var str = /evision as of /g |
|||
str.lastIndex = 0; |
|||
str.test(timestamp) |
|||
var date = timestamp.substring(str.lastIndex) |
|||
/* |
|||
All this following bogus crap is because Safari |
|||
doesn't recognize Wikipedia's date format. |
|||
Every other browser can just use the date string |
|||
object above, but Safari is retarded |
|||
*/ |
|||
var str1 = /[A-z]+/ |
|||
var str2 = /\d+/g |
|||
var monthtext = date.match(str1); |
|||
var testdate = date.match(str2); |
|||
var hours = testdate[0]; |
|||
var minutes = testdate[1]; |
|||
var day = testdate[2]; |
|||
var year = testdate[3]; |
|||
var months = ['January','February','March','April','May','June','July','August','September','October','November','December']; |
|||
for (i in months) { |
|||
if (monthtext==months[i]) { |
|||
var month = i; |
|||
break; |
|||
} |
|||
i++ |
|||
} |
|||
/* |
|||
End Safari madness |
|||
*/ |
|||
date = new Date(year,month,day,hours,minutes); |
|||
return date; |
|||
} |
|||
var leftNode = document.getElementById('mw-diff-otitle1'); |
|||
var rightNode = document.getElementById('mw-diff-ntitle1'); |
|||
var firstDate = convertTimestampStringToDate('mw-diff-otitle1'); |
|||
var secondDate = convertTimestampStringToDate('mw-diff-ntitle1'); |
|||
function TimeBetweenDiffs() { |
|||
var minutesAgo = DateSub(firstDate,secondDate); |
|||
var newNode = document.createElement('span'); |
|||
newNode.setAttribute('style', 'font-weight:bold; color:red;') |
|||
newNode.appendChild(document.createTextNode('(' + minutesAgo + ' later)')); |
|||
newNode.appendChild(document.createElement('br')); |
|||
rightNode.insertBefore(newNode, rightNode.firstChild); |
|||
} |
|||
function TimeSinceDiff() { |
|||
var DateNow = new Date(); |
|||
var minutesAgo1 = DateSub(firstDate,DateNow); |
|||
var minutesAgo2 = DateSub(secondDate,DateNow); |
|||
document.getElementById('mw-diff-otitle1').title=minutesAgo1 + ' ago'; |
|||
document.getElementById('mw-diff-ntitle1').title=minutesAgo2 + ' ago'; |
|||
var t = setTimeout("TimeSinceDiff()",60000); |
|||
} |
|||
$(window).load(TimeSinceDiff); // Adds time since displayed diffs as tooltip |
|||
$(window).load(TimeBetweenDiffs); // Adds time between diffs |
|||
} |
|||
// Modified from [[User:Gary King/link intermediate revisions.js]] |
|||
if (typeof(unsafeWindow) != 'undefined') |
|||
{ |
|||
var console = unsafeWindow.console; |
|||
importScriptURI = unsafeWindow.importScriptURI; |
|||
mw = unsafeWindow.mw; |
|||
} |
|||
mw.loader.using( ['mediawiki.util'], function () { |
|||
$(createDiffMultiLink); |
|||
}); |
|||
function createDiffMultiLink() |
|||
{ |
|||
if (!mw.util.getParamValue('diff') || !mw.util.getParamValue('oldid')) return false; |
|||
$.get(mw.config.get('wgScriptPath') + '/api.php', { |
|||
action: 'query', |
|||
prop: 'revisions', |
|||
titles: mw.config.get('wgPageName'), |
|||
rvprop: 'timestamp', |
|||
rvstartid: mw.util.getParamValue('diff'), |
|||
rvendid: mw.util.getParamValue('oldid'), |
|||
rvlimit: '5000', |
|||
format: 'json', |
|||
indexpageids: 1 |
|||
}, diffMultiCallback); |
|||
} |
|||
function twoDigitPadding(integer) |
|||
{ |
|||
var string = integer.toString(); |
|||
if (string.length == 1) return '0' + integer; |
|||
else return integer; |
|||
} |
|||
function diffMultiCallback(response) |
|||
{ |
|||
if (!response['query'] || !response['query']['pages'] || response['query']['pageids'][0] == -1) return false; |
|||
var diffMultis = $('#bodyContent .diff-multi'); |
|||
if (!diffMultis.length) return false; |
|||
var pageId = response['query']['pageids'][0]; |
|||
var page = response['query']['pages'][pageId]; |
|||
var revisions = page['revisions']; |
|||
if (!revisions) return false; |
|||
var oldid = new Date(revisions[revisions.length - 1]['timestamp']); |
|||
oldid = oldid.getUTCFullYear().toString() + twoDigitPadding(oldid.getUTCMonth() + 1).toString() + oldid.getUTCDate().toString() + twoDigitPadding(oldid.getUTCHours() + 1).toString() + twoDigitPadding(oldid.getUTCMinutes() + 1).toString() + twoDigitPadding(oldid.getUTCSeconds() + 1).toString(); |
|||
var diff = new Date(revisions[0]['timestamp']); |
|||
diff = diff.getUTCFullYear().toString() + twoDigitPadding(diff.getUTCMonth() + 1).toString() + diff.getUTCDate().toString() + twoDigitPadding(diff.getUTCHours() + 1).toString() + twoDigitPadding(diff.getUTCMinutes() + 1).toString() + twoDigitPadding(diff.getUTCSeconds() + 1).toString(); |
|||
var diffMulti = diffMultis.eq(0); |
|||
var a = $('<a href="' + mw.config.get('wgScript') + '?title=' + mw.config.get('wgPageName') + '&action=history&offset=' + diff + '&limit=' + revisions.length + '"></a>').append(diffMulti.contents().eq(0)); |
|||
diffMulti.append(a); |
|||
} |
|||
if (typeof inspectText == "undefined") |
|||
{ |
|||
inspectText = "inspect diff"; |
|||
} |
|||
if (typeof showText == "undefined") |
|||
{ |
|||
showText = "show diff"; |
|||
} |
|||
if (typeof hideText == "undefined") |
|||
{ |
|||
hideText = "hide diff"; |
|||
} |
|||
var specialPageName = mw.config.get("wgCanonicalSpecialPageName"); |
|||
if (specialPageName == "Watchlist" || |
|||
specialPageName == "Recentchanges" || |
|||
specialPageName == "Contributions" || |
|||
mw.config.get("wgAction") == "history" || |
|||
specialPageName == "Recentchangeslinked" || |
|||
(specialPageName == "Blankpage" && mw.config.get("wgTitle").indexOf("section-watchlist") > 0)) |
|||
{ |
|||
function inspectionEachHelper(index, element) |
|||
{ |
|||
var findString; |
|||
if (mw.config.get("wgAction") == "history" || $(element).hasClass("mw-enhanced-rc-nested")) |
|||
{ |
|||
findString = 'a:contains("prev")'; |
|||
} |
|||
else |
|||
{ |
|||
findString = 'a:contains("diff")'; |
|||
} |
|||
var regex; |
|||
if (specialPageName == "Contributions") |
|||
{ |
|||
regex = /&oldid=(\d+)$/; |
|||
} |
|||
else |
|||
{ |
|||
regex = /(?:&diff=(\d+)&oldid=|&diff=prev&oldid=(\d+))/; |
|||
} |
|||
var diffLink = $(element).find(findString); |
|||
if (diffLink.length > 0) |
|||
{ |
|||
var regexResult = regex.exec(diffLink[0].href); |
|||
if (regexResult != null && regexResult.length >= 2) |
|||
{ |
|||
var diffID = regexResult[1] || regexResult[2]; |
|||
//don't re-add if it already exists |
|||
if ($("#" + diffID).length > 0) |
|||
{ |
|||
return; |
|||
} |
|||
var inlineDiffButton; |
|||
if (typeof inlineDiffBigUI === "undefined") |
|||
{ |
|||
inlineDiffButton = document.createElement("a"); |
|||
inlineDiffButton.href = "#"; |
|||
inlineDiffButton.innerHTML = '<b><span style="color:black;"> [</span><span style="color:#008A00;">' + inspectText + '</span><span style="color:black;">] </span></b>'; |
|||
} |
|||
else |
|||
{ |
|||
inlineDiffButton = document.createElement("input"); |
|||
inlineDiffButton.type = "button"; |
|||
inlineDiffButton.value = "Inspect edit"; |
|||
} |
|||
inlineDiffButton.id = diffID; |
|||
$(inlineDiffButton).addClass("inspectDiffButton"); |
|||
$(inlineDiffButton).click(function () |
|||
{ |
|||
return inspectWatchlistDiff(this); |
|||
} |
|||
); |
|||
if ($(element).find("tr:first").length == 0) |
|||
{ |
|||
$(element).find(".mw-changeslist-separator:first").css("padding-right", 0); |
|||
$(inlineDiffButton).insertAfter($(element).find(".mw-changeslist-separator:first")); |
|||
} |
|||
else |
|||
{ |
|||
$(inlineDiffButton).insertBefore($(element).find(".mw-title")); |
|||
$(inlineDiffButton).addClass("mw-enhanced-rc-diff"); |
|||
/* |
|||
$(element).find("tr:first").append("<td></td>"); |
|||
$(element).find("tr:first>td:last").append(inlineDiffButton); |
|||
*/ |
|||
} |
|||
} |
|||
} |
|||
} |
|||
function addWatchlistInspectionBoxes() |
|||
{ |
|||
mw.loader.using("mediawiki.diff.styles").done(function() |
|||
{ |
|||
var entries = $("#mw-content-text table.mw-enhanced-rc"); |
|||
if (entries.length == 0) |
|||
{ |
|||
$("#mw-content-text ul").each(function (ind, el) |
|||
{ |
|||
$(el).children("li").each(inspectionEachHelper); |
|||
}); |
|||
} |
|||
else |
|||
{ |
|||
entries.each(inspectionEachHelper); |
|||
$("td.mw-enhanced-rc-nested").each(inspectionEachHelper); |
|||
} |
|||
}); |
|||
} |
|||
function inspectWatchlistDiff(button) |
|||
{ |
|||
mw.loader.using(['mediawiki.api']).done(function () |
|||
{ |
|||
var mwApi = new mw.Api(); |
|||
mwApi.get( |
|||
{ |
|||
action: "query", |
|||
prop: "revisions", |
|||
format: "json", |
|||
rvprop: "timestamp", |
|||
rvdiffto: "prev", |
|||
revids: button.id |
|||
} |
|||
).done(function (response) |
|||
{ |
|||
if (response == null) |
|||
{ |
|||
alert("Request failed!"); |
|||
return false; |
|||
} |
|||
var diffString = response.query.pages[Object.keys(response.query.pages)[0]].revisions[0].diff["*"]; |
|||
if (diffString == null) |
|||
{ |
|||
alert("Request failed!"); |
|||
return false; |
|||
} |
|||
var newTable = document.createElement("table"); |
|||
newTable.className = "diff"; |
|||
$(newTable).html('<colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup>'); |
|||
$(newTable).append(diffString); |
|||
diffParent = null; |
|||
if ($("#" + button.id).hasClass("mw-enhanced-rc-diff")) |
|||
{ |
|||
$("#" + button.id).parents("table").after(newTable); |
|||
} |
|||
else |
|||
{ |
|||
diffParent = $("#" + button.id).parent(); |
|||
diffParent.append(newTable); |
|||
} |
|||
newTable.id = button.id + "display"; |
|||
mw.hook('new-diff-table').fire(newTable); |
|||
$(button).unbind("click"); |
|||
if (typeof inlineDiffBigUI === "undefined") |
|||
{ |
|||
$(button).html('<b><span style="color:black;"> [</span><span style="color:#008A00;">' + hideText + '</span><span style="color:black;">] </span></b>'); |
|||
$(button).click(function () |
|||
{ |
|||
return hideSmallEditInspection(this); |
|||
} |
|||
); |
|||
} |
|||
else |
|||
{ |
|||
$(button).attr("value", "Hide edit"); |
|||
$(button).click(function () |
|||
{ |
|||
return hideEditInspection(this); |
|||
} |
|||
); |
|||
} |
|||
if (typeof markAsViewed != "undefined" && markAsViewed) |
|||
{ |
|||
mwApi.postWithToken('csrf', |
|||
{ |
|||
action: "setnotificationtimestamp", |
|||
revids: button.id |
|||
} |
|||
).done(function (data) |
|||
{ |
|||
if (diffParent != null) |
|||
{ |
|||
diffParent.removeClass("mw-changeslist-line-watched"); |
|||
diffParent.addClass("mw-changeslist-line-not-watched"); |
|||
} |
|||
} |
|||
); |
|||
} |
|||
} |
|||
); |
|||
} |
|||
); |
|||
return false; |
|||
} |
|||
function showEditInspection(button) |
|||
{ |
|||
$("#" + button.id + "display").css("display", ""); |
|||
$(button).attr("value", "Hide edit"); |
|||
$(button).unbind("click"); |
|||
$(button).click(function () |
|||
{ |
|||
return hideEditInspection(this); |
|||
} |
|||
); |
|||
return false; |
|||
} |
|||
function hideEditInspection(button) |
|||
{ |
|||
$("#" + button.id + "display").css("display", "none"); |
|||
$(button).attr("value", "Show edit"); |
|||
$(button).unbind("click"); |
|||
$(button).click(function () |
|||
{ |
|||
return showEditInspection(this); |
|||
} |
|||
); |
|||
return false; |
|||
} |
|||
function showSmallEditInspection(button) |
|||
{ |
|||
$("#" + button.id + "display").css("display", ""); |
|||
$(button).html('<b><span style="color:black;"> [</span><span style="color:#008A00;">' + hideText + '</span><span style="color:black;">] </span></b>'); |
|||
$(button).unbind("click"); |
|||
$(button).click(function () |
|||
{ |
|||
return hideSmallEditInspection(this); |
|||
} |
|||
); |
|||
return false; |
|||
} |
|||
function hideSmallEditInspection(button) |
|||
{ |
|||
$("#" + button.id + "display").css("display", "none"); |
|||
$(button).html('<b><span style="color:black;"> [</span><span style="color:#008A00;">' + showText + '</span><span style="color:black;">] </span></b>'); |
|||
$(button).unbind("click"); |
|||
$(button).click(function () |
|||
{ |
|||
return showSmallEditInspection(this); |
|||
} |
|||
); |
|||
return false; |
|||
} |
|||
mw.hook('wikipage.content').add(addWatchlistInspectionBoxes); |
|||
} |
|||
/* |
|||
* Pages Created -- finds all the pages created by a user |
|||
* see [[User:Jfmantis/pagesCreated]] |
|||
*/ |
|||
(function() { |
|||
/* |
|||
* create <li> list item for one article |
|||
* right now, just a link to the page & the date |
|||
*/ |
|||
function makeCreatedPageItem(contrib) { |
|||
var item = document.createElement("li"); |
|||
var link = document.createElement("a"); |
|||
link.href = mw.util.getUrl(contrib.title); |
|||
link.innerHTML = contrib.title; |
|||
item.appendChild(link); |
|||
item.innerHTML += " . . " + new Date(contrib.timestamp).toDateString(); |
|||
return item; |
|||
} |
|||
/* |
|||
* looks through all of a user's non-minor namespace 0 edits, |
|||
* looking for edits tagged as "new" |
|||
* |
|||
* the arguments all in one object so that it can be expanded |
|||
* in the future without having to add a bunch more parameters |
|||
*/ |
|||
function findPagesCreated(bundle) { |
|||
bundle.api.get({ |
|||
action: "query", |
|||
rawcontinue: '', |
|||
list: "usercontribs", |
|||
ucuser: bundle.user, |
|||
ucstart: bundle.start, |
|||
ucprop: "flags|title|timestamp", |
|||
ucshow: "!minor", |
|||
uclimit: 500, |
|||
ucnamespace: 0 |
|||
}).done( function(data) { |
|||
$.each(data.query.usercontribs, function(index, contrib) { |
|||
if (contrib.new != undefined) { |
|||
bundle.list.appendChild(makeCreatedPageItem(contrib)); |
|||
bundle.count++; |
|||
} |
|||
}); |
|||
if (data["query-continue"]) { // more contributions |
|||
bundle.start = data["query-continue"].usercontribs.ucstart |
|||
setTimeout(function() { findPagesCreated(bundle); }, 3000); |
|||
} else { // done |
|||
$("#pc-status")[0].innerHTML = "<br />" + bundle.user + " has created " + bundle.count + " articles"; |
|||
} |
|||
}).fail( function(error) { |
|||
alert(error); |
|||
}); |
|||
} |
|||
/* |
|||
* change title, clear content area, etc. |
|||
*/ |
|||
function setupPagesCreated(user) { |
|||
// set new title |
|||
mw.util.$content.find("#firstHeading")[0].innerHTML = "Pages created by " + user; |
|||
// status bar (text + waiting gif) |
|||
var status = document.createElement("span"); |
|||
status.id = "pc-status"; |
|||
status.innerHTML = "<br />Fetching user data..."; |
|||
// heading for results |
|||
var heading = document.createElement("h3"); |
|||
heading.innerHTML = "Articles"; |
|||
// list of results |
|||
var articles = document.createElement("ul"); |
|||
articles.id = "pc-articles"; |
|||
var body = mw.util.$content.find("#bodyContent")[0]; |
|||
body.innerHTML = ""; |
|||
body.appendChild(status); |
|||
body.appendChild(heading); |
|||
body.appendChild(articles); |
|||
var api = new mw.Api(); |
|||
api.get({ |
|||
action: "query", |
|||
list: "users", |
|||
ususers: user, |
|||
usprop: "editcount" |
|||
}).done(function(data) { |
|||
// 500 results per request, 1 request every 3 seconds |
|||
var count = data.query.users[0].editcount; |
|||
status.innerHTML = "<br />User has " + count + " edits, this should take less than "; |
|||
status.innerHTML += (3 * Math.round(count / 500)) + " seconds "; |
|||
var waitgif = document.createElement("img"); |
|||
waitgif.src = "https://upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif"; |
|||
status.appendChild(waitgif); |
|||
findPagesCreated( |
|||
{"api": api, |
|||
"user": user, |
|||
"list": articles, |
|||
"start": "", |
|||
"count": 0} |
|||
); |
|||
}).fail(function(error) { |
|||
alert(error); |
|||
}); |
|||
return false; |
|||
} |
|||
mw.loader.using("mediawiki.util", function() { |
|||
// add portlet when page is User or User_talk, but not on subpages |
|||
if ((wgNamespaceNumber == 2 || wgNamespaceNumber == 3) && (wgTitle.indexOf("/") == -1)) { |
|||
if (mw.util.getParamValue("pagesCreated")) { |
|||
setupPagesCreated(wgTitle); |
|||
} else { |
|||
mw.util.addPortletLink("p-tb", |
|||
document.location.toString() + "?pagesCreated=true", |
|||
"Pages created", "pc-pages", |
|||
"Get a list of all pages created by this user" |
|||
); |
|||
} |
|||
} |
|||
}); |
|||
})(); |
|||
if ( mw.config.get( "wgAction" ) === "history" ) { |
|||
$( document ).ready( function() { |
|||
"use strict"; |
|||
const HC = document.getElementById( "mw-history-compare" ); |
|||
if ( HC ) { |
|||
const PH = document.getElementById( "pagehistory" ), |
|||
BTNS = HC.querySelectorAll( 'input[value="Compare selected revisions"]' ), |
|||
TOP = BTNS[ 0 ], |
|||
BTM = BTNS[ 1 ], |
|||
encapsulate = function() { |
|||
const LSB = PH.querySelector( 'li.selected.before' ), |
|||
LSA = PH.querySelector( 'li.selected.after' ); |
|||
if ( TOP && LSB ) { |
|||
PH.insertBefore( TOP, LSB ); |
|||
} |
|||
if ( BTM && LSA ) { |
|||
const NES = LSA.nextElementSibling; |
|||
if ( NES ) { |
|||
PH.insertBefore( BTM, NES ); |
|||
} else { |
|||
PH.appendChild( BTM ); |
|||
} |
|||
} |
|||
/* move buttons added by User:Enterprisey/cv-revdel.js along with the "Compare selected revisions" buttons */ |
|||
HC.querySelectorAll( "button.cv-rd-add-range" ).forEach( function( b, i ) { PH.insertBefore( b, BTNS[ i ] ) } ); |
|||
}; |
|||
encapsulate(); |
|||
HC.addEventListener( "change", encapsulate ); |
|||
} |
|||
} ); |
|||
} |
|||
/* Rollback all */ |
|||
$( function() { |
|||
if ( $('span.mw-rollback-link')[0] && mw.config.get( 'wgCanonicalSpecialPageName' ) == 'Contributions' ) |
|||
mw.util.addPortletLink( 'p-cactions', 'javascript:rollbackEverything()', "rollback all", "ca-rollbackeverything", "Rollback all top edits displayed here" ); |
|||
} ); |
|||
function rollbackEverything() { |
|||
for ( var i in document.links ) { |
|||
if ( document.links[i].href.indexOf( 'action=rollback' ) != -1 ) |
|||
window.open( document.links[i].href+'&bot=1' ); |
|||
} |
|||
} |
|||
/* Interface modifications */ |
|||
$( function(){ |
|||
// These add action tabs at the top of a page |
|||
if( mw.config.get( 'wgNamespaceNumber' ) > -1 ) { |
|||
mw.util.addPortletLink( 'p-cactions', '/wiki/Special:PrefixIndex/' + wgPageName, 'Subpages', 'd-subpages', 'List subpages and other pages starting with this title' ); |
|||
mw.util.addPortletLink( 'p-cactions', '/w/index.php?title=Special:Log&page=' + wgPageName, 'Logs', 'd-logs', 'Show any relevant logs for this title' ); |
|||
mw.util.addPortletLink( 'p-cactions', '/wiki/' + wgPageName + '?action=purge', 'Purge', 'd-purge', 'Purge the current page' ); |
|||
// mw.util.addPortletLink( 'p-cactions', '/wiki/' + wgPageName + '?useskin=vector', 'Vector', 'd-vector', 'View page in the Vector skin' ); |
|||
} |
|||
// These add personal links at the top right of every page |
|||
mw.util.addPortletLink( 'p-personal', '/wiki/Special:ListFiles/' + wgUserName, 'Uploads', 'pt-uploads' ); |
|||
mw.util.addPortletLink( 'p-personal', '/wiki/Special:Log/' + wgUserName, 'Logs', 'pt-logs' ); |
|||
mw.util.addPortletLink( 'p-personal', '/wiki/Special:PrefixIndex/User:'+ wgUserName, 'Subpages', 'pt-subpages' ); |
|||
$("#pt-logout").hide(); |
|||
// These add toolbox links to the sidebar of every page |
|||
mw.util.addPortletLink( 'p-tb', 'https://en.uncyclopedia.co/wiki/User:Zombiebaron/2019.js', '2019.js Project', 't-2019' ); |
|||
mw.util.addPortletLink( 'p-tb', 'https://en.uncyclopedia.co/wiki/User:Zombiebaron/Images', 'Images', 't-images' ); |
|||
mw.util.addPortletLink( 'p-tb', 'https://en.uncyclopedia.co/wiki/Special:MassDelete', 'mass delete', 't-massdelete' ); |
|||
$('#n-currentevents').after($('#n-recentchanges')); |
|||
$('#n-recentchanges').css({ 'font-weight': 'bold' }); |
|||
} ); |
|||
/* Edit counter in top bar - by Wikipedia:User:Mvolz */ |
|||
$(document).ready( function () { |
|||
mw.loader.using( 'mediawiki.user', function() { |
|||
( new mw.Api() ).get( { |
|||
action: 'query', |
|||
meta: 'userinfo', |
|||
uiprop: 'editcount' |
|||
} ).done( function( result ) { |
|||
document.getElementById( 'pt-mycontris' ).append( ' (' + result.query.userinfo.editcount + ')' ); |
|||
} ); |
|||
} ); |
|||
} ); |
Revision as of 03:52, 9 January 2021
// Highlight admins
;(function($, mw){
$.getJSON(mw.config.get('wgScriptPath')+'/index.php?action=raw&ctype=application/json&title=User:Amalthea_(bot)/userhighlighter.js/sysop.js', function(data){
ADMINHIGHLIGHT_EXTLINKS = window.ADMINHIGHLIGHT_EXTLINKS || false;
ADMINHIGHLIGHT_NAMESPACES = [-1,2,3];
mw.loader.using(['mediawiki.util','mediawiki.Uri', 'mediawiki.Title'], function() {
mw.util.addCSS(".userhighlighter_sysop.userhighlighter_sysop {background-color: #00FFFF !important}");
$('#bodyContent a').each(function(index,linkraw){
try {
var link = $(linkraw);
var url = link.attr('href');
if (!url || url.charAt(0) === '#') return; // Skip <a> elements that aren't actually links; skip anchors
if (url.lastIndexOf("http://", 0) != 0 && url.lastIndexOf("https://", 0) != 0 && url.lastIndexOf("/", 0) != 0) return; //require http(s) links, avoid "javascript:..." etc. which mw.Uri does not support
var uri = new mw.Uri(url);
if (!ADMINHIGHLIGHT_EXTLINKS && !$.isEmptyObject(uri.query)) return; // Skip links with query strings if highlighting external links is disabled
if (uri.host == 'en.wikipedia.org') {
var mwtitle = new mw.Title(mw.util.getParamValue('title',url) || decodeURIComponent(uri.path.slice(6))); // Try to get the title parameter of URL; if not available, remove '/wiki/' and use that
if ($.inArray(mwtitle.getNamespaceId(), ADMINHIGHLIGHT_NAMESPACES)>=0) {
var user = mwtitle.getMain().replace(/_/g," ");
if (mwtitle.getNamespaceId() === -1) user = user.replace('Contributions/',''); // For special page "Contributions/<username>"
if (data[user] == 1) {
link.addClass('userhighlighter_sysop'); // Override the above color by using `a.userhighlighter_sysop.userhighlighter_sysop {background-color: COLOR !important}`
}
}
}
} catch (e) {
// Sometimes we will run into unparsable links, so just log these and move on
window.console && console.error('Admin highlighter recoverable error',e.message);
}
});
});
});
}(jQuery, mediaWiki));
/**
* SkinSwitcher.js
* @file Allows for easy switching between seven main skins, and Timeless
* @author Eizzen <en.wikipedia.org/wiki/User_talk:Eizzen>
* @timeless added by Zombiebaron
* @license Apache-2.0
* @external "jQuery"
* @external "mediawiki.util"
*/
/*jslint browser, this:true */
/*global mw, jQuery, window */
mw.loader.using("mediawiki.util", function () {
"use strict";
/**
* @class SkinSwitcher
* @classdesc The central SkinSwitcher class
*/
var SkinSwitcher = {
lang: {
script: "Skin Switcher",
viewIn: "View this page in $1 skin"
},
skins: {
"vector": "Vector",
"monobook": "MonoBook",
"modern": "Modern",
"minerva": "Minerva",
"minervaneue": "MinervaNeue",
"cologneblue": "CologneBlue",
"apioutput": "ApiOutput",
"timeless": "Timeless"
},
/**
* @method constructElement
* @param {string} $selectedSkin
* @param {string} $itemText
* @returns {html}
*/
constructElement: function ($selectedSkin, $itemText) {
var $href = window.location.href;
var $param = (window.location.search)
? "&"
: "?";
return mw.html.element("li", {
"id": "skinSwitcher-li-" + $selectedSkin,
"class": "skinSwitcher-li"
}, new mw.html.Raw(
mw.html.element("a", {
"href": $href.replace(/#.*/, "") +
$param + jQuery.param({useskin: $selectedSkin}),
"title": this.lang.viewIn.replace("$1", $itemText),
"id": "skinSwitcher-a-" + $selectedSkin,
"class": "skinSwitcher-a"
}, $itemText)
));
},
/**
* @method assembleElements
* @returns {string[] } $elementsArray
*/
assembleElements: function () {
var $elementsArray = [];
Object.keys(this.skins).forEach(function ($property) {
$elementsArray.push(
this.constructElement($property, this.skins[$property])
);
}, this);
return $elementsArray;
},
/**
* @method cloneMenu
* @param {string} $template
* @returns {void}
*/
cloneMenu: function ($template) {
jQuery($template)
.clone()
.attr("id", "skinSwitcher")
.insertAfter($template);
jQuery("#skinSwitcher h3")
.html("<span>" + this.lang.script + "</span>");
jQuery("#skinSwitcher ul").empty();
},
/**
* @method experimentalPlacement
* @returns {void}
*/
experimentalPlacement: function () {
// Experimental CSS to center links horizontally in header
mw.util.addCSS(
"#skinSwitcher {" +
"display: flex;" +
"justify-content: center;" +
"flex-direction: row;" +
"align-items: center;" +
"}" +
".skinSwitcher-li {" +
"display:inline-block;" +
"margin:5px 25px 0 25px;" +
"}"
);
jQuery("<ul>", {
id: "skinSwitcher"
}).prependTo(".mw-body");
},
/**
* @method determinePlacement
* @param {string[] } $assembledElements
* @returns {void}
*/
determinePlacement: function ($assembledElements) {
var $appendLocation;
switch (this.currentSkin) {
case "vector":
case "monobook":
case "modern":
case "cologneblue":
this.cloneMenu("#p-tb");
$appendLocation = jQuery("#skinSwitcher ul");
break;
case "minerva":
case "minervaneue":
case "apioutput":
this.experimentalPlacement();
$appendLocation = jQuery("#skinSwitcher");
break;
case "timeless":
}
$assembledElements.forEach(function ($element) {
jQuery($element).appendTo($appendLocation);
});
},
/**
* @method init
* @returns {void}
*/
init: function () {
if (
window.isSkinSwitcherLoaded ||
jQuery("#skinSwitcher").length
) {
return;
}
window.isSkinSwitcherLoaded = true;
this.currentSkin = mw.config.get("skin");
if (this.skins.hasOwnProperty(this.currentSkin)) {
delete this.skins[this.currentSkin];
this.determinePlacement(this.assembleElements());
}
}
};
jQuery(document).ready(function () {
SkinSwitcher.init();
});
});
// Creates a link and an html class to invert the screen
// Documentation at [[w:User:BrandonXLF/Invert]]
mw.loader.load('//en.uncyclopedia.co/w/index.php?title=User:Zombiebaron/Invert.css&action=raw&ctype=text/css', 'text/css'); // Import stylesheet
$(function() {
function update(){ // Function to update filter
if(mw.storage.get('InvertPage') == 'true'){
$(document.body).addClass('inverted-colors'); // Add CSS
}else{
$(document.body).removeClass('inverted-colors'); // Remove CSS
}
}
function set(e){ // Function to set web storage and update filter
e.preventDefault(); // Pervent default action
if(mw.storage.get('InvertPage') == 'true'){
mw.storage.set('InvertPage','false');
}else{
mw.storage.set('InvertPage','true');
}
update(); // Update fiter
}
var node = mw.util.addPortletLink( // Add link
'p-personal',
"https://en.wikipedia.org/wiki/User:BrandonXLF/Invert/select", // Backup link to URL
'🌛',
'night mode',
'enter night mode',
'n',
'#pt-mytalk'
);
update();
$(node).on('click',function(e){ // Make the dark mode link work
set(e);
});
$('#ToggleWikiInvert').click(function(e){ // Allow for id to toggle dark mode
set(e);
});
$('.ToggleWikiInvert').click(function(e){ // Allow to CSS class to toggle dark mode
set(e);
});
});
mw.loader.using(['mediawiki.api', 'mediawiki.Title'], function () {
"use strict";
var config = mw.config.get(['wgNamespaceNumber', 'wgTitle', 'wgUserGroups', 'skin']);
function removeBlanks(arr) {
var ret = [];
var i, len;
for (i = 0, len = arr.length; i < len; i++) {
var s = arr[i];
s = s.trim();
if (s) {
ret.push(s);
}
}
return ret;
}
function doMassDelete() {
document.getElementById("wpMassDeleteSubmit").disabled = true;
var articles = document.getElementById("wpMassDeletePages").value.split("\n");
articles = removeBlanks(articles);
if (!articles.length) {
return;
}
var
api = new mw.Api(),
wpMassDeleteReasons = document.getElementById("wpMassDeleteReasons").value,
wpMassDeleteReason = document.getElementById("wpMassDeleteReason").value,
deleted = 0,
failed = [],
error = [],
deferreds = [],
reason = wpMassDeleteReasons == "other" ?
wpMassDeleteReason :
wpMassDeleteReasons + (wpMassDeleteReason ? " (" + wpMassDeleteReason + ")" : ""),
onSuccess = function () {
deleted++;
document.getElementById("wpMassDeleteSubmit").value = "(" + deleted + ")";
};
function makeDeleteFunc(article) {
return function () {
return $.Deferred(function (deferred) {
var promise = api.postWithToken('delete', {
format: 'json',
action: 'delete',
title: article,
reason: reason
});
promise.done(onSuccess);
promise.fail(function (code, obj) {
failed.push(article);
error.push(obj.error.info);
});
promise.always(function () {
deferred.resolve();
});
});
};
}
// Make a chain of deferred objects. We chain them rather than execute them in
// parallel so that we don't make 1000 simultaneous delete requests and bring the
// site down. We use deferred objects rather than the promise objects returned
// from the API request so that the chain continues even if some articles gave
// errors.
var deferred = makeDeleteFunc(articles[0])();
for (var i = 1, len = articles.length; i < len; i++) {
deferred = deferred.then(makeDeleteFunc(articles[i]));
}
// Show the output and do cleanup once all the requests are done.
$.when(deferred).then(function () {
document.getElementById("wpMassDeleteSubmit").value = "Done (" + deleted + ")";
if (failed.length) {
var $failedList = $('<ul>');
for(var x = 0; x < failed.length; x++) {
// Link the titles in the "failed" array
var failedTitle = mw.Title.newFromText(failed[x]);
var $failedItem = $('<li>');
if (failedTitle) {
$failedItem.append( $('<a>')
.attr('href', failedTitle.getUrl())
.text(failed[x])
);
} else {
$failedItem.text(failed[x]);
}
$failedItem.append(document.createTextNode(': ' + error[x]));
$failedList.append($failedItem);
}
$('#wpMassDeleteFailedContainer')
.append($('<br />'))
.append($('<b>')
.text('Failed deletions:')
)
.append($failedList);
}
});
}
function massdeleteform() {
var bodyContent = (config.skin == "cologneblue" ? "article" : "bodyContent");
document.getElementsByTagName("h1")[0].textContent = "Animum's mass-deletion tool";
document.title = "Animum's mass-deletion tool - Wikipedia, the free encyclopedia";
document.getElementById(bodyContent).innerHTML = '<h3 id="siteSub">From Wikipedia, the free encyclopedia</h3><br /><br />' +
'<form id="wpMassDelete" name="wpMassDelete">' +
'<b>If you abuse this tool, it\'s <i>your</i> fault, not mine.</b>' +
'<div id="wpMassDeleteFailedContainer"></div>' +
'<br /><br />' +
'Pages to delete (one on each line, please):<br />' +
'<textarea tabindex="1" accesskey="," name="wpMassDeletePages" id="wpMassDeletePages" rows="10" cols="80"></textarea>' +
'<br /><br /><table style="background-color:transparent">' +
'<tr><td>Common reasons:</td>' +
'<td><select id="wpMassDeleteReasons">' +
'<optgroup label="Other reason">' +
'<option value="other">Other reason</option>' +
'</optgroup>' +
'<optgroup label="Criteria for speedy deletion">' +
'<optgroup label="General criteria">' +
'<option value="[[WP:CSD#G1|G1]]: [[WP:PN|Patent nonsense]], meaningless, or incomprehensible">G1: Patent nonsense</option>' +
'<option value="[[WP:CSD#G2|G2]]: Test page">G2: Test page</option>' +
'<option value="[[WP:CSD#G3|G3]]: [[WP:Vandalism|Vandalism]]">G3: Vandalism</option>' +
'<option value="[[WP:CSD#G3|G3]]: Blatant [[WP:Do not create hoaxes|hoax]]">G3: Hoax</option>' +
'<option value="[[WP:CSD#G4|G4]]: Recreation of a page that was [[WP:DEL|deleted]] per a [[WP:XFD|deletion discussion]]">G4: Repost</option>' +
'<option value="[[WP:CSD#G5|G5]]: Creation by a [[WP:BLOCK|blocked]] or [[WP:BAN|banned]] user in violation of block or ban">G5: Banned</option>' +
'<option value="[[WP:CSD#G6|G6]]: Housekeeping and routine (non-controversial) cleanup">G6: Maintenance</option>' +
'<option value="[[WP:CSD#G7|G7]]: One author who has requested deletion or blanked the page">G7: Author</option>' +
'<option value="[[WP:CSD#G8|G8]]: Page dependent on a deleted or nonexistent page">G8: Orphaned talk page</option>' +
'<option value="[[WP:CSD#G10|G10]]: [[WP:ATP|Attack page]] or negative unsourced [[WP:BLP|BLP]]">G10: Attack page</option>' +
'<option value="[[WP:CSD#G11|G11]]: Unambiguous [[WP:NOTADVERTISING|advertising]] or promotion">G11: Advertising</option>' +
'<option value="[[WP:CSD#G12|G12]]: Unambiguous [[WP:CV|copyright infringement]]">G12: Copyvio</option>' +
'<option value="[[WP:CSD#G13|G13]]: Abandoned draft or [[WP:AFC|Articles for Creation]] submission – to retrieve it, see [[WP:REFUND/G13]]">G13: Abandoned draft</option>' +
'</optgroup>' +
'<optgroup label="Articles">' +
'<option value="[[WP:CSD#A1|A1]]: Short article without enough context to identify the subject">A1: No context</option>' +
'<option value="[[WP:CSD#A2|A2]]: Article in a foreign language that exists on another project">A2: Foreign</option>' +
'<option value="[[WP:CSD#A3|A3]]: Article that has no meaningful, substantive content">A3: No content</option>' +
'<option value="[[WP:CSD#A5|A5]]: Article that has been transwikied to another project">A5: Transwiki</option>' +
'<option value="[[WP:CSD#A7|A7]]: No credible indication of importance (individuals, animals, organizations, web content, events)">A7: Non-notable individual, animal, organization, web content, or event</option>' +
'<option value="[[WP:CSD#A9|A9]]: Music recording by redlinked artist and no indication of importance or significance">A9: Non-notable recording by redlinked artist</option>' +
'<option value="[[WP:CSD#A10|A10]]: Recently created article that duplicates an existing topic">A10: Recently created article that duplicates an existing topic</option>' +
'<option value="[[WP:CSD#A11|A11]]: [[Wikipedia:Wikipedia is not for things made up one day|Made up]] by article creator or an associate, and no indication of importance/significance">A11: Made up</option>' +
'</optgroup>' +
'<optgroup label="Redirects">' +
'<option value="[[WP:CSD#R2|R2]]: Cross-[[WP:NS|namespace]] [[WP:R|redirect]] from mainspace">R2: Cross-namespace</option>' +
'<option value="[[WP:CSD#R3|R3]]: Recently created, implausible [[WP:R|redirect]]">R3: Implausible redirect</option>' +
'</optgroup>' +
'<optgroup label="Images and other media">' +
'<option value="[[WP:CSD#F1|F1]]: File redundant to another on Wikipedia">F1: Redundant</option>' +
'<option value="[[WP:CSD#F2|F2]]: Corrupt or empty file, or a file description page for a file on Commons">F2: Corrupt, empty. or Commons</option>' +
'<option value="[[WP:CSD#F3|F3]]: File with improper license">F3: File with improper license</option>' +
'<option value="[[WP:CSD#F4|F4]]: Lack of licensing information">F4: Lack of licensing information</option>' +
'<option value="[[WP:CSD#F5|F5]]: Unused non-free media">F5: Unfree and unused</option>' +
'<option value="[[WP:CSD#F6|F6]]: Non-free file without [[WP:RAT|fair-use rationale]]">F6: No rationale</option>' +
'<option value="[[WP:CSD#F7|F7]]: [[WP:NFCC|Invalid]] fair-use claim">F7: Bad fair use rationale</option>' +
'<option value="[[WP:CSD#F8|F8]]: Media file available on Commons">F8: On Commons</option>' +
'<option value="[[WP:CSD#F9|F9]]: File [[WP:COPYVIO|copyright violation]]">F9: File copyvio</option>' +
'<option value="[[WP:CSD#F10|F10]]: Useless media file">F10: Useless media file</option>' +
'<option value="[[WP:CSD#F11|F11]]: No evidence of permission">F11: No permission</option>' +
'</optgroup>' +
'<optgroup label="Categories">' +
'<option value="[[WP:CSD#C1|C1]]: Empty category">C1: Empty</option>' +
'<option value="[[WP:CSD#C2|C2]]: Speedy renaming">C2: Speedy rename</option>' +
'<option value="[[WP:CSD#G8|G8]]: Populated by deleted or retargeted template">G8: Populated by deleted or retargeted template</option>' +
'</optgroup>' +
'<optgroup label="User namespace">' +
'<option value="[[WP:CSD#U1|U1]]: User request to delete page in own userspace">U1: User requests deletion</option>' +
'<option value="[[WP:CSD#U2|U2]]: Userpage or subpage of a nonexistent user">U2: Non-existent user</option>' +
'<option value="[[WP:CSD#U3|U3]]: [[WP:NFC|Non-free]] [[Help:Gallery|gallery]]">U3: Fair use gallery</option>' +
'<option value="[[WP:CSD#U5|U5]]: [[WP:NOTWEBHOST|Misuse of Wikipedia as a web host]]">U5: Misuse as webhost</option>' +
'</optgroup>' +
'<optgroup label="Templates">' +
'<option value="[[WP:CSD#T3|T3]]: Unused, redundant template">T3: Redundant and unused</option>' +
'<option value="[[WP:CSD#G8|G8]]: Component or documentation of a deleted template">G8: component of deleted template</option>' +
'</optgroup>' +
'<optgroup label="Portals">' +
'<option value="[[WP:CSD#P1|P1]]: [[WP:P|Portal]] page that would be subject to speedy deletion as an article">P1: Deletion as article</option>' +
'<option value="[[WP:CSD#P2|P2]]: [[WP:P|Portal]] without a substantial topic base">P2: Underpopulated</option>' +
'</optgroup>' +
'<optgroup label="Other">' +
'<option value="[[WP:PROD]]: Nominated for seven days with no objection">PRODded for more than 7 days without objection</option>' +
'<option value="[[WP:BLPPROD]]: Nominated for seven days with no reliable sources present in the article">BLPPRODded for more than seven days without a source</option>' +
'<option value="Listed at [[Wikipedia:Copyright problems]] for over seven days">Listed at Copyright problems for over seven days</option>' +
'</optgroup>' +
'</optgroup>' +
'</select></td></tr>' +
'<tr><td>Other/additional reason:</td>' +
'<td><input type="text" id="wpMassDeleteReason" name="wpMassDeleteReason" maxlength="255" /></td></tr>' +
'<tr><td><input type="button" id="wpMassDeleteSubmit" name="wpMassDeleteSubmit" value="Delete" /></td>' +
'</form>';
document.getElementById("wpMassDeleteReasons").onchange = function() {
var maxlength = (document.getElementById("wpMassDeleteReasons").value == "other" ? 255 : 252-document.getElementById("wpMassDeleteReasons").value.length); //It's 252 because of the three characters (" ()") in addition to the selected summary.
document.getElementById("wpMassDeleteReason").setAttribute("maxlength", maxlength);
};
document.getElementById("wpMassDeleteSubmit").addEventListener("click", function (e) {
doMassDelete();
});
}
if (config.wgNamespaceNumber == -1 &&
config.wgTitle.toLowerCase() == "massdelete" &&
/sysop/.test(config.wgUserGroups)
) {
massdeleteform();
}
});
/** This script contains the code required for loading [[User:Joeytje50/JWB.js]].
* All other code is located at that page.
*/
//Idea by [[User:Epicgenius]]
$.when(mw.loader.using(['mediawiki.util'], $.ready)).done( function() {
mw.util.addPortletLink("p-tb", mw.config.get('wgArticlePath').replace('$1', "Project:AutoWikiBrowser/Script"), "JS Wiki Browser", "tb-awbscript", "Run Javascript Wiki Browser");
});
if (mw.config.get('wgCanonicalNamespace')+':'+mw.config.get('wgTitle') === 'Project:AutoWikiBrowser/Script' && mw.config.get('wgAction') == 'view')
mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js&action=raw&ctype=text/javascript');
function DateSub(Date1,Date2) {
var timeDifference = Date2 - Date1;
var minutesAgo = Math.round(timeDifference / 1000 / 60);
var hoursAgo = 0
var daysAgo = 0
var hoursText = 'hour'
var daysText = 'day'
while (minutesAgo >= 60) {
minutesAgo = minutesAgo-60;
hoursAgo++;
}
while (hoursAgo >= 24) {
hoursAgo = hoursAgo-24;
daysAgo++;
}
if (hoursAgo!=1)
hoursText = hoursText + 's';
if (daysAgo!=1)
daysText = daysText + 's';
if (daysAgo > 0) {
if (hoursAgo > 0) {
if (minutesAgo <=1 ) {
minutesAgo = daysAgo + ' ' + daysText + ', ' + hoursAgo + ' ' + hoursText;
}
else {
minutesAgo = daysAgo + ' ' + daysText + ', ' + hoursAgo + ' ' + hoursText + ', ' + minutesAgo + ' minutes';
}
}
else {
if (minutesAgo <=1 ) {
minutesAgo = daysAgo + ' ' + daysText;
}
else {
minutesAgo = daysAgo + ' ' + daysText + ', ' + minutesAgo + ' minutes';
}
}
}
else {
if (hoursAgo > 0) {
if (minutesAgo <=1 ) {
minutesAgo = hoursAgo + ' ' + hoursText;
}
else {
minutesAgo = hoursAgo + ' ' + hoursText + ', ' + minutesAgo + ' minutes';
}
}
else {
if (minutesAgo <=1 ) {
minutesAgo = 'Less than a minute';
}
else {
minutesAgo = minutesAgo + ' minutes';
}
}
}
return minutesAgo;
}
if (document.getElementById('mw-diff-otitle1') || document.getElementById('mw-diff-ntitle1')) {
function convertTimestampStringToDate(id) {
var timestamp = document.getElementById(id).firstChild.firstChild.firstChild.nodeValue;
var str = /evision as of /g
str.lastIndex = 0;
str.test(timestamp)
var date = timestamp.substring(str.lastIndex)
/*
All this following bogus crap is because Safari
doesn't recognize Wikipedia's date format.
Every other browser can just use the date string
object above, but Safari is retarded
*/
var str1 = /[A-z]+/
var str2 = /\d+/g
var monthtext = date.match(str1);
var testdate = date.match(str2);
var hours = testdate[0];
var minutes = testdate[1];
var day = testdate[2];
var year = testdate[3];
var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
for (i in months) {
if (monthtext==months[i]) {
var month = i;
break;
}
i++
}
/*
End Safari madness
*/
date = new Date(year,month,day,hours,minutes);
return date;
}
var leftNode = document.getElementById('mw-diff-otitle1');
var rightNode = document.getElementById('mw-diff-ntitle1');
var firstDate = convertTimestampStringToDate('mw-diff-otitle1');
var secondDate = convertTimestampStringToDate('mw-diff-ntitle1');
function TimeBetweenDiffs() {
var minutesAgo = DateSub(firstDate,secondDate);
var newNode = document.createElement('span');
newNode.setAttribute('style', 'font-weight:bold; color:red;')
newNode.appendChild(document.createTextNode('(' + minutesAgo + ' later)'));
newNode.appendChild(document.createElement('br'));
rightNode.insertBefore(newNode, rightNode.firstChild);
}
function TimeSinceDiff() {
var DateNow = new Date();
var minutesAgo1 = DateSub(firstDate,DateNow);
var minutesAgo2 = DateSub(secondDate,DateNow);
document.getElementById('mw-diff-otitle1').title=minutesAgo1 + ' ago';
document.getElementById('mw-diff-ntitle1').title=minutesAgo2 + ' ago';
var t = setTimeout("TimeSinceDiff()",60000);
}
$(window).load(TimeSinceDiff); // Adds time since displayed diffs as tooltip
$(window).load(TimeBetweenDiffs); // Adds time between diffs
}
// Modified from [[User:Gary King/link intermediate revisions.js]]
if (typeof(unsafeWindow) != 'undefined')
{
var console = unsafeWindow.console;
importScriptURI = unsafeWindow.importScriptURI;
mw = unsafeWindow.mw;
}
mw.loader.using( ['mediawiki.util'], function () {
$(createDiffMultiLink);
});
function createDiffMultiLink()
{
if (!mw.util.getParamValue('diff') || !mw.util.getParamValue('oldid')) return false;
$.get(mw.config.get('wgScriptPath') + '/api.php', {
action: 'query',
prop: 'revisions',
titles: mw.config.get('wgPageName'),
rvprop: 'timestamp',
rvstartid: mw.util.getParamValue('diff'),
rvendid: mw.util.getParamValue('oldid'),
rvlimit: '5000',
format: 'json',
indexpageids: 1
}, diffMultiCallback);
}
function twoDigitPadding(integer)
{
var string = integer.toString();
if (string.length == 1) return '0' + integer;
else return integer;
}
function diffMultiCallback(response)
{
if (!response['query'] || !response['query']['pages'] || response['query']['pageids'][0] == -1) return false;
var diffMultis = $('#bodyContent .diff-multi');
if (!diffMultis.length) return false;
var pageId = response['query']['pageids'][0];
var page = response['query']['pages'][pageId];
var revisions = page['revisions'];
if (!revisions) return false;
var oldid = new Date(revisions[revisions.length - 1]['timestamp']);
oldid = oldid.getUTCFullYear().toString() + twoDigitPadding(oldid.getUTCMonth() + 1).toString() + oldid.getUTCDate().toString() + twoDigitPadding(oldid.getUTCHours() + 1).toString() + twoDigitPadding(oldid.getUTCMinutes() + 1).toString() + twoDigitPadding(oldid.getUTCSeconds() + 1).toString();
var diff = new Date(revisions[0]['timestamp']);
diff = diff.getUTCFullYear().toString() + twoDigitPadding(diff.getUTCMonth() + 1).toString() + diff.getUTCDate().toString() + twoDigitPadding(diff.getUTCHours() + 1).toString() + twoDigitPadding(diff.getUTCMinutes() + 1).toString() + twoDigitPadding(diff.getUTCSeconds() + 1).toString();
var diffMulti = diffMultis.eq(0);
var a = $('<a href="' + mw.config.get('wgScript') + '?title=' + mw.config.get('wgPageName') + '&action=history&offset=' + diff + '&limit=' + revisions.length + '"></a>').append(diffMulti.contents().eq(0));
diffMulti.append(a);
}
if (typeof inspectText == "undefined")
{
inspectText = "inspect diff";
}
if (typeof showText == "undefined")
{
showText = "show diff";
}
if (typeof hideText == "undefined")
{
hideText = "hide diff";
}
var specialPageName = mw.config.get("wgCanonicalSpecialPageName");
if (specialPageName == "Watchlist" ||
specialPageName == "Recentchanges" ||
specialPageName == "Contributions" ||
mw.config.get("wgAction") == "history" ||
specialPageName == "Recentchangeslinked" ||
(specialPageName == "Blankpage" && mw.config.get("wgTitle").indexOf("section-watchlist") > 0))
{
function inspectionEachHelper(index, element)
{
var findString;
if (mw.config.get("wgAction") == "history" || $(element).hasClass("mw-enhanced-rc-nested"))
{
findString = 'a:contains("prev")';
}
else
{
findString = 'a:contains("diff")';
}
var regex;
if (specialPageName == "Contributions")
{
regex = /&oldid=(\d+)$/;
}
else
{
regex = /(?:&diff=(\d+)&oldid=|&diff=prev&oldid=(\d+))/;
}
var diffLink = $(element).find(findString);
if (diffLink.length > 0)
{
var regexResult = regex.exec(diffLink[0].href);
if (regexResult != null && regexResult.length >= 2)
{
var diffID = regexResult[1] || regexResult[2];
//don't re-add if it already exists
if ($("#" + diffID).length > 0)
{
return;
}
var inlineDiffButton;
if (typeof inlineDiffBigUI === "undefined")
{
inlineDiffButton = document.createElement("a");
inlineDiffButton.href = "#";
inlineDiffButton.innerHTML = '<b><span style="color:black;"> [</span><span style="color:#008A00;">' + inspectText + '</span><span style="color:black;">] </span></b>';
}
else
{
inlineDiffButton = document.createElement("input");
inlineDiffButton.type = "button";
inlineDiffButton.value = "Inspect edit";
}
inlineDiffButton.id = diffID;
$(inlineDiffButton).addClass("inspectDiffButton");
$(inlineDiffButton).click(function ()
{
return inspectWatchlistDiff(this);
}
);
if ($(element).find("tr:first").length == 0)
{
$(element).find(".mw-changeslist-separator:first").css("padding-right", 0);
$(inlineDiffButton).insertAfter($(element).find(".mw-changeslist-separator:first"));
}
else
{
$(inlineDiffButton).insertBefore($(element).find(".mw-title"));
$(inlineDiffButton).addClass("mw-enhanced-rc-diff");
/*
$(element).find("tr:first").append("<td></td>");
$(element).find("tr:first>td:last").append(inlineDiffButton);
*/
}
}
}
}
function addWatchlistInspectionBoxes()
{
mw.loader.using("mediawiki.diff.styles").done(function()
{
var entries = $("#mw-content-text table.mw-enhanced-rc");
if (entries.length == 0)
{
$("#mw-content-text ul").each(function (ind, el)
{
$(el).children("li").each(inspectionEachHelper);
});
}
else
{
entries.each(inspectionEachHelper);
$("td.mw-enhanced-rc-nested").each(inspectionEachHelper);
}
});
}
function inspectWatchlistDiff(button)
{
mw.loader.using(['mediawiki.api']).done(function ()
{
var mwApi = new mw.Api();
mwApi.get(
{
action: "query",
prop: "revisions",
format: "json",
rvprop: "timestamp",
rvdiffto: "prev",
revids: button.id
}
).done(function (response)
{
if (response == null)
{
alert("Request failed!");
return false;
}
var diffString = response.query.pages[Object.keys(response.query.pages)[0]].revisions[0].diff["*"];
if (diffString == null)
{
alert("Request failed!");
return false;
}
var newTable = document.createElement("table");
newTable.className = "diff";
$(newTable).html('<colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup>');
$(newTable).append(diffString);
diffParent = null;
if ($("#" + button.id).hasClass("mw-enhanced-rc-diff"))
{
$("#" + button.id).parents("table").after(newTable);
}
else
{
diffParent = $("#" + button.id).parent();
diffParent.append(newTable);
}
newTable.id = button.id + "display";
mw.hook('new-diff-table').fire(newTable);
$(button).unbind("click");
if (typeof inlineDiffBigUI === "undefined")
{
$(button).html('<b><span style="color:black;"> [</span><span style="color:#008A00;">' + hideText + '</span><span style="color:black;">] </span></b>');
$(button).click(function ()
{
return hideSmallEditInspection(this);
}
);
}
else
{
$(button).attr("value", "Hide edit");
$(button).click(function ()
{
return hideEditInspection(this);
}
);
}
if (typeof markAsViewed != "undefined" && markAsViewed)
{
mwApi.postWithToken('csrf',
{
action: "setnotificationtimestamp",
revids: button.id
}
).done(function (data)
{
if (diffParent != null)
{
diffParent.removeClass("mw-changeslist-line-watched");
diffParent.addClass("mw-changeslist-line-not-watched");
}
}
);
}
}
);
}
);
return false;
}
function showEditInspection(button)
{
$("#" + button.id + "display").css("display", "");
$(button).attr("value", "Hide edit");
$(button).unbind("click");
$(button).click(function ()
{
return hideEditInspection(this);
}
);
return false;
}
function hideEditInspection(button)
{
$("#" + button.id + "display").css("display", "none");
$(button).attr("value", "Show edit");
$(button).unbind("click");
$(button).click(function ()
{
return showEditInspection(this);
}
);
return false;
}
function showSmallEditInspection(button)
{
$("#" + button.id + "display").css("display", "");
$(button).html('<b><span style="color:black;"> [</span><span style="color:#008A00;">' + hideText + '</span><span style="color:black;">] </span></b>');
$(button).unbind("click");
$(button).click(function ()
{
return hideSmallEditInspection(this);
}
);
return false;
}
function hideSmallEditInspection(button)
{
$("#" + button.id + "display").css("display", "none");
$(button).html('<b><span style="color:black;"> [</span><span style="color:#008A00;">' + showText + '</span><span style="color:black;">] </span></b>');
$(button).unbind("click");
$(button).click(function ()
{
return showSmallEditInspection(this);
}
);
return false;
}
mw.hook('wikipage.content').add(addWatchlistInspectionBoxes);
}
/*
* Pages Created -- finds all the pages created by a user
* see [[User:Jfmantis/pagesCreated]]
*/
(function() {
/*
* create <li> list item for one article
* right now, just a link to the page & the date
*/
function makeCreatedPageItem(contrib) {
var item = document.createElement("li");
var link = document.createElement("a");
link.href = mw.util.getUrl(contrib.title);
link.innerHTML = contrib.title;
item.appendChild(link);
item.innerHTML += " . . " + new Date(contrib.timestamp).toDateString();
return item;
}
/*
* looks through all of a user's non-minor namespace 0 edits,
* looking for edits tagged as "new"
*
* the arguments all in one object so that it can be expanded
* in the future without having to add a bunch more parameters
*/
function findPagesCreated(bundle) {
bundle.api.get({
action: "query",
rawcontinue: '',
list: "usercontribs",
ucuser: bundle.user,
ucstart: bundle.start,
ucprop: "flags|title|timestamp",
ucshow: "!minor",
uclimit: 500,
ucnamespace: 0
}).done( function(data) {
$.each(data.query.usercontribs, function(index, contrib) {
if (contrib.new != undefined) {
bundle.list.appendChild(makeCreatedPageItem(contrib));
bundle.count++;
}
});
if (data["query-continue"]) { // more contributions
bundle.start = data["query-continue"].usercontribs.ucstart
setTimeout(function() { findPagesCreated(bundle); }, 3000);
} else { // done
$("#pc-status")[0].innerHTML = "<br />" + bundle.user + " has created " + bundle.count + " articles";
}
}).fail( function(error) {
alert(error);
});
}
/*
* change title, clear content area, etc.
*/
function setupPagesCreated(user) {
// set new title
mw.util.$content.find("#firstHeading")[0].innerHTML = "Pages created by " + user;
// status bar (text + waiting gif)
var status = document.createElement("span");
status.id = "pc-status";
status.innerHTML = "<br />Fetching user data...";
// heading for results
var heading = document.createElement("h3");
heading.innerHTML = "Articles";
// list of results
var articles = document.createElement("ul");
articles.id = "pc-articles";
var body = mw.util.$content.find("#bodyContent")[0];
body.innerHTML = "";
body.appendChild(status);
body.appendChild(heading);
body.appendChild(articles);
var api = new mw.Api();
api.get({
action: "query",
list: "users",
ususers: user,
usprop: "editcount"
}).done(function(data) {
// 500 results per request, 1 request every 3 seconds
var count = data.query.users[0].editcount;
status.innerHTML = "<br />User has " + count + " edits, this should take less than ";
status.innerHTML += (3 * Math.round(count / 500)) + " seconds ";
var waitgif = document.createElement("img");
waitgif.src = "https://upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif";
status.appendChild(waitgif);
findPagesCreated(
{"api": api,
"user": user,
"list": articles,
"start": "",
"count": 0}
);
}).fail(function(error) {
alert(error);
});
return false;
}
mw.loader.using("mediawiki.util", function() {
// add portlet when page is User or User_talk, but not on subpages
if ((wgNamespaceNumber == 2 || wgNamespaceNumber == 3) && (wgTitle.indexOf("/") == -1)) {
if (mw.util.getParamValue("pagesCreated")) {
setupPagesCreated(wgTitle);
} else {
mw.util.addPortletLink("p-tb",
document.location.toString() + "?pagesCreated=true",
"Pages created", "pc-pages",
"Get a list of all pages created by this user"
);
}
}
});
})();
if ( mw.config.get( "wgAction" ) === "history" ) {
$( document ).ready( function() {
"use strict";
const HC = document.getElementById( "mw-history-compare" );
if ( HC ) {
const PH = document.getElementById( "pagehistory" ),
BTNS = HC.querySelectorAll( 'input[value="Compare selected revisions"]' ),
TOP = BTNS[ 0 ],
BTM = BTNS[ 1 ],
encapsulate = function() {
const LSB = PH.querySelector( 'li.selected.before' ),
LSA = PH.querySelector( 'li.selected.after' );
if ( TOP && LSB ) {
PH.insertBefore( TOP, LSB );
}
if ( BTM && LSA ) {
const NES = LSA.nextElementSibling;
if ( NES ) {
PH.insertBefore( BTM, NES );
} else {
PH.appendChild( BTM );
}
}
/* move buttons added by User:Enterprisey/cv-revdel.js along with the "Compare selected revisions" buttons */
HC.querySelectorAll( "button.cv-rd-add-range" ).forEach( function( b, i ) { PH.insertBefore( b, BTNS[ i ] ) } );
};
encapsulate();
HC.addEventListener( "change", encapsulate );
}
} );
}
/* Rollback all */
$( function() {
if ( $('span.mw-rollback-link')[0] && mw.config.get( 'wgCanonicalSpecialPageName' ) == 'Contributions' )
mw.util.addPortletLink( 'p-cactions', 'javascript:rollbackEverything()', "rollback all", "ca-rollbackeverything", "Rollback all top edits displayed here" );
} );
function rollbackEverything() {
for ( var i in document.links ) {
if ( document.links[i].href.indexOf( 'action=rollback' ) != -1 )
window.open( document.links[i].href+'&bot=1' );
}
}
/* Interface modifications */
$( function(){
// These add action tabs at the top of a page
if( mw.config.get( 'wgNamespaceNumber' ) > -1 ) {
mw.util.addPortletLink( 'p-cactions', '/wiki/Special:PrefixIndex/' + wgPageName, 'Subpages', 'd-subpages', 'List subpages and other pages starting with this title' );
mw.util.addPortletLink( 'p-cactions', '/w/index.php?title=Special:Log&page=' + wgPageName, 'Logs', 'd-logs', 'Show any relevant logs for this title' );
mw.util.addPortletLink( 'p-cactions', '/wiki/' + wgPageName + '?action=purge', 'Purge', 'd-purge', 'Purge the current page' );
// mw.util.addPortletLink( 'p-cactions', '/wiki/' + wgPageName + '?useskin=vector', 'Vector', 'd-vector', 'View page in the Vector skin' );
}
// These add personal links at the top right of every page
mw.util.addPortletLink( 'p-personal', '/wiki/Special:ListFiles/' + wgUserName, 'Uploads', 'pt-uploads' );
mw.util.addPortletLink( 'p-personal', '/wiki/Special:Log/' + wgUserName, 'Logs', 'pt-logs' );
mw.util.addPortletLink( 'p-personal', '/wiki/Special:PrefixIndex/User:'+ wgUserName, 'Subpages', 'pt-subpages' );
$("#pt-logout").hide();
// These add toolbox links to the sidebar of every page
mw.util.addPortletLink( 'p-tb', 'https://en.uncyclopedia.co/wiki/User:Zombiebaron/2019.js', '2019.js Project', 't-2019' );
mw.util.addPortletLink( 'p-tb', 'https://en.uncyclopedia.co/wiki/User:Zombiebaron/Images', 'Images', 't-images' );
mw.util.addPortletLink( 'p-tb', 'https://en.uncyclopedia.co/wiki/Special:MassDelete', 'mass delete', 't-massdelete' );
$('#n-currentevents').after($('#n-recentchanges'));
$('#n-recentchanges').css({ 'font-weight': 'bold' });
} );
/* Edit counter in top bar - by Wikipedia:User:Mvolz */
$(document).ready( function () {
mw.loader.using( 'mediawiki.user', function() {
( new mw.Api() ).get( {
action: 'query',
meta: 'userinfo',
uiprop: 'editcount'
} ).done( function( result ) {
document.getElementById( 'pt-mycontris' ).append( ' (' + result.query.userinfo.editcount + ')' );
} );
} );
} );