User:Frietjes/addcheckforunknownparameters.js

//<nowiki>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 <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&#123;$2');  mytxt = mytxt.replace(/([^\}])\}([^\}])/g, '$1&#125;$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>