User:Capankajsmilyo/addcheckforunknownparameters.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//<nowiki>
//Initially 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 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, '');
  // 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 < 10) ) {
    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');
    }
    loopcount++;
  }
  if( mytxt.search(/[\{\}]/gm) >= 0 ) {
     mytxt = mytxt.replace(/([\{\}])/gm, '\n<!-- UNPROCESSED HERE -->$1');
     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) { return a.toLowerCase().localeCompare(b.toLowerCase()) });
  } else {
  	plist = plist.sort(function(a,b) { return klist[a] - klist[b] } );
  }
  myfullpagename = mw.config.get('wgPageName');
  myfullpagename = myfullpagename.replace(/_/g, ' ');
  mypagename = myfullpagename.replace(/^Template:/, '');
  mypagename = mypagename.charAt(0).toLowerCase() + mypagename.slice(1);
  // 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>