User:Lightmouse/monobook.js/script.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.
//'''Instructions for installation'''
//*EITHER: If you have a [[Special:Mypage/monobook.js|monobook]] already, go to it, click "edit this page", and paste in this string underneath your existing script:
//:<code><nowiki>importScript('User:Lightmouse/monobook.js/script.js');</nowiki></code>
//*OR: If you don't have a monobook.js page, create one using this title:
//:<code><nowiki>[[User:[your username]/monobook.js]]</nowiki></code>
//:Then click on "edit this page" and paste in at the top the "importScript" string you see three lines above here.
//*Hit "Save page".
//*Refresh your cache (instructions at top of monobook). 
//*You're ready to start.

//'''Applying the script—it's very simple'''
//*Go to an article and determine whether US or international format is used. (For this purpose, it's best to have selected "no preferences" for dates in your user preferences, which will display the raw date formats that our readers see. Otherwise, you'll need to check in edit mode.) Occasionally, you'll see that the wrong format is used (check [[Wikipedia:Mosnum#Full_date_formatting|MOSNUM's guidance on this]] carefully). 
//*Click on "edit this page". You'll see the list of script commands under "what links here". Click on either "delink all dates to mdy" (US format) or "delink all dates to mdy" (international format).
//*The diff will automatically appear. Check through the changes you're making before saving them. If there are problems, fix them manually before saving, or cancel.
//*Leave a note at the article talk page if editors need to negotiate which format to use, or need to be alerted to any other date-related issues.
//*Click on "Save page": it's done.

function make_dates_bold(){
 var txt=document.editform.wpTextbox1;

//process date ranges containing a hyphen
 txt.value=txt.value.replace(/\*\s?((?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?\s?[-–]\s?(?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?)\s?:\s?/gi, '* \'\'\'$1:\'\'\' ');

//process date ranges containing a hyphen
 txt.value=txt.value.replace(/\*\s?((?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?\s?[-–]\s?\d\d?)\s?:\s?/gi, '* \'\'\'$1:\'\'\' ');


//protect date ranges containing a hyphen
 txt.value=txt.value.replace(/\*\s?((?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?\s?)[-–](\s?(?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?)\s?:\s?/gi, '$1xx$2');
 txt.value=txt.value.replace(/\*\s?((?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?\s?)[-–](\s?\d\d?)\s?:\s?/gi, '$1xx$2');



//process dates containing a hyphen
 txt.value=txt.value.replace(/\*\s?((?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?\s?)[-–]\s?/gi, '* \'\'\'$1:\'\'\' ');

//unprotect date ranges containing a hyphen
 txt.value=txt.value.replace(/\*\s?((?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?\s?)xx(\s?(?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?)\s?:\s?/gi, '$1–$2');
 txt.value=txt.value.replace(/\*\s?((?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?\s?)xx(\s?\d\d?)\s?:\s?/gi, '$1–$2');

//process other dates
 txt.value=txt.value.replace(/\*\s?((?:January|February|March|April|May|June|July|August|September|October|November|December) \d\d?)\s?:\s?/gi, '* \'\'\'$1:\'\'\' ');


 edit_summary();
}

function fix_common_errors() {
 var txt=document.editform.wpTextbox1;
//first add template
//if (txt.value.search(/\{\{template\}\}/gi) == -1)
//{
//txt.value='\{\{template\}\}\r\n'+txt.value;
//}

//month+day piped
 txt.value=txt.value.replace(/\[\[\d{1,2}(?:th|st|nd|rd|)\s(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\|([^\]]{1,30})\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s\d{1,2}(?:th|st|nd|rd|)\|([^\]]{1,30})\]\]/gi, '$1');

//fix 'bda' template redirect
 txt.value=txt.value.replace(/\{\{bda\|([^}]+)\}\}/gi, '\{\{birth date and age|$1\}\}');

 txt.value=txt.value.replace(/(\[\[)\s([^\]]*\]\])/gi, '$1$2');
 txt.value=txt.value.replace(/(\[\[[^\]\|]*)\s(\]\])/gi, '$1$2');
 txt.value=txt.value.replace(/(\[\[[^\]]*\s)\s+([^\]]\]\])/gi, '$1$2');
 txt.value=txt.value.replace(/(\[\[[^\]]*\d),(\]\])/gi, '$1$2');
}

function part_dates() {
 var txt=document.editform.wpTextbox1;

fix_common_errors();

//remove leading zeros from dts templates
 txt.value=txt.value.replace(/(\{\{dts\d?\|[^}]*\|)0([^}]*\}\})/gi, '$1$2');

//delink ISO dates
 txt.value=txt.value.replace(/\[\[(\d{4}-\d\d-\d\d)\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[(\d\d-\d\d)\]\]/gi, '$1-$2');
 txt.value=txt.value.replace(/(\d{4})-\[\[(\d\d-\d\d)\]\]/gi, '$1-$2');
 txt.value=txt.value.replace(/\[\[(\d{4})\]\]-(\d\d-\d\d)/gi, '$1-$2');

//remove templates that links launch year, baseball year etc
// txt.value=txt.value.replace(/\{\{(?:avyear|by|fy|ly|scy|sdy)\|(\d{1,4})\}\}/gi, '$1');

//remove dts1 template that links ISO dates
 txt.value=txt.value.replace(/\{\{dts1\|(\d{4}-\d\d-\d\d)\}\}/gi, '$1');

// century
// txt.value=txt.value.replace(/\[\[((?:first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|eleventh|twelfth|thirteenth|fourteenth|fifteenth|sixteenth|seventeenth|eighteenth|nineteenth|twentieth|twenty(?:\s|-)first)(?:\s|-))(century|centuries)\]\]/gi, '$1$2');
// txt.value=txt.value.replace(/\[\[(?:first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|eleventh|twelfth|thirteenth|fourteenth|fifteenth|sixteenth|seventeenth|eighteenth|nineteenth|twentieth|twenty(?:\s|-)first(?:\s|-))(?:century|centuries)\|([^\]]{1,30})\]\]/gi, '$1');

 txt.value=txt.value.replace(/\[\[((?:first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|eleventh|twelfth|thirteenth|fourteenth|fifteenth|sixteenth|seventeenth|eighteenth|nineteenth|twentieth|twenty(?:\s|-)first)(?:\s|-))(century|centuries)(\sAD|\sBC|\sCE|\sBCE|)\]\]/gi, '$1$2$3');
 txt.value=txt.value.replace(/\[\[(?:first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|eleventh|twelfth|thirteenth|fourteenth|fifteenth|sixteenth|seventeenth|eighteenth|nineteenth|twentieth|twenty(?:\s|-)first)(?:\s|-)(?:century|centuries)(?:\sAD|\sBC|\sCE|\sBCE|)\|([^\]]{1,30})\]\]/gi, '$1');

 txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th)(?:\s|-))(century|centuries)(\sAD|\sBC|\sCE|\sBCE|)\]\]/gi, '$1$2$3');
 txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)(?:century|centuries)(?:\sAD|\sBC|\sCE|\sBCE|)\|([^\]]{1,30})\]\]/gi, '$1');

// decades and years
 txt.value=txt.value.replace(/\[\[(\d{1,3}0)\'?s\]\]/g, '$1s');
 txt.value=txt.value.replace(/\[\[\d{1,3}0\'?s?\|([^\]]{1,30})\]\]/g, '$1');
 txt.value=txt.value.replace(/\[\[(\d{1,3}0)\'?(s)?\s(AD|BC|CE|BCE)\]\]/gi, '$1$2 $3');
 txt.value=txt.value.replace(/\[\[\d{1,3}0\'?s?\s(?:AD|BC|CE|BCE)\|([^\]]{1,30})\]\]/gi, '$1');

//month+year
//Identify surprise or 'Easter egg' diversions linking month+years to year articles. Turn them into month+year links to be dealt with below
 txt.value=txt.value.replace(/\[\[\d{1,4}#[^\|\]]+\|((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{3,4})\]\]/gi, '[[$1]]');
 txt.value=txt.value.replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{3,4})\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{3,4}\|([^\]]{1,30})\]\]/gi, '$1');

//removed piped years when in full date
 txt.value=txt.value.replace(/(\[\[\d{1,2}\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\],?\s?\[\[)[^\|\]]{1,32}\|(\d{1,4}\]\])/gi, '$1$2');
 txt.value=txt.value.replace(/(\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}\]\],?\s?\[\[)[^\|\]]{1,32}\|(\d{1,4}\]\])/gi, '$1$2');

//remove 'xx' left by other code
 txt.value=txt.value.replace(/(in)xx((?:aviation|baseball|film|literature|comics|ireland))/gi, '$1 $2');

//'present'
 txt.value=txt.value.replace(/\[\[Present\s\(time\)\|([^\]]{1,30})\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(Present)\]\]/gi, '$1');

//Season
 txt.value=txt.value.replace(/\[\[(spring\s\(season\)|summer|winter|autumn)\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[spring\s\(season\)\|([^\]]{1,30})\]\]/gi, '$1');

//Identify surprise or 'Easter egg' diversions linking months to year articles.
 txt.value=txt.value.replace(/\[\[\d{1,4}#[^\|\]]+\|(January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '$1');

// months
 txt.value=txt.value.replace(/\[\[(January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\|([^\]]{1,30})\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(Jan\.?|Feb\.?|Mar\.?|Apr\.?|May\.?|Jun\.?|Jul\.?|Aug\.?|Sep\.?|Oct\.?|Nov\.?|Dec\.?)\]\]/g, '$1');
//Treat 'Sept' (i.e. month abbreviation) differently from 'sept' (i.e. family)
 txt.value=txt.value.replace(/\[\[(Sept)\]\]/g, '$1');

//Month+day_number "March 7th" -> "March 7"
 txt.value=txt.value.replace(/\[\[(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d?\d)(?:th|st|nd|rd)\]\]/gi, '[[$1 $2]]');
 txt.value=txt.value.replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d?\d)\]\](?:th|st|nd|rd)/gi, '[[$1]]');
 txt.value=txt.value.replace(/\[\[(\d?\d)(?:th|st|nd|rd)\s(January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '[[$1 $2]]');



//Sequence containing month+day_number piped into number. Preferences do not work. They don't work in sequence because digits in the two dates must be adjacent
 txt.value=txt.value.replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d?\d)\]\](\s?\-?\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');
//same again but with ndash or mdash instead of hyphen
 txt.value=txt.value.replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d?\d)\]\](\s?&[nm]dash;\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');
//same again but with slash instead of hyphen
 txt.value=txt.value.replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d?\d)\]\](\/)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');

 txt.value=txt.value.replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d?\d)\]\](\s?\-?\s?)\[\[(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');
//same again but with ndash instead of hyphen
 txt.value=txt.value.replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d?\d)\]\](\s?&[nm]dash;\s?)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4');
