Jump to content

User:LOL/mmastylefix.js

From Wikipedia, the free encyclopedia
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.
var mma = mma || {};
mma.tb;
mma.exceptions = [];
mma.exceptions.push({regex: /\bd'arce\b/gi, replacement: 'D\'Arce'},
        {regex: /\bperuvian\b/gi, replacement: 'Peruvian'},
        {regex: /\bbrabo\b/gi, replacement: 'Brabo'},
        {regex: /\bezekiel\b/gi, replacement: 'Ezekiel'});

mma.fixAll = function() {
    mma.fixCaps(mma.tb.value);
    mma.fixEvents(mma.tb.value);
    mma.fixLocations(mma.tb.value);
    mma.removeFlags(mma.tb.value);
    mma.useDashes(mma.tb.value);
    mma.useDts(mma.tb.value);
    mma.misc(mma.tb.value);
}

mma.toLowerCase = function(s) {
    s = s.toLowerCase();
    s = s.replace(/\u2019/g, '\''); // Replace curly apostrophe
    for (var i in mma.exceptions) {
        var me = mma.exceptions[i];
        s = s.replace(me.regex, me.replacement);
    }
    return s;
}

mma.fixCaps = function(s) {
    // Heading ending in "Record"
    s = s.replace(/([A-Za-z]) +Record( *=+ *)$/gm, '$1 record$2');
    // Heading ending in "Career"
    s = s.replace(/([A-Za-z]) +Career( *=+ *)$/gm, '$1 career$2');
    // "Mixed Martial Art" in headings
    s = s.replace(/^(=+ *)mixed +martial +art/gm, '$1Mixed martial art');
    // <ul> entries containing "Bout"
    s = s.replace(/^(\* *[A-Za-z' ]+?) +Bout *: *(.)/gm, '$1 bout: $2');
    // Heading containing "Card"
    s = s.replace(/^(={2,}.+?)Card\b/gm, '$1card');
    // Heading containing "Match"
    s = s.replace(/^(={2,}.+?)Match\b/gm, '$1match');
    // Heading containing "Official Fight"
    s = s.replace(/^(={2,}.+?)Official +Fight\b/gm, '$1Official fight');
    // Technical/Verbal Submission
    s = s.replace(/(technical|verbal) *submission *\(/gi, '$1 submission (');
    // Technical Decision/Draw
    s = s.replace(/(technical) *d(ecision|raw)/gi, '$1 d$2');
    // No contest
    s = s.replace(/(no) +contest/gi, '$1 contest');
    // PRIDE
    s = s.replace(/\bPRIDE\b/g, 'Pride');
    // DREAM
    s = s.replace(/\bDREAM\b/g, 'Dream');
    // DEEP
    s = s.replace(/\bDEEP\b/g, 'Deep');
    // RINGS
    s = s.replace(/\bRINGS\b/g, 'Rings');
    // ICON
    s = s.replace(/\bICON\b/g, 'Icon');
    // HERO'S
    s = s.replace(/\bHERO'[Ss]\b/g, 'Hero\'s');

    var re, m;

    // Capitalization of meridian per MOS:TIME
    s = s.replace(/([^.:a-zA-Z0-9]\d{1,2})(:\d{2})?( *|&nbsp;)?a(\.?)m(\W)/gi, '$1$2&nbsp;a$4m$5');
    s = s.replace(/([^.:a-zA-Z0-9]\d{1,2})(:\d{2})?( *|&nbsp;)?p(\.?)m(\W)/gi, '$1$2&nbsp;p$4m$5');

    // Method capitalization
    re = /\b(decision|submission|draw|no contest|NC|DQ|knockout|KO|TKO) *\( *([^\)\n]+?) *\)/gi;
    while ((m = re.exec(s)) != null) {
        s = s.substring(0, m.index + m[1].length) + ' (' + mma.toLowerCase(m[2])
                + ')' + s.substring(m.index + m[0].length);
    }
    
    mma.tb.value = s;
}

mma.fixEvents = function(s) {
    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?.+?)(?: +- *| *- +)/gm,
            '$1: ');

    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?\[\[) *([^\|]+?) *\| *\2(?: *: *| +- *| *- +)[^\]]+\]\]/gm,
            '$1$2]]');

    mma.tb.value = s;
}

