//<nowiki>
// Shamelessly copied from 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 templateTitle = document.title;
templateTitle = templateTitle.replace(/Editing\sTemplate\:(.*)\s\-\sWikipedia.*/, "{{unknown params category|$1}}");
var dummy = $('<input>').val(templateTitle).appendTo('body').select()
document.execCommand('copy')
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 <nowiki /> and <span />
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(/<noinclude>(?:[^<>]|<\/?[^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.length; ++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<plist.length; ++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>(?:<!--[^<>]*-->|[^<>])*<\/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;
}
}
}
}
// -------------------------------------------------------------------------------- //
});
//</nowiki>