User:FlightTime/English variants/sandbox.js

// This is a custom fork of User:Ohconfucius/script/EngvarB.js.

// This script converts American English spellings into British spellings.

// PLEASE READ THE DOCUMENTATION at User:Ohconfucius/EngvarB.

// Feedback and constructive criticism are welcome.

// Any advice on improving the scripts are especially welcome.

//

/**

* TemplateScript adds configurable templates and scripts to the sidebar, and adds an example regex editor.

* @see https://meta.wikimedia.org/wiki/TemplateScript

* @update-token File:Pathoschild/templatescript.js

*/

$.ajax('//tools-static.wmflabs.org/meta/scripts/pathoschild.templatescript.js', {

dataType: 'script',

cache: true

}).then(function () {

pathoschild.TemplateScript.add([

{

category: 'EngvarB', name: 'AMERICAN', isMinorEdit: true, script: function (editor) {

ohc_ENGVAR_set_variation(editor, "U");

}

},

{

category: 'EngvarB', name: 'BRITISH', isMinorEdit: true, script: function (editor) {

ohc_ENGVAR_set_variation(editor, "B");

}

},

{

category: 'EngvarB', name: 'OXFORD', isMinorEdit: true, script: function (editor) {

ohc_ENGVAR_set_variation(editor, "O");

}

},

{

category: 'EngvarB', name: 'CANADIAN', isMinorEdit: true, script: function (editor) {

ohc_ENGVAR_set_variation(editor, "C");

}

}

]);

});

//

/** ------------------------------------------------------------------------ **/

// PROTECTION FROM STRING SUBSTITUTION

var protected_map;

function ohc_ENGVAR_protect(editor) {

// protects categories, templates, link pipings, quotes, etc

// the sensitive part is stored and replaced with a unique identifier,

// which is later replaced with the stored part.

var text = editor.get();

protected_map = [];

var replace_string = function (match) {

protected_map.push(match);

return '⍌' + (protected_map.length - 1) + '⍍';

};

var protect_string = function (string) {

text = text.replace(string, replace_string);

};

// protect_string(/(pre)(string)(post)/gi); // template

protect_string(/(

)(.*?)(<\/blockquote>)/gi);

protect_string(/({\| *class *= *"wikitable *")([\S\s]*?)(\|})/gi);

protect_string(/(]*?>)([^<>]*)(<\/table>)/gi);

protect_string(/(]*?>)([^<>]*)(<\/timeline>)/gi);

protect_string(/(]*>)/gi);

protect_string(/(=\s*)(color)(\s*:#)/gi);

protect_string(/(\{)((?:meta |font |)color)([^|]*\|)/gi); //color box templates

protect_string(/([\s;:\'\"]+)(color)([\s;:\'\"]\w)/gi);

protect_string(/({{\w*\scolor\|)([^|=\[\]]*)(}})/gi); //

protect_string(/(<\/?[ ]*)(center)([ ]*>)/gi); //

tags

protect_string(/(align\/?[ ]*=\/?[ ]*[ "'][ ]*)(center)([ ]*[ "'])/gi); // align="center" in tables

protect_string(/(\{\{)(Medical cases chart\/bar colors)([^\}]+\}\})/gi);

protect_string(/(\{\{)(bar percent)(\|[^\}]+\}\})/gi);

protect_string(/(]*?>)([^<>]*)(<\/ref>)/gi);

protect_string(/(]*)(\/>)/gi);

protect_string(/([\s(]["“])([^"“”\n]*)(["”])/gi); // double quotes

protect_string(/({[\w ]{0,12}(?:quot[^|]{1,7}\s?|sic|(?:not a |)typo|as written)\|)([^}]+)(})/gi);

protect_string(/((?:Category|File|Image):)([^|\]]*)([|\]])/gi); // cats, images

protect_string(/((?:image\d?|image_skyline|image[ _]location\d?|image[ _](?:map|name)|img|pic)\s*=)([^|}]*)([|}])/gi); // images within templates infoboxes etc

protect_string(/(cite[ _]encyclopedia\s*\|)/gi);

protect_string(/((?:url)\s*=)([^|}]*)([|}])/gi); // urls within templates infoboxes etc

protect_string(/(\[(?:https?:|ftp:))([^\]]*)(])/gi);

protect_string(/(\[(?:https?:|ftp:))([^\s\]]*)([\s\]])/gi);

protect_string(/(\[\[)([^|\]]*)(\|)/gi); // pipings

protect_string(/({(?:See ?also|Main))(\|[^}]*)(})/gi); // see also and main templates

protect_string(/({{(?:external|wide )image\s?\|)([^}]+)(})/gi);

protect_string(/({{(?:harvnb|wikisource)\|)([^}]+)(})/gi);

protect_string(/({{)((?:NYT|WSJ)topic\|[^}]*)(}})/gi);

protect_string(/({{\w*)([^|=\[\]}]*)(}})/gi); // templates