//same again but with slash instead of hyphen
 txt.value=txt.value.replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d?\d)\]\](\/)\[\[(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');

 txt.value=txt.value.replace(/([^\[]{4})\[\[(\d?\d)\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?\-?\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');
//same again but with ndash instead of hyphen
 txt.value=txt.value.replace(/([^\[]{4})\[\[(\d?\d)\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?&[nm]dash;\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');
//same again but with slash instead of hyphen
 txt.value=txt.value.replace(/([^\[]{4})\[\[(\d?\d)\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\/)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');

 txt.value=txt.value.replace(/([^\[]{4})\[\[(\d?\d)\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?\-?\s?)\[\[(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');
//same again but with ndash instead of hyphen
 txt.value=txt.value.replace(/([^\[]{4})\[\[(\d?\d)\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?&[nm]dash;\s?)\[\[(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');
//same again but with slash instead of hyphen
 txt.value=txt.value.replace(/([^\[]{4})\[\[(\d?\d)\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\/)\[\[(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1$2$3$4');

// month and day piped
 txt.value=txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd)\|([^\]]{1,30})\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[\d{1,2}(?:th|st|nd|rd)\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\|([^\]]{1,30})\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th))\]\]/gi, '$1');


//4 digit years piped
 txt.value=txt.value.replace(/\[\[\d{1,4}\|([^\]]{1,30})\]\]/gi, '$1');

//full dates with incorrect 'year in'
 txt.value=txt.value.replace(/(\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s(?:[0123][\d]|[\d])\]\]),\s\[\[(\d{1,4})\sin\s[^\]]{1,32}\]\]/gi, '$1 $2');
 txt.value=txt.value.replace(/(\[\[(?:[0123][\d]|[\d])\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\])\s\[\[(\d{1,4})\sin\s[^\]]{1,32}\]\]/gi, '$1 $2');
 txt.value=txt.value.replace(/(\[\[(?:[0123][\d]|[\d])\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\])\s\{\{(?:avyear|by|fy|ly|scy|sdy)\|(\d{1,4})\}\}/gi, '$1 [[$2]]');
 txt.value=txt.value.replace(/(\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s(?:[0123][\d]|[\d])\]\]),\s\{\{(?:avyear|by|fy|ly|scy|sdy)\|(\d{1,4})\}\}/gi, '$1 [[$2]]');

}

function formatgeneral() {
 var txt=document.editform.wpTextbox1;

//remove flagicons from birth and death
 txt.value=txt.value.replace(/(birth\s?=\s?)\{\{flagicon\|[^\}]+\}\}/gi, '$1');
 txt.value=txt.value.replace(/(death\s?=\s?)\{\{flagicon\|[^\}]+\}\}/gi, '$1');
 txt.value=txt.value.replace(/(birth_?place\s?=\s?)\{\{flagicon\|[^\}]+\}\}/gi, '$1');
 txt.value=txt.value.replace(/(death_?place\s?=\s?)\{\{flagicon\|[^\}]+\}\}/gi, '$1');

//symbol for 'times'
 txt.value=txt.value.replace(/&times;/gi, '×');

//turn letter 'x' into symbol '×'
 txt.value=txt.value.replace(/(\d)\sx\s(\d{1,3})\sin\s\(/gi, '$1 × $2 in (');
 txt.value=txt.value.replace(/(\d)\sx\s(\d{1,3})\sinch\s/gi, '$1 × $2 inch ');

// Convert degree symbols into ° symbol, ensure preceding space
 txt.value=txt.value.replace(/&deg;/g, '°');
 txt.value=txt.value.replace(/º/g, '°');

//aviation specifications: protect 'main=' and 'alt=' - undone below
 txt.value=txt.value.replace(/((?:main|alt)\s?=\s?)(\d)/gi, '$1xx$2');

// Celsius spelling errors
 txt.value=txt.value.replace(/celsius/gi, 'Celsius');
 txt.value=txt.value.replace(/celcius/gi, 'Celsius');
//Fix common naming error (be careful with this one)
 txt.value=txt.value.replace(/centigrade/gi, 'Celsius');
//Celsius or Fahrenheit
 txt.value=txt.value.replace(/(\d)&nbsp;(?:°|deg|degree|degrees)&nbsp;([CF]\W)/g, '$1&nbsp;°$2');
 txt.value=txt.value.replace(/(\d)(?:°|deg|degree|degrees)&nbsp;([CF]\W)/g, '$1&nbsp;°$2');
 txt.value=txt.value.replace(/(\d)&nbsp;(?:°|deg|degree|degrees)([CF]\W)/g, '$1&nbsp;°$2');
 txt.value=txt.value.replace(/(\d)(?:\s|)(?:°|deg|degree|degrees)(?:\s|)([CF]\W)/g, '$1 °$2');
 txt.value=txt.value.replace(/(\d)&nbsp;(\[\[Celsius|°C\]\])/gi, '$1&nbsp;$2');
 txt.value=txt.value.replace(/(\d)(?:\s|)(\[\[Celsius|°C\]\])/gi, '$1 $2');
 txt.value=txt.value.replace(/(\d)&nbsp;(\[\[Fahrenheit|°F\]\])/gi, '$1&nbsp;$2');
 txt.value=txt.value.replace(/(\d)(?:\s|)(\[\[Fahrenheit|°F\]\])/gi, '$1 $2');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(-?\d[\d,\.]*)(?:\s|-|&nbsp;|)°?F([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|°F|°C|abbr=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(-?\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:deg|degree|degrees)(?:\s|-|&nbsp;|)Fahrenheit([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|°F|°C\}\}$3');

// Convert &sup to superscript
 txt.value=txt.value.replace(/&sup2;/g, '²');
 txt.value=txt.value.replace(/&sup3;/g, '³');

//metre
//delink this common unit
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)\[\[(metres|meters|metre|meter)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)\[\[(metre|meter)\]\]s([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3s$4');
//space before 'm' only when lower case. Check for dollars and pounds to avoid 'm' used for millions in money.
 txt.value=txt.value.replace(/(\(\d[\d,\.]*)(?:\s|-|)m([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 m$2');
//convert 'metres' to 'm' when in parentheses
 txt.value=txt.value.replace(/(\(\d[\d,\.]*)(?:\s|-|)(?:metres|meters|metre|meter)(\))/g, '$1 m$2');
 txt.value=txt.value.replace(/(\(\d[\d,\.]*)&nbsp;(?:metres|meters|metre|meter)(\))/g, '$1&nbsp;m$2');
 txt.value=txt.value.replace(/({convert\|\d+\|(?:m|ft)[^\}]*)\|lk=(?:on|in|out)/g, '$1');

//metre per second
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(?:m\/second|m\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 m/s$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;(?:m\/second|m\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2&nbsp;m/s$3');
 txt.value=txt.value.replace(/({convert\|\d+\|(?:m\s|ft\s)[^\}]*)\|lk=(?:on|in|out)/g, '$1');

//square metre
 txt.value=txt.value.replace(/(\d)(?:\s|-|&nbsp;|)sq(?:\s|\.\s|-|&nbsp;)m([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 m²$2');
 txt.value=txt.value.replace(/({convert\|\d+\|(?:m2|sqft)[^\}]*)\|lk=(?:on|in|out)/g, '$1');

// millimetre
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)mm([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 mm$3');

// centimetre, cubic centimetre
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(cm|cc)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');

// kilometre
//delink this common unit
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)\[\[(kilometres|kilometers|kilometre|kilometer)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;\[\[(kilometres|kilometers|kilometre|kilometer)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2&nbsp;$3$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)\[\[(?:kilometres?|kilometers?)\|(km)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;\[\[(?:kilometres?|kilometers?)\|(km)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)kms?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 km$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;kms?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2&nbsp;km$3');
 txt.value=txt.value.replace(/({convert\|\d+\|(?:mi|km)[^\}]*)\|lk=(?:on|in|out)/g, '$1');

//square kilometre
 txt.value=txt.value.replace(/(\d)(\s|-|&nbsp;)\[\[km²\]\]/gi, '$1$2km²');
 txt.value=txt.value.replace(/(\d)\s?sq\.?(?:\s|-|&nbsp;|)kms?(\s|\.)/gi, '$1 km²$2');
 txt.value=txt.value.replace(/({convert\|\d+)00\|ha\|\d(\||})/g, '$1|km2$2');
 txt.value=txt.value.replace(/({convert\|\d+)00\|ha/g, '$1|km2');
 txt.value=txt.value.replace(/({convert\|\d+)(\d)0\|ha\|\d(\||})/g, '$1.$2|km2$2');
 txt.value=txt.value.replace(/({convert\|\d+)(\d)0\|ha/g, '$1.$2|km2');
 txt.value=txt.value.replace(/({convert\|\d+)(\d\d)\|ha\|\d(\||})/g, '$1.$2|km2$2');
 txt.value=txt.value.replace(/({convert\|\d+)(\d\d)\|ha/g, '$1.$2|km2');
 txt.value=txt.value.replace(/({convert\|\d+\|sqmi\|)ha\|\d(\||})/g, '$1km2$2');
 txt.value=txt.value.replace(/({convert\|\d+\|sqmi\|)ha/g, '$1km2');
 txt.value=txt.value.replace(/({convert\|\d\d\d+\|acre\|)ha\|\d(\||})/g, '$1km2$2');
 txt.value=txt.value.replace(/({convert\|\d{\d\d+\|acre\|)ha/g, '$1km2');
 txt.value=txt.value.replace(/({convert\|\d\d\d+\|acre)}/g, '$1|km2}');
 txt.value=txt.value.replace(/({convert\|\d(?:\.\d+|)\|acre)\|ha\|\d(\||})/g, '$1|m2$2');
 txt.value=txt.value.replace(/({convert\|\d(?:\.\d+|)\|acre)\|ha/g, '$1|m2');
 txt.value=txt.value.replace(/({convert\|\d(?:\.\d+|)\|acre)}/g, '$1|m2}');
 txt.value=txt.value.replace(/({convert\|[^\}]*(?:km2|sqmi)[^\}]*)\|lk=(?:on|in|out)/g, '$1');

//kilometre per second
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(?:km\/second|km\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 km/s$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;(?:km\/second|km\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2&nbsp;km/s$3');

// kilometre per hour
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(?:km\/hr|km\/ph|kph|kmph|kmh)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 km/h$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;(?:km\/hr|km\/ph|kph|kmph|kmh)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2&nbsp;km/h$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)\[\[(?:km\/hr|km\/ph|kph|kmph|kmh)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 km/h$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;\[\[(?:km\/hr|km\/ph|kph|kmph|kmh)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2&nbsp;km/h$3');

//millilitre
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(ml)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');

// ensure spaces and correct case in kilowatt
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)kW([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 kW$3');

// ensure spaces and correct case in hertz
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)Hz([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 Hz$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)kHz([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 kHz$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)GHz([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 GHz$3');
// ensure spaces in megahertz. Must be upper case to avoid clashing with millihertz
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)MHz([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 MHz$3');

// frames per second
 txt.value=txt.value.replace(/frames\/s([:;,\.?!]?\s[^\d\(\)\/\\])/gi, 'frame/s$1');

// kilogram
 txt.value=txt.value.replace(/kilogrammes/gi, 'kilograms');
 txt.value=txt.value.replace(/kilogramme/gi, 'kilogram');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)\[\[(kilograms?)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;\[\[(kilograms?)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2&nbsp;$3$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)grammes([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 grams$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)gramme([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 gram$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(?:kgs?|\[\[kg\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 kg$3');
 txt.value=txt.value.replace(/({convert\|\d+\|(?:kg|lb)[^\}]*)\|lk=(?:on|in|out)/g, '$1');

//foot
//convert 'foot' to 'ft' when in parentheses
 txt.value=txt.value.replace(/(\(\d[\d,\.]*)(?:\s|-|)(?:feet|foot)(\))/g, '$1 ft$2');
 txt.value=txt.value.replace(/(\(\d[\d,\.]*)&nbsp;(?:feet|foot)(\))/g, '$1&nbsp;ft$2');

//remove trailing period when in parentheses
 txt.value=txt.value.replace(/(\(\d[\d,\.]*)(?:\s|-|)ft\.(\))/g, '$1 ft$2');
 txt.value=txt.value.replace(/(\(\d[\d,\.]*)&nbsp;ft\.(\))/g, '$1&nbsp;ft$2');

// square foot
//convert 'sq foot' to 'sq ft'
 txt.value=txt.value.replace(/(\d)(\s|-)sq\.?(\s|-|)(feet|foot|ft)/gi, '$1 sq ft');
 txt.value=txt.value.replace(/(\d)&nbsp;sq\.?&nbsp;(feet|foot|ft)/gi, '$1&nbsp;sq&nbsp;ft');
//convert 'square ft' to 'sq ft'
 txt.value=txt.value.replace(/(\d)(\s|-)square(\s|-)ft/gi, '$1 sq ft');
 txt.value=txt.value.replace(/(\d)&nbsp;square&nbsp;ft/gi, '$1&nbsp;sq&nbsp;ft');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)sq(?:\s|-|&nbsp;|)ft([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|sqft|m2|abbr=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)square(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|sqft|m2\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)square(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|sqft|m2|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)thousand(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)ft([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000|sqft|m2|abbr=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)thousand(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000|sqft|m2\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)thousand(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000|sqft|m2|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)ft([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000000|sqft|m2|abbr=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000000|sqft|m2\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000000|sqft|m2|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)ft([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$300000|sqft|m2|abbr=on\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$300000|sqft|m2\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$300000|sqft|m2|adj=on\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)ft([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$30000|sqft|m2|abbr=on\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$30000|sqft|m2\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:sq|square)\.?(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$30000|sqft|m2|adj=on\}\}$4');

//square foot: singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:square\sfoot|\[\[square\sfoot\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|sqft|m2|adj=on\}\}$3');

//square foot: plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:square\sfeet|\[\[square\sfeet\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|sqft|m2\}\}$3');

//feet per second
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(?:ft\/second|ft\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 ft/s$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;(?:ft\/second|ft\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2&nbsp;ft/s$3');
//feet per second:plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)feet\sper\ssecond([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft/s|m/s\}\}$3');
//feet per second:singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)foot\sper\ssecond([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft/s|m/s|adj=on\}\}$3');
//feet per second:abbreviated
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)ft\/s([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft/s|m/s|abbr=on\}\}$3');

// foot and inch
 txt.value=txt.value.replace(/(ength[.]{1,3})(\d{1,4})\s?['’]\s?(\d{1,3})\s?["”]/gi, '$1$2 ft $3 in');
 txt.value=txt.value.replace(/(idth[.]{1,3})(\d{1,4})\s?['’]\s?(\d{1,3})\s?["”]/gi, '$1$2 ft $3 in');
 txt.value=txt.value.replace(/([\(\|:]\s?\d{1,4})\s?['’]\s?(\d{1,3})\s?["”]([^NESW])/g, '$1 ft $2 in$3');
 txt.value=txt.value.replace(/(\d)\s?ft\s?(\d{1,3})\s?in/gi, '$1 ft $2 in');

// yard
 txt.value=txt.value.replace(/(\d)(?:\s|-|&nbsp;|)yds?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 yd$2');
 txt.value=txt.value.replace(/(\d)(?:\s|-|&nbsp;|)sq\.?\s?yds?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 sq yd$2');
 txt.value=txt.value.replace(/yd\.\)/gi, 'yd)');
//yards: plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:yards|\[\[yard\]\]s|\[\[yards\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|yd|m\}\}$3');
//yards: singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:yard|\[\[yard\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|yd|m|adj=on\}\}$3');
//yards: abbreviated
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)yd([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|yd|m|abbr=on\}\}$3');
//yards: in full
 txt.value=txt.value.replace(/([^y]\sone(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (1 m)$2');
 txt.value=txt.value.replace(/([^y]\stwo(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (2 m)$2');
 txt.value=txt.value.replace(/([^y]\sthree(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (3 m)$2');
 txt.value=txt.value.replace(/([^y]\sfour(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (4 m)$2');
 txt.value=txt.value.replace(/([^y]\sfive(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (5 m)$2');
 txt.value=txt.value.replace(/([^y]\ssix(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (5 m)$2');
 txt.value=txt.value.replace(/([^y]\sseven(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (6 m)$2');
 txt.value=txt.value.replace(/([^y]\seight(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (7 m)$2');
 txt.value=txt.value.replace(/([^y]\snine(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (8 m)$2');
 txt.value=txt.value.replace(/([^y]\sten(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (9 m)$2');
 txt.value=txt.value.replace(/([^y]\seleven(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (10 m)$2');
 txt.value=txt.value.replace(/([^y]\stwelve(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (11 m)$2');
 txt.value=txt.value.replace(/([^y]\sthirteen(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (12 m)$2');
 txt.value=txt.value.replace(/([^y]\sfourteen(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (13 m)$2');
 txt.value=txt.value.replace(/([^y]\sfifteen(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (14 m)$2');
 txt.value=txt.value.replace(/([^y]\ssixteen(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (15 m)$2');
 txt.value=txt.value.replace(/([^y]\sseventeen(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (16 m)$2');
 txt.value=txt.value.replace(/([^y]\seighteen(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (16 m)$2');
 txt.value=txt.value.replace(/([^y]\snineteen(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (17 m)$2');
 txt.value=txt.value.replace(/([^y]\stwenty(?:\s|-|&nbsp;|)yards?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (18 m)$2');

// knot
 txt.value=txt.value.replace(/(\d)(\s|-|&nbsp;)(?:kts|kt|knt)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2knots$3');
 txt.value=txt.value.replace(/\[knot\s\(unit\)\|/gi, '[knot (speed)|');
 txt.value=txt.value.replace(/\[\[kts\]\]/gi, '[[knot (speed)|knots]]');
 txt.value=txt.value.replace(/\|kts\]\]/gi, '|knots]]');

//nautical mile - rename 'miles' as 'nautical miles' when followed by knots or conversion code
 txt.value=txt.value.replace(/(\d)(?:\s|-|&nbsp;|)miles\s(?:at|@)\s([\d\.]{1,9}(?:\s|-|&nbsp;|)knots|\{\{convert)/gi, '$1 nautical miles at $2');
 txt.value=txt.value.replace(/(\d)(\s|-|&nbsp;)(?:mi|nm|nmi)\s(?:at|@)\s([\d\.]{1,9}(?:\s|-|&nbsp;|)knots|\{\{convert)/gi, '$1$2nmi at $3');
//nautical mile: plural unlinked
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|nmi|km\}\}$3');
//nautical mile: plural linked with 's' inside link
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)\[\[nautical(?:\s|-|&nbsp;|)miles\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|nmi|km\}\}$3');
//nautical mile: plural linked with 's' outside link
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)\[\[nautical(?:\s|-|&nbsp;|)mile\]\]s([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|nmi|km\}\}$3');
//nautical mile: singular unlinked
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)mile([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|nmi|km|adj=on\}\}$3');
//nautical mile: singular linked
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)\[\[nautical(?:\s|-|&nbsp;|)mile\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|nmi|km|adj=on\}\}$3');
//nautical mile: abbreviated
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:\[\[nautical\smile\|nmi?\]\]|nmi)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|nmi|km|abbr=on\}\}$3');
//nautical mile: in full
 txt.value=txt.value.replace(/([^y]\sone(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (1.9 km)$2');
 txt.value=txt.value.replace(/([^y]\stwo(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (4 km)$2');
 txt.value=txt.value.replace(/([^y]\sthree(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (6 km)$2');
 txt.value=txt.value.replace(/([^y]\sfour(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (7 km)$2');
 txt.value=txt.value.replace(/([^y]\sfive(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (9 km)$2');
 txt.value=txt.value.replace(/([^y]\ssix(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (11 km)$2');
 txt.value=txt.value.replace(/([^y]\sseven(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (13 km)$2');
 txt.value=txt.value.replace(/([^y]\seight(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (15 km)$2');
 txt.value=txt.value.replace(/([^y]\snine(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (17 km)$2');
 txt.value=txt.value.replace(/([^y]\sten(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (19 km)$2');
 txt.value=txt.value.replace(/([^y]\seleven(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (20 km)$2');
 txt.value=txt.value.replace(/([^y]\stwelve(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (22 km)$2');
 txt.value=txt.value.replace(/([^y]\sthirteen(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (24 km)$2');
 txt.value=txt.value.replace(/([^y]\sfourteen(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (26 km)$2');
 txt.value=txt.value.replace(/([^y]\sfifteen(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (28 km)$2');
 txt.value=txt.value.replace(/([^y]\ssixteen(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (30 km)$2');
 txt.value=txt.value.replace(/([^y]\sseventeen(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (31 km)$2');
 txt.value=txt.value.replace(/([^y]\seighteen(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (33 km)$2');
 txt.value=txt.value.replace(/([^y]\snineteen(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (35 km)$2');
 txt.value=txt.value.replace(/([^y]\stwenty(?:\s|-|&nbsp;|)nautical(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (37 km)$2');

//knot - plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:knots|\[\[knot\s\(speed\)\|(?:knots\]\]|knot\]\]s|kts\]\]|kt\]\]s))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|kn|km/h\}\}$3');
//knot - singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:knot|\[\[knot\s\(speed\)\|(?:knot|kt|kn)\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|kn|km/h|adj=on\}\}$3');
//knot - abbreviation
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:kts?|\[\[knot\s\(speed\)\|(?:kt|kn)\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|kn|km/h|abbr=on\}\}$3');

//mile - delink this common unit
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)\[\[(miles?)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;\[\[(miles?)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2&nbsp;$3$4');

//mile - lower case to avoid proper names like 'Five Mile Road'
//mile - protect 'miles per hour' - undone below
 txt.value=txt.value.replace(/(miles?)\s(per)/gi, '$1xx$2');
//miles: plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:miles|\[\[miles\]\]|\[\[mile\]\]s)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|mi|km\}\}$3');
//miles: singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:mile|\[\[mile\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|mi|km|adj=on\}\}$3');
//miles: abbreviated
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)mi([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|mi|km|abbr=on\}\}$3');
//miles: in full
 txt.value=txt.value.replace(/([^y]\sone(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (1.6 km)$2');
 txt.value=txt.value.replace(/([^y]\stwo(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (3 km)$2');
 txt.value=txt.value.replace(/([^y]\sthree(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (5 km)$2');
 txt.value=txt.value.replace(/([^y]\sfour(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (6 km)$2');
 txt.value=txt.value.replace(/([^y]\sfive(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (8 km)$2');
 txt.value=txt.value.replace(/([^y]\ssix(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (10 km)$2');
 txt.value=txt.value.replace(/([^y]\sseven(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (11 km)$2');
 txt.value=txt.value.replace(/([^y]\seight(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (13 km)$2');
 txt.value=txt.value.replace(/([^y]\snine(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (14 km)$2');
 txt.value=txt.value.replace(/([^y]\sten(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (16 km)$2');
 txt.value=txt.value.replace(/([^y]\seleven(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (18 km)$2');
 txt.value=txt.value.replace(/([^y]\stwelve(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (19 km)$2');
 txt.value=txt.value.replace(/([^y]\sthirteen(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (19 km)$2');
 txt.value=txt.value.replace(/([^y]\sfourteen(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (21 km)$2');
 txt.value=txt.value.replace(/([^y]\sfifteen(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (24 km)$2');
 txt.value=txt.value.replace(/([^y]\sixteen(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (26 km)$2');
 txt.value=txt.value.replace(/([^y]\sseventeen(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (27 km)$2');
 txt.value=txt.value.replace(/([^y]\seighteen(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (29 km)$2');
 txt.value=txt.value.replace(/([^y]\snineteen(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (30 km)$2');
 txt.value=txt.value.replace(/([^y]\stwenty(?:\s|-|&nbsp;|)miles?)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 (32 km)$2');

//mile - unprotect 'miles per hour'
 txt.value=txt.value.replace(/(miles?)xx(per)/gi, '$1 $2');

//mile per hour
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)m\.?p\.?h([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|mi/h|km/h|abbr=on\}\}$3');

// square mile
 txt.value=txt.value.replace(/(\d)(?:\s|-)sq(?:\s|\.\s|-)mi([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 sq mi$2');
 txt.value=txt.value.replace(/\[\[(square\smile)\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[square\smile\|(sq\smi)\]\]/gi, '$1');
 txt.value=txt.value.replace(/(sq)(?:\s|-|&nbsp;|)(mile)/gi, '$1uare $2');
// square mile:plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)square(?:\s|-|&nbsp;|)miles([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|sqmi|km2\}\}$3');
// square mile:singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)square(?:\s|-|&nbsp;|)mile([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|sqmi|km2|adj=on\}\}$3');
// square mile:abbreviated
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)sq(?:\s|-|&nbsp;|)mi([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|sqmi|km2|abbr=on\}\}$3');

//acre foot:plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d+)\.(\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$300000|acre feet\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d+)\.(\d)(?:\s|-|&nbsp;|)MAF([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2$300000|acre feet\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d+)\.(\d\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$30000|acre feet\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d+)\.(\d\d)(?:\s|-|&nbsp;|)MAF([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2$30000|acre feet\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d+)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000000|acre feet\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d+)(?:\s|-|&nbsp;|)MAF([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2000000|acre feet\}\}$3');

 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|acre feet\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)\[\[acre(?:\s|-|&nbsp;|)foot\|acre(?:\s|-|&nbsp;|)feet\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|acre feet\}\}$3');
//acre foot:singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|acre feet|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)\[\[acre(?:\s|-|&nbsp;|)foot\|acre(?:\s|-|&nbsp;|)feet\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|acre feet|adj=on\}\}$3');
//acre foot:abbreviation
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:acre|ac\.?)(?:\s|-|&nbsp;|)(?:foot|feet|ft)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|acre ft|abbr=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)\[\[acre(?:\s|-|&nbsp;|)foot\|acre(?:\s|-|&nbsp;|)ft\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|acre ft|abbr=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)\[\[acre(?:\s|-|&nbsp;|)ft\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|acre ft|abbr=on\}\}$3');

//acre
//acres - temporary change to protect acre feet. changed below
 txt.value=txt.value.replace(/(acre.feet)/gi, 'xtempx$1ytempy');
 txt.value=txt.value.replace(/(\d)-(acre)/gi, '$1 $2');
 txt.value=txt.value.replace(/(\d)(?:\s|-|&nbsp;|)(?:surface|square)(?:\s|-|&nbsp;|)acre/gi, '$1 acre');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)thousand(?:\s|-|&nbsp;|)(?:acres|\[\[acres\]\]|\[\[acre\]\]s)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000|acre|km2\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)thousand(?:\s|-|&nbsp;|)(?:acre|\[\[acre\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2000|acre|km2|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:acres|\[\[acres\]\]|\[\[acre\]\]s)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|e6acre|km2\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:acre|\[\[acre\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|e6acre|km2|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:acres|\[\[acres\]\]|\[\[acre\]\]s)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$300000|acre|km2\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:acre|\[\[acre\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$300000|acre|km2|adj=on\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:acres|\[\[acres\]\]|\[\[acre\]\]s)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$30000|acre|km2\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+)\.(\d\d)(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)(?:acre|\[\[acre\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2$30000|acre|km2|adj=on\}\}$4');
 txt.value=txt.value.replace(/([^y]\sone(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (4,000 km²)$2');
 txt.value=txt.value.replace(/(\sa(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (4,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\stwo(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (8,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\sthree(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (12,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\sfour(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (16,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\sfive(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (20,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\ssix(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (24,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\sseven(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (28,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\seight(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (32,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\snine(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (36,000 km²)$2');
 txt.value=txt.value.replace(/([^y]\sten(?:\s|-|&nbsp;|)million(?:\s|-|&nbsp;|)acres?)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (40,000 km²)$2');

//acre:plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+\d\d[\d\.]*)(?:\s|-|&nbsp;|)(?:acres|\[\[acres\]\]|\[\[acre\]\]s)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|acre|km2\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d?\d\.\d+|\d?\d)(?:\s|-|&nbsp;|)(?:acres|\[\[acres\]\]|\[\[acre\]\]s)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|acre|m2\}\}$3');

//acre:singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]+\d\d[\d\.]*)(?:\s|-|&nbsp;|)(?:acre|\[\[acre\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|acre|km2|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d?\d\.\d+|\d?\d)(?:\s|-|&nbsp;|)(?:acre|\[\[acre\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|acre|m2|adj=on\}\}$3');

//undo protection for acre feet
 txt.value=txt.value.replace(/xtempx(acre.feet)ytempy/gi, '$1');

// foot pound
 txt.value=txt.value.replace(/(\W)lbs?[\s-.·•\/]{1,2}ft([^²\w])/gi, '$1ft·lbf$2');
 txt.value=txt.value.replace(/(\W)lbs?ft([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1ft·lbf$2');
 txt.value=txt.value.replace(/ftlbs?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, 'ft·lbf$1');
 txt.value=txt.value.replace(/ft[\s-.·•\/]{1,2}lbs?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, 'ft·lbf$1');
 txt.value=txt.value.replace(/ftlbs?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, 'ft·lbf$1');
 txt.value=txt.value.replace(/ft[\s-.·•\/]{1,2}lbf([^\|])/gi, 'ft·lbf$1');
 txt.value=txt.value.replace(/ft[\s-.·•\/]{1,2}lbff/gi, 'ft·lbf');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)pounds?(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|ft.lbf|N.m\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)foot(?:\s|-|&nbsp;|)pounds([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|ft.lbf|N.m\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)pound(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|ft.lbf|N.m|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)foot(?:\s|-|&nbsp;|)pound([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|ft.lbf|N.m|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)ft.lbf([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1\{\{convert|$2|ft.lbf|N.m|abbr=on\}\}$3');

// pound force
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(\s|-|&nbsp;|)lbs?.?\s(thrust|of\sthrust|force|of\sforce)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2$3lbf $4$5');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*000)(?:\s|-|&nbsp;|)pounds\sforce([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lbf|kN\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)pounds\sforce([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lbf|N\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*000)(?:\s|-|&nbsp;|)pound\sforce([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lbf|kN|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)pound\sforce([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lbf|N|adj=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*000)(?:\s|-|&nbsp;|)lbf([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lbf|kN|abbr=on\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)lbf([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lbf|abbr=on\}\}$3');

// pound weight. Parsed after foot pound and pound force
 txt.value=txt.value.replace(/\[\[pound\s\(weight\)\|([^\]]+)\]\]/gi, '[[pound (mass)|$1]]');
 txt.value=txt.value.replace(/\|lbs?\.\]\]/gi, '|lb]]');
 txt.value=txt.value.replace(/(\d)\s?lbs?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 lb$2');
 txt.value=txt.value.replace(/(\d\+?)\s?lbs?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 lb$2');
 txt.value=txt.value.replace(/(\d)&nbsp;lbs?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1&nbsp;lb$2');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)lb([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lb|abbr=on\}\}$3');
//pounds and ounces - plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)pounds(?:\s|-|&nbsp;|)(\d[\d,\.]*)(?:\s|-|&nbsp;|)ounces?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lb|$3|oz|kg\}\}$4');
//pounds and ounces - singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)pound(?:\s|-|&nbsp;|)(\d[\d,\.]*)(?:\s|-|&nbsp;|)ounces?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lb|$3|oz|kg|adj=on\}\}$4');
//pounds and ounces - abbreviated
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)lbs?\.?,?(?:\s|-|&nbsp;|)(\d[\d,\.]*)(?:\s|-|&nbsp;|)oz\.?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|lb|$3|oz|kg|abbr=on\}\}$4');

//foot and inch: plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)feet\.?(?:\s|-|&nbsp;|)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:in|ins|inch|inches)\.?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft|$3|in|m\}\}$4');
//foot and inch: singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)foot\.?(?:\s|-|&nbsp;|)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:in|ins|inch|inches)\.?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft|$3|in|m|adj=on\}\}$4');
//foot and inch: abbreviated
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)ft\.?(?:\s|-|&nbsp;|)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:in|ins|inch|inches)\.?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft|$3|in|m|abbr=on\}\}$4');

//foot (again). Parsed after 'foot per second' and 'foot pound'
//foot: plural
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft|m\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)linear(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft|m\}\}$3');
//foot: singular
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft|m|adj=on\}\}$3');
//foot: abbreviated
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)ft\.?([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ft|m|abbr=on\}\}$3');

//inch: plural
 txt.value=txt.value.replace(/([^\Wt'’]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)inches([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|in|mm\}\}$3');
// inch: plural with number in words
 txt.value=txt.value.replace(/([^ty]\sthree(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (76 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sfour(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (102 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sfive(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (127 mm) $2');
 txt.value=txt.value.replace(/([^ty]\ssix(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (152 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sseven(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (178 mm) $2');
 txt.value=txt.value.replace(/([^ty]\seight(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (203 mm) $2');
 txt.value=txt.value.replace(/([^ty]\snine(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (229 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sten(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (254 mm) $2');
 txt.value=txt.value.replace(/([^ty]\seleven(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (279 mm) $2');
 txt.value=txt.value.replace(/([^ty]\stwelve(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (305 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sthirteen(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (330 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sfourteen(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (356 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sfifteen(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (381 mm) $2');
 txt.value=txt.value.replace(/([^ty]\ssixteen(?:\s|-|&nbsp;|)(?:inches|\[\[inches\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (406 mm) $2');
//inch: singular
 txt.value=txt.value.replace(/([^\Wt'’]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|in|mm|adj=on\}\}$3');
 txt.value=txt.value.replace(/({convert\|\d+\|(?:in|mm|cm)[^\}]*)\|lk=(?:on|in|out)/g, '$1');
// inch: singular with number in words
 txt.value=txt.value.replace(/([^ty]\sthree(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (76 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sfour(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (102 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sfive(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (127 mm) $2');
 txt.value=txt.value.replace(/([^ty]\ssix(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (152 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sseven(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (178 mm) $2');
 txt.value=txt.value.replace(/([^ty]\seight(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (203 mm) $2');
 txt.value=txt.value.replace(/([^ty]\snine(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (229 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sten(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (254 mm) $2');
 txt.value=txt.value.replace(/([^ty]\seleven(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (279 mm) $2');
 txt.value=txt.value.replace(/([^ty]\stwelve(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (305 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sthirteen(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (330 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sfourteen(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (356 mm) $2');
 txt.value=txt.value.replace(/([^ty]\sfifteen(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (381 mm) $2');
 txt.value=txt.value.replace(/([^ty]\ssixteen(?:\s|-|&nbsp;|)(?:inch|\[\[inch\]\]))([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 (406 mm) $2');

// horsepower
 txt.value=txt.value.replace(/\.28\s?(bhp|ihp|shp)\.29\|/gi, '($1)|');
 txt.value=txt.value.replace(/(\d)(?:\s|-|)(horsepower|hp|bhp|ihp|shp)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 $2$3');
 txt.value=txt.value.replace(/(\d)&nbsp;(horsepower|hp|bhp|ihp|shp)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1&nbsp;$2$3');
 txt.value=txt.value.replace(/(\d)(?:\s|-|)horse(?:\s|-|)power([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 horsepower$2');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(?:horsepower|\[\[horsepower\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|hp\}\}$3');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(indicated(?:\s|-|&nbsp;|)horsepower)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|ihp\}\}$4');
 txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)(hp|bhp|ihp|shp)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1\{\{convert|$2|$3|abbr=on\}\}$4');

 txt.value=txt.value.replace(/({convert\|\d+\|)horsepower\|/gi, '$1horsepower|');
 txt.value=txt.value.replace(/({convert\|\d+\|)hp\|/gi, '$1hp|');
 txt.value=txt.value.replace(/({convert\|\d+\|)bhp\|/gi, '$1bhp|');
 txt.value=txt.value.replace(/({convert\|\d+\|)ihp\|/gi, '$1ihp|');
 txt.value=txt.value.replace(/({convert\|\d+\|)shp\|/gi, '$1shp|');

// rpm
 txt.value=txt.value.replace(/(\d)\s?rpm([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 rpm$2');
 txt.value=txt.value.replace(/(\d)&nbsp;rpm([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1&nbsp;rpm$2');
 txt.value=txt.value.replace(/(\d)\-rpm([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 rpm$2');

// decibel
 txt.value=txt.value.replace(/(\d)\s?(dB)\b/g, '$1 $2');

// bits per second
 txt.value=txt.value.replace(/(\d)\s?([KkMmGgTt])?(?:bps|bits\/s|b\/s)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 $2bit/s$3');
 txt.value=txt.value.replace(/(\d)&nbsp;([KkMmGgTt])?(?:bps|bits\/s|b\/s)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1&nbsp;$2bit/s$3');
 txt.value=txt.value.replace(/bits?\/sec([:;,\.?!]?\s[^\d\(\)\/\\])/gi, 'bit/s$1');

// bytes per second
 txt.value=txt.value.replace(/([KkMmGgTt])(?:Bps|bytes?\/s)([:;,\.?!]?\s[^\d\(\)\/\\])/g, ' $1byte/s$2');
 txt.value=txt.value.replace(/bytes?\/s([:;,\.?!]?\s[^\d\(\)\/\\])/gi, 'byte/s$1');

// capitalization of prefix with bits and bytes
 txt.value=txt.value.replace(/K(bit|B|byte)\/s/g, 'k$1/s');
 txt.value=txt.value.replace(/m(bit|B|byte)\/s/g, 'M$1/s');
 txt.value=txt.value.replace(/g(bit|B|byte)\/s/g, 'G$1/s');
 txt.value=txt.value.replace(/t(bit|B|byte)\/s/g, 'T$1/s');

// space with bits and bytes
 txt.value=txt.value.replace(/([^\w]\d)\s?(k|M|G|T)(bit|B)/g, '$1 $2$3');

//aviation specifications: unprotect 'main=' and 'alt='
 txt.value=txt.value.replace(/((?:main|alt)\s?=\s?)xx(\d)/gi, '$1$2');

//change format of convert template variables
 txt.value=txt.value.replace(/({convert\|[^}]+km):h/g, '$1/h');
 txt.value=txt.value.replace(/({convert\|[^}]+mi):h/g, '$1/h');
 txt.value=txt.value.replace(/({convert\|[^}]+ft):s/g, '$1/s');
 txt.value=txt.value.replace(/({convert\|[^}]+m):s/g, '$1/s');


//replace other templates with convert template
 txt.value=txt.value.replace(/\{\{mi\sto\skm\|(\d{1,9})\}\}/gi, '\{\{convert|$1|mi|km\}\}');
 txt.value=txt.value.replace(/\{\{mi\sto\skm\|(\d{1,9})\|round[^\}]{1,5\}\}}/gi, '\{\{convert|$1|mi|km\}\}');
 txt.value=txt.value.replace(/\{\{mi2\sto\skm2\|(\d{1,9})\}\}/gi, '\{\{convert|$1|mi|km\}\}');
 txt.value=txt.value.replace(/\{\{mi2\sto\skm2\|(\d{1,9})\|round[^\}]{1,5\}\}}/gi, '\{\{convert|$1|mi|km\}\}');

//replace rail gauge template
 txt.value=txt.value.replace(/\{\{(\d?\d)\s?in\}\}/gi, '\{\{convert|$1|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{(\d?\d)\s?ft\}\}/gi, '\{\{convert|$1|ft|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{(\d?\d)\s?ft\s?(\d?\d)\s?in\}\}/gi, '\{\{convert|$1|ft|$2|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{(\d?\d)\s?ft\s?(\d?\d\.\d+)\s?in\}\}/gi, '\{\{convert|$1|ft|$2|in|mm|0|abbr=on\}\}');

 txt.value=txt.value.replace(/(\{\{railgauge\|[^}]+)\|lk=on(\}\})/gi, '$1$2');
 txt.value=txt.value.replace(/\{\{railgauge\|(\d?\d)\s?in\}\}/gi, '\{\{convert|$1|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|(\d?\d)\s?ft\}\}/gi, '\{\{convert|$1|ft|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|(\d?\d)\s?ft\s?(\d?\d)\s?in\}\}/gi, '\{\{convert|$1|ft|$2|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|(\d?\d)\s?ft\s?(\d?\d\.\d+)\s?in\}\}/gi, '\{\{convert|$1|ft|$2|in|mm|0|abbr=on\}\}');

 txt.value=txt.value.replace(/\{\{railgauge\|24\}\}/gi, '\{\{convert|2|ft|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|25\}\}/gi, '\{\{convert|2|ft|1|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|26\}\}/gi, '\{\{convert|2|ft|2|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|27\}\}/gi, '\{\{convert|2|ft|3|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|28\}\}/gi, '\{\{convert|2|ft|4|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|29\}\}/gi, '\{\{convert|2|ft|5|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|30\}\}/gi, '\{\{convert|2|ft|6|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|31\}\}/gi, '\{\{convert|2|ft|7|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|32\}\}/gi, '\{\{convert|2|ft|8|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|33\}\}/gi, '\{\{convert|2|ft|9|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|34\}\}/gi, '\{\{convert|2|ft|10|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|35\}\}/gi, '\{\{convert|2|ft|11|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|36\}\}/gi, '\{\{convert|3|ft|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|37\}\}/gi, '\{\{convert|3|ft|1|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|38\}\}/gi, '\{\{convert|3|ft|2|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|39\}\}/gi, '\{\{convert|3|ft|3|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|40\}\}/gi, '\{\{convert|3|ft|4|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|41\}\}/gi, '\{\{convert|3|ft|5|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|42\}\}/gi, '\{\{convert|3|ft|6|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|48\}\}/gi, '\{\{convert|4|ft|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|49\}\}/gi, '\{\{convert|4|ft|1|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|50\}\}/gi, '\{\{convert|4|ft|2|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|51\}\}/gi, '\{\{convert|4|ft|3|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|52\}\}/gi, '\{\{convert|4|ft|4|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|53\}\}/gi, '\{\{convert|4|ft|5|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|54\}\}/gi, '\{\{convert|4|ft|6|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|55\}\}/gi, '\{\{convert|4|ft|7|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|56\}\}/gi, '\{\{convert|4|ft|8|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|57\}\}/gi, '\{\{convert|4|ft|9|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|58\}\}/gi, '\{\{convert|4|ft|10|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|59\}\}/gi, '\{\{convert|4|ft|11|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|60\}\}/gi, '\{\{convert|5|ft|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|61\}\}/gi, '\{\{convert|5|ft|1|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|62\}\}/gi, '\{\{convert|5|ft|2|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|63\}\}/gi, '\{\{convert|5|ft|3|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|64\}\}/gi, '\{\{convert|5|ft|4|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|65\}\}/gi, '\{\{convert|5|ft|5|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|66\}\}/gi, '\{\{convert|5|ft|6|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|67\}\}/gi, '\{\{convert|5|ft|7|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|68\}\}/gi, '\{\{convert|5|ft|8|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|69\}\}/gi, '\{\{convert|5|ft|9|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|70\}\}/gi, '\{\{convert|5|ft|10|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|71\}\}/gi, '\{\{convert|5|ft|11|in|mm|0|abbr=on\}\}');
 txt.value=txt.value.replace(/\{\{railgauge\|72\}\}/gi, '\{\{convert|6|ft|mm|0|abbr=on\}\}');

//remove commas from numerical values in convert template
 txt.value=txt.value.replace(/({convert\|\d+),(\d)/g, '$1$2');
 txt.value=txt.value.replace(/({convert\|\d+),(\d)/g, '$1$2');
 txt.value=txt.value.replace(/({convert\|\d+),(\d)/g, '$1$2');
 txt.value=txt.value.replace(/({convert\|\d+),(\d)/g, '$1$2');
 txt.value=txt.value.replace(/({convert\|\d+),(\d)/g, '$1$2');

//remove leading zeros from convert template
 txt.value=txt.value.replace(/({convert\|)0(\d)/g, '$1$2');
 txt.value=txt.value.replace(/({convert\|)0(\d)/g, '$1$2');
 txt.value=txt.value.replace(/({convert\|)0(\d)/g, '$1$2');

//Remove surprise or 'Easter egg' diversions linking unit name to orders of magnitude articles
 txt.value=txt.value.replace(/\[\[1\s?_?E\s?[\-\+]?\d{1,2}\s?..?\|([^\]]{1,50})\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[Orders\sof\smagnitude\s\([^\)]+\)\|([^\]]{1,50})\]\]/gi, '$1');

}

function run_formatgeneral() {
 var txt=document.editform.wpTextbox1;
    formatgeneral();
 edit_summary();
}


function delink_year_in_X(){
 var txt=document.editform.wpTextbox1;

 txt.value=txt.value.replace(/\{\{(?:avyear|by|fy|ly|mlby|mlb\syear|scy|sdy)\|(\d{1,4})\}\}/gi, '$1');
 txt.value=txt.value.replace(/\[\[\d{1,4}\sin\s\w+\|(\d{1,4})\]\]/gi, "[[$1]]");

 edit_summary();
}


var linkmap=[];
function protect_dates(){
 var txt=document.editform.wpTextbox1;
 txt.value=txt.value.replace(/Image:[^|]+/gi, function(img){
        linkmap.push(img);
        return "\x02"+(linkmap.length-1)+"\x03";
    });
//protect certain dates
 txt.value=txt.value.replace(/(september)\s(11[^\d])/gi, '$1xx$2');
 txt.value=txt.value.replace(/([^\d]7)\s(july)/gi, '$1xx$2');
 txt.value=txt.value.replace(/(\[\[May)\s(1968\]\])/gi, '$1xx$2');
 txt.value=txt.value.replace(/(\[\[(?:2300|2000))\s(AD\]\])/gi, '$1xx$2');
 txt.value=txt.value.replace(/(\[\[(?:112|911|999))(\]\])/gi, '$1xx$2');
 txt.value=txt.value.replace(/(\[\[september)xx(11\]\])/gi, '$1 $2');
 txt.value=txt.value.replace(/(\[\[7)xx(july\]\])/gi, '$1 $2');
}

function unprotect_dates(){
 var txt=document.editform.wpTextbox1;

//unprotect certain dates
 txt.value=txt.value.replace(/(september)xx(11)/gi, '$1 $2');
 txt.value=txt.value.replace(/(7)xx(july)/gi, '$1 $2');
 txt.value=txt.value.replace(/(\[\[May)xx(1968\]\])/gi, '$1 $2');
 txt.value=txt.value.replace(/(\[\[(?:2300|2000))xx(AD]\])/gi, '$1 $2');
 txt.value=txt.value.replace(/(\[\[(?:112|911|999))xx(\]\])/gi, '$1$2');

 txt.value=txt.value.replace(/\x02([0-9]+)\x03/g, function(x, n){
        return linkmap[n];
    });
}

function remove_leading_zeros_from_linked_dates () {
 var txt=document.editform.wpTextbox1;
//remove leading zero from linked date
 txt.value=txt.value.replace(/\[\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s0(\d)(?:th|st|nd|rd|)\]\]/gi, '[[$1 $2]]');
 txt.value=txt.value.replace(/\[\[0(\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\]\]/gi, '[[$1 $2]]');

}

function remove_leading_zeros_from_nonlinked_dates () {
 var txt=document.editform.wpTextbox1;
//remove leading zero from nonlinked date
 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s0(\d)(?:th|st|nd|rd|)(,?\s\d{4})([^\w\d][^\d])/gi, '$1$2 $3$4$5');
 txt.value=txt.value.replace(/([^\d][^\w\d])0(\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)(\s\d{4})([^\w\d][^\d])/gi, '$1$2 $3$4$5');

 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s0(\d)(?:th|st|nd|rd|)([^\w\d][^\d])/gi, '$1$2 $3$4');
 txt.value=txt.value.replace(/([^\d][^\w\d])0(\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)([^\w\d][^\d])/gi, '$1$2 $3$4');

}


function code_delink_dates_to_dmy () {
 var txt=document.editform.wpTextbox1;
 protect_dates();
 part_dates();
 remove_leading_zeros_from_linked_dates ();

 txt.value=txt.value.replace(/\[\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d?\d)(?:th|st|nd|rd|)\]\],?\s?\[\[(\d{1,4})\]\]/gi, '$2 $1 $3');
 txt.value=txt.value.replace(/\[\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d?\d)(?:th|st|nd|rd|)\]\],?\s?(\d{1,4})([^\w\d])/gi, '$2 $1 $3$4');
 txt.value=txt.value.replace(/\[\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d?\d)(?:th|st|nd|rd|)\]\]/gi, '$2 $1');

 txt.value=txt.value.replace(/\[\[(\d?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\]\],?\s?\[\[(\d{1,4})\]\]/gi, '$1 $2 $3');
 txt.value=txt.value.replace(/\[\[(\d?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\]\],?\s?(\d{1,4})([^\w\d])/gi, '$1 $2 $3$4');
 txt.value=txt.value.replace(/\[\[(\d?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\]\]/gi, '$1 $2');

//year: temporary change to protect accessyear. Undone below at #1
 txt.value=txt.value.replace(/(accessyear\s?=\s?)\[\[(\d{1,4})\]\]/gi, '$1xx$2xx');
//year: now remove unprotected linked years
 txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]/gi, '$1');
//year: #1. Undo temporary change to protect accessyear and date preference dates
 txt.value=txt.value.replace(/xx(\d{1,4})xx/gi, '[[$1]]');

//remove dts-simple template that links dates
 txt.value=txt.value.replace(/\{\{dts-simple\|(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\|\s?(\d\d?)\|(\d{1,4})\}\}/gi, '$2 $1 $3');

//remove dts3 template that links dates
 txt.value=txt.value.replace(/\{\{dts3\|(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\|(\d\d?)\|(\d{1,4})\}\}/gi, '$2 $1 $3');

//change deprecated dts2 template
 txt.value=txt.value.replace(/\{\{dts2\|(.*?)\|(.*?)\|(.*?)\}\}/gi, '\{\{dts|link=off|format=dmy|$3|$2|$1\}\}');
//fix dts template
 txt.value=txt.value.replace(/(\{\{dts\|)/gi, '$1link=off|format=dmy|');
 txt.value=txt.value.replace(/(\{\{dts\|)link=off\|([^}]*link=off)/gi, '$1$2');
 txt.value=txt.value.replace(/(\{\{dts\|)format=dmy\|([^}]*format=dmy)/gi, '$1$2');

//change deprecated birth and death templates
 txt.value=txt.value.replace(/(\{\{(?:Birth|Death|release)[^}]*)\|mf=ye?s?/gi, '$1');
 txt.value=txt.value.replace(/(\{\{(?:Birth|Death|release)[^|]*\|)/gi, '$1df=yes|');
 txt.value=txt.value.replace(/(\{\{(?:Birth|Death|release)[^|]*\|)df=ye?s?\|([^}]*df=ye?s?)/gi, '$1$2');

 unprotect_dates();

}

function code_delink_dates_to_mdy() {
 var txt=document.editform.wpTextbox1;
 protect_dates();
 part_dates();
 remove_leading_zeros_from_linked_dates ();

 txt.value=txt.value.replace(/\[\[(\d?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\]\],?\s?\[\[(\d{1,4})\]\]/gi, '$2 $1, $3');
 txt.value=txt.value.replace(/\[\[(\d?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\]\],?\s?(\d{1,4})([^\w\d])/gi, '$2 $1, $3$4');
 txt.value=txt.value.replace(/\[\[(\d?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\]\]/gi, '$2 $1');

 txt.value=txt.value.replace(/\[\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d?\d)(?:th|st|nd|rd|)\]\],?\s?\[\[(\d{1,4})\]\]/gi, '$1 $2, $3');
 txt.value=txt.value.replace(/\[\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d?\d)(?:th|st|nd|rd|)\]\],?\s(\d{1,4})([^\w\d])/gi, '$1 $2, $3$4');
 txt.value=txt.value.replace(/\[\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d?\d)(?:th|st|nd|rd|)\]\]/gi, '$1 $2');

//year: temporary change to protect accessyear. Undone below at #1
 txt.value=txt.value.replace(/(accessyear\s?=\s?)\[\[(\d{1,4})\]\]/gi, '$1xx$2xx');
//year: now remove unprotected linked years
 txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]/gi, '$1');
//year: #1. Undo temporary change to protect accessyear and date preference dates
 txt.value=txt.value.replace(/xx(\d{1,4})xx/gi, '[[$1]]');

//remove dts-simple template that links dates
 txt.value=txt.value.replace(/\{\{dts-simple\|(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\|\s?(\d\d?)\|(\d{1,4})\}\}/gi, '$1 $2, $3');

//remove dts3 template that links dates
 txt.value=txt.value.replace(/\{\{dts3\|(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\|(\d\d?)\|(\d{1,4})\}\}/gi, '$1 $2, $3');

//change deprecated dts2 template
 txt.value=txt.value.replace(/\{\{dts2\|(.*?)\|(.*?)\|(.*?)\}\}/gi, '\{\{dts|link=off|$3|$2|$1\}\}');
//fix dts template
 txt.value=txt.value.replace(/(\{\{dts\|)/gi, '$1link=off|');
 txt.value=txt.value.replace(/(\{\{dts\|)link=off\|([^}]*link=off)/gi, '$1$2');

//change deprecated birth and death templates
 txt.value=txt.value.replace(/(\{\{(?:Birth|Death|release)[^}]*)\|df=ye?s?/gi, '$1');
 txt.value=txt.value.replace(/(\{\{(?:Birth|Death|release)[^|]*\|)/gi, '$1mf=yes|');
 txt.value=txt.value.replace(/(\{\{(?:Birth|Death|release)[^|]*\|)mf=ye?s?\|([^}]*mf=ye?s?)/gi, '$1$2');

unprotect_dates();

}

function button_delink_dates_to_dmy() {
 code_delink_dates_to_dmy();
 edit_summary();
}


function button_delink_dates_to_mdy() {
 code_delink_dates_to_mdy();
 edit_summary();
}


function all_dates_to_dmy(){
 var txt=document.editform.wpTextbox1;
 protect_dates();
 part_dates();
 code_delink_dates_to_dmy();
 remove_leading_zeros_from_nonlinked_dates ();
//repeat protect dates because 'unprotect dates' function is within 'delink dates' function
 protect_dates();

 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s([0123]?\d)(?:th|st|nd|rd|),?\s(\d{1,4})([^\w\d][^\d])/gi, '$1$3 $2 $4$5');
 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s([0123]?\d)(?:th|st|nd|rd|)([^\w\d][^\d])/gi, '$1$3 $2$4');

//repeat previous two bits of code to capture some date ranges that were missed first time round
 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s([0123]?\d)(?:th|st|nd|rd|),?\s(\d{1,4})([^\w\d][^\d])/gi, '$1$3 $2 $4$5');
 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s([0123]?\d)(?:th|st|nd|rd|)([^\w\d][^\d])/gi, '$1$3 $2$4');

//Month+day_number "March 7th" -> "March 7"
 txt.value=txt.value.replace(/([^\d][^\w\d])([0123]?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d{1,4})([^\w\d][^\d])/gi, '$1$2 $3 $4$5');
 txt.value=txt.value.replace(/([^\d][^\w\d])([0123]?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)([^\w\d][^\d])/gi, '$1$2 $3$4');


//year: temporary change to protect accessyear. Undone below at #1
 txt.value=txt.value.replace(/(accessyear\s?=\s?)\[\[(\d{1,4})\]\]/gi, '$1xx$2xx');
//year: now remove unprotected linked years
 txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]/gi, '$1');
//year: #1. Undo temporary change to protect accessyear and date preference dates
 txt.value=txt.value.replace(/xx(\d{1,4})xx/gi, '[[$1]]');

 unprotect_dates();

 edit_summary();
}

function all_dates_to_mdy(){
 var txt=document.editform.wpTextbox1;
 protect_dates();
 part_dates();
 code_delink_dates_to_mdy();
 remove_leading_zeros_from_nonlinked_dates ();
//repeat protect dates because 'unprotect dates' function is within 'delink dates' function
 protect_dates();

 txt.value=txt.value.replace(/([^\d][^\w\d])([0123]?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d{1,4})([^\w\d][^\d])/gi, '$1$3 $2, $4$5');
 txt.value=txt.value.replace(/([^\d][^\w\d])([0123]?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)([^\w\d][^\d])/gi, '$1$3 $2$4');

//repeat previous two bits of code to capture some date ranges that were missed first time round
 txt.value=txt.value.replace(/([^\d][^\w\d])([0123]?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s(\d{1,4})([^\w\d][^\d])/gi, '$1$3 $2, $4$5');
 txt.value=txt.value.replace(/([^\d][^\w\d])([0123]?\d)(?:th|st|nd|rd|)\s(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)([^\w\d][^\d])/gi, '$1$3 $2$4');

//Month+day_number "March 7th" -> "March 7"
 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s([0123]?\d)(?:th|st|nd|rd|)(,?\s)(\d{1,4})([^\w\d][^\d])/gi, '$1$2 $3$4$5$6');
 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s([0123]?\d)(?:th|st|nd|rd|)([^\w\d][^\d])/gi, '$1$2 $3$4');

//add comma when missing
 txt.value=txt.value.replace(/([^\d][^\w\d])(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s([0123]?\d)(?:th|st|nd|rd|)(\s)(\d{1,4})([^\w\d][^\d])/gi, '$1$2 $3,$4$5$6');


//year: temporary change to protect accessyear. Undone below at #1
 txt.value=txt.value.replace(/(accessyear\s?=\s?)\[\[(\d{1,4})\]\]/gi, '$1xx$2xx');
//year: now remove unprotected linked years
 txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]/gi, '$1');
//year: #1. Undo temporary change to protect accessyear and date preference dates
 txt.value=txt.value.replace(/xx(\d{1,4})xx/gi, '[[$1]]');

 unprotect_dates();

 edit_summary();
}

function edit_summary(){
// Add a tag to the summary box
 var txt=document.editform.wpSummary;
    var summary = "[[wp:datescript]]-assisted date/terms audit; see [[wp:unlinkdates]], [[wp:overlink]]";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}
   document.editform.wpDiff.click();
}

function delink_dates_to_dmy_and_common_terms() {
  code_delink_dates_to_dmy();
  CommonTerms();
 edit_summary();
}

function delink_dates_to_mdy_and_common_terms() {
 code_delink_dates_to_mdy();
 CommonTerms();
 edit_summary();
}

function CommonTerms(){
 var txt=document.editform.wpTextbox1;

 txt.value=txt.value.replace(/\[\[(African?|Alaskan?|American?|Antarctican?|Arctic\sOcean|Asian?|Atlantic\sOcean|Australian?|Austrian?|Beijing|Belgian|Belgium|Berlin|British|British\sIsles|Canada|Canadian|Central\sAmerican?|Chicago|China|Chinese|Korean?|Paris|People's\sRepublic\sof\sChina|Phillipines|Czech\sRepublic|Danish|Denmark|England|English|Europe|European|France|French|Finland|Finnish|Germany?|Great\sBritain|Greece|Greek|Hawaiin?|Hungary|Hungarian|Hong\sKong|Indian?|Indian\sOcean|Ireland|Irish|Italy|Italian|Japan|Japanese|London|Los\sAngeles|Mexican|Mexico|Mexico\sCity|Middle\sEast|Middle\sEastern|Moscow|the\sNetherlands|Netherlands|New\sDelhi|New\sYork|New\sYork\sCity|New\sZealand|New\sZealander|North\sAmerican?|Norway|Norwegian|Pacific|Pacific\sOcean|Poland|Polish|Portugal|Portuguese|Queensland|Rome|Russian?|Scandinavian?|Scotland|Scottish|Shanghai|South\sAfrican?|Arctic\sOcean|South\sAmerican?|South\sKorean?|Spain|Spanish|Sweden|Swedish|Switzerland|Sydney|Tokyo|Toronto|United\sKingdom|U\.K\.|UK|United\sStates|United\sStates\sof\sAmerica|US|U\.S\.|USA|U\.S\.A\.|Vancouver|Wales|Welsh|Western\sAustralian?|West\sGermany?)\]\]/gi, '$1');

 txt.value=txt.value.replace(/\[\[(?:African?|Alaskan?|American?|Antarctican?|Arctic\sOcean|Asian?|Atlantic\sOcean|Australian?|Austrian?|Beijing|Belgian|Belgium|Berlin|British|British\sIsles|Canada|Canadian|Central\sAmerican?|Chicago|China|Chinese|Korean?|Paris|People's\sRepublic\sof\sChina|Phillipines|Czech\sRepublic|Danish|Denmark|England|English|Europe|European|France|French|Finland|Finnish|Germany?|Great\sBritain|Greece|Greek|Hawaiin?|Hungary|Hungarian|Hong\sKong|Indian?|Indian\sOcean|Ireland|Irish|Italy|Italian|Japan|Japanese|London|Los\sAngeles|Mexican|Mexico|Mexico\sCity|Middle\sEast|Middle\sEastern|Moscow|the\sNetherlands|Netherlands|New\sDelhi|New\sYork|New\sYork\sCity|New\sZealand|New\sZealander|North\sAmerican?|Norway|Norwegian|Pacific|Pacific\sOcean|Poland|Polish|Portugal|Portuguese|Queensland|Rome|Russian?|Scandinavian?|Scotland|Scottish|Shanghai|South\sAfrican?|Arctic\sOcean|South\sAmerican?|South\sKorean?|Spain|Spanish|Sweden|Swedish|Switzerland|Sydney|Tokyo|Toronto|United\sKingdom|U\.K\.|UK|United\sStates|United\sStates\sof\sAmerica|US|U\.S\.|USA|U\.S\.A\.|Vancouver|Wales|Welsh|Western\sAustralian?|West\sGermany?)\|(African?|Alaskan?|American?|Antarctican?|Arctic\sOcean|Asian?|Atlantic\sOcean|Australian?|Austrian?|Beijing|Belgian|Belgium|Berlin|British|British\sIsles|Canada|Canadian|Central\sAmerican?|Chicago|China|Chinese|Korean?|Paris|People's\sRepublic\sof\sChina|Phillipines|Czech\sRepublic|Danish|Denmark|England|English|Europe|European|France|French|Finland|Finnish|Germany?|Great\sBritain|Greece|Greek|Hawaiin?|Hungary|Hungarian|Hong\sKong|Indian?|Indian\sOcean|Ireland|Irish|Italy|Italian|Japan|Japanese|London|Los\sAngeles|Mexican|Mexico|Mexico\sCity|Middle\sEast|Middle\sEastern|Moscow|the\sNetherlands|Netherlands|New\sDelhi|New\sYork|New\sYork\sCity|New\sZealand|New\sZealander|North\sAmerican?|Norway|Norwegian|Pacific|Pacific\sOcean|Poland|Polish|Portugal|Portuguese|Queensland|Rome|Russian?|Scandinavian?|Scotland|Scottish|Shanghai|South\sAfrican?|Arctic\sOcean|South\sAmerican?|South\sKorean?|Spain|Spanish|Sweden|Swedish|Switzerland|Sydney|Tokyo|Toronto|United\sKingdom|U\.K\.|UK|United\sStates|United\sStates\sof\sAmerica|US|U\.S\.|USA|U\.S\.A\.|Vancouver|Wales|Welsh|Western\sAustralian?|West\sGermany?)\]\]/gi, '$1');

 txt.value=txt.value.replace(/\[\[(?:African?|Alaskan?|American?|Antarctican?|Arctic\sOcean|Asian?|Atlantic\sOcean|Australian?|Austrian?|Beijing|Belgian|Belgium|Berlin|British|British\sIsles|Canada|Canadian|Central\sAmerican?|Chicago|China|Chinese|Korean?|Paris|People's\sRepublic\sof\sChina|Phillipines|Czech\sRepublic|Danish|Denmark|England|English|Europe|European|France|French|Finland|Finnish|Germany?|Great\sBritain|Greece|Greek|Hawaiin?|Hungary|Hungarian|Hong\sKong|Indian?|Indian\sOcean|Ireland|Irish|Italy|Italian|Japan|Japanese|London|Los\sAngeles|Mexican|Mexico|Mexico\sCity|Middle\sEast|Middle\sEastern|Moscow|the\sNetherlands|Netherlands|New\sDelhi|New\sYork|New\sYork\sCity|New\sZealand|New\sZealander|North\sAmerican?|Norway|Norwegian|Pacific|Pacific\sOcean|Poland|Polish|Portugal|Portuguese|Queensland|Rome|Russian?|Scandinavian?|Scotland|Scottish|Shanghai|South\sAfrican?|Arctic\sOcean|South\sAmerican?|South\sKorean?|Spain|Spanish|Sweden|Swedish|Switzerland|Sydney|Tokyo|Toronto|United\sKingdom|U\.K\.|UK|United\sStates|United\sStates\sof\sAmerica|US|U\.S\.|USA|U\.S\.A\.|Vancouver|Wales|Welsh|Western\sAustralian?|West\sGermany?)\s\(?language\)?\|(African?|Alaskan?|American?|Antarctican?|Arctic\sOcean|Asian?|Atlantic\sOcean|Australian?|Austrian?|Beijing|Belgian|Belgium|Berlin|British|British\sIsles|Canada|Canadian|Central\sAmerican?|Chicago|China|Chinese|Korean?|Paris|People's\sRepublic\sof\sChina|Phillipines|Czech\sRepublic|Danish|Denmark|England|English|Europe|European|France|French|Finland|Finnish|Germany?|Great\sBritain|Greece|Greek|Hawaiin?|Hungary|Hungarian|Hong\sKong|Indian?|Indian\sOcean|Ireland|Irish|Italy|Italian|Japan|Japanese|London|Los\sAngeles|Mexican|Mexico|Mexico\sCity|Middle\sEast|Middle\sEastern|Moscow|the\sNetherlands|Netherlands|New\sDelhi|New\sYork|New\sYork\sCity|New\sZealand|New\sZealander|North\sAmerican?|Norway|Norwegian|Pacific|Pacific\sOcean|Poland|Polish|Portugal|Portuguese|Queensland|Rome|Russian?|Scandinavian?|Scotland|Scottish|Shanghai|South\sAfrican?|Arctic\sOcean|South\sAmerican?|South\sKorean?|Spain|Spanish|Sweden|Swedish|Switzerland|Sydney|Tokyo|Toronto|United\sKingdom|U\.K\.|UK|United\sStates|United\sStates\sof\sAmerica|US|U\.S\.|USA|U\.S\.A\.|Vancouver|Wales|Welsh|Western\sAustralian?|West\sGermany?)\]\]/gi, '$1');

 txt.value=txt.value.replace(/\[\[(actor|author|dancer|model|novelist|playwright|poet|politican|record producer|singer|songwriter|writer)\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(actress)\]\]/gi, '$1');
 txt.value=txt.value.replace(/\[\[(dance)\]\](r)/gi, '$1$2');
 txt.value=txt.value.replace(/\[\[model\s\(person\)\|(model)\]\]/gi, '$1');

 edit_summary();
}

$.when(mw.loader.using(['mediawiki.util']), $.ready).done(function () {
 if(document.forms.editform) {
  mw.util.addPortletLink('p-tb', 'javascript:CommonTerms()', 'Delink common terms', 't-delinkcommon', 'Regexp common terms', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:run_formatgeneral()', 'Add metric units', 't-addmetric', 'Fixes some unit formatting', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:button_delink_dates_to_dmy()', 'Delink dates to dmy', 't-delinkdmy', 'day month', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:button_delink_dates_to_mdy()', 'Delink dates to mdy', 't-delinkmdy', 'month day', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:all_dates_to_dmy()', 'All dates to dmy', 't-alldmy', 'day month', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:all_dates_to_mdy()', 'All dates to mdy', 't-allmdy', 'month day', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:delink_year_in_X()'  , 'Delink year-in-X dates', 't-yearinX',  'Regexp yearinX', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_and_common_terms()', 'Delink dates to dmy+common terms', 't-dmyandcommon', 'Fixes some unit formatting', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:delink_dates_to_mdy_and_common_terms()', 'Delink dates to mdy+common terms', 't-mdyandcommon', 'Fixes some unit formatting', '', '');
  mw.util.addPortletLink('p-tb', 'javascript:make_dates_bold()', 'Make dates bold', 't-bolddates', 'Fixes some unit formatting', '', '');
  }
});