User:Frietjes/addcheckforunknownparameters.js

//

jQuery(document).ready(function($) {

if(mw.config.get('wgNamespaceNumber') != -1 && document.getElementsByName('wpTextbox1')[0]) {

mw.loader.using(['mediawiki.util']).done( function() {

var portletlink = mw.util.addPortletLink('p-tb','#','Chk4unkwn','t-cfu');

$(portletlink).click(function(e) {

e.preventDefault();

wpBuildCheckForUnknownParameters();

});

});

}

// -------------------------------------------------------------------------------- //

function wpBuildCheckForUnknownParameters()

{

var mycontent = document.getElementById('wpTextbox1');

// Copy the contents of the text window so we can modify it without problems

var mytxt = mycontent.value;

var mytxt2 = mycontent.value;

// Make sure we haven't already done this before

if(mytxt.search(/\{\{#invoke:[Cc]heck[_ ]+for[_ ]+unknown[_ ]+parameters/g) >= 0 ) {

alert('Already added, aborting ...');

return;

}

// Remove {PAGENAME}, {BASEPAGENAME}, ...

mytxt = mytxt.replace(/\{\{(?:PAGENAME|BASEPAGENAME|FULLPAGENAME|CURRENTYEAR)\}\}/g, '');

// Remove and

mytxt = mytxt.replace(/<(?:span|nowiki)[ ]*\/>/gi, '');

// Excaped table markup

mytxt = mytxt.replace(/([\r\n])\{(\{\{)(!\}\})/g, '$1$2($3');

mytxt = mytxt.replace(/([\r\n]\{\{!)(\}\})\}[\t ]*([\r\n])/g, '$1)$2$3');

// Replace some braces

mytxt = mytxt.replace(/([^\{])\{([^\{])/g, '$1{$2');

mytxt = mytxt.replace(/([^\}])\}([^\}])/g, '$1}$2');

// Remove newlines and tabs which confuse the regexp search

mytxt = mytxt.replace(/[\s]/gm, ' ');

// Compress whitespace

mytxt = mytxt.replace(/[\s][\s]+/gm, ' ');

// Remove some HTML comments

mytxt = mytxt.replace(//gm, '');

// Remove some includeonly tags

mytxt = mytxt.replace(/<\/?includeonly>/gm, '');

// Remove some noinclude sections

mytxt = mytxt.replace(/(?:[^<>]|<\/?[^n][^<>]*>)*<\/noinclude>/gm, '');

// Compress more whitespace

mytxt = mytxt.replace(/\|[\s]+/g, '|');

mytxt = mytxt.replace(/(\{\{[^\{\}\|]*)[\s]+(\||\}\})/g, '$1$2');

// Remove wikilinks to make patterns less complicated

mytxt = mytxt.replace(/\[\[[^\[\]\{\}]*\]\]/g, '');

// Add a leading and trailing newline to make pattern matches less complicated

mytxt = '\n' + mytxt + '\n';

// Avoid false matches

mytxt2 = mytxt2.replace(/(\{\{\{[^\{\}\|]*)/g, '$1₳₳');

mytxt2 = mytxt2.replace(/[\s]+₳/g, '₳');

// Now start extracting the parameters

var plist = []; var klist = {}; var loopcount = 0;

while( (mytxt.search(/[^{}]/gm) >= 0) && (loopcount < 16) ) {

var p = mytxt.match(/(\{\{\{[^{}\|]*\|?[^\{\}\|=]*\}\}\})/g);

if( p ) {

for(var j=0; j

p[j] = p[j].replace(/\{\{\{([^{}\|]*)\|?[^\{\}\|=]*\}\}\}/g, '$1');

p[j] = p[j].replace(/^[\s]+/, '');

p[j] = p[j].replace(/[\s]+$/, '');

p[j] = p[j].replace(/([\(\)])/g, '\\$1');

var r = new RegExp("\\{\\{\\{[\\s]*" + p[j].replace(/\?/g, '\\?') + "\\|?[^\\{\\}\\|=]*\\}\\}\\}", 'g');

mytxt= mytxt.replace(r, '');

p[j] = p[j].replace(/\\/g, '');

if( klist[p[j]] == undefined ) {

klist[p[j]] = mytxt2.indexOf('{{{' + p[j] + '₳₳');

plist.push(p[j]);

}

}

// Remove templates, parserfunctions, and other double brace expressions

mytxt = mytxt.replace(/([^\{])\{\{[^{}]*\}\}/gm, '$1');

mytxt = mytxt.replace(/\{\{[^{}]*\}\}([^\}])/gm, '$1');

mytxt = mytxt.replace(/([^\{])\{\{(?:[\r\n]|[^{}]|\{\{[^{}]*\}\})*\}\}/gm, '$1');

mytxt = mytxt.replace(/\{\{(?:[\r\n]|[^{}]|\{\{[^{}]*\}\})*\}\}([^\}])/gm, '$1');

}

loopcount++;

}

if( mytxt.search(/[\{\}]/gm) >= 0 ) {

alert('Did not finish processing: ' + mytxt);

} else {

alert('Found ' + plist.length + ' unique keys');

}

var alphasort = confirm('Sort parameters alphabetically?');

// Sort

if(alphasort === true) {

plist.sort(function (a, b) {

aa = a.replace(/([^0-9])([0-9][^0-9]*)$/, '$10$2');

bb = b.replace(/([^0-9])([0-9][^0-9]*)$/, '$10$2');

return aa.toLowerCase().localeCompare(bb.toLowerCase()) });

} else {

plist = plist.sort(function(a,b) { return klist[a] - klist[b] } );

}

myfullpagename = mw.config.get('wgPageName');

myfullpagename = myfullpagename.replace(/_/g, ' ');

myfullpagename = myfullpagename.replace(/\/sandbox$/, '');

mypagename = myfullpagename.replace(/^Template:/, '');

mypagename = mypagename.charAt(0).toLowerCase() + mypagename.slice(1);

mypagename = mypagename.replace(/^wikiProject/, 'WikiProject');

// Finally, build the blank template

mytxt = '{' + '{#invoke:'

+ 'Check for unknown parameters|check|unknown=' + '{' + '{main other|['

+ '[Category:Pages using ' + mypagename + ' with unknown parameters'

+ '|_VALUE_{' + '{PAGENAME}' + '}]' + ']}'

+ '}|preview=Page using [' + '[' + myfullpagename + ']' + '] with '

+ 'unknown parameter "_VALUE_"|ignoreblank=y';

for(var k=0; k

mytxt = mytxt + "| " + plist[k] + " ";

}

mytxt = mytxt + "}}";

mycontent.value = mycontent.value + mytxt;

// Move up

mycontent.value = mycontent.value.replace(/([\r\n \t][\r\n \t]*)(\{\{#invoke:Check for unknown parameters(?:\{\{(?:\{\{[^{}]*\}\}|[^{}])*\}\}|[^{}])*\}\})/gi, '$2$1');

mycontent.value = mycontent.value.replace(/((?:|[^<>])*<\/noinclude>)(\{\{#invoke:Check for unknown parameters(?:\{\{(?:\{\{[^{}]*\}\}|[^{}])*\}\}|[^{}])*\}\})/gi, '$2$1');

mycontent.value = mycontent.value.replace(/([\r\n \t][\r\n \t]*)(\{\{#invoke:Check for unknown parameters(?:\{\{(?:\{\{[^{}]*\}\}|[^{}])*\}\}|[^{}])*\}\})/gi, '$2$1');

mysummary = 'Adding unknown parameter tracking through ['

+ '[:Category:Pages using ' + mypagename + ' with unknown parameters]]'

+ ' using Module:check for unknown parameters';

var editsummary = document.getElementsByName('wpSummary')[0];

if(typeof editsummary == 'object') {

if (editsummary.value.indexOf(mysummary) == -1) {

if (editsummary.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {

editsummary.value += '; ' + mysummary;

} else {

editsummary.value += mysummary;

}

}

}

}

// -------------------------------------------------------------------------------- //

});

//