mma.fixLocations = function(s) {
    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?)\[\[ *([A-Za-z ]+?) *(?: *,|\]\] *, *\[\[) *(Alabama|Alaska|Arizona|Arkansas|California|Colorado|Connecticut|Delaware|Florida|Georgia|Hawaii|Idaho|Illinois|Indiana|Iowa|Kansas|Kentucky|Louisiana|Maine|Maryland|Massachusetts|Michigan|Minnesota|Mississippi|Missouri|Montana|Nebraska|Nevada|New Hampshire|New Jersey|New Mexico|New York|North Carolina|North Dakota|Ohio|Oklahoma|Oregon|Pennsylvania|Rhode Island|South Carolina|South Dakota|Tennessee|Texas|Utah|Vermont|Virginia|Washington|West Virginia|Wisconsin|Wyoming)(?: *\|\1(?: *\]\] *, *\[\[ *\2 *)?)? *\]\](?: *, *(?:\[\[)? *(?:United States|U\.?S\.?A?\.?) *(?:\]\])?)? *$/gm, '$1[[$2, $3|$2]], [[$3]], [[United States]]');

    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?)\[\[ *([A-Za-z ]+?) *(?: *,|\]\] *, *\[\[) *(British Columbia|Alberta|Saskatchewan|Manitoba|Ontario|Quebec|Nova Scotia|New Brunswick|Prince Edward Island|Newfoundland|Yukon|Northwest Territories|Nunavut)(?: *\|\1(?: *\]\] *, *\[\[ *\2 *)?)? *\]\](?: *, *(?:\[\[)? *Canada *(?:\]\])?)? *$/gm, '$1[[$2, $3|$2]], [[$3]], [[Canada]]');

    mma.tb.value = s;
}

mma.removeFlags = function(s) {
    s = s.replace(/^(\| *(?:align *= *['"]?(?:left|center)['"]? *\| *)?)(\{\{[Ff]lag ?icon[^\}]+\}\} *)/gm, '$1');
    s = s.replace(/^(\|.+?) *\{\{[Ff]lag ?icon *\|[^\}]+\}\} *$/gm, '$1');
    mma.tb.value = s;
}

mma.toggleDates = function(s) {
    // [dm]/[dm]/yy dates
    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?)(\d{1,2})\/(\d{1,2})\/(\d{4}|\d{2})\b/gm,
            '$1$3/$2/$4');

    // {{dts|yyyy-dd-mm}}
    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?\{\{dts\|\d{4}-)(\d{1,2})-(\d{1,2})/gm,
            '$1$3-$2');

    mma.tb.value = s;
}

mma.useDashes = function(s) {
    // En dashes
    s = s.replace(/([^\/\w-]\d{1,2})-(\d{1,2}[^\/\w-/])/g, '$1–$2');
    s = s.replace(/([^\/\w-]\d{1,2})[-–](\d{1,2})[-–](\d{1,2}[^\/\w-])/g,
            '$1–$2–$3');

    mma.tb.value = s;
}

mma.useDts = function(s) {
    var re, m;

    // ISO 8601-like dates
    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?)(\d{4}-\d{1,2}-\d{1,2})\b/gm,
            '$1{{dts|$2}}');
    // m/d/yy dates
    re = /^(\| *(?:align *= *['"]?left['"]? *\| *)?)(\d{1,2})\/(\d{1,2})\/(\d{4}|\d{2})\b/gm;
    while ((m = re.exec(s)) != null) {
        if (m[4].length == 2) {
            // Handle YY with an arbitrary cutoff to determine century
            if (parseInt(m[4], 10) < 50) {
                m[4] = '20' + m[4];
            } else {
                m[4] = '19' + m[4];
            }
        }
        // Leading zeroes
        if (m[2].length == 1) {
            m[2] = '0' + m[2];
        }
        if (m[3].length == 1) {
            m[3] = '0' + m[3];
        }
        s = s.substring(0, m.index + m[1].length) + '{{dts|' + m[4] + '-' + m[2]
                + '-' + m[3] + '}}' + s.substring(m.index + m[0].length);
    }

    // mdy dates without {{dts}}
    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?)(January|February|March|April|May|June|July|August|September|October|November|December) *(\d{1,2}) *,? *(\d{4})\b/gm,
            '$1{{dts|$4|$2|$3}}');

    // dmy dates without {{dts}}
    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?)(\d{1,2}) *,? *(January|February|March|April|May|June|July|August|September|October|November|December) *,? *(\d{4})\b/gm,
            '$1{{dts|format=dmy|$4|$3|$2}}');

    mma.tb.value = s;
}

