User:He7d3r/Tools/jsUpdater.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
// [[File:User:He7d3r/Tools/jsUpdater.js]] (workaround for [[phab:T35355]])
/**
 * jsUpdater
 *
 * Helper tool for implementing good practices and changes as found on:
 * [[mw:RL/MGU]], [[mw:CC#JavaScript code]], [[mw:RL/JD]].
 * @version 10
 * @author: Helder, 2011-2014 (https://github.com/he7d3r)
 * @author Timo Tijhof, 2011-2012 ([[m:User:Krinkle]])
 * @license: CC BY-SA 3.0 <https://creativecommons.org/licenses/by-sa/3.0/>
 */
// <nowiki>
(function(e,s){"use strict";var a={};e.messages.set({"jsupdater-single-quotes":"single quotes","jsupdater-update-link":"Update","jsupdater-update-link-description-some":"Click here to scan this script for potential improvements for better compatibility with MW 1.17+","jsupdater-migration-summary":"[[mw:RL/MGU|Migration]]: ","jsupdater-new-code-description":"The updated code is displayed below:","jsupdater-update-button":"Update","jsupdater-select-updates":"Which updates should be performed?","jsupdater-no-updates":"No applicable updates for this script available. Perhaps this script has been updated already?"}),a.patterns={appendCSS:{regex:/\bappendCSS\s*\(/g,replace:"mw.util.addCSS(",summary:"appendCSS → mw.util.addCSS"},importScriptURI:{regex:/\bimportScriptURI\s*\(/g,replace:"mw.loader.load(",summary:"importScriptURI → mw.loader.load"},importStylesheetURI:{regex:/\bimportStylesheetURI\s*\(\s*([^\n\)]+?)\s*\)/g,replace:"mw.loader.load($1, 'text/css')",summary:"importStylesheetURI → mw.loader.load"},addOnloadHook:{regex:/^((?!.*function addOnloadHook\s*\().*)addOnloadHook\s*\(/g,replace:"$1$(",summary:"addOnloadHook → $"},getURLParamValue:{regex:/([^.])getURLParamValue\s*\(/g,replace:"$1mw.util.getParamValue(",summary:"getURLParamValue → mw.util.getParamValue"},getParamVal:{regex:/([^.])getParamVal\s*\(/g,replace:"$1mw.util.getParamValue(",summary:"getParamVal → mw.util.getParamValue"},getParamValue:{regex:/([^.])getParamValue\s*\(/g,replace:"$1mw.util.getParamValue(",summary:"getParamValue → mw.util.getParamValue"},addPortletLink:{regex:/([^.])addPortletLink\s*\(/g,replace:"$1mw.util.addPortletLink(",summary:"addPortletLink → mw.util.addPortletLink"},arrayProtoIndexOf:{regex:/((?:mw\.config\.get\( *['"])?(?:wgRevisionId|wgUserGroups|wgRestrictionEdit|wgRestrictionMove|wgSearchNamespaces|wgMWSuggestMessages|wgFileExtensions)(?:['"] *\))?)\.indexOf\s*\(\s*(.+?)\s*\)/g,replace:"$.inArray($2, $1)",summary:"arr.indexOf → $.inArray"},strProtoEscapeRE:{regex:/([a-zA-Z_][0-9a-zA-Z_]*)\.escapeRE\s*\(\s*\)/g,replace:"mw.util.escapeRegExp($1)",summary:"str.escapeRE() → mw.util.escapeRegExp(str)"},mwRegExpEscape:{regex:/mw\.RegExp\.escape\s*\(/g,replace:"mw.util.escapeRegExp(",summary:"mw.RegExp.escape → mw.util.escapeRegExp"},theOrOrOrOr:{regex:/([0-9a-zA-Z_\$\.]*|mw\.config\.get\(\s*'[a-zA-Z_]*'\s*\))\s*===?\s*([^\(\|\)&!]*)\s*\|\|\s*\1\s*===?\s*([^\(\|\)&!]*)\s*\|\|\s*\1\s*===?\s*([^\(\|\)&!]*)\s*\|\|\s*\1\s*===?\s*([^\(\|\)&!]*)\s*/g,replace:"$.inArray($1, [$2, $3, $4, $5]) !== -1",summary:"a==1||a==2 → $.inArray(a,[1,2])"},theOrOrOr:{regex:/([0-9a-zA-Z_\$\.]*|mw\.config\.get\(\s*'[a-zA-Z_]*'\s*\))\s*===?\s*([^\(\|\)&!]*)\s*\|\|\s*\1\s*===?\s*([^\(\|\)&!]*)\s*\|\|\s*\1\s*===?\s*([^\(\|\)&!]*)\s*/g,replace:"$.inArray($1, [$2, $3, $4]) !== -1",summary:"a==1||a==2 → $.inArray(a,[1,2])"},theOrOr:{regex:/([0-9a-zA-Z_\$\.]*|mw\.config\.get\(\s*'[a-zA-Z_]*'\s*\))\s*===?\s*([^\(\|\)&!]*)\s*\|\|\s*\1\s*===?\s*([^\(\|\)&!]*)\s*/g,replace:"$.inArray($1, [$2, $3]) !== -1",summary:"a==1||a==2 → $.inArray(a,[1,2])"},wgVars:{regex:/([^'"<>$0-9A-Za-z_\/])(stylepath|wgUrlProtocols|wgArticlePath|wgScriptPath|wgScriptExtension|wgScript|wgVariantArticlePath|wgActionPaths|wgServer|wgCanonicalNamespace|wgCanonicalSpecialPageName|wgNamespaceNumber|wgPageName|wgTitle|wgAction|wgArticleId|wgIsArticle|wgUserName|wgUserGroups|wgUserLanguage|wgContentLanguage|wgBreakFrames|wgCurRevisionId|wgVersion|wgEnableAPI|wgEnableWriteAPI|wgSeparatorTransformTable|wgDigitTransformTable|wgMainPageTitle|wgMainPageTitle|wgNamespaceIds|wgSiteName|wgCategories|wgRestrictionEdit|wgRestrictionMove|wgUserVariant|wgMWSuggestTemplate|wgDBname|wgSearchNamespaces|wgSearchNamespaces|wgMWSuggestMessages|wgAjaxWatch|wgLivepreviewMessageLoading|wgLivepreviewMessageReady|wgLivepreviewMessageFailed|wgLivepreviewMessageError|wgFileExtensions|wgFormattedNamespaces|wgIsRedirect|wgStableRevisionId)\b/g,replace:"$1mw.config.get('$2')",summary:"wg* → mw.config.get('wg*')"},skin:{regex:/([^'"<>$0-9A-Za-z_\/])skin\b/g,replace:"$1mw.config.get('skin')",summary:"skin → mw.config.get('skin')"},documentWriteRawScript:{regex:/document\.write\('<[Ss][Cc][Rr][Ii][Pp][Tt] (?:[Tt][Yy][Pp][Ee]="text\/javascript" )?[Ss][Rr][Cc]="(?:'\n?[\t\s]*\+[\t\s]*')?(http[^\n]+?\.js(?:'\n?[\t\s]*\+[\t\s]*')?&action=raw&ctype=text\/javascript(?:&dontcountme=s)?(?:&smaxage=\d+)?(?:&maxage=\d+)?)"><\/[Ss][Cc][Rr][Ii][Pp][Tt]>'\)/g,replace:"mw.loader.load( '$1' )",summary:"document.write('<script...') → mw.loader.load"},documentWriteScript:{regex:/document\.write\(["']<[Ss][Cc][Rr][Ii][Pp][Tt] (?:[Tt][Yy][Pp][Ee]="text\/javascript" )?[Ss][Rr][Cc]=["'](http.+?\.js)["']><\/[Ss][Cc][Rr][Ii][Pp][Tt]>["']\)/g,replace:"mw.loader.load( '$1' )",summary:"document.write('<script...') → mw.loader.load"},documentWriteStylesheet:{regex:/document\.write\(["']<[Ll][Ii][Nn][Kk] [Rr][Ee][Ll]="stylesheet" (?:[Tt][Yy][Pp][Ee]="text\/css" )?[Hh][Rr][Ee][Ff]=["'](http.+?)["']><\/[Ll][Ii][Nn][Kk]>["']\)/g,replace:"mw.loader.load( '$1', 'text/css' )",summary:"document.write('<link...') → mw.loader.load"},wgServerMissing:{regex:/(mw\.loader\.load\s*\(\s*)(mw\.config\.get\s*\(\s*(["'])wgScript\3\s*\)\s*\+\s*['"]\?)|(\s*var\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\s*=\s*)(mw\.config\.get\s*\(\s*(["'])wgScript\7\s*\)\s*\+\s*['"]\?)(?=(?:.|\n)+?mw\.loader\.load\s*\(\s*\5\s*\))/g,replace:"$1$4mw.config.get( $3$7wgServer$3$7 ) + $2$6",summary:"+wgServer ([[phab:T36036]])"},preNowiki:{regex:/\/\/\s*(?:<\/?pre>(?:\s*<\/?nowiki>)?|<\/?nowiki>\s*<\/?pre>|<\/?pre>)\s*\n/g,replace:"",summary:"-<pre>"},isFunction:{regex:/\$\.isFunction\s*\((.+?)\)/g,replace:"typeof $1 === 'function'",summary:"$.isFunction(x) → typeof x === 'function'"},jqSize:{regex:/((?:\$|jQuery)[^;$]+)\.size\s*\(\)/g,replace:"$1.length",summary:"$obj.size() → $obj.length"},old$j:{regex:/\$j\s*(\(|\.)/g,replace:"$$$1",summary:"$j → $"},newArray:{regex:/new\s+Array\s*\(\s*\)/g,replace:"[]",summary:"new Array() → []"},newObject:{regex:/new\s+Object\s*\(\s*\)/g,replace:"{}",summary:"new Object() → {}"},wikiGetlink:{regex:/mw\.util\.wikiGetlink\s*\(/g,replace:"mw.util.getUrl(",summary:"wikiGetlink → getUrl"},hookEvent:{regex:/hookEvent\s*\(\s*(["'])load\1\s*,/g,replace:"$(",summary:"hookEvent → $"},addHandler:{regex:/addHandler\s*\((.*?),\s*(["'])focus\2\s*,/g,replace:"$($1).focus(",summary:"addHandler → $(...).focus"},live:{regex:/\$\s*\(\s*(.*?)\s*\)\.live\s*\(\s*(.*?),\s*(.*?)\s*\)/g,replace:"$(document).on($2,$1,$3)",summary:"live → $(document).on"},live2:{regex:/\$\s*\(\s*(.*?)\s*,\s*([^\),]*?)\s*\)\.live\(\s*(.*?)\s*,/g,replace:"$($2).on($3,$1,",summary:"live → $(document).on"},mwUserName:{regex:/mw\.user\.name\s*\(\s*\)/g,replace:"mw.user.getName()",summary:"mw.user.name → mw.user.getName"},mwUserAnonymous:{regex:/mw\.user\.anonymous\s*\(\s*\)/g,replace:"mw.user.isAnon()",summary:"mw.user.anonymous → mw.user.isAnon"},tooltipAccessKeyPrefix:{regex:/(?:window\.|mw\.util\.)?tooltipAccessKeyPrefix/g,replace:"/* FIXME: Use jquery.accessKeyLabel */",summary:"tooltipAccessKeyPrefix → jquery.accessKeyLabel"},tooltipAccessKeyRegexp:{regex:/(?:window\.|mw\.util\.)?tooltipAccessKeyRegexp/g,replace:"/* FIXME: Use jquery.accessKeyLabel */",summary:"tooltipAccessKeyPrefix → jquery.accessKeyLabel"},updateTooltipAccessKeys:{regex:/([^.]|window\.)updateTooltipAccessKeys/g,replace:"$1mw.util.updateTooltipAccessKeys",summary:"updateTooltipAccessKeys → mw.util.updateTooltipAccessKeys"},jsMessage:{regex:/mw\.util\.jsMessage/g,replace:"mw.notify",summary:"mw.util.jsMessage → mw.notify"},jsMsg:{regex:/jsMsg/g,replace:"mw.notify",summary:"jsMsg → mw.notify"},toJSON:{regex:/\$\.toJSON/g,replace:"JSON.stringify",summary:"$.toJSON → JSON.stringify"},parseJSON:{regex:/\$\.parseJSON/g,replace:"JSON.parse",summary:"$.parseJSON → JSON.parse"},evalJSON:{regex:/\$\.evalJSON/g,replace:"JSON.parse",summary:"$.evalJSON → JSON.parse"},secureEvalJSON:{regex:/\$\.secureEvalJSON/g,replace:"JSON.parse",summary:"$.secureEvalJSON → JSON.parse"},quoteString:{regex:/\$\.quoteString/g,replace:"JSON.stringify",summary:"$.quoteString → JSON.stringify"},browser:{regex:/\$\.browser(.*)/g,replace:"$.browser$1 /* FIXME: Use $.client */",summary:"$.browser → $.client"},andSelf:{regex:/\.andSelf\(/g,replace:".addBack(",summary:".andSelf → .addBack"},getElementsByClassName:{regex:/getElementsByClassName\s*\(\s*([^(),]+?)\s*,\s*([^(),]+?)\s*,\s*([^(),]+?)\s*\)/g,replace:"$($3).find($2 + '.' + $1)",summary:"getElementsByClassName → $('.class')"},getElementsByClassName2:{regex:/getElementsByClassName\s*\(\s*([^(),]+?)\s*\)/g,replace:"$('.' + $1)",summary:"getElementsByClassName → $('.class')"},mwEditButtons:{regex:/mwEditButtons(.*)/g,replace:"[]$1 /* FIXME: Use mw.toolbar */",summary:"-mwEditButtons"},mwCustomEditButtons:{regex:/mwCustomEditButtons(.*)/g,replace:"[]$1 /* FIXME: Use mw.toolbar */",summary:"-mwCustomEditButtons"},injectSpinner:{regex:/(?:window\.|[^.])injectSpinner\s*\(\s*(.*?)\s*,\s*(.*?)\s*\)/g,replace:"$($1).injectSpinner($2)",summary:"injectSpinner → $(...).injectSpinner"},injectSpinner2:{regex:/(?:window\.|[^.])injectSpinner\s*\(\s*(.*?)\s*\)/g,replace:"$($1).injectSpinner()",summary:"injectSpinner → $(...).injectSpinner"},removeSpinner:{regex:/(?:window\.|[^.])removeSpinner\s*\(\s*(.*?)\s*\)/g,replace:"$.removeSpinner($1)",summary:"removeSpinner → $.removeSpinner"},escapeQuotesHTML:{regex:/(?:window\.)?escapeQuotesHTML\s*\(/g,replace:"mw.html.escape(",summary:"escapeQuotesHTML → mw.html.escape"},escapeQuotes:{regex:/(?:window\.)?escapeQuotes\s*\(/g,replace:"mw.html.escape(",summary:"escapeQuotes → mw.html.escape"},liveAndTestAtStart:{regex:/(\.liveAndTestAtStart\s*\(.*)/g,replace:"$1 /* FIXME: Use .on() and .each() directly */",summary:"liveAndTestAtStart → .on()/.each()"},otherDeprecations:{regex:/((?:window\.|[^.])(?:is_gecko|is_chrome_mac|is_chrome|webkit_version|is_safari_win|webkit_match|is_ff2|ff2_bugs|is_ff2_win|is_ff2_x11|opera95_bugs|opera7_bugs|opera6_bugs|is_opera_95|is_opera_preseven|is_opera|ie6_bugs|doneOnloadHook|onloadFuncts|runOnloadHook|changeText|killEvt|addClickHandler|removeHandler|getElementsByClassName|getInnerText|checkboxes|lastCheckbox|setupCheckboxShiftClick|addCheckboxClickHandlers|checkboxClickHandler|sajax_debug_mode|sajax_request_type|sajax_debug|sajax_init_object|sajax_do_call|wfSupportsAjax|addButton|insertTags|gM\s*\().*)/g,replace:"$1 /* FIXME */",summary:"other deprecations"},maxage:{regex:/[?&]s?maxage=\d*/g,replace:"",summary:"-maxage ([[mw:Special:Diff/1068457]])"},dontcountme:{regex:/[?&]dontcountme=s/g,replace:"",summary:"-dontcountme ([[w:en:Special:PermaLink/128295924#dontcountme=s?]])"},jqEscapeRE:{regex:/(?:\$|jQuery)\.escapeRE\s*\(/g,replace:"mw.util.escapeRegExp(",summary:"$.escapeRE → mw.util.escapeRegExp"},bitsSkins:{regex:/(https?:)?\/\/bits\.wikimedia\.org\/skins\//g,replace:"/static/current/skins/",summary:"bits.wikimedia.org → static"},bitsStaticCurrent:{regex:/(https?:)?\/\/bits\.wikimedia\.org\/static-current\//g,replace:"/static/current/",summary:"bits.wikimedia.org → static"}},a.getPatterns=function(e,t){var r=[];return s.each(a.patterns,function(s,a){return a.regex.lastIndex=0,a.regex.test(e)&&(r.push(s),t)?!1:void 0}),r},a.checkForUpdates=function(t){var r,i,n,o,g,m=t.query.pages,c=t.query.pageids[0];c&&Number(c)>0&&m[c]?(r=m[c].title,i=m[c].revisions[0]["*"],n=a.getPatterns(i,!0),o=e.util.getUrl(r,{action:"edit",runjsupdater:"true"}),g=e.util.addPortletLink("p-views",o,e.msg("jsupdater-update-link"),"ca-js-updater",n.length?e.msg("jsupdater-update-link-description-some"):e.msg("jsupdater-no-updates")),s(g).find("a").css("color",n.length?"orange":"green")):e.log("API information for jsUpdater indicates this page does't exist.")},a.install=function(){var t,r=e.config.get("wgNamespaceNumber");r=r%2===0?r:r-1,t=e.config.get("wgFormattedNamespaces")[r]+":"+e.config.get("wgTitle"),s.getJSON(e.util.wikiScript("api"),{format:"json",action:"query",titles:t,prop:"revisions",rvprop:"content",indexpageids:""},a.checkForUpdates)},a.doConversion=function(e,t){var r;return r={output:e,summaries:[]},t.length?(s.each(t,function(s){var i=a.patterns[t[s]];i.regex.lastIndex=0,r.output=e.replace(i.regex,i.replace),r.output!==e&&(r.summaries.push(i.summary),e=r.output)}),r):r},a.run=function(t){var r,i=e.msg("jsupdater-migration-summary"),n=s(".ace_editor"),o=n.length?n[0].env.document.getValue():s("#wpTextbox1").val();r=a.doConversion(o,t),i+=r.summaries.join("; "),s("#js-updater-options").remove(),e.util.$content.find(".permissions-errors").length?s("#mw-content-text").prepend("<b>"+e.msg("jsupdater-new-code-description")+"</b><br><br>"+'<textarea cols="80" rows="40" style="width: 100%; font-family: monospace; line-height: 1.5em;">'+e.html.escape(r.output)+"</textarea>"):(n.length?n[0].env.document.setValue(r.output):s("#wpTextbox1").val(r.output),s("#wpSummary").val(i),s("#wpDiff").click())},a.showOptions=function(){var t,r,i,n,o,g=s(".ace_editor"),m=g.length?g[0].env.document.getValue():s("#wpTextbox1").val(),c=a.getPatterns(m,!1);if(t=s('<div id="js-updater-options"></div>'),c.length){for(t.text(e.msg("jsupdater-select-updates")),o=0;c.length>o;o++)r=s("<input>",{type:"checkbox",name:"updates",id:"update-"+c[o],value:c[o],checked:"checked"}),i=s("<label>",{"for":"update-"+c[o],text:a.patterns[c[o]].summary}),t.append("<br>",r,i);n=s("<button>",{type:"button",id:"update-button",value:"Update",text:e.msg("jsupdater-update-button")}).click(function(){var e=[];s("#js-updater-options").find('input:checkbox[name="updates"]:checked').each(function(){e.push(s(this).val())}),a.run(e)}).appendTo(t)}else t.text(e.msg("jsupdater-no-updates"));s("#mw-content-text").prepend(t.get(0))},/\.js$/g.test(e.config.get("wgTitle"))&&s.inArray(e.config.get("wgNamespaceNumber"),[8,9,2,3,4,5])!==-1&&e.loader.using(["mediawiki.util"]).then(function(){s(a.install),s.inArray(e.config.get("wgAction"),["edit","submit"])!==-1&&e.util.getParamValue("runjsupdater")&&s(a.showOptions)}),window.jsUpdater=a})(mediaWiki,jQuery);
// </nowiki>