protect_string(/({Party name with colou?r)(\s+)/gi);

protect_string(/({Infobox )((?:[\w ]*)organization)(\s+)/gi);

protect_string(/({Infobox )((?:[\w]* )artifact)(\s+)/gi);

// parameters

protect_string(/(\|)(\s*colors(?:_label|)\s*)(=)/gi);

protect_string(/(\|)(\s*background color\s*)(=)/gi);

protect_string(/([\|\!]\s*style\s*=[^|:"]*)"[^|]*(color|center|gray)([^|]*\|)/gi);

protect_string(/(\|)(\s*organizations?\s*)(=)/gi);

protect_string(/(\\|\/?[ ]*)(center)([ ]*\\|)/gi); // |center| in files

protect_string(/(\|)(\s*analog\s*)(=)/gi);

protect_string(/(\|)(\s*licen[cs]e ?(?:place|date|)\s*)(=)/gi);

protect_string(/(\|\s*)(cleanup|color|coordinates\w*)([ ]*=)/gi); // parameters within infoboxes

protect_string(/(\|(?:[^=|{}]*))(cleanup|encyclopa?edia|enroll?ment|honorific_prefix|honors|lockup\w{1,4}|organi[sz]ation|catalog\snumber)(\s*=)/g);

protect_string(/(\|\s*)(encyclopedia|\w*colors|(?:org|rom)anization|license)(\s?=)/gi);

protect_string(/(\|\s*)(local[ _]authority)(\s?=)/gi);

protect_string(/(\|\s*)([Ss]hip[ _](?:armou?r|honou?rs))([ ]*?=)/g);

protect_string(/(\|\s*title\s?=)([^|\]]*)(\|)/gi);

//white list

protect_string(/(Back in the U.S.S.R.)/g); // title of work

protect_string(/(Born in the U.S.A.)/g); // title of work

protect_string(/(Dear Mom|Serial Mom)/g); // title of work

protect_string(/(derailment)/gi);

protect_string(/(Traveling Wilburys?|Rockefeller)/g); // proper noun

protect_string(/(to license)/gi); // verb

protect_string(/(improvis)/gi);

protect_string(/(non-cooperation)/gi);

protect_string(/(Organisation for Economic Co-operation and Development)/gi);

protect_string(/(pr[eo]mis(?:e|ing)|paradise)/gi);

protect_string(/(solid gr[ae]y)/gi);

protect_string(/(rigor mortis)/gi);

protect_string(/(revis)/gi);

protect_string(/((?:analy|iri|peni)ses)/gi);

protect_string(/(World Health Organization)/gi);

// protect from hyphenation

protect_string(/(\breed(?:|s)[^aeiou]|[Rr]eegan)/g);

// whitelisting: protect from doubling of "L"

protect_string(/(adrenaline|conceal|derail(?:ing|ment)|rebel|Rockefeller)/gi);

// whitelisting: protect from function ohc_ENGVAR_restore_z

protect_string(/(?:ar|de[mv]|enterpr|improv|parad|prec|prom|rev|surpr|treat|telev)(?:ise?[drs]?|ing)/gi);

protect_string(/(?: anti)(?:c|dote|mon|path|q)/g);

protect_string(/(denise|excell(ed|ing))/gi);

protect_string(/(?:(?:mercury|nobel)pri|imagesi|picsi)(?:ze)/g);

editor.set(text);

}

function ohc_ENGVAR_unprotect(editor) {

// restore words protected at runtime

editor.replace(/[♫]/g, '');

// restore words protected beforehand

var text = editor.get();

var matches;

do {

text = text.replace(/⍌([0-9]+)⍍/g, function (match, index) {

return protected_map[index];

});

matches = text.match(/⍌([0-9]+)⍍/g);

} while (matches !== null && matches.length > 0);

editor.set(text);

}

/** ------------------------------------------------------------------------ **/

function ohc_ENGVAR_plain(editor) {

// per https://www.gov.uk/guidance/style-guide/a-to-z-of-gov-uk-style

// redundancies

editor.replace(/B\.B\.C\.(?=[\W])/g, 'BBC');

editor.replace(/U\.S\.A\.(?=[\W])/g, 'USA');

editor.replace(/U\.S\.(?=[\W])/g, 'US');

editor.replace(/U\.K\.(?=[\W])/g, 'UK');

editor.replace(/E\.U\.(?=[\W])/g, 'EU');

editor.replace(/(fill )out/gi, '$1in');

editor.replace(/U\.S\.S\.R\./g, 'USSR');

// agrammatical

editor.replace(/(comprised )of /gi, '$1');

// old-fashioned

editor.replace(/(whil)st /gi, '$1e ');

editor.replace(/(among)st /gi, '$1 ');

// hyphenation

// editor.replace(/(co)(ordinat(e\b|ing|ion))/g, '$1-$2');

// editor.replace(/\b(re)(e\w[aeiou]\w{4,})/gi, '$1-$2');

// editor.replace(/\b(over|under)(r\w{4,})/gi, '$1-$2');

// capitalisation

// rem geographical regions - too many false positives

// editor.replace(/(local )authority/g, '$1council');

editor.replace(/w(estern European Union)/g, 'W$1');

editor.replace(/(New )s(outh Wales)/g, '$1S$2');

}

function ohc_ENGVAR_simple_b(editor) {

var table = {

'aging': '$1ageing',

'aluminum': '$1aluminium',

'adrenalin(\\b)': '$1adrenaline$2',

'annex(\\b)': '$1annexe$2',

'artifact': '$1artefact',

'(ana|breatha|cata|hydro|para)lyz(e|ing)': '$1$2lys$3',

// 'bestsell': '$1best-sell', //disabled 24/04/24 following comment;word in OED

'ba(lk)': '$1u$2',

'diarrhea': '$1diarrhoea',

'(de|of)fense': '$1$2fence',

'license': '$1licence',

'(licen)c(ing|ed)': '$1$2s$3',

'percent(\\b)': '$1per cent$2',

'plow(s|ing|\\b)': '$1plough$2',

'(practi)c(ing|ed)': '$1$2s$3',

'furor(\\b)': '$1furore$2',

'(light-|dark-|\\b)gray': '$1$2grey',

'guerilla': '$1guerrilla',

'jewelry': '$1jewellery',

'(judg)(ment)': '$1$2e$3',

'maneuver(ab|ed|ing)': '$1manoeuvr$2',

'maneuver': '$1manoeuvre',

'meager': '$1meagre',

'louve(red|ring)': '$1louv$2',

'(louv|somb)er': '$1$2re',

'ped(iatric|ophil)': '$1paed$2',

'encyclopedi(a|c)': '$1encyclopaedi$2',

'skeptic': '$1sceptic',

'mollusk': '$1mollusc',

'vapor(s?\\b)': '$1vapour$2',

'licorice': '$1liquorice',

// composite words

'(break|drop|clean|line|lock|pick)(out|up)': '$1$2-$3',

// oe/ae words

'gyneco': '$1gynaeco',

'hemo(globin|ly|phil|rr)': '$1haemo$2',

'orthopedic': '$1orthopaedic',

'archeo': '$1archaeo',

'paleonto': '$1palaeonto',

'enology': '$1oenology',

'esophag': '$1oesophag',

'estrogen': '$1oestrogen',

'(an|)esthe(sia|tic|tist)': '$1$2aesthe$3',

'anesthesiologist': '$1anaesthetist',

'homeopath': '$1homoeopath',

// 'medieval(\\b)': '$1mediaeval$2',

'omelet(\\b)': '$1omelette$2',

'rigor(\\b)': '$1rigour$2',

'(an|leuk|septic|tox)emi(a|c)': '$1$2aemi$3',

// 'f' words

//'(S|s)ulfur': '$1$2ulphur', //disabled per WP:ARTCOM

'anymore': '$1any more',

'specialty': '$1speciality',

// non-redundant e

'(lik|liv|rat|sal|siz|shak)(able)': '$1$2e$3',

// '~our' words

'(arm|clam|glam|harb|neighb|rum|savi?|tum)or(ed|ful|ing|less|ly|s|\\b)': '$1$2our$3',

'(arm|sav)or(ies|y|s|\\b)': '$1$2our$3',

'(cand|hum|od)or((?:ful|less)(?:ly|)|\\b)': '$1$2our$3',

'neighborhood': '$1neighbourhood',

'behavior(al|s|\\b)': '$1behaviour$2',

'favor(abl[ey]|ed|i[\\w]*|s|\\b)': '$1favour$2',

'honor(abl[ey]|ed|ing|s|\\b)': '$1honour$2',

'(endeav|lab)or(e[dr]|ing|s|\\W)': '$1$2our$3',

'mol(dy?|t)(ed|ing|s|\\W)': '$1moul$2$3',

// '~re~' words

'(calib|fib|goit|lust|mit|nit|och|reconnoit|sab|saltpet|spect|theat|tit)er(s?\\W)': '$1$2re$3',

'(\b(?:[2-9]|\d{2,3}|half|quarter|two|three|four|five|six|seven|eight|nine|ten)\b) (liter|(?:kilo|)meter)': '$1$2re$3',

'(centi|kilo|micro|milli|nano|-|hundred\\s|\\d\\s)meter': '$1$2metre',

'(centi|milli|deci|pico|hecto|\\b)liter(s?\\b)': '$1$2litre$3',

'(dema|peda|mono|syna)gog(s?\\W)': '$1$2gogue$3',

'(\b(?:[2-9]|\d{2,3}|one|two|three|four|five|six|seven|eight|nine|ten)\b) story': '$1-storey',

// '(\\W[a-zA-Z]{3,12}[^s\\b])iz(e[drs]?|ation(s|al|)|ing)': '$1$2is$3',

// '~l' words where the 'l' doubles as past and present participle

'((?:\\w{3,9}[-–—]|)(?:fu|pan))el(e[dr]|ist|ing)': '$1$2ell$3',

'(bev|canc|couns|fu|jew|lab|lev|marv|mod|pan|prop|quarr|rev|sign|trav)el(e[dr]|ing)': '$1$2ell$3',

'([a-zA-Z]{2,8}[^eglpstz ])el(e[dr]|est|ing)(\\b)': '$1$2ell$3$4', // added 'p' to avoid changing of "misspelling"

'(app|di|enthr|equ|initi|journ|riv|sign|tot)al(e[dr]|ing)': '$1$2all$3' // appalled/appalling is also American

};

for (var word in table) {

try {

editor.replace(new RegExp('([ \\|\\[\\*])' + word, 'g'), table[word]);

} catch (err) {

alert('There was an error when changing "' + word + '" => "' + table[word] + '".\n\n'

+ 'Error: ' + err.message + '\n\n'

+ 'Click OK to continue.\n\n');

}

}

var table2 = {

// '~our' words

'([ \\|\\[\\*])(col|flav|hum)or(ed|ful|fully|ings?|less|lessly|s\\W)': '$1$2our$3',

'( [\\w\\D]*\\-)(col|flav|hum)ored': '$1$2oured',

'([^\\w\\d\\-\\/=:])(col)or(\\W)': '$1$2our$3',

// '~re~' words

'([^\\w\\d\\-\\/=])(calib|fib|goit|lust|mit|nit|reconnoit|sab|saltpet|spect|theat|tit)er(ed|ing)': '$1$2re$3',

'([^\\w\\d\\-\\/=:])(cent|epicent|recent)er(ed|ing)': '$1$2r$3',

'([^\\w\\d\\-\\/=:])(cent|epicent|recent)er(s?\\b)': '$1$2re$3',

// '~logu~' words

'([^\\w\\d\\-\\/])(ana|cata|dia|epi|homo|mono|pro)log(ed|ing)': '$1$2logu$3',

'([^\\w\\d\\-\\/])(ana|cata|dia|epi|homo|mono|pro)log(s?\\b)': '$1$2logue$3',

// '~l' words where the 'l' doubles as past and present participle

'([ \\|\\[])(counc[ie])l(e[dr]|ing|ors?)(\\b)': '$1$2ll$3$4',

'\\b([a-zA-Z]*)ll(ful|ment)': '$1l$2',

'(movie theat(er|re))': 'cinema',

'([ \\|\\[\\*])airplane': '$1aeroplane',

// '([ \\|\\[\\*])\\b[Mm](um|om(my|))\\b': '$1mother', // disabled 10 June – frequent false positives

'([ \\|\\[\\*])sidewalk': '$1pavement'

};

for (word in table2) {

try {

editor.replace(new RegExp(word, 'g'), table2[word]);

} catch (err) {

alert('There was an error when changing "' + word + '" => "' + table2[word] + '".\n\n'

+ 'Error: ' + err.message + '\n\n'

+ 'Click OK to continue.\n\n');

}

}

// remove US spelling from {{convert}} template output

editor.replace(/({{convert\|[^}]*)\|(?:sp|spell)[ ]*=[ ]*us/gi, '$1');

editor.replace(/({{(?:in|ft|yd|[mck]?m)[23]?[ ]+to[ ]+[^}]*)\|(?:sp|spell)[ ]*=[ ]*(?:American|us)/gi, '$1');

editor.replace(/({{(?:pd|pop[ ]+density[ ])+(?:km|mi)2[^}]*)\|(?:sp|spell)[ ]*=[ ]*(?:American|us)/gi, '$1');

// remove ambiguous pound sign; rem incidental intervening space

editor.replace(/₤ ?(\d)/g, '£$1');

editor.replace(/\b(vice) (president|chairman|chancellor|minister)/gi, '$1-$2');

}

function ohc_ENGVAR_simple_c(editor) {

var table = {

'ageing': '$1aging',

'aluminum': '$1aluminium',

'adrenalin(\\b)': '$1adrenaline$2',

'annex(\\b)': '$1annexe$2',

'(ana|breatha|cata|hydro|para)lyz(e|ing)': '$1$2lys$3',

'bau(lk)': '$1ba$2',

'(de|of)fense': '$1$2fence',

'license': '$1licence',

'(licen)c(ing|ed)': '$1$2s$3',

'percent(\\b)': '$1per cent$2',

'(practi)s(ing|ed)': '$1$2c$3',

'furor(\\b)': '$1furore$2',

'(light-|dark-|\\b)gray': '$1$2grey',

'guerilla': '$1guerrilla',

'maneuver(ab|ed|ing)': '$1manoeuvr$2',

'maneuver': '$1manoeuvre',

'louve(red|ring)': '$1louv$2',

'louver': '$1louvre',

'encyclopaedi(a|c)': '$1encyclopedi$2',

'skeptic': '$1sceptic',

'mollusk': '$1mollusc',

'vapor(s?\\b)': '$1vapour$2',

'liquorice': '$1licorice',

// composite words

// 'onstage': '$1on-stage',

'(break|drop|clean|line|lock|pick)(out|up)': '$1$2-$3',

// oe/ae words

'anaesthesiologist': '$1anesthetist',

'(an)aesthe(sia|tic|tist)': '$1$2esthe$3',

'archaeo': '$1archeo',

'diarrhoea': '$1diarrhea',

'foetus': '$1fetus',

'gyneco': '$1gynaeco',

'haemo(globin|ly|phil|rr)': '$1hemo$2',

'orthopaedic': '$1orthopedic',

'oenology': '$1enology',

'oesophag': '$1esophag',

'oestrogen': '$1estrogen',

'homoeopath': '$1homeopath',

'omelet(\\b)': '$1omelette$2',

'paed(iatric|ophil)': '$1ped$2',

'palaeonto': '$1paleonto',

'rigor(\\b)': '$1rigour$2',

'(an|leuk|septic|tox)aemi(a|c)': '$1$2emi$3',

// 'f' words

//'(S|s)ulfur': '$1$2ulphur', //disabled per WP:ARTCOM

'anymore': '$1any more',

'speciality': '$1specialty',

// non-redundant e

'(lik|liv|rat|sal|siz|shak)(able)': '$1$2e$3',

// '~our' words

'(arm|clam|glam|harb|neighb|rum|savi?|tum)or(ed|ful|ing|less|ly|s|\\b)': '$1$2our$3',

'(arm|sav)or(ies|y|s|\\b)': '$1$2our$3',

'(cand|hum|od)or((?:ful|less)(?:ly|)|\\b)': '$1$2our$3',

'neighborhood': '$1neighbourhood',

'behavior(al|s|\\b)': '$1behaviour$2',

'favor(abl[ey]|ed|i[\\w]*|s|\\b)': '$1favour$2',

'honor(abl[ey]|ed|ing|s|\\b)': '$1honour$2',

'(endeav|lab)or(e[dr]|ing|s|\\W)': '$1$2our$3',

'mol(dy?|t)(ed|ing|s|\\W)': '$1moul$2$3',

// '~re~' words

'(calib|fib|goit|lust|mit|nit|och|reconnoit|sab|saltpet|spect|theat|tit)er(s?\\W)': '$1$2re$3',

'(centi|kilo|micro|milli|nano|-|hundred\\s|\\d\\s)meter': '$1$2metre',

'(centi|milli|deci|pico|hecto|\\b)liter(s?\\b)': '$1$2litre$3',

'(dema|peda|mono|syna)gog(s?\\W)': '$1$2gogue$3',

// '~l' words where the 'l' doubles as past and present participle

'((?:\\w{3,9}[-–—]|)(?:fu|pan))el(e[dr]|ist|ing)': '$1$2ell$3',

'(bev|canc|couns|fu|jew|lab|lev|marv|mod|pan|prop|quarr|rev|sign|trav)el(e[dr]|ing)': '$1$2ell$3',

'([a-zA-Z]{2,8}[^eglpstz ])el(e[dr]|est|ing)(\\b)': '$1$2ell$3$4', // added 'p' to avoid changing of "misspelling"

'(app|di|enthr|equ|initi|journ|riv|sign|tot)al(e[dr]|ing)': '$1$2all$3' // appalled/appalling is also American

};

for (var word in table) {

try {

editor.replace(new RegExp('([ \\|\\[\\*])' + word, 'g'), table[word]);

} catch (err) {

alert('There was an error when changing "' + word + '" => "' + table[word] + '".\n\n'

+ 'Error: ' + err.message + '\n\n'

+ 'Click OK to continue.\n\n');

}

}

var table2 = {

// '~our' words

'([ \\|\\[\\*])(col|flav|hum)or(ed|ful|fully|ings?|less|lessly|s\\W)': '$1$2our$3',

'( [\\w\\D]*\\-)(col|flav|hum)ored': '$1$2oured',

'([^\\w\\d\\-\\/=:])(col)or(\\W)': '$1$2our$3',

// '~re~' words

'([^\\w\\d\\-\\/=])(calib|fib|goit|lust|mit|nit|reconnoit|sab|saltpet|spect|theat|tit)er(ed|ing)': '$1$2r$3',

'([^\\w\\d\\-\\/=:])(cent|epicent|recent)er(ed|ing)': '$1$2r$3',

'([^\\w\\d\\-\\/=:])(cent|epicent|recent)er(s?\\b)': '$1$2re$3',

// '~logu~' words

'([^\\w\\d\\-\\/])(ana|cata|dia|homo|mono|pro)log(ed|ing)': '$1$2logu$3',

'([^\\w\\d\\-\\/])(ana|cata|dia|homo|mono|pro)log(s?\\b)': '$1$2logue$3',

// '~l' words where the 'l' doubles as past and present participle

'\\b(counc[ie])l(e[dr]|ing|ors?)\\b': '$1ll$2',

// '(movie theat(er|re))': 'cinema',

'\\b([a-z]*)ll(ful|ment)': '$1l$2'

};

for (word in table2) {

try {

editor.replace(new RegExp(word, 'g'), table2[word]);

} catch (err) {

alert('There was an error when changing "' + word + '" => "' + table2[word] + '".\n\n'

+ 'Error: ' + err.message + '\n\n'

+ 'Click OK to continue.\n\n');

}

}

// remove US spelling from {{convert}} template output

editor.replace(/({{convert\|[^}]*)\|(?:sp|spell)[ ]*=[ ]*us/gi, '$1');

editor.replace(/({{(?:in|ft|yd|[mck]?m)[23]?[ ]+to[ ]+[^}]*)\|(?:sp|spell)[ ]*=[ ]*(?:American|us)/gi, '$1');

editor.replace(/({{(?:pd|pop[ ]+density[ ])+(?:km|mi)2[^}]*)\|(?:sp|spell)[ ]*=[ ]*(?:American|us)/gi, '$1');

// remove ambiguous dollar sign; rem incidental intervening space

editor.replace(/$ ?(\d)/g, '$$1');

//editor.replace(/rigour mortis/g, 'rigor mortis');

// reconvert special cases

}

function ohc_ENGVAR_simple_a(editor) {

var table = {

'ageing': '$1aging',

'aluminium': '$1aluminum',

'adrenaline(\\b)': '$1adrenalin$2',

'annexe(\\b)': '$1annex$2',

'artefact': '$1artifact',

'(ana|breatha|cata|hydro|para)lys(e|ing)': '$1$2lyz$3',

'bau(lk)': '$1ba$2',

// 'bestsell': '$1best-sell', //disabled 24/04/24 following comment;word in OED

'diarrhoea': '$1diarrhea',

'(de|of)fence': '$1$2fense',

'licence': '$1license',

'(licen)c(ing|ed)': '$1$2s$3',

'per cent(\\b)': '$1percent$2',

'(practi)s(ing|ed)': '$1$2c$3',

'furore(\\b)': '$1furor$2',

'(light-|dark-|\\b)grey': '$1$2gray',

'guerilla': '$1guerrilla',

'jewellery': '$1jewelry',

'manoeuvr(ab|ed?|ing)': '$1maneuver$2',

'louv(red|ring)': '$1louve$2',

'louvre': '$1louver',

'paed(iatric|ophil)': '$1ped$2',

'encyclopaedi(a|c)': '$1encyclopedi$2',

'sceptic': '$1skeptic',

'mollusc': '$1mollusk',

'vapour(s?\\b)': '$1vapor$2',

'liquorice': '$1licorice',

// composite words

'(break|drop|clean|line|lock|pick)-(out|up)': '$1$2$3',

// oe/ae words

'gynaeco': '$1gyneco',

'haemo(globin|ly|phil|rr)': '$1hemo$2',

'orthopaedic': '$1orthopedic',

// 'archaeo': '$1archeo', // disabling per user:coffeeandcrumbs (21/8/2018)

'palaeonto': '$1paleonto',

'oenology': '$1enology',

'oesophag': '$1esophag',

'oestrogen': '$1estrogen',

'(an)aesthe(sia|tic|tist)': '$1$2esthe$3',

'anaesthetist': '$1anesthesiologist',

'homoeopath': '$1homeopath',

// 'mediaeval(\\b)': '$1medieval$2',

'omelette(\\b)': '$1omelet$2',

'rigour(\\b)': '$1rigor$2',

'(an|leuk|septic|tox)aemi(a|c)': '$1$2emi$3',

// 'f' words

//'(S|s)ulfur': '$1$2ulphur', //disabled per WP:ARTCOM

'any more': '$1anymore',

'speciality': '$1specialty',

// non-redundant e

'(lik|liv|rat|sal|siz|shak)e(able)': '$1$2$3',

// '~our' words

'(arm|clam|harb|neighb|rum|savi?|tum)our(ed|ful|ing|less|ly|s|\\b)': '$1$2or$3', // removing "glamour" per user:coffeeandcrumbs (21/8/2018)

'(arm|sav)our(ies|y|s|\\b)': '$1$2or$3',

'(cand|hum|od)our((?:ful|less)(?:ly|)|\\b)': '$1$2or$3',

'neighbourhood': '$1neighborhood',

'behaviour(al|s|\\b)': '$1behavior$2',

'favour(abl[ey]|ed|i[\\w]*|s|\\b)': '$1favor$2',

'honour(abl[ey]|ed|ing|s|\\b)': '$1honor$2',

'(endeav|lab)our(e[dr]|ing|s|\\W)': '$1$2or$3',

'moul(d|t)(ed|ing|s|\\W)': '$1mol$2$3',

// '~re~' words

'(calib|fib|goit|lust|mit|nit|och|reconnoit|sab|saltpet|spect|theat|tit)re(s?\\W)': '$1$2er$3',

'(centi|kilo|micro|milli|nano|-|hundred\\s|\\d\\s)metre': '$1$2meter',

'(centi|milli|deci|pico|hecto|\\b)litre(s?\\b)': '$1$2liter$3',

'(mono)gogue(s?\\W)': '$1$2gog$3', //rem "demagog"; rem "synagog" and "pedagog" June 2025

// '(\\W[a-zA-Z]{3,12}[^s\\b])iz(e[drs]?|ation(s|al|)|ing)': '$1$2is$3',

// '~l' words where the 'l' doubles as past and present participle

'((?:\\w{3,9}[-–—]|)(?:fu|pan))ell(e[dr]|ist|ing)': '$1$2el$3',

'(bev|canc|couns|fu|jew|lab|lev|marv|mod|pan|prop|quarr|rev|sign|trav)el(e[dr]|ing)': '$1$2el$3',

'([a-zA-Z]{2,8}[^eglpstz ])el(e[dr]|est|ing)(\\b)': '$1$2el$3$4', // added 'p' to avoid changing of "misspelling"

'(di|enthr|equ|initi|journ|riv|sign|tot)al(e[dr]|ing)': '$1$2al$3' // appalled/appalling is also American

// '\\b(appal|excel)((?:e[dr]|est|ing)\\b)': '$1l$2', // "excelling/excelled" is US English

};

for (var word in table) {

try {

editor.replace(new RegExp('([ \\|\\[\\*])' + word, 'g'), table[word]);

} catch (err) {

alert('There was an error when changing "' + word + '" => "' + table[word] + '".\n\n'

+ 'Error: ' + err.message + '\n\n'

+ 'Click OK to continue.\n\n');

}

}

var table2 = {

// '~our' words

'([ \\|\\[\\*])(col|flav|hum)our(ed|ful|fully|ings?|less|lessly|s\\W)': '$1$2or$3',

'( [\\w\\D]*\\-)(col|flav|hum)oured': '$1$2ored',

'([^\\w\\d\\-\\/=:])(col)our(\\W)': '$1$2or$3',

// '~re~' words

'([^\\w\\d\\-\\/=])(calib|fib|goit|lust|mit|nit|reconnoit|sab|saltpet|spect|theat|tit)re(ed|ing)': '$1$2er$3',

'([^\\w\\d\\-\\/=:])(cent|epicent|recent)re(ed|ing)': '$1$2er$3',

'([^\\w\\d\\-\\/=:])(cent|epicent|recent)re(s?\\b)': '$1$2er$3',

// '~logu~' words

'([^\\w\\d\\-\\/])(ana|cata|epi|homo|mono|pro)logu(ed|ing)': '$1$2log$3', // removing "dialogue" per user:coffeeandcrumbs (21/8/2018)

'([^\\w\\d\\-\\/])(ana|cata|epi|homo|mono|pro)logue(s?\\b)': '$1$2log$3', // removing "dialogue" per user:coffeeandcrumbs

// '~l' words where the 'l' doubles as past and present participle

'([ \\|\\[])(counc[ie])ll(e[dr]|ing|ors?)(\\b)': '$1$2l$3$4',

'\\b([a-zA-Z]{3,})([^l])l(ful|ment)': '$1$2ll$3', //added specific quantifier – false positive with "ailment"

// '(movie theat(er|re))': 'cinema', // disabling per user:coffeeandcrumbs

'([ \\|\\[\\*])aeroplane': '$1airplane',

// '([ \\|\\[\\*])\\b[Mm](um|om(my|))\\b': '$1mother' // disabled 10 June – frequent false positives

};

for (word in table2) {

try {

editor.replace(new RegExp(word, 'g'), table2[word]);

} catch (err) {

alert('There was an error when changing "' + word + '" => "' + table2[word] + '".\n\n'

+ 'Error: ' + err.message + '\n\n'

+ 'Click OK to continue.\n\n');

}

}

// remove US spelling from {{convert}} template output

// editor.replace(/({{convert\|[^}]*)\|(?:sp|spell)[ ]*=[ ]*us/gi, '$1');

// editor.replace(/({{(?:in|ft|yd|[mck]?m)[23]?[ ]+to[ ]+[^}]*)\|(?:sp|spell)[ ]*=[ ]*(?:American|us)/gi, '$1');

// editor.replace(/({{(?:pd|pop[ ]+density[ ])+(?:km|mi)2[^}]*)\|(?:sp|spell)[ ]*=[ ]*(?:American|us)/gi, '$1');

// remove ambiguous dollar sign; rem incidental intervening space

editor.replace(/$ ?(\d)/g, '$$1');

// reconvert special cases

}

function ohc_ENGVAR_set_variation(editor, variation) {

ohc_ENGVAR_protect(editor);

switch (variation) {

case 'B':

ohc_ENGVAR_simple_b(editor);

ohc_ENGVAR_remove_z(editor);

break;

case 'O':

ohc_ENGVAR_simple_b(editor);

ohc_ENGVAR_restore_z(editor);

break;

case 'C':

ohc_ENGVAR_simple_c(editor);

ohc_ENGVAR_restore_z(editor);

break;

case 'U':

ohc_ENGVAR_simple_a(editor);

ohc_ENGVAR_restore_z(editor);

break;

default:

return;

}

ohc_ENGVAR_plain(editor);

ohc_ENGVAR_unprotect(editor);

ohc_retask_pipes(editor);

ohc_ENGVAR_insert_template(editor, variation);

ohc_Reorder_template(editor);

ohc_ENGVAR_edit_summary(editor, variation);

editor.clickDiff();

}

/** ------------------------------------------------------------------------ **/

function ohc_ENGVAR_remove_z(editor) {

editor.replace(/([^\w\-.][a-z]{3,12}[^s ])iz(e[drs]?|ations?|abl[ey]|ing)(\W)/g, '$1is$2$3');

editor.replace(/([Oo]rgan|[Rr]ecog)iz(e(?:[drs]?|rs)|able|ations)(\W)/g, '$1is$2$3');

editor.replace(/(empha)siz(e|ing)/g, '$1sis$2');

editor.replace(/(synthe)siz(e[ds]|ing)/g, '$1sis$2');

editor.replace(/(burgl)ari[sz](ed?|ing)/g, '$1$2');

}

function ohc_ENGVAR_restore_z(editor) {

// converts 's-words' into 'z-words'

editor.replace(/([^\w\-.\/][a-zA-Z]{5,12})is(ations?)(\W)/g, '$1iz$2$3');

editor.replace(/([^\w\-.\/][a-zA-Z]{0,12}(?:[aeiou][^aeiosuw]|ph|rd|thes))is(e[drs]?|ing)(\W)/g, '$1iz$2$3');

editor.replace(/([Oo]rgan|[Rr]ecogn)is(e(?:[drs]?|rs)|able|ations)(\W)/g, '$1iz$2$3');

}

/** ------------------------------------------------------------------------ **/

/** ------------------------------------------------------------------------ **/

function ohc_retask_pipes(editor) {

editor.replace(/([^\w\-.]\[\[)(?:(?:[a-zA-Z]+? |)[a-zA-Z]+?[^s ]i[sz]ation)\|((?:[a-zA-Z]+? |)[a-zA-Z]{3,12}[^s ]i[sz](?:e[drs]?|ations?|abl[ey]|ing))/g, '$1$2');

// editor.replace(/(empha|synthe)siz(e|ing)/g, '$1sis$2');

}

/** ------------------------------------------------------------------------ **/

function ohc_ENGVAR_insert_template(editor, variation) {

// Build date string: "Month YYYY"

var date_object = new Date();

var month_map = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

var date_string = month_map[date_object.getMonth()] + ' ' + date_object.getFullYear();

// Define groups

var americanTemplates = [

'Use American English',

'Use Liberian English',

'Use Philippine English'

];

var canadianTemplates = ['Use Canadian English'];

var oxfordTemplates = ['Use Oxford spelling'];

var britishTemplates = [

'Use British English',

'Use Antiguan and Barbudan English',

'Use Australian English',

'EngvarB',

'Use Ghanaian English',

'Use Hiberno-English',

'Use Hong Kong English',

'Use Indian English',

'Use Jamaican English',

'Use Kenyan English',

'Use Malaysian English',

'Use New Zealand English',

'Use Nigerian English',

'Use Pakistani English',

'Use Singapore English',

'Use South African English',

'Use Sri Lankan English',

'Use Trinidad and Tobago English',

'Use Ugandan English'

];

// Build regex to match all English variant templates

var template_matcher = new RegExp('{{(?:[_ ]*Template[_ ]*:)?[_ ]*(' +

[

americanTemplates,

canadianTemplates,

oxfordTemplates,

britishTemplates

].flat().join('|').replace(/ /g, '[_ ]+') +

')(?:[_ ]+English)?(?:[_ ]+spelling)?(?:/sandbox)?[_ ]*(?:\\|[ ]*date[ ]*=[^{}|]*)?[ ]*}}', 'gi');

// Build template string based on variation

var template_string = '';

switch (variation) {

case 'O': // Oxford

template_string = '{{Use Oxford spelling|date=' + date_string + '}}';

// Remove ALL other templates except Oxford

editor.replace(template_matcher, function (match, templateName) {

if (templateName.replace(/[_ ]+/g, ' ') !== 'Use Oxford spelling') return '';

return match; // Keep Oxford templates

});

if (!editor.contains(/\{\{\s*Use[_ ]+Oxford[_ ]+spelling/gi)) {

editor.prepend(template_string + '\r\n');

} else {

editor.replace(/\{\{\s*Use[_ ]+Oxford[_ ]+spelling(?:\|date=[^{}|]*)?[ ]*}}/gi, template_string);

}

break;

case 'C': // Canadian

template_string = '{{Use Canadian English|date=' + date_string + '}}';

// Remove ALL other templates except Canadian

editor.replace(template_matcher, function (match, templateName) {

if (templateName.replace(/[_ ]+/g, ' ') !== 'Use Canadian English') return '';

return match; // Keep Canadian templates

});

if (!editor.contains(/\{\{\s*Use[_ ]+Canadian[_ ]+English/gi)) {

editor.prepend(template_string + '\r\n');

} else {

editor.replace(/\{\{\s*Use[_ ]+Canadian[_ ]+English(?:\|date=[^{}|]*)?[ ]*}}/gi, template_string);

}

break;

case 'U': // American

var americanFound = editor.contains(new RegExp('{{\\s*(?:' +

americanTemplates.map(t => t.replace(/ /g, '[_ ]+')).join('|') +

')', 'gi'));

if (americanFound) {

// Only update dates for existing American templates

americanTemplates.forEach(function (tpl) {

var tplRegex = new RegExp('{{\\s*' + tpl.replace(/ /g, '[_ ]+') + '(?:\\|date=[^{}|]*)?[ ]*}}', 'gi');

editor.replace(tplRegex, '{{' + tpl + '|date=' + date_string + '}}');

});

} else {

// Remove all other templates

editor.replace(template_matcher, '');

editor.prepend('{{Use American English|date=' + date_string + '}}\r\n');

}

break;

case 'B': // British

var britishFound = editor.contains(new RegExp('{{\\s*(?:' +

britishTemplates.map(t => t.replace(/ /g, '[_ ]+')).join('|') +

')', 'gi'));

if (britishFound) {

// Only update dates for existing British templates

britishTemplates.forEach(function (tpl) {

var tplRegex = new RegExp('{{\\s*' + tpl.replace(/ /g, '[_ ]+') + '(?:\\|date=[^{}|]*)?[ ]*}}', 'gi');

editor.replace(tplRegex, '{{' + tpl + '|date=' + date_string + '}}');

});

} else {

// Remove all other templates

editor.replace(template_matcher, '');

editor.prepend('{{Use British English|date=' + date_string + '}}\r\n');

}

break;

default:

return; // Do nothing if variation is not recognized

}

}

function ohc_Reorder_template(editor) {

// Ensure Short description appears before EngvarB if both exist

editor.replace(/(\{\{Use \w+ (?:spelling|English) ?\|[^}]+\}\}\n?)((?:\{\{[\S\s]+\}\}\n?)+|)(\{\{[Ss]hort description ?\|[^}]+\}\}(|)\n?)/g, '$3$2$1');

}

function ohc_ENGVAR_edit_summary(){

//Add a tag to the summary box

// setoptions(minor='true');

setreason('Per WP:ENGVAR by script', 'append');

// doaction('save');

}

//