/// Mass Purge Tool
/// Adapted from [[User:Timotheus_Canens/massedit.js]]
/// Once installed, go to Special:MassPurge and provide a list of pages
var edited = 0, failed = [], error = [];
function doMassPurge() {
document.getElementById("wpMassPurgeSubmit1").disabled = true;
document.getElementById("wpMassPurgeSubmit2").disabled = true;
var templates = document.getElementById("wpMassPurgeTransclusions").value.split("\n");
var articlelimit = Number(document.getElementById("wpMassPurgeTransclusionsLimit").value);
if(templates.length > 0) {
if(templates[0].search(/[^\s]/g) < 0) {
templates.shift();
}
}
if(templates.length > 0) {
var articlelist = [];
for(var j=0;j<templates.length;j++) {
var k = 0;
var loopflag = true;
var ckey;
while(loopflag) {
k = k + 1;
var req = new XMLHttpRequest();
var cstr = "";
if(k > 1) {
cstr = "&eicontinue=" + ckey;
}
req.open("GET", mw.config.get('wgScriptPath') + "/api.php?format=json" +
"&action=query&continue=" + cstr +
"&list=embeddedin&eilimit=500&eititle=" +
encodeURIComponent(templates[j]), false);
req.send();
var response = JSON.parse(req.responseText).query.embeddedin;
for(var index in response) {
var info = response[index];
articlelist.push(info.title);
}
if(JSON.parse(req.responseText).continue) {
loopflag = true;
ckey = JSON.parse(req.responseText).continue.eicontinue;
} else {
loopflag = false;
}
if(articlelist.length >= articlelimit) {
loopflag = false;
}
}
}
articlelist.sort();
articlelist = articlelist.filter( function( item, index, inputArray ) {
return inputArray.indexOf(item) == index;
});
document.getElementById("wpMassPurgePages").value =
document.getElementById("wpMassPurgePages").value + '\n' + articlelist.join('\n');
}
document.getElementById("wpMassPurgePages").value = document.getElementById("wpMassPurgePages").value.replace(/[\r\n][\t ]*[\r\n]/, '\n');
document.getElementById("wpMassPurgePages").value = document.getElementById("wpMassPurgePages").value.replace(/^[\t ]*[\r\n]/, '');
var articles = document.getElementById("wpMassPurgePages").value.split("\n");
articles.sort();
var articlecount = articles.length;
if(articles.length < 1) return;
// The following is a convoluted method for a for loop with a 3 second per iteration delay
var i=0;
function myLoop () {
setTimeout(function () {
doPurge(articles[i], !articles[i+1],articlecount);
i++;
if(i<articles.length){
myLoop();
}
}, 3000);
}
myLoop();
// End loop code
}
function doPurge(article, lastflag, tcount){
if(article.length > 0) {
article = article.replace(/[\u200e\s]*\((?:redirect|transclusion)\)[\u200e\s]*$/, '');
article = article.replace(/[\u200e\s]*\([\s]*links[\s]*\|[\s]*edit[\s]*\)[\u200e\s]*$/, '');
var req = new XMLHttpRequest();
req.open("GET", mw.config.get('wgScriptPath') + "/api.php?format=json&action=query&prop=info&meta=tokens&titles=" + encodeURIComponent(article), false);
req.send();
var edittoken = JSON.parse(req.responseText).query.tokens.csrftoken;
var postdata = "format=json"
+ "&action=edit&watchlist=nochange"
+ "&title=" + encodeURIComponent(article)
+ "&summary=" + "Null"
+ "&token=" + encodeURIComponent(edittoken)
+ "&nocreate=1"
+ "&minor=1"
+ "&prependtext=";
req = new XMLHttpRequest();
req.open("POST", mw.config.get('wgScriptPath') + "/api.php", false);
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.setRequestHeader("Content-length", postdata.length);
req.send(postdata);
if(JSON.parse(req.responseText).edit ) { //If edited, update the count and the button.
edited++;
document.getElementById("wpMassPurgeSubmit2").value = "(" + edited + " / " + tcount + ")";
} else { //If not edited, add the title to the "failed" array and a description of the error to the "error" array.
failed.push(article);
error.push(JSON.parse(req.responseText).error.info);
}
}
if(lastflag) {
document.getElementById("wpMassPurgeSubmit2").value = "Done (" + edited + ")";
if(failed.length > 0) {
var linkedList = "";
for(x=0; x<failed.length; x++) {
linkedList += "<li><a href=\"" + mw.config.get('wgScript') + "?title=" + encodeURIComponent(failed[x]) + "\">" + failed[x] + "</a>: " + error[x] + "</li>"; //Links the titles in the "failed" array
}
document.getElementById("wpMassPurgeFailedContainer").innerHTML += '<br /><b>Failed edits:</b><ul>' + linkedList + '</ul>';
}
}
}
function masspurgeform() {
var bodyContent = 'bodyContent';
switch (mw.config.get('skin')) {
case 'modern':
bodyContent = 'mw_contentholder';
break;
case 'cologneblue':
bodyContent = 'article';
break;
case 'vector':
case 'monobook':
case 'vector':
default:
bodyContent = 'bodyContent';
break;
}
document.getElementsByTagName("h1")[0].textContent = "Mass purge tool";
document.title = "Mass purge tool - Wikipedia, the free encyclopedia";
document.getElementById(bodyContent).innerHTML = '<h3 id="siteSub">From Wikipedia, the free encyclopedia</h3><br /><br />'
+ '<form id="wpMassPurge1" name="wpMassPurge1">'
+ '<b>If you abuse this tool, it\'s <i>your</i> fault, not mine.</b>'
+ '<div id="wpMassPurgeFailedContainer"></div>'
+ '<p></p>'
+ 'Limit (rounded up to nearest 500):'
+ '<br /><input type="text" tabindex="1" name="wpMassPurgeTransclusionsLimit" id="wpMassPurgeTransclusionsLimit" value="5000" maxlength="6" />'
+ '<br /><br />'
+ 'Pages with transclusions to purge (one on each line, with namespace prefix):<br />'
+ '<textarea tabindex="2" name="wpMassPurgeTransclusions" id="wpMassPurgeTransclusions" rows="5" cols="80"></textarea>'
+ '<input type="button" id="wpMassPurgeSubmit1" name="wpMassPurgeSubmit1" value="Purge" onclick="doMassPurge()" />'
+ '</form><form id="wpMassPurge2" name="wpMassPurge2">'
+ 'Pages to purge (one on each line, please):<br />'
+ '<textarea tabindex="3" name="wpMassPurgePages" id="wpMassPurgePages" rows="10" cols="80"></textarea>'
+ '<input type="button" id="wpMassPurgeSubmit2" name="wpMassPurgeSubmit2" value="Purge" onclick="doMassPurge()" />'
+ '</form>';
}
if(mw.config.get('wgNamespaceNumber') === -1 && (mw.config.get('wgTitle') === "Masspurge" || mw.config.get('wgTitle') === "MassPurge")
) {
$.when( $.ready, mw.loader.using(['mediawiki.util'])).done( masspurgeform );
}