mma.misc = function(s) {
    // Exactly one space after {{flagicon}}
    s = s.replace(/\{\{ *([Ff]lagicon) *\| *(\w+) *\}\} *([\w\[])/g,
            '{\u007b$1|$2}} $3');
    // Replace "lbs" per MOS:NUM
    s = s.replace(/(\d+) *lbs\.?/gi, '$1&nbsp;lb');
    // Format draws and NCs in record tables
    s = s.replace(/^(\|-[^\n]*\n)\| *(?:(?:align|style) *=[^\|]+\|)? *(?:< *span +.+?<\/span> *)?Draw *$/gm,
            '$1| {{draw}}Draw');
    s = s.replace(/^(\|-[^\n]*\n)\| *(?:(?:align|style) *=[^\|]+\|)? *(?:< *span +.+?<\/span> *)?(?:NC|No +[Cc]ontest) *$/gm,
            '$1| {{nocontest}}NC');
    // Use {{small}} instead of unclosed <small>
    s = s.replace(/^(\| *(?:align *= *['"]?left['"]? *\| *)?)<small> *([^<\n]+?) *$/gm,
            '$1{{small|$2}}');

    var re, m;

    // Remove extraneous table row syntax
    re = /(\n\|-[^\n]*){2,}/g;
    while ((m = re.exec(s)) != null) {
        s = s.substring(0, m.index)
                + m[0].substring(m[0].lastIndexOf('\n'))
                + s.substring(m.index + m[0].length);
    }

    mma.tb.value = s;
}

$(function() {
    if (document.forms.editform) {
        mma.tb = document.getElementById('wpTextbox1');
        mw.util.addPortletLink('p-tb', 'javascript:mma.fixAll()', 'MMA style cleanup', 't-mmastylefix', 'Fix various style and formatting issues that are common in MMA articles', '', '');
        mw.util.addPortletLink('p-tb', 'javascript:mma.fixCaps(mma.tb.value)', '\u00a0 \u00a0 - capitalization', 't-mmacaps', 'Fix capitalization', '', '');
        mw.util.addPortletLink('p-tb', 'javascript:mma.useDashes(mma.tb.value)', '\u00a0 \u00a0 - dashes', 't-mmadashes', 'Use dashes', '', '');
        mw.util.addPortletLink('p-tb', 'javascript:mma.fixEvents(mma.tb.value)', '\u00a0 \u00a0 - events', 't-mmaevents', 'Fix event format', '', '');
        mw.util.addPortletLink('p-tb', 'javascript:mma.fixLocations(mma.tb.value)', '\u00a0 \u00a0 - locations', 't-mmalocs', 'Fix format of some locations', '', '');
        mw.util.addPortletLink('p-tb', 'javascript:mma.removeFlags(mma.tb.value)', '\u00a0 \u00a0 - flags', 't-mmaflags', 'Remove unnecessary flags from MMA record tables', '', '');
        mw.util.addPortletLink('p-tb', 'javascript:mma.toggleDates(mma.tb.value)', '\u00a0 \u00a0 - toggle table date fmt', 't-mmadmy', 'Swap the first two numbers in d/m/y or m/d/y dates in record tables', '', '');
        mw.util.addPortletLink('p-tb', 'javascript:mma.useDts(mma.tb.value)', '\u00a0 \u00a0 - {{dts}}', 't-mmadts', 'Use {{dts}} in MMA record tables', '', '');
        mw.util.addPortletLink('p-tb', 'javascript:mma.misc(mma.tb.value)', '\u00a0 \u00a0 - misc', 't-mmamisc', 'Misc cleanup', '', '');
    }
});