Jump to content

User:IceWelder/USEnglish.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by IceWelder (talk | contribs) at 13:00, 28 December 2018. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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.
// NOTICE: This script is a fork of Ohconfucius' EngvarB script, all credit goes to them
// This script converts between multiple variations of English spellings
// PLEASE READ THE DOCUMENTATION at [[User:Ohconfucius/EngvarB]] (click on the link above) before using.

/**
 * 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: 'Flip imperial units', isMinorEdit: true, script: function (editor) {
                ohc_imperial_units(editor);
            }
        },
        {
            category: 'EngvarB', name: 'Flip international units', isMinorEdit: true, script: function (editor) {
                ohc_international_units(editor);
            }
        },
        {
            category: 'EngvarB', name: 'American English', isMinorEdit: true, script: function (editor) {
                ohc_ENGVAR_set_variation(editor, "U");
            }
        },
        {
            category: 'EngvarB', name: 'Australian English', isMinorEdit: true, script: function (editor) {
                ohc_ENGVAR_set_variation(editor, "A");
            }
        },
        {
            category: 'EngvarB', name: 'British English', isMinorEdit: true, script: function (editor) {
                ohc_ENGVAR_set_variation(editor, "B");
            }
        },
        {
            category: 'EngvarB', name: 'British (Oxford) English', isMinorEdit: true, script: function (editor) {
                ohc_ENGVAR_set_variation(editor, "O");
            }
        },
        {
            category: 'EngvarB', name: 'Canadian English', isMinorEdit: true, script: function (editor) {
                ohc_ENGVAR_set_variation(editor, "C");
            }
        },
        {
            category: 'EngvarB', name: 'Indian English', isMinorEdit: true, script: function (editor) {
                ohc_ENGVAR_set_variation(editor, "I");
            }
        }
    ]);
});
// </nowiki>

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

// 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();
    var match_count = 0;
    var protect_string = function (string) {
        var token_format = "~" + (new Date()).getTime() + ".$1~";
        text = text.replace(string, function (match) {
        	console.log(string);
        	console.log(match);
            var token = token_format.replace("$1", ++match_count);
        	console.log(token);
            protected_map[token] = match;
            return token;
        });
    };

//    protect_function(/(pre)(string)(post)/gi); //template
    protect_string(/(<blockquote>)(.*?)(<\/blockquote>)/gi);
    protect_string(/({\| *class *= *\"wikitable *\")([\S\s]*?)(\|})/gi);
    protect_string(/(<table[^<>]*?>)([^<>]*)(<\/table>)/gi);
    protect_string(/(<timeline[^<>]*?>)([^<>]*)(<\/timeline>)/gi);
    protect_string(/(\|\s*style\s*=[^|]*)(color|center)([^|]*\|)/gi);
    protect_string(/(<\/?[ ]*)(center)([ ]*>)/gi); //<center> tags
    protect_string(/(align\/?[ ]*=\/?[ ]*[ "'][ ]*)(center)([ ]*[ "'])/gi); //align="center" in tables
    protect_string(/(\\|\/?[ ]*)(center)([ ]*\\|)/gi); //|center| in files

    protect_string(/(<ref[^<>]*?>)([^<>]*)(<\/ref>)/gi);
    protect_string(/(<ref name=)([^<>]*)(\/>)/gi);
    protect_string(/(\{[\w ]{0,12}(?:quot[^\|]{1,7}\s?|sic|(?:not a |)typo|as written)\|)([^\}]+)(\})/gi);
    protect_string(/([\s\(]["“])([^"“”\n]*)(["”])/gi); //double quotes

    protect_string(/((?:Category|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(/(\|)(\s*colors(?:_label|)\s*)(=)/gi);
    protect_string(/(\|)(\s*analog\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(/(.)(Back in the U.S.S.R.)(.)/gi); //title of work
    protect_string(/(.)(Born in the U.S.A.)(.)/gi); //title of work
    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(/(\{Infobox )((?:[\w ]*)organization)(\s+)/gi);
    protect_string(/(\|\s*)(cleanup|color|coordinates\w*)([ ]*=)/gi); //parameters within infoboxes
    protect_string(/(\|(?:[^=\|\{\}]*))(cleanup|encyclopa?edia|enroll?ment|honors|lockup\w{1,4}|organi[sz]ation|catalog\snumber)(\s*=)/g);
    protect_string(/(\|\s*)(encyclopedia|\w*colors)(\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);

    protect_string(/(.)(solid gray)(.)/gi);

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

    //protect from function ohc_ENGVAR_restore_z
    protect_string(/(.)((?:enterpri|promi|surpri|treati)(?:se[drs]?|ing))(.)/gi);
    protect_string(/(.)((?: ant)(?:ic|idote|imon|ipath|iq))(.)/g);
    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();

    for (var token in protected_map) {
    	console.log(token);
    	console.log(protected_map[token]);
        text = text.replace(token, protected_map[token]);
    }

    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\./g, 'BBC');
    editor.replace(/U\.S\.A\./g, 'U.S.');
    editor.replace(/U\.S\.S\.R\./g, 'USSR');
    editor.replace(/U\.K\./g, 'UK');
    editor.replace(/E\.U\./g, 'EU');
    editor.replace(/(fill )out/gi, '$1in');
//    editor.replace(/in order (to )/g, '$1'); // disabling per discussion on my talk (archive 35)
    editor.replace(/In order t(o )/g, 'T$1');

    //hyphenation
    editor.replace(/(co)(o(?:per|rdin)at(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');
    editor.replace(/\b(vice) (president|chairman|chancellor|minister)/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',
        'diarrhea': '$1diarrhoea',
        '(de|of)fense': '$1$2fence',
        'license': '$1licence',
        '(licen)c(ing|ed)': '$1$2s$3',
        '(practi)c(ing|ed)': '$1$2s$3',
        'furor(\\b)': '$1furore$2',
        '(light-|dark-|\\b)gray': '$1$2grey',
        'guerilla': '$1guerrilla',
        'jewelry': '$1jewellery',
        'maneuver(ab|ed|ing)': '$1manoeuvr$2',
        'maneuver': '$1manoeuvre',
        'louve(red|ring)': '$1louv$2',
        'louver': '$1louvre',
        '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',

        '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?)or(ed|ful|ing|less|ly|s|\\b)': '$1$2our$3',
        '(arm|sav)or(ies|y|s|\\b)': '$1$2our$3',
        '(cand|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(d|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|-|\\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',
//        '(\\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|jew|lev|mod|rev|trav)el(e[dr]|ing)': '$1$2ell$3',
        '([a-zA-Z]{2,8}[^eglstz ])el(e[dr]|est|ing)(\\b)': '$1$2ell$3$4', //added 'z' to avoid changing of "embezzled"
        '(app|di|enthr|equ|initi|journ|riv|sign|tot)al(e[dr]|ing)': '$1$2all$3'
    };

    for (var word in table) {
        try {
            editor.replace(new RegExp('([ \\|\\[\\*])' + word, 'g').toString(), 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$2re$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'
    };

    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(/rigour mortis/g, 'rigor mortis');
    //reconvert special cases
}

function ohc_ENGVAR_simple_c(editor) {
    var table = {
        'ageing': '$1aging',
        'aluminium': '$1aluminum',
        'adrenalin(\\b)': '$1adrenaline$2',
        'annex(\\b)': '$1annexe$2',
        '(ana|breatha|cata|hydro|para)lyz(e|ing)': '$1$2lys$3',
        '(de|of)fense': '$1$2fence',
        'license': '$1licence',
        '(licen)c(ing|ed)': '$1$2s$3',
        '(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',

        '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?)or(ed|ful|ing|less|ly|s|\\b)': '$1$2our$3',
        '(arm|sav)or(ies|y|s|\\b)': '$1$2our$3',
        '(cand|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(d|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|-|\\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|jew|lev|mod|rev|trav)el(e[dr]|ing)': '$1$2ell$3',
        '([a-zA-Z]{2,8}[^eglstz ])el(e[dr]|est|ing)(\\b)': '$1$2ell$3$4', //added 'z' to avoid changing of "embezzled"
        '(app|di|enthr|equ|initi|journ|riv|sign|tot)al(e[dr]|ing)': '$1$2all$3'
    };

    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|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'
    };

    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',
        'best-sell': '$1bestsell',
        'diarrhoea': '$1diarrhea',
        '(de|of)fence': '$1$2fense',
        'licence': '$1license',
        '(licen)c(ing|ed)': '$1$2s$3',
        '(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',
        'manoeuvre': '$1maneuver',
        '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',
        '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',

        'any more': '$1anymore',
        'speciality': '$1specialty',

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

        //'~our' words
        '(arm|clam|glam|harb|neighb|rum|savi?)our(ed|ful|ing|less|ly|s|\\b)': '$1$2or$3',
        '(arm|sav)our(ies|y|s|\\b)': '$1$2or$3',
        '(cand|od)oru((?: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|-|\\d\\s)metre': '$1$2meter',
        '(centi|milli|deci|pico|hecto|\\b)litre(s?\\b)': '$1$2liter$3',
        '(dema|peda|mono|syna)gogue(s?\\W)': '$1$2gog$3',
//        '(\\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|jew|lev|mod|rev|trav)ell(e[dr]|ing)': '$1$2el$3',
        '([a-zA-Z]{2,8}[^eglstz ])ell(e[dr]|est|ing)(\\b)': '$1$2el$3$4', //added 'z' to avoid changing of "embezzled"
        '(app|di|enthr|equ|initi|journ|riv|sign|tot)all(e[dr]|ing)': '$1$2al$3'
    };

    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|dia|epi|homo|mono|pro)logu(ed|ing)': '$1$2log$3',
        '([^\\w\\d\\-\\/])(ana|cata|dia|epi|homo|mono|pro)logue(s?\\b)': '$1$2log$3',

        //'~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]*)([^l])l(ful|ment)': '$1$2ll$3',
        '(movie theat(er|re))': 'cinema',

        '([ \\|\\[\\*])aeroplane': '$1airplane',
        '([ \\|\\[\\*])\\b[Mm](um|om(my|))\\b': '$1mother'
    };

    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_set_variation(editor, variation) {
    ohc_ENGVAR_protect(editor);

    switch (variation) {
        case 'A':
        case 'B':
        case 'I':
            ohc_ENGVAR_simple_b(editor);
            ohc_ENGVAR_remove_z(editor);
            break;
        case 'O':
        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_ENGVAR_edit_summary(editor, variation);

    editor.clickDiff();
}

function ohc_ENGVAR_remove_z(editor) {
    editor.replace(/([^\w\-\.][a-zA-Z]{3,12}[^s ])iz(e[drs]?|ations?|abl[ey]|ing)(\W)/g, '$1is$2$3');
    editor.replace(/(empha)siz(e|ing)/g, '$1sis$2');
    editor.replace(/(synthe)siz(e[ds]|ing)/g, '$1sis$2');
}

function ohc_ENGVAR_restore_z(editor) {
    //converts 's-words' into 'z-words'
    editor.replace(/([^\w\-\.\/])(ar|de[mv]|improv|parad|(?:com|)pr[eo][cm]|(?:un|)rev|surm|telev)is(e|ing)/g, '$1$2♫is$3');
    editor.replace(/([\w])r([eo])mis(e|ing)/g, '$1r$2m♫is$3'); // Premise, promise et al.
    editor.replace(/([\w])radise/g, '$1rad♫ise'); // Paradise et al.
    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');
}

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

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_imperial_units(editor) {
    //measurements and perception
//    editor.replace(/\[\[(foobar)(s|)\]\]/gi, '$1$2');

    //Template:{{convert}}
//    editor.replace(/(\{\{convert)(\s*\|)/gi, '$1/flip$2'); //rem linking within convert template (area)    //needs resolving
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:(?:sq|cu|)(?:[mck]?m)(?:2|3|))(?:\|(?:sq|cu|)(?:in|ft|yd|mi)(?:2|3|))?(\|\d)?(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //rem linking within convert template (area)
    editor.replace(/(\{\{convert\|[\d\.,]+?\|tonnes?(?:\|tons?)?(\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //rem linking within convert template
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:(?:sq|)(?:k?m)(?:2|3|)|hectare))(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*?(?=\})/gi, '$1$2|disp=flip'); //putting metres and hectares behind
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:hectares?|ha)(?:\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //flip hectares
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:kmh|km\/h)(?:\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //flip kmh
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:to|by|x)(?:\|[\d\.,]+?\|(?:[mck]?m))(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //rem linking within convert template (input ranges only)
    editor.replace(/(\{\{convert\|[\d\.,]+?\|nmi)(2|)(\|mi\2 km\2|\|km\2 mi\2|)(?=[|}])/gi, '$1$2|mi$2 km$2'); //putting miles first in nautical mile conversion
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:kg|°?F))(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]+?)*(?=\})/gi, '$1$2|disp=flip'); //putting pounds and °C first
//    editor.replace(/(\{\{(?:in|ft|mi|[mck]?m)[23]?\sto\s(?:in|ft|mi|[mck]?m)[23]?[^\}]*?)\|wiki=(?:yes|no)/gi, '$1');

    //manipulating "|disp=flip" parameter where already "flipped"
    editor.replace(/(\{\{convert\|[\d\.,]+?\|\w{1,4}(?:\|\w{1,4}|)?(?:\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(\|disp=flip)(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)+(?=\})/gi, '$1$3$2'); //reordering flipping parameter within convert template (last parameter)
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:(?:sq|cu|)(?:in|ft|yd|mi|acre)(?:2|3|))(?:\|(?:sq|cu|)(?:[mck]?m|ha)(?:2|3|))?(\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)\|disp=flip(?=\})/gi, '$1$2'); //rem flipping within convert template (Imperial, sq and cubed)
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:mi|miles?|mph)(?:\|kph|km\/h|)?(\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)\|disp=flip(?=\})/gi, '$1$2'); //rem flipping within convert template (Imperial, sq and cubed)
}

function ohc_international_units(editor) {
    //measurements and perception
//    editor.replace(/\[\[(foobar)(s|)\]\]/gi, '$1$2');

    //Template:{{convert}}
//    editor.replace(/(\{\{convert)(\s*\|)/gi, '$1/flip$2'); //rem linking within convert template (area)    //needs resolving
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:(?:sq|cu|)(?:in|ft|yd|mi)(?:2|3|))(?:\|(?:sq|cu|)(?:[mck]?m)(?:2|3|))?(\|\d)?(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //rem linking within convert template (area)
    editor.replace(/(\{\{convert\|[\d\.,]+?\|tonnes?(?:\|tons?)?(\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //rem linking within convert template
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:(?:sq|)mi(?:2|3|)|acre))(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*?(?=\})/gi, '$1$2|disp=flip'); //putting metres and hectares behind
//    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:hectares?|ha)(?:\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //flip hectares
//    editor.replace(/(\{\{convert\|[\d\.,]+?\|mp[gh](?:\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //flip kmh
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:to|by|x)(?:\|[\d\.,]+?\|(?:yd|f(?:oo|)t|in))(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(?=\})/gi, '$1|disp=flip'); //rem linking within convert template (input ranges only)
    editor.replace(/(\{\{convert\|[\d\.,]+?\|nmi)(2|)(\|mi\2 km\2|\|km\2 mi\2|)(?=[|}])/gi, '$1$2|km$2 mi$2'); //putting miles first in nautical mile conversion
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:lb|oz|°?F))(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]+?)*(?=\})/gi, '$1$2|disp=flip'); //putting pounds and °C first
//    editor.replace(/(\{\{(?:in|ft|mi|[mck]?m)[23]?\sto\s(?:in|ft|mi|[mck]?m)[23]?[^\}]*?)\|wiki=(?:yes|no)/gi, '$1');

    //manipulating "|disp=flip" parameter where already "flipped"
    editor.replace(/(\{\{convert\|[\d\.,]+?\|\w{1,4}(?:\|\w{1,4}|)?(?:\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)(\|disp=flip)(\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)+(?=\})/gi, '$1$3$2'); //reordering flipping parameter within convert template (last parameter)
    editor.replace(/(\{\{convert\|[\d\.,]+?\|(?:(?:sq|cu|)(?:[mck]?m|ha)(?:2|3|))(?:\|(?:sq|cu|)(?:in|ft|yd|mi|acre)(?:2|3|))?(\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)\|disp=flip(?=\})/gi, '$1$2'); //rem flipping within convert template (Imperial, sq and cubed)
    editor.replace(/(\{\{convert\|[\d\.,]+?(?:\|kph|km\/h|)(?:\|mi|miles?|mph)?(\|\d)?(?:\|(?:sp|adj|abbr|lk|sigfig|sortable)=[^\|\}]*)*)\|disp=flip(?=\})/gi, '$1$2'); //rem flipping within convert template (Imperial, sq and cubed)
}

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

function ohc_ENGVAR_insert_template(editor, variation) {
    // Add a template to the article identifying English variant
    // Build a string with "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();

    // Matches "Use Australian English" or "EngvarA"
    var reA = new RegExp('{{[_ ]*(?:[Uu]se[_ ]+Australian[_ ]+English|[Ee]ngvarA)[_ ]*(?:|\\|[ ]*date[ ]*=[^{}\\|]*)[ ]*}}', 'gi');
    // Matches "Use British English" or "EngvarB"
    var reB = new RegExp('{{[_ ]*(?:[Uu]se[_ ]+British[_ ]+English|[Ee]ngvarB)[_ ]*(?:|\\|[ ]*date[ ]*=[^{}\\|]*)[ ]*}}', 'gi');
    // Matches "Use British (Oxford) English", "Use British English Oxford spelling" or "EngvarOx"
    var reO = new RegExp('{{[_ ]*(?:[Uu]se[_ ]+British[_ ]+\\(Oxford\\)[_ ]+English|[Uu]se[_ ]+British[_ ]+English[_ ]+Oxford[_ ]+[Ss]pelling|[Ee]ngvarOx)[_ ]*(?:|\\|[ ]*date[ ]*=[^{}\\|]*)[ ]*}}', 'gi');
    // Matches "Use Canadian English" or "EngvarC"
    var reC = new RegExp('{{[_ ]*(?:[Uu]se[_ ]+Canadian[_ ]+English|[Ee]ngvarC)[_ ]*(?:|\\|[ ]*date[ ]*=[^{}\\|]*)[ ]*}}', 'gi');
    // Matches "Use American English"
    var reU = new RegExp('{{[_ ]*(?:[Uu]se[_ ]+American[_ ]+English)[_ ]*(?:|\\|[ ]*date[ ]*=[^{}\\|]*)[ ]*}}', 'gi');
    // Matches "Use Indian English"
    var reI = new RegExp('{{[_ ]*(?:[Uu]se[_ ]+Indian[_ ]+English)[_ ]*(?:|\\|[ ]*date[ ]*=[^{}\\|]*)[ ]*}}', 'gi');

    var reg;
    var template;

    switch (variation) {
        case 'A':
            template = '{{Use Australian English|date=' + date_string + '}}';
            reg = reA;
            break;
        case 'B':
            template = '{{Use British English|date=' + date_string + '}}';
            reg = reB;
            break;
        case 'O':
            template = '{{Use British English Oxford spelling|date=' + date_string + '}}';
            reg = reO;
            break;
        case 'C':
            template = '{{Use Canadian English|date=' + date_string + '}}';
            reg = reC;
            break;
        case 'U':
            template = '{{Use American English|date=' + date_string + '}}';
            reg = reU;
            break;
        case 'I':
            template = '{{Use Indian English|date=' + date_string + '}}';
            reg = reI;
            break;
    }

    // Replace with existing variants
    editor.replace(reA, template);
    editor.replace(reB, template);
    editor.replace(reO, template);
    editor.replace(reC, template);
    editor.replace(reU, template);
    editor.replace(reI, template);

    // Prepend template if not already tagged
    if (!editor.contains(reg)) {
        editor.prepend(template + '\r\n');
    }
}

function ohc_ENGVAR_edit_summary(editor, variation) {
    //Add a tag to the summary box
    var variation;
    switch (variation) {
        case 'A':
            variation = 'Australian English';
            break;
        case 'B':
            variation = 'British English';
            break;
        case 'O':
            variation = 'British (Oxford) English';
            break;
        case 'C':
            variation = 'Canadian English';
            break;
        case 'U':
            variation = 'American English';
            break;
        case 'I':
            variation = 'Indian English';
            break;
        default:
            return;
    }

    editor.appendEditSummary(variation + ' spelling per [[WP:ENGVAR]] by [[User:Ohconfucius/EngvarB|script]]');
}