Portugal at the 2008 Summer Olympics and User:Lightmouse/monobook.js/script.js: Difference between pages

From Wikipedia, the free encyclopedia
(Difference between pages)
Content deleted Content added
capitalisation clean up using AWB
 
No edit summary
 
Line 1: Line 1:
function delink_ISO() {
{{Infobox Olympics Portugal
var txt = document.editform.wpTextbox1;
|games=2008 Summer
// delink_ISO();
|competitors=77
txt.value=txt.value.replace(/\[\[(\d{4}-\d\d-\d\d)\]\]/gi, '$1');
|sports=16
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[(\d\d-\d\d)\]\]/gi, '$1-$2');
|flagbearer=[[Nelson Évora]] (opening)<br/>[[Vanessa Fernandes]] (closing)
txt.value=txt.value.replace(/(\d{4})-\[\[(\d\d-\d\d)\]\]/gi, '$1-$2');
|officials=
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-(\d\d-\d\d)/gi, '$1-$2');
|gold=1
|silver=1
// Add a tag to the summary box
|bronze=
var txt = document.editform.wpSummary;
|rank=45
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
}}
if (txt.value.indexOf(summary) == -1) {
if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
txt.value += " | ";
}
txt.value += summary;
}
// Press the diff button to check it
document.editform.wpDiff.click()
}
addOnloadHook(function () {
if(document.forms.editform) {
// addPortletLink('p-cactions', 'javascript:run_delink_ISO()', 'delink ISO', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
}
});


function delink_ISO_to_dmy() {
'''[[Portugal]]''' competed at the '''[[2008 Summer Olympics]]''' in [[Beijing]], [[People's Republic of China]]. This was the nation's 22nd consecutive participation in an edition of the [[Summer Olympic Games]].
var txt = document.editform.wpTextbox1;
The [[Olympic Committee of Portugal]] was represented by a delegation of 129 people,<ref>{{cite news |url=http://www.pequim2008.com.pt/n20-comecou-a-ponte-aerea-para-pequim.html |title=Começou a ponte aérea para Pequim |publisher=Comité Olímpico de Portugal |date=[[2008-07-18]] |accessdate=2008-08-01 |language=Portuguese}}</ref> of which 77 were competitors participating in 16 sports.<ref>{{cite news |url=http://www.pequim2008.com.pt/n22-missao-de-portugal-fecha-com-78-atletas.html |title=Missão de Portugal fecha com 78 atletas |publisher=Comité Olímpico de Portugal |date=[[2008-07-18]] |accessdate=2008-08-01 |language=Portuguese}}</ref>
The 2007 [[triple jump]] [[2007 World Championships in Athletics - Men's triple jump|world champion]] [[Nelson Évora]] was the [[2008 Summer Olympics national flag bearers|flag bearer]] during the [[2008 Summer Olympics Opening Ceremony|opening ceremony]],<ref>{{cite news |url=http://www.pequim2008.com.pt/n24-nelson-evora-porta-bandeira-na-cerimo.html |title=Nelson Évora porta-bandeira na Cerimónia de Abertura |publisher=Comité Olímpico de Portugal |date=[[2008-08-01]] |accessdate=2008-08-01 |language=Portuguese}}</ref> and later on also became [[Athletics at the 2008 Summer Olympics - Men's triple jump|Olympic champion]].


txt.value=txt.value.replace(/\[\[(\d{4})-01-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 January $1');
== Medalists ==
txt.value=txt.value.replace(/\[\[(\d{4})-02-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 February $1');
{| class="wikitable sortable" style="font-size:100%"
txt.value=txt.value.replace(/\[\[(\d{4})-03-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 March $1');
|-
txt.value=txt.value.replace(/\[\[(\d{4})-04-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 April $1');
! Medal
txt.value=txt.value.replace(/\[\[(\d{4})-05-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 May $1');
! Name
txt.value=txt.value.replace(/\[\[(\d{4})-06-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 June $1');
! Sport
txt.value=txt.value.replace(/\[\[(\d{4})-07-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 July $1');
! Event
txt.value=txt.value.replace(/\[\[(\d{4})-08-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 August $1');
|-
txt.value=txt.value.replace(/\[\[(\d{4})-09-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 September $1');
| {{gold medal}} || {{sortname|Nelson|Évora|4=Evora}} || [[Athletics at the 2008 Summer Olympics|Athletics]] || [[Athletics at the 2008 Summer Olympics - Men's triple jump|Men's triple jump]]
txt.value=txt.value.replace(/\[\[(\d{4})-10-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 October $1');
|-
txt.value=txt.value.replace(/\[\[(\d{4})-11-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 November $1');
| {{silver medal}} || {{sortname|Vanessa|Fernandes}} || [[Triathlon at the 2008 Summer Olympics|Triathlon]] || [[Triathlon at the 2008 Summer Olympics#Women|Women's triathlon]]
txt.value=txt.value.replace(/\[\[(\d{4})-12-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 December $1');
|-
|}


txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[01-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 January $1');
==[[Image:Archery pictogram.svg|30px]] Archery==
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[02-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 February $1');
{{main|Archery at the 2008 Summer Olympics|Archery at the 2008 Summer Olympics - Qualification}}
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[03-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 March $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[04-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 April $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[05-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 May $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[06-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 June $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[07-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 July $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[08-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 August $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[09-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 September $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[10-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 October $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[11-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 November $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[12-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 December $1');
}


function delink_ISO_to_mdy() {
A single male archer secured qualification by winning the individual competition at the Final World Qualification Tournament, in [[Boe]], [[France]].
var txt = document.editform.wpTextbox1;


txt.value=txt.value.replace(/\[\[(\d{4})-01-(?:0(\d)|([1-3]\d))\]\]/gi, 'January $2, $1');
{|class=wikitable style="font-size:90%"
txt.value=txt.value.replace(/\[\[(\d{4})-02-(?:0(\d)|([1-3]\d))\]\]/gi, 'February $2, $1');
|-
txt.value=txt.value.replace(/\[\[(\d{4})-03-(?:0(\d)|([1-3]\d))\]\]/gi, 'March $2, $1');
!rowspan="2"|Athlete
txt.value=txt.value.replace(/\[\[(\d{4})-04-(?:0(\d)|([1-3]\d))\]\]/gi, 'April $2, $1');
!rowspan="2"|Event
txt.value=txt.value.replace(/\[\[(\d{4})-05-(?:0(\d)|([1-3]\d))\]\]/gi, 'May $2, $1');
!colspan="2"|Ranking round
txt.value=txt.value.replace(/\[\[(\d{4})-06-(?:0(\d)|([1-3]\d))\]\]/gi, 'June $2, $1');
!Round of 64
txt.value=txt.value.replace(/\[\[(\d{4})-07-(?:0(\d)|([1-3]\d))\]\]/gi, 'July $2, $1');
!Round of 32
txt.value=txt.value.replace(/\[\[(\d{4})-08-(?:0(\d)|([1-3]\d))\]\]/gi, 'August $2, $1');
!Round of 16
txt.value=txt.value.replace(/\[\[(\d{4})-09-(?:0(\d)|([1-3]\d))\]\]/gi, 'September $2, $1');
!Quarterfinals
txt.value=txt.value.replace(/\[\[(\d{4})-10-(?:0(\d)|([1-3]\d))\]\]/gi, 'October $2, $1');
!Semifinals
txt.value=txt.value.replace(/\[\[(\d{4})-11-(?:0(\d)|([1-3]\d))\]\]/gi, 'November $2, $1');
!colspan="2"|Finals
txt.value=txt.value.replace(/\[\[(\d{4})-12-(?:0(\d)|([1-3]\d))\]\]/gi, 'December $2, $1');
|-
!Score
!Seed
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Rank
|-
|[[Nuno Pombo]]
|[[Archery at the 2008 Summer Olympics - Men's individual|Individual]]
|align="center"|650
|align="center"|42
|align="center"|{{flagIOCathlete|[[Yusuf Ergin]]|TUR|2008 Summer}} <br> '''L''' '''103'''-106
|colspan="6" bgcolor="honeydew" align="center"|Did not advance
|}


txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[01-(?:0(\d)|([1-3]\d))\]\]/gi, 'January $2, $1');
==[[Image:Athletics pictogram.svg|25px]] Athletics==
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[02-(?:0(\d)|([1-3]\d))\]\]/gi, 'February $2, $1');
{{main|Athletics at the 2008 Summer Olympics}}
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[03-(?:0(\d)|([1-3]\d))\]\]/gi, 'March $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[04-(?:0(\d)|([1-3]\d))\]\]/gi, 'April $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[05-(?:0(\d)|([1-3]\d))\]\]/gi, 'May $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[06-(?:0(\d)|([1-3]\d))\]\]/gi, 'June $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[07-(?:0(\d)|([1-3]\d))\]\]/gi, 'July $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[08-(?:0(\d)|([1-3]\d))\]\]/gi, 'August $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[09-(?:0(\d)|([1-3]\d))\]\]/gi, 'September $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[10-(?:0(\d)|([1-3]\d))\]\]/gi, 'October $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[11-(?:0(\d)|([1-3]\d))\]\]/gi, 'November $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[12-(?:0(\d)|([1-3]\d))\]\]/gi, 'December $2, $1');


}
As in previous editions, the Portuguese Olympic team's biggest share of competitors will compete in athletics events. Twenty-seven athletes (13 men and 14 women) will perform in a wide range of [[track and field]] disciplines, including the long-distance events, where Portugal holds its best record, but also the more technical events, where national athletes have achieved international-level results in the build-up to the Beijing Games.


Notable male athletes include the [[Athletics at the 2004 Summer Olympics - Men's 100 metres|2004 Olympic 100 metres silver medalist]], [[Francis Obikwelu]], and the 2007 triple jump world champion, [[Nelson Évora]]. [[Susana Feitor]]—bronze in the 20&nbsp;km walk at the [[2005 World Championships in Athletics|2005 World Championships]]—and [[Naide Gomes]]—[[2008 IAAF World Indoor Championships|2008 world]] and [[2007 European Indoor Athletics Championships|2007 European indoor]] [[long jump]] champion—are featured among the women's contingent.


function year_in_blah() {
===Men===
var txt = document.editform.wpTextbox1;
{|class=wikitable style="font-size:90%; text-align:center;"
|-
!rowspan="2"|Athlete
!rowspan="2"|Events
!colspan="3"|Heat
!colspan="3"|Quarterfinal
!colspan="3"|Semifinal
!colspan="2"|Final
|-
!Result
!Rank
!Overall
!Result
!Rank
!Overall
!Result
!Rank
!Overall
!Result
!Rank
|-
|[[Arnaldo Abrantes]]
|[[Athletics at the 2008 Summer Olympics - Men's 200 metres|200&nbsp;m]]
|align=center|21.46
|align=center|8
|align=center|52
|align=center bgcolor=honeydew colspan="8"|Did not advance
|-
|align="left"|[[Augusto Cardoso]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 50 kilometre walk|50&nbsp;km walk]]
|colspan="9" bgcolor="wheat"|
|align=center|4:09:00
|align=center|40
|-
|align="left"|'''[[Nelson Évora]]'''
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's triple jump|Triple jump]]
|align=center|17.34
|align=center|2 '''Q'''
|align=center|2
|colspan="6" bgcolor="wheat"|
|align=center bgcolor=gold|17.67
|align=center bgcolor=gold|[[Image:Gold medal icon.svg]]
|-
|align="left"|[[Marco Fortes]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's shot put|Shot put]]
|align=center|18.05
|align=center|20
|align=center|38
|colspan="6" bgcolor="wheat"|
|align=center bgcolor=honeydew colspan="2"|Did not advance
|-
|align="left"|[[Paulo Gomes (athlete)|Paulo Gomes]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's marathon|Marathon]]
|colspan="9" bgcolor="wheat"|
|align=center|2:18:15
|align=center|30
|-
|align="left"|[[Edivaldo Monteiro]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 400 metre hurdles|400&nbsp;m hurdles]]
|align=center|49.89
|align=center|6
|align=center|20
|colspan="6" bgcolor="wheat"|
|align=center bgcolor=honeydew colspan="2"|Did not advance
|-
|rowspan="2" align="left"|[[Francis Obikwelu]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 100 metres|100&nbsp;m]]
|align=center|10.25
|align=center|1 '''Q'''
|align=center|12
|align=center|10.09
|align=center|3 '''Q'''
|align=center|9
|align=center|10.10
|align=center|6
|align=center|11
|align=center bgcolor=honeydew colspan="2"|Did not advance
|-
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 200 metres|200&nbsp;m]]
|colspan="11" align=center bgcolor=palegreen|Withdrew


txt.value=txt.value.replace(/\[\[\d{1,4}s?\sin\s[^\|\]]+\|(\d{1,4}s?)\]\]/gi, '\[\[$1\]\]');
|-
txt.value=txt.value.replace(/\{\{..\|(d{4})\}\}/gi, '$1');
|align="left"|[[Hélder Ornelas]]
}
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's marathon|Marathon]]
|colspan="9" bgcolor="wheat"|
|align=center|2:23:20
|align=center|46
|-
|align="left"|[[Alberto Paulo]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 3000 metre steeplechase|3000&nbsp;m steeplechase]]
|align=center|8:39.11
|align=center|11
|34
|colspan="6" bgcolor="wheat"|
|align=center bgcolor=honeydew colspan="2"|Did not advance
|-
|align="left"|[[António Pereira]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 50 kilometre walk|50&nbsp;km walk]]
|colspan="9" bgcolor="wheat"|
|align=center|3:48:12 '''NR'''
|align=center|11
|-
|align="left"|[[Rui Pedro Silva]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 10000 metres|10000&nbsp;m]]
|colspan="9" bgcolor="wheat"|
|align=center|29:09.03
|align=center|34
|-
|align="left"|[[João Vieira (athlete)|João Vieira]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 20 kilometre walk|20&nbsp;km walk]]
|colspan="9" bgcolor="wheat"|
|align=center|1:25:05
|align=center|32
|-
|align="left"|[[Sérgio Vieira]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Men's 20 kilometre walk|20&nbsp;km walk]]
|colspan="9" bgcolor="wheat"|
|align=center|1:29:51
|align=center|45
|}


function part_dates() {
===Women===
var txt = document.editform.wpTextbox1;
{|class=wikitable style="font-size:90%; text-align:center;"
|-
!rowspan="2"|Athlete
!rowspan="2"|Events
!colspan="3"|Heat
!colspan="3"|Quarterfinal
!colspan="3"|Semifinal
!colspan="2"|Final
|-
!Result
!Rank
!Overall
!Result
!Rank
!Overall
!Result
!Rank
!Overall
!Result
!Rank
|-
|rowspan="2" align="left"|[[Jessica Augusto]]
|align="center"|[[Athletics at the 2008 Summer Olympics - Women's 3000 metre steeplechase|3000&nbsp;m steeplechase]]
|align=center|9:30.23
|align=center|5
|align=center|20
|colspan="6" bgcolor="wheat"|
|align=center colspan="2" bgcolor=honeydew|Did not advance
|-
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's 5000 metres|5000&nbsp;m]]
|align=center|16:05.71
|align=center|14
|align=center|25
|colspan="6" bgcolor="wheat"|
|align=center colspan="2" bgcolor=honeydew|Did not advance
|-
|align="left"|[[Marisa Barros]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's marathon|Marathon]]
|colspan="9" bgcolor="wheat"|
|align=center|2:34:08
|align=center|32
|-
|align="left"|[[Ana Cabecinha]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's 20 kilometre walk|20&nbsp;km walk]]
|colspan="9" bgcolor="wheat"|
|align=center|1:27:45 '''NR'''
|align=center|8
|-
|align="left"|[[Clarisse Cruz]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's 3000 metre steeplechase|3000&nbsp;m steeplechase]]
|align=center|9:49.45
|align=center|15
|align=center|34
|colspan="6" bgcolor="wheat"|
|align=center colspan="2" bgcolor=honeydew|Did not advance
|-
|align="left"|[[Sílvia Cruz]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's javelin throw|Javelin throw]]
|align=center|57.06
|align=center|14
|align=center|24
|colspan="6" bgcolor="wheat"|
|align=center colspan="2" bgcolor=honeydew|Did not advance
|-
|align="left"|[[Ana Dias]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's marathon|Marathon]]
|colspan="9" bgcolor="wheat"|
|align=center|2:36:25
|align=center|46
|-
|align="left"|[[Susana Feitor]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's 20 kilometre walk|20&nbsp;km walk]]
|colspan="9" bgcolor="wheat"|
|align=center colspan="2"|Did not finish
|-
|align="left"|[[Naide Gomes]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's long jump|Long jump]]
|align=center|6.29
|align=center|16
|align=center|32
|align=center colspan="8" bgcolor=honeydew|Did not advance
|-
|align="left"|[[Inês Monteiro]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's marathon|Marathon]]
|colspan="9" bgcolor="wheat"|
|align=center colspan="2" |Did not finish
|-
|align="left"|[[Sara Moreira]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's 3000 metre steeplechase|3000&nbsp;m steeplechase]]
|align=center|9:34.39
|align=center|10
|align=center|22
|colspan="6" bgcolor="wheat"|
|align=center colspan="2" bgcolor=honeydew|Did not advance
|-
|align="left"|[[Vera Santos]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's 20 kilometre walk|20&nbsp;km walk]]
|colspan="9" bgcolor="wheat"|
|align=center|1:28:14
|align=center|10
|-
|align="left"|[[Vânia Silva]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's hammer throw|Hammer throw]]
|align=center|59.42
|align=center|23
|align=center|46
|colspan="6" bgcolor="wheat"|
|align=center colspan="2" bgcolor=honeydew|Did not advance
|-
|align="left"|[[Maria do Carmo Tavares]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's 800 metres|800&nbsp;m]]
|align=center|2:01.91
|align=center|6
|align=center|21
|colspan="3" bgcolor="wheat"|
|align=center colspan="5" bgcolor=honeydew|Did not advance
|-
|align="left"|[[Sandra Tavares]]
|align="left"|[[Athletics at the 2008 Summer Olympics - Women's pole vault|Pole vault]]
|align=center|4.30
|align=center|9
|align=center|19
|colspan="6" bgcolor="wheat"|
|align=center colspan="2" bgcolor=honeydew|Did not advance
|}


//delink ISO dates
==[[Image:Badminton pictogram.svg|30px]] Badminton==
txt.value=txt.value.replace(/\[\[(\d{4}-\d\d-\d\d)\]\]/gi, '$1');
{{main|Badminton at the 2008 Summer Olympics|Badminton at the 2008 Summer Olympics - Qualification}}
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 dts1 template that links ISO dates
[[Marco Vasconcelos]] qualified for his third consecutive Olympic Games in virtue of a 64th place in the [[Badminton World Federation]] (BWF) men's ranking list, which allowed him to be the 32nd qualified player in a total of 41 individual players. For the first time, women's national badminton will be represented at the Olympics, thanks to the 59th place of [[Ana Moura (badminton)|Ana Moura]] in the BWF women's ranking, which converted her in the 31st qualified player from a total of 47 individual players.
txt.value=txt.value.replace(/{{dts1\|(\d{4}-\d\d-\d\d)}}/gi, '$1');


// century
{|class=wikitable style="font-size:90%"
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\]\]/gi, '$1century');
|-
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\s(AD|BC|CE|BCE)\]\]/gi, '$1century');
!rowspan="2"|Athlete
txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th)(?:\s|-))century\]\]/gi, '$1century');
!rowspan="2"|Event
txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th)(?:\s|-))centuries\]\]/gi, '$1centuries');
!Round of 64
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th))\]\]/gi, '$1');
!Round of 32
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th)(?:\s|-))century\]\]/gi, '$1century');
!Round of 16
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th)(?:\s|-))centuries\]\]/gi, '$1centuries');
!Quarterfinals
txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th)(?:\s|-))century\s(AD|BC|CE|BCE)\]\]/gi, '$1century $2');
!Semifinals
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th)(?:\s|-))century\s(AD|BC|CE|BCE)\]\]/gi, '$1century $2');
!colspan="2"|Final
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th)(?:\s|-))centuries\s(AD|BC|CE|BCE)\]\]/gi, '$1centuries $2');
|-
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Rank
|-
|[[Marco Vasconcelos]]
|[[Badminton at the 2008 Summer Olympics - Men's singles|Men's singles]]
|align="center"|{{flagIOCathlete|[[Anup Sridhar]]|IND|2008 Summer}}<br/>'''L''' '''16'''–21 '''14'''–21
|align="center" colspan="6" bgcolor="honeydew"|Did not advance
|-
|[[Ana Moura (badminton)|Ana Moura]]
|[[Badminton at the 2008 Summer Olympics - Women's singles|Women's singles]]
|align="center"|{{flagIOCathlete|[[Jeanine Cicognini]]|SUI|2008 Summer}}<br />'''L''' '''9'''–21 '''13'''–21
|align="center" colspan="6" bgcolor="honeydew"|Did not advance
|}


// decades and years
==Canoeing==
txt.value=txt.value.replace(/\[\[(\d{1,4})\'?s\]\]/gi, '$1s');
{{main|Canoeing at the 2008 Summer Olympics|Canoeing at the 2008 Summer Olympics - Qualification}}
txt.value=txt.value.replace(/\[\[(\d{1,4})\'?(s)?\s(AD|BC|CE|BCE)\]\]/gi, '$1$2 $3');
txt.value=txt.value.replace(/\[\[\d{1,4}\'?s?\s(?:AD|BC|CE|BCE)\|(\d{1,4})\'?(s)?\]\]/gi, '$1$2');
txt.value=txt.value.replace(/\[\[\d{1,4}\'?s?\s(?:AD|BC|CE|BCE)\|(\d{1,4})\'?(s)?\s(AD|BC|CE|BCE)\]\]/gi, '$1$2 $3');
txt.value=txt.value.replace(/\[\[\d{1,4}\'?s?\|(\d{1,4})\'?(s)?\s(AD|BC|CE|BCE)\]\]/gi, '$1$2 $3');
txt.value=txt.value.replace(/\[\[\d{1,4}\'?s?\|(\d{1,4})\'?(s)?\]\]/gi, '$1$2');
txt.value=txt.value.replace(/\[\[\d\d?(?:st|nd|rd|th)\scentur(?:y|ies)\|(\d{1,4})\'?(s)?\]\]/gi, '$1$2');
txt.value=txt.value.replace(/\[\[\w{5,12}\scentur(?:y|ies)\|(\d{1,4})\'?(s)?\]\]/gi, '$1$2');
// solitary day_numbers
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)\|(\d{1,2}(?:th|st|nd|rd))\]\]/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)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th))\]\]/gi, '$1');


//month+year
Having reached the [[Canoeing at the 2004 Summer Olympics - Men's K-1 1000 metres|K-1 1000 metres final]] and the [[Canoeing at the 2004 Summer Olympics - Men's K-1 500 metres|K-1 500 metres semifinal]] in his first Olympic appearance, in [[2004 Summer Olympics|2004]], [[Emanuel Silva]] will be participating in the same two events, in Beijing.
//Identify surprise or 'Easter egg' diversions linking month+years to year articles. Turn them into month+year links to be dealt with below
Portugal will be represented in the women's kayak events for the first time, with [[Teresa Portela]] and the pair [[Beatriz Gomes]] and [[Helena Rodrigues]] in the 500 metres distance. All competitors were granted qualification by allocation of spare athlete quota places.
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');


//removed piped years when in full date
===[[Image:Canoeing (flatwater) pictogram.svg|25px]] Flatwater===
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');
'''Men'''
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');
{|class=wikitable style="font-size:90%"
|-
!rowspan="2"|Athlete
!rowspan="2"|Event
!colspan="2"|Heats
!colspan="2"|Semifinals
!colspan="2"|Final
|-
!Time
!Rank
!Time
!Rank
!Time
!Rank
|-
|rowspan="2" align="left"|[[Emanuel Silva]]
|align="left"|[[Canoeing at the 2008 Summer Olympics - Men's K-1 500 metres|K-1 500&nbsp;m]]
|align="center"|1:42.513
|align="center"|6 '''Q'''
|align="center"|1:45.985
|align="center"|5
|align="center" colspan=2 bgcolor=honeydew|Did not advance
|-
|align="left"|[[Canoeing at the 2008 Summer Olympics - Men's K-1 1000 metres|K-1 1000&nbsp;m]]
|align="center"|3:31.843
|align="center"|4 '''Q'''
|align="center"|3:34.508
|align="center"|4
|align="center" colspan=2 bgcolor=honeydew|Did not advance
|}


//remove 'xx' left by other code
'''Women'''
txt.value=txt.value.replace(/(in)xx((?:aviation|baseball|film|literature|comics|ireland))/gi, '$1 $2');
{|class=wikitable style="font-size:90%"
|-
!rowspan="2"|Athlete
!rowspan="2"|Event
!colspan="2"|Heats
!colspan="2"|Semifinals
!colspan="2"|Final
|-
!Time
!Rank
!Time
!Rank
!Time
!Rank
|-
|align="left"|[[Teresa Portela]]
|align="left"|[[Canoeing at the 2008 Summer Olympics - Women's K-1 500 metres|K-1 500&nbsp;m]]
|align="center"|1:53.761
|align="center"|6 '''Q'''
|align="center"|1:54.831
|align="center"|6
|align="center" colspan=2 bgcolor=honeydew|Did not advance
|-
|align="left"|[[Beatriz Gomes]]<br />[[Helena Rodrigues]]
|align="left"|[[Canoeing at the 2008 Summer Olympics - Women's K-2 500 metres|K-2 500&nbsp;m]]
|align="center"|1:47.588
|align="center"|7 '''Q'''
|align="center"|1:46.021
|align="center"|5
|align="center" colspan=2 bgcolor=honeydew|Did not advance
|}


//year: temporary change to protect accessyear. Undone below at #1
==Cycling==
txt.value=txt.value.replace(/(accessyear\s?=\s?)\[\[(\d{1,4})\]\]/gi, '$1xx$2xx');
{{main|Cycling at the 2008 Summer Olympics|Cycling at the 2008 Summer Olympics - Qualification}}
//Year: temporary change to protext preference dates - y?y?y?. Needed to handle 'year in' piped links
txt.value=txt.value.replace(/(\[\[\d\d?\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\],?\s?\s?)\[\[(\d{1,4})\]\]y?y?y?/gi,'$1xx$2xx');
txt.value=txt.value.replace(/(\[\[\d\d?\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\]\],?\s?\s?)\[\[(\d{1,4})\]\]y?y?y?/g,'$1xx$2xx');
txt.value=txt.value.replace(/(\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d\d?\]\],?\s?\s?)\[\[(\d{1,4})\]\]y?y?y?/gi,'$1xx$2xx');
txt.value=txt.value.replace(/(\[\[(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d\d?\]\],?\s?\s?)\[\[(\d{1,4})\]\]y?y?y?/g,'$1xx$2xx');
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]y?y?y?(,?\s?\-?\s?\[\[(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d\d?\]\])/g,'xx$1xx$2');
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]y?y?y?(,?\s?\-?\s?\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d\d?\]\])/gi,'xx$1xx$2');
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]y?y?y?(,?\s?\-?\s?\[\[\d\d?\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\])/gi,'xx$1xx$2');
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]y?y?y?(,?\s?\-?\s?\[\[\d\d\-\d\d\]\]y?y?y?)/gi,'xx$1xx$2');


//year: now remove unprotected linked years
A maximum of three places were allocated to Portugal in the men's road event, due to a tenth place in the [[2006-2007 UCI Europe Tour]] nations ranking, which corresponded to a second place in terms of continental Olympic qualification. A quota place was available for the men's time trial event, but it was not taken.
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]/gi, '$1');
The national cycling federation chose to send [[Cycling at the 2004 Summer Olympics - Men's road race|2004 Olympic silver medalist]] [[Sérgio Paulinho]] together with [[André Cardoso]] and [[Nuno Ribeiro]]. However, just five days before the road race event, it was announced that Paulinho would not compete in Beijing due to asthma problems, and that he would not be replaced by another rider.<ref>{{cite news |url=http://noticias.sapo.pt/lusa/artigo/f3ba0c9be28a1df40a4e32.html |title=Sérgio Paulinho vai falhar Jogos devido a problemas de saúde |publisher=Agência Lusa |date=[[2008-08-04]] |accessdate=2008-08-04 |language=Portuguese}}</ref>
//year: #1. Undo temporary change to protect accessyear and date preference dates
txt.value=txt.value.replace(/xx(\d{1,4})xx/gi, '\[\[$1\]\]');


//'present'
===[[Image:Cycling pictogram.svg|25px]] Road===
txt.value=txt.value.replace(/\[\[Present\s\(time\)\|(Present)\]\]/gi, '$1');
{|class=wikitable style="font-size:90%;"
txt.value=txt.value.replace(/\[\[(Present)\]\]/gi, '$1');
|-
!Athlete
!Event
!Time
!Rank
|-
|[[André Cardoso]]
|[[Cycling at the 2008 Summer Olympics - Men's road race|Road race]]
|6:39:42 (+15:53)
|align="center"|72
|-
|[[Nuno Ribeiro]]
|[[Cycling at the 2008 Summer Olympics - Men's road race|Road race]]
|6:26:17 (+2:28)
|align="center"|28
|}


//Season
==[[Image:Equestrian pictogram.svg|25px]] Equestrian==
txt.value=txt.value.replace(/\[\[(spring\s\(season\)|summer|winter|autumn)\]\]/gi, '$1');
{{main|Equestrian at the 2008 Summer Olympics|Equestrian at the 2008 Summer Olympics - Qualification}}
txt.value=txt.value.replace(/\[\[spring\s\(season\)\|(spring)\]\]/gi, '$1');


//Identify surprise or 'Easter egg' diversions linking months to year articles.
Three horse riders qualified for the individual dressage competition—hence for the team competition, as well—, by benefiting from Switzerland's decision of not competing in the dressage events, but also from allocation of unused quota places. [[Daniel Pinto]] returns to the Olympic Games after his debut in [[2000 Summer Olympics|Sydney 2000]], while his brother [[Carlos Pinto (equestrian)|Carlos Pinto]] will make his first Olympic appearance.
txt.value=txt.value.replace(/\[\[\d{1,4}#[^\|\]]+\|(January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '$1');


// months
===Dressage===
txt.value=txt.value.replace(/\[\[\s?(January|February|March|April|May|June|July|August|September|October|November|December)\s?\]\]/gi, '$1');
<small>(Total scores are based on sum of qualifying round 2 and freestyle final for the individual competition, and average of individual round 1 scores for the team competition.)</small>
txt.value=txt.value.replace(/\[\[(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\]\]/g, '$1');
{|class=wikitable style="font-size:90%"
txt.value=txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\|(January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '$1');
|-
//Treat 'Sept' (i.e. month abbreviation) differently from 'sept' (i.e. family)
!rowspan="2"|Athlete
txt.value=txt.value.replace(/\[\[(Sept)\]\]/g, '$1');
!rowspan="2"|Horse
txt.value=txt.value.replace(/\[\[January\|(Jan)\]\]/gi, '$1');
!rowspan="2"|Event
txt.value=txt.value.replace(/\[\[February\|(Feb)\]\]/gi, '$1');
!colspan="2"|Qualifying Round 1
txt.value=txt.value.replace(/\[\[March\|(Mar)\]\]/gi, '$1');
!colspan="2"|Qualifying Round 2
txt.value=txt.value.replace(/\[\[April\|(Apr)\]\]/gi, '$1');
!colspan="2"|Freestyle Final
txt.value=txt.value.replace(/\[\[May\|(May)\]\]/gi, '$1');
!colspan="2"|Total
txt.value=txt.value.replace(/\[\[June\|(Jun)\]\]/gi, '$1');
|-
txt.value=txt.value.replace(/\[\[July\|(Jul)\]\]/gi, '$1');
!Score
txt.value=txt.value.replace(/\[\[August\|(Aug)\]\]/gi, '$1');
!Rank
txt.value=txt.value.replace(/\[\[September\|(Sep)\]\]/gi, '$1');
!Score
txt.value=txt.value.replace(/\[\[October\|(Oct)\]\]/gi, '$1');
!Rank
txt.value=txt.value.replace(/\[\[November\|(Nov)\]\]/gi, '$1');
!Score
txt.value=txt.value.replace(/\[\[December\|(Dec)\]\]/g, '$1');
!Rank
!Score
!Rank
|-
|align="left"|[[Miguel Ralão Duarte]]
|Oxalis
|align="left"|[[Equestrian at the 2008 Summer Olympics - Individual dressage|Individual]]
|colspan="8" align="center" bgcolor=palegreen|Withdrew
|-
|align="left"|[[Carlos Pinto (equestrian)|Carlos Pinto]]
|Notavel
|align="left"|[[Equestrian at the 2008 Summer Olympics - Individual dressage|Individual]]
|align=center|61.708
|align=center|39
|align=center colspan=6 bgcolor=honeydew|Did not advance
|-
|align="left"|[[Daniel Pinto]]
|Galopin de la Font
|align="left"|[[Equestrian at the 2008 Summer Olympics - Individual dressage|Individual]]
|align=center|63.083
|align=center|33
|align=center colspan=6 bgcolor=honeydew|Did not advance
|-
|align="left"|[[Miguel Ralão Duarte]]<br />[[Carlos Pinto (equestrian)|Carlos Pinto]]<br />[[Daniel Pinto]]
|''as above''
|align="left"|[[Equestrian at the 2008 Summer Olympics - Team dressage|Team]]
|colspan="2" align="center" bgcolor=palegreen|Eliminated
|colspan="4" bgcolor="wheat"|
|colspan="2" align="center" bgcolor=palegreen|Eliminated
|}


//month piped to number
==[[Image:Fencing pictogram.svg|30px]] Fencing==
txt.value=txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\|(\d{1,4})\]\]/gi, '$1');
{{main|Fencing at the 2008 Summer Olympics|Fencing at the 2008 Summer Olympics - Qualification}}
For the second time, since [[1960 Summer Olympics|Rome 1960]], Portugal qualified a female fencer for the individual foil competition. [[Débora Nogueira]] secured her place in Beijing by coming second in the European qualification tournament, held in [[Lisbon]]. She is joined by [[Joaquim Videira]], a silver medalist in the men's individual épée at the [[2006 World Fencing Championships]], who qualified in virtue of his third place in the [[FIE]] individual adjusted official ranking (AOR).


//Month+day_number "March 7th" -> "March 7"
{| class="wikitable" style="font-size:90%;"
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\]\]');
!rowspan="2"|Athlete
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\]\]');
!rowspan="2"|Event
!Round of 64
!Round of 32
!Round of 16
!Quarterfinals
!Semifinals
!Final
|-
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
!Opposition<br />Score
|-
|align="left"|[[Joaquim Videira]]
|align="left"|[[Fencing at the 2008 Summer Olympics - Men's épée|Men's Individual épée]]
|align=center|{{flagIOCathlete|[[Dario Torrente]]|RSA|2008 Summer}}<br/>'''W''' '''15'''–10
|align=center|{{flagIOCathlete|[[Radoslaw Zawrotniak]]|POL|2008 Summer}}<br/>'''L''' '''9'''–15
|align=center colspan=4 bgcolor=honeydew|Did not advance
|-
|align="left"|[[Débora Nogueira]]
|align="left"|[[Fencing at the 2008 Summer Olympics - Women's foil|Women's Individual foil]]
|align=center|{{flagIOCathlete|[[Su Wanwen]]|CHN|2008 Summer}}<br/>'''L''' '''4'''–15
|align=center colspan=5 bgcolor=honeydew|Did not advance
|}


//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
==Gymnastics==
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');
{{main|Gymnastics at the 2008 Summer Olympics|Gymnastics at the 2008 Summer Olympics - Qualification}}
//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');
Trampoline will be the only gymnastics discipline where Portugal will be represented. One male and one female gymnasts will attempt to mimic [[Nuno Merino]]'s debut in Athens, where he reached the final and landed a sixth place.
//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');
===[[Image:Gymnastics_(trampoline)_pictogram.svg|30px]] Trampoline===
//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');
{| class="wikitable" style="font-size:90%"
//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');
!rowspan="2"|Athlete
//same again but with slash instead of hyphen
!rowspan="2"|Event
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');
!colspan="2"|Qualifying
!colspan="2"|Final
|-
!Score
!Rank
!Score
!Rank
|-
|align="left"|[[Diogo Ganchinho]]
|align="left"|[[Gymnastics at the 2008 Summer Olympics - Men's trampoline|Men's Individual]]
|align=center|69.10
|align=center|11
|align="center" bgcolor="honeydew" colspan="2"|Did not advance
|-
|align="left"|[[Ana Rente]]
|align="left"|[[Gymnastics at the 2008 Summer Olympics - Women's trampoline|Women's Individual]]
|align=center|31.60
|align=center|16
|align="center" bgcolor="honeydew" colspan="2"|Did not advance
|}


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)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');
==[[Image:Judo pictogram.svg|25px]] Judo==
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)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');
{{main|Judo at the 2008 Summer Olympics|Judo at the 2008 Summer Olympics - Qualification}}


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)\|((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{1,2}(?:th|st|nd|rd))\]\]/g, '$1');
In the wake of [[Nuno Delgado]]'s bronze medal in 2000 (the first Olympic judo medal), the national judo scene developed considerably and new stars emerged, achieving international results of credit. Among notable judokas competing in Beijing are [[2008 European Judo Championships|2008 under-81&nbsp;kg European champion]], [[João Neto]], and two-time under-52&nbsp;kg European champion and [[2007 World Judo Championships]] runner-up, [[Telma Monteiro]].
//month+day piped into month+day or vice versa
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)\|((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');
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)\|(\d{1,2}(?:th|st|nd|rd)\s(?:January|February|March|April|May|June|July|August|September|October|November|December))\]\]/gi, '$1');


// days of the week in full. Optional plurals
===Men===
txt.value=txt.value.replace(/\[\[(Mondays?|Tuesdays?|Wednesdays?|Thursdays?|Fridays?|Saturdays?|Sundays?)\]\]/gi, '$1');
{| class="wikitable" style="font-size:90%"
// days of the week abbreviated. Leave out 'Sun' as potentially valid link to the Sun. Leave out 'SAT' in upper case as potential link to 'Scholastic achievement/aptitude test'.
|-
txt.value=txt.value.replace(/\[\[(Mon|Tue|Tues|Wed|Thu|Thur|Thurs|Fri)\]\]/gi, '$1');
!rowspan="2"|Athlete
txt.value=txt.value.replace(/\[\[(Sat)\]\]/g, '$1');
!rowspan="2"|Event
txt.value=txt.value.replace(/\[\[Mondays?\|(Mondays?|Mon)\]\]/gi, '$1');
!Round of 64
txt.value=txt.value.replace(/\[\[Tuesdays?\|(Tuesdays?|Tues?)\]\]/gi, '$1');
!Round of 32
txt.value=txt.value.replace(/\[\[Wednesdays?\|(Wednesdays?|Wed)\]\]/gi, '$1');
!Round of 16
txt.value=txt.value.replace(/\[\[Thursdays?\|(Thursdays?|Thur?)\]\]/gi, '$1');
!Quarterfinals
txt.value=txt.value.replace(/\[\[Fridays?\|(Fridays?|Fri)\]\]/gi, '$1');
!Semifinals
txt.value=txt.value.replace(/\[\[Saturdays?\|(Saturdays?|Sat)\]\]/gi, '$1');
!Final
txt.value=txt.value.replace(/\[\[Sundays?\|(Sundays?|Sun)\]\]/gi, '$1');
!Repechage 1
!Repechage 2
!Repechage 3
!Bronze medal<br/>final
|-
!Opposition<br />Result
!Opposition<br />Result
!Opposition<br />Result
!Opposition<br />Result
!Opposition<br />Result
!Opposition<br />Result
!Opposition<br />Result
!Opposition<br />Result
!Opposition<br />Result
!Opposition<br />Result
|-
|[[Pedro Dias]]
|[[Judo at the 2008 Summer Olympics - Men's 66 kg|66&nbsp;kg]]
|align="center" bgcolor=honeydew| Bye
|align=center|{{flagIOCathlete|[[Ludwing Ortiz Flores|Flores]]|VEN|2008 Summer}}<br/>'''W'''&nbsp;'''0100'''/0001
|align=center|{{flagIOCathlete|[[João Derly|Derly]]|BRA|2008 Summer}}<br/>'''W'''&nbsp;'''0101<sub>2</sub>'''/0010
|align=center|{{flagIOCathlete|[[Pak Chol Min|Pak]]|PRK|2008 Summer}}<br/>'''L'''&nbsp;'''0000'''/0002
|align=center colspan=2 bgcolor=honeydew|Did not advance
|align="center" bgcolor=wheat|
|align=center|{{flagIOCathlete|[[Giovanni Casale|Casale]]|ITA|2008 Summer}}<br/>'''L'''&nbsp;'''0001'''/1001
|align=center colspan=2 bgcolor=honeydew|Did not advance
|-
|[[João Neto]]
|[[Judo at the 2008 Summer Olympics - Men's 81 kg|81&nbsp;kg]]
|align=center|{{flagIOCathlete|[[Saba Gavashelishvili|Gavashel-<br>ishvili]]|GEO|2008 Summer}}<br/>'''W'''&nbsp;'''1010'''/0000
|align=center|{{flagIOCathlete|[[Edmond Topalli|Topalli]]|ALB|2008 Summer}}<br/>'''W'''&nbsp;'''1001'''/0000
|align=center|{{flagIOCathlete|[[Oscar Cardenas|Cardenas]]|CUB|2008 Summer}}<br/>'''W'''&nbsp;'''1000'''/0000
|align=center|{{flagIOCathlete|[[Kim Jae-Bum|Kim]]|KOR|2008 Summer}}<br/>'''L'''&nbsp;'''0000'''/0001
|align=center colspan=2 bgcolor=honeydew|Did not advance
|align="center" bgcolor=wheat|
|align=center|{{flagIOCathlete|[[Robert Krawczyk|Krawczyk]]|POL|2008 Summer}}<br/>'''L'''&nbsp;'''0000'''/1000
|align=center colspan=2 bgcolor=honeydew|Did not advance
|-
|[[João Pina]]
|[[Judo at the 2008 Summer Olympics - Men's 73 kg|73&nbsp;kg]]
|align="center" bgcolor=wheat|
|align=center|{{flagIOCathlete| [[Nicholas Tritton|Tritton]]|CAN|2008 Summer}}<br/>'''W'''&nbsp;'''0010'''/0000
|align=center|{{flagIOCathlete| [[Ali Malomat|Malomat]]|IRI|2008 Summer}}<br/>'''L'''&nbsp;'''0001'''/0111
|align=center colspan=2 bgcolor=honeydew|Did not advance
|align="center" bgcolor=wheat|
|align=center|{{flagIOCathlete| [[Yusuke Kanamaru|Kanamaru]]|JPN|2008 Summer}}<br/>'''L'''&nbsp;'''0010'''/0011
|align=center colspan=3 bgcolor=honeydew|Did not advance
|}


//4 digit years piped into 2
===Women===
txt.value=txt.value.replace(/\[\[\d{1,4}\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');
{| class="wikitable" style="font-size:90%;"
|-
!rowspan="2"|Athlete
!rowspan="2"|Event
!colspan="3"|Preliminaries
!colspan="3"|Repechage
!rowspan="2"|Rank
|-
!Round of 32
!Round of 16
!Quarterfinals
!First round
!Quarterfinals
!Semifinals
|-
| [[Ana Hormigo]]
| [[Judo at the 2008 Summer Olympics - Women's 48 kg|48&nbsp;kg]]
|align="center"| Bye
| {{flagIOCathlete|[[Devi Khumujam Tomb|Tomb]]|IND|2008 Summer}}<br/>'''W''' '''1011'''/0000
| {{flagIOCathlete|[[Pak Ok-Song|Pak]]|PRK|2008 Summer}}<br/>'''L''' '''0000'''/0100
|align="center"| Bye
| {{flagIOCathlete|[[Kelbet Nurgazina|Nurgazina]]|KAZ|2008 Summer}}<br/>'''W''' '''0002'''<sub>1</sub>/0001
| {{flagIOCathlete|[[Lyudmila Bogdanova|Bogdanova]]|RUS|2008 Summer}}<br />'''L''' '''0010'''/0100<sub>2</sub>
|align="center"| 7
|-
| [[Telma Monteiro]]
| [[Judo at the 2008 Summer Olympics - Women's 52 kg|52&nbsp;kg]]
|align="center"| Bye
| {{flagIOCathlete|[[Anna Kharitonova|Kharitonova]]|RUS|2008 Summer}}<br/>'''W''' '''0211'''/0000<sub>1</sub>
| {{flagIOCathlete|[[Xian Dongmei|Xian]]|CHN|2008 Summer}}<br/>'''L''' 1011/'''0010'''
|align="center"| Bye
| {{flagIOCathlete|[[Ana Carrascosa|Carrascosa]]|ESP|2008 Summer}}<br/>'''L''' 0101<sub>1</sub>/'''0001<sub>1</sub>'''
|align="center"| Did not advance
|align="center"| 9
|}


}
==[[Image:Rowing pictogram.svg|25px]] Rowing==
{{main|Rowing at the 2008 Summer Olympics|Rowing at the 2008 Summer Olympics - Qualification}}


A national crew achieved qualification for the men's lightweight double sculls event, by reaching second place in the Final Olympic Qualification Regatta, held in [[Poznan]].


{| class="wikitable" style="font-size:90%; text-align:center;"
|-
!rowspan="2"|Athlete(s)
!rowspan="2"|Event
!colspan="2"|Heats
!colspan="2"|Repechage
!colspan="2"|Semifinals A/B
!colspan="2"|Final B
!rowspan="2"|Rank
|-
!Time
!Rank
!Time
!Rank
!Time
!Rank
!Time
!Rank
|-
|align="left"|[[Nuno Mendes]] {{tooltip|(b)|Bow}}<br />[[Pedro Fraga]] {{tooltip|(s)|Stroke}}
|align="left"|[[Rowing at the 2008 Summer Olympics - Men's lightweight double sculls|Lightweight double sculls]]
|6:24.35
|3
|6:39.07
|1
|6:39.23
|6
|6:28.47
|2
|8
|}


function formatgeneral() {
==[[Image:Sailing pictogram.svg|25px]] Sailing==
var txt = document.editform.wpTextbox1;
{{main|Sailing at the 2008 Summer Olympics|Sailing at the 2008 Summer Olympics - Qualification}}


//remove flagicons from birth and death
A sport with tradition and success in the nation's Olympic history (four medals), the sailing events will feature nine Portuguese sailormen distributed among five classes. Notable sailors include former sailboard world and three-time European champion ([[Mistral]] and [[Neil Pryde RS:X]]), [[João Rodrigues (sailor)|João Rodrigues]]; 2003 ISAF [[Laser (dinghy)|Laser]] world champion, [[Gustavo Lima]]; and 2008 [[470 (dinghy)|470]] world championship runner-up and European champion crew, [[Álvaro Marinho]] and [[Miguel Nunes]].
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'
{| class="wikitable" style="font-size:90%; text-align:center;"
txt.value=txt.value.replace(/&times;/gi, '×');
|-
!rowspan="2"|Athlete(s)
!rowspan="2"|Event
!colspan="16"|Races
!rowspan="2"|Total<br />points
!rowspan="2"|Net<br />points
!rowspan="2"|Rank
|-
!width=20|1
!width=20|2
!width=20|3
!width=20|4
!width=20|5
!width=20|6
!width=20|7
!width=20|8
!width=20|9
!width=20|10
!width=20|11
!width=20|12
!width=20|13
!width=20|14
!width=20|15
!width=20|16
|-
|align="left"|[[Afonso Domingos]] {{tooltip|(s)|Skipper}}<br />[[Bernardo Santos]] {{tooltip|(c)|crew}}
|align="left"|[[Sailing at the 2008 Summer Olympics - Star class|Star]]
|3
|3
|10
|<s>{{tooltip|OCS|On the course side}}</s>
|13
|3
|5
|7
|7
|9
|12
|colspan="5" bgcolor="wheat"|
|89
|'''72'''
|8
|-
|align="left"|[[Gustavo Lima]]
|align="left"|[[Sailing at the 2008 Summer Olympics - Men's Laser class|Laser]]
|5
|8
|3
|<s>27</s>
|17
|6
|16
|8
|3
|bgcolor="lightgray"|
|10
|colspan="5" bgcolor="wheat"|
|103
|'''76'''
|4
|-
|align="left"|[[Jorge Lima]] {{tooltip|(s)|Skipper}}<br />[[Francisco Andrade]] {{tooltip|(c)|Crew}}
|align="left"|[[Sailing at the 2008 Summer Olympics - 49er class|49er]]
|12
|7
|9
|11
|4
|<s>{{tooltip|DNS|Did not start}}</s>
|10
|6
|5
|11
|13
|12
|colspan="3" bgcolor="lightgray"|
|{{tooltip|DNQ|Did not qualify (Medal race)}}
|120
|'''100'''
|11
|-
|align="left"|[[Álvaro Marinho]] {{tooltip|(s)|Skipper}}<br />[[Miguel Nunes]] {{tooltip|(c)|Crew}}
|align="left"|[[Sailing at the 2008 Summer Olympics - Men's 470 class|470]]
|2
|8
|15
|6
|11
|7
|9
|<s>{{tooltip|OCS|On the course side}}</s>
|10
|14
|20
|colspan="5" bgcolor="wheat"|
|132
|'''102'''
|8
|-
|align="left"|[[João Rodrigues (sailor)|João Rodrigues]]
|align="left"|[[Sailing at the 2008 Summer Olympics - Men's sailboard|RS:X]]
|18
|10
|10
|8
|14
|16
|9
|3
|13
|<s>19</s>
|{{tooltip|DNQ|Did not qualify (Medal race)}}
|colspan="5" bgcolor="wheat"|
|120
|'''101'''
|11
|}


//turn letter 'x' into symbol '×'
==[[Image:Shooting pictogram.svg|25px]] Shooting==
txt.value=txt.value.replace(/(\d)\sx\s(\d{1,3})\sin\s\(/gi, '$1 × $2 in (');
{{main|Shooting at the 2008 Summer Olympics|Shooting at the 2008 Summer Olympics - Qualification}}
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
Two male shooters will take part in three events. [[João Costa]] returns to the Olympics to compete in the same two events where he debuted in 2000. [[Manuel Silva]] also makes an Olympic comeback, in the trap event, sixteen years later. Both qualified as 2006 World Cup winners.
txt.value=txt.value.replace(/&deg;/g, '°');
txt.value=txt.value.replace(/º/g, '°');


//aviation specifications: protect 'main=' and 'alt=' - undone below
{| class="wikitable" style="font-size:90%; text-align:center"
txt.value=txt.value.replace(/((?:main|alt)\s?=\s?)(\d)/gi, '$1xx$2');
|-
!rowspan="2"|Athlete
!rowspan="2"|Event
!colspan="2"|Qualification
|-
!Score
!Rank
|-
|align="left" rowspan="2"|[[João Costa]]
|align="left"|[[Shooting at the 2008 Summer Olympics - Men's 10 metre air pistol|10&nbsp;m air pistol]]
|579
|18
|-
|align="left"|[[Shooting at the 2008 Summer Olympics - Men's 50 metre pistol|50&nbsp;m pistol]]
|549
|33
|-
|align="left"|[[Manuel Silva]]
|align="left"|[[Shooting at the 2008 Summer Olympics - Men's trap|Trap]]
|111
|27
|}


// Celsius spelling errors
==[[Image:Swimming pictogram.svg|25px]] Swimming==
txt.value=txt.value.replace(/celsius/gi, 'Celsius');
{{main|Swimming at the 2008 Summer Olympics}}
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
The second largest contingent within the national Olympic team (10 competitors) will participate in swimming events. Portugal qualified one male and one female swimmer to the 10 kilometre open-water marathon, the newest event added to the official Olympic program.
txt.value=txt.value.replace(/&sup2;/g, '²');
txt.value=txt.value.replace(/&sup3;/g, '³');


//metre
===Men===
//delink this common unit
{| class="wikitable" style="font-size:90%;"
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');
!rowspan="2"|Athlete
//space before 'm' only when lower case. Check for dollars and pounds to avoid 'm' used for millions in money.
!rowspan="2"|Event
txt.value=txt.value.replace(/(\(\d[\d,\.]*)(?:\s|-|)m([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1 m$2');
!colspan="3"|Heats
//convert 'metres' to 'm' when in parentheses
!colspan="3"|Semifinals
txt.value=txt.value.replace(/(\(\d[\d,\.]*)(?:\s|-|)(?:metres|meters|metre|meter)(\))/g, '$1 m$2');
!colspan="2"|Final
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');
!Time
!Rank
!Overall
!Time
!Rank
!Overall
!Time
!Rank
|-
|[[Carlos Almeida (swimmer)|Carlos Almeida]]
|[[Swimming at the 2008 Summer Olympics - Men's 200 metre breaststroke|200&nbsp;m breaststroke]]
|2:13.34<sup>{{tooltip|NR|National record}}</sup>
|align="center"|1
|align="center"|34
|colspan="5" align="center"|Did not advance
|-
|[[Diogo Carvalho]]
|[[Swimming at the 2008 Summer Olympics - Men's 200 metre individual medley|200&nbsp;m individual medley]]
|2:00.66
|align="center"|6
|align="center"|18
|colspan="5" align="center"|Did not advance
|-
|[[Fernando Costa]]
|[[Swimming at the 2008 Summer Olympics - Men's 1500 metre freestyle|1500&nbsp;m freestyle]]
|15:26.21
|align="center"|6
|align="center"|29
|colspan="3" bgcolor="wheat"|
|colspan="2" align="center"|Did not advance
|-
|[[Arseniy Lavrentiev]]
|[[Swimming at the 2008 Summer Olympics - Men's 10 kilometre|10&nbsp;km open-water]]
|colspan="6" bgcolor="wheat"|
|2:03:39.6
|align="center"|22
|-
|[[Simão Morgado]]
|[[Swimming at the 2008 Summer Olympics - Men's 100 metre butterfly|100&nbsp;m butterfly]]
|52.80<sup>{{tooltip|NR|National record}}</sup>
|align="center"|3
|align="center"|33
|colspan="5" align="center"|Did not advance
|-
|rowspan="2"|[[Pedro Oliveira (swimmer)|Pedro Oliveira]]
|[[Swimming at the 2008 Summer Olympics - Men's 200 metre backstroke|200&nbsp;m backstroke]]
|2:01.08
|align="center"|6
|align="center"|28
|colspan="5" align="center"|Did not advance
|-
|[[Swimming at the 2008 Summer Olympics - Men's 200 metre butterfly|200&nbsp;m butterfly]]
|1:57.41<sup>{{tooltip|NR|National record}}</sup>&nbsp;<sup>{{tooltip|IR|Iberian record}}</sup>
|align="center"|2
|align="center"|24
|colspan="5" align="center"|Did not advance
|-
|rowspan="2"|[[Tiago Venâncio]]
|[[Swimming at the 2008 Summer Olympics - Men's 100 metre freestyle|100&nbsp;m freestyle]]
|50.30
|align="center"|7
|align="center"|45
|colspan="5" align="center"|Did not advance
|-
|[[Swimming at the 2008 Summer Olympics - Men's 200 metre freestyle|200&nbsp;m freestyle]]
|1:50.24
|align="center"|8
|align="center"|39
|colspan="5" align="center"|Did not advance
|}


//metre per second
===Women===
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(?:m\/second|m\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 m/s$3');
{| class="wikitable" style="font-size:90%;"
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');
!rowspan="2"|Athlete
!rowspan="2"|Event
!colspan="3"|Heats
!colspan="3"|Semifinals
!colspan="2"|Final
|-
!Time
!Rank
!Overall
!Time
!Rank
!Overall
!Time
!Rank
|-
|rowspan="2"|[[Diana Gomes]]
|[[Swimming at the 2008 Summer Olympics - Women's 100 metre breaststroke|100&nbsp;m breaststroke]]
|1:10.02
|align="center"|3
|align="center"|26
|colspan="5" align="center"|Did not advance
|-
|[[Swimming at the 2008 Summer Olympics - Women's 200 metre breaststroke|200&nbsp;m breaststroke]]
|2:30.18
|align="center"|5
|align="center"|29
|colspan="5" align="center"|Did not advance
|-
|[[Daniela Inácio]]
|[[Swimming at the 2008 Summer Olympics - Women's 10 kilometre|10&nbsp;km open-water]]
|colspan="6" bgcolor="wheat"|
|2:00:59
|align="center"|17
|-
|rowspan="2"|[[Sara Oliveira]]
|[[Swimming at the 2008 Summer Olympics - Women's 100 metre butterfly|100&nbsp;m butterfly]]
|59.48<sup>{{tooltip|NR|National record}}</sup>
|align="center"|3
|align="center"|35
|colspan="5" align="center"|Did not advance
|-
|[[Swimming at the 2008 Summer Olympics - Women's 200 metre butterfly|200&nbsp;m butterfly]]
|2:10.14<sup>{{tooltip|NR|National record}}</sup>
|align="center"|3
|align="center"|19
|colspan="5" align="center"|Did not advance
|}


//square metre
==[[Image:Table tennis pictogram.svg|25px]] Table tennis==
txt.value=txt.value.replace(/(\d)(?:\s|-|&nbsp;|)sq(?:\s|\.\s|-|&nbsp;)m([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 m²$2');
{{main|Table tennis at the 2008 Summer Olympics|Table tennis at the 2008 Summer Olympics - Qualification}}
txt.value=txt.value.replace(/({convert\|\d+\|(?:m2|sqft)[^\}]*)\|lk=(?:on|in|out)/g, '$1');


// millimetre
Table tennis is one of the two Olympic sports where Portugal will compete for the first time, in Beijing. A maximum of three players will participate in the men's singles: [[João Monteiro]], qualified via Continental Qualification Tournament, [[Marco Freitas]] and [[Tiago Apolónia]], qualified due to allocation of unused team quota places.
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)mm([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 mm$3');


// centimetre, cubic centimetre
{| class="wikitable" style="font-size:90%"
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(cm|cc)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
|-
!Athlete
!Event
!Preliminary round
!Round 1
!Round 2
|-
|[[Tiago Apolónia]]
|[[Table tennis at the 2008 Summer Olympics - Men's singles|Singles]]
|align="center"|Bye
|{{flagIOCathlete|[[Lin Ju]]|DOM|2008 Summer}}<br/>'''L''' '''1'''–4
|align="center"|Did not advance
|-
|[[Marco Freitas]]
|[[Table tennis at the 2008 Summer Olympics - Men's singles|Singles]]
|align="center"|Bye
|{{flagIOCathlete|[[El-Sayed Lashin]]|EGY|2008 Summer}}<br/>'''W''' '''4'''–1
|{{flagIOCathlete|[[Yang Zi]]|SIN|2008 Summer}} <br/>'''L''' '''2'''–4
|-
|[[João Monteiro]]
|[[Table tennis at the 2008 Summer Olympics - Men's singles|Singles]]
|align="center"|Bye
|{{flagIOCathlete|[[Segun Toriola]]|NGR|2008 Summer}}<br/>'''L''' '''3'''–4
|align="center"|Did not advance
|}


// kilometre
==[[Image:Taekwondo pictogram.svg|25px]] Taekwondo==
//delink this common unit
{{main|Taekwondo at the 2008 Summer Olympics|Taekwondo at the 2008 Summer Olympics - Qualification}}
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
Taekwondo is the second Olympic sport where Portuguese competitors will enter for the first time, in Beijing. The feat was achieved by [[Pedro Póvoa]], following his victory in the European Qualification Tournament, held in [[Istanbul]].
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');


{| class="wikitable" style="font-size:90%"
|-
!rowspan="2"|Athlete
!rowspan="2"|Event
!Preliminaries
!Repechage
!rowspan="2"|Rank
|-
!Round of 16
!First round
|-
|[[Pedro Póvoa]]
|[[Taekwondo at the 2008 Summer Olympics - Men's 58 kg|58&nbsp;kg]]
|{{flagIOCathlete|[[Gabriel Mercedes]]|DOM|2008 Summer}}<br/>'''L''' '''0'''–3
|{{flagIOCathlete|[[Chu Mu-Yen]]|TPE|2008 Summer}}<br/>'''L''' '''−1'''–1
|align="center"|7
|}


//kilometre per second
==[[Image:Triathlon pictogram.svg|25px]] Triathlon==
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(?:km\/second|km\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 km/s$3');
{{main|Triathlon at the 2008 Summer Olympics}}
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
The nation's second consecutive presence in the Olympic triathlon competition will be expanded to both events, with the qualification of two male triathletes. They will join [[Vanessa Fernandes]], eight place in Athens, who is aiming to grab the Olympic gold medal, following a world title, in 2007, and a fifth consecutive European title, in 2008.
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
===Men===
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(ml)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
{| class="wikitable" style="font-size:90%; text-align:center;"
|-
!Athlete
!Event
!Swim
!Cycling
!Run
!Total time
!Rank
|-
|align="left"|[[Duarte Marques]]
|align="left"|[[Triathlon at the 2008 Summer Olympics|Individual]]
|18:20
|59:06
|36:47
|1:55:06.57
|45
|-
|align="left"|[[Bruno Pais]]
|align="left"|[[Triathlon at the 2008 Summer Olympics|Individual]]
|18:28
|58:47
|32:32
|1:50:40.22
|17
|}


// ensure spaces and correct case in kilowatt
===Women===
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)kW([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 kW$3');
{| class="wikitable" style="font-size:90%; text-align:center;"
|-
!Athlete
!Event
!Swim
!Cycling
!Run
!Total time
!Rank
|-
|align="left"|'''[[Vanessa Fernandes]]'''
|align="left"|[[Triathlon at the 2008 Summer Olympics|Individual]]
|19:53
|1:04:18
|34:21
|1:59:34.63
|[[Image:Silver medal icon.svg]]
|}
<!--
==Officials==
{{col-begin}}
{{col-3}}
;NOC staff:
* [[José Vicente de Moura]] (president)
* Victor Fonseca da Costa (general secretary)
* Manuel Boa de Jesus (mission chief)
* Celeste Gil
* Maria José Farinha
* Rita Fernandes
;Medical staff:
* Pedro Branco
* Jacob Frischknecht
* Pedro Mimoso
* Susana Nogueira
* Ricardo Paulino
* José Ramos
;Media staff:
* João Querido Manha
{{col-3}}
;Coaching staff:
* Myung Lee (archery)
* João Ganso (athletics)
* (athletics)
* (athletics)
* (athletics)
* (athletics)
* (athletics)
* (athletics)
* (athletics)
* Ricardo Fernandes (badminton)
* David Freitas (badminton)
* Miguel Caetano (cycling)
* José Poeira (cycling)
* Paulo Silva (cycling)
* Kyra Kyrklund (equestrian)
{{col-3}}
* Hélder Alves (fencing)
* Nuno Frazão (fencing)
* (gymnastics)
* (gymnastics)
* Michel Almeida (judo)
* Leandra Freitas (judo)
* (judo)
* Rui Rosa (judo)
* José Santos (rowing)
* Domingos Rodrigues (shooting)
* Filipe Coelho (swimming)
* Rui Magalhães (swimming)
* Élio Terrível (swimming)
* Sérgio Santos (triathlon)
{{col-end}}
-->


// ensure spaces and correct case in hertz
==See also==
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)Hz([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 Hz$3');
* [[Portugal at the 2008 Summer Paralympics]]
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
==Notes and references==
txt.value=txt.value.replace(/frames\/s([:;,\.?!]?\s[^\d\(\)\/\\])/gi, 'frame/s$1');
;Notes:
{{Reflist}}


// kilogram
;References:
txt.value=txt.value.replace(/kilogrammes/gi, 'kilograms');
{{refbegin}}
txt.value=txt.value.replace(/kilogramme/gi, 'kilogram');
* {{cite web |url=http://www.comiteolimpicoportugal.pt/projectos.php?id=1 |title=Projecto Pequim 2008 |language=Portuguese |publisher=Olympic Committee of Portugal}}
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)\[\[(kilograms?)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2 $3$4');
* {{cite web |url=http://www.pequim2008.com.pt |title=Missão de Portugal aos Jogos da XXIX Olimpíada |language=Portuguese |publisher=Olympic Committee of Portugal}}
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;\[\[(kilograms?)\]\]([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1$2&nbsp;$3$4');
{{refend}}
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
{{NOCin2008SummerOlympics}}
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
[[Category:Nations at the 2008 Summer Olympics]]
//convert 'sq foot' to 'sq ft'
[[Category:Portugal at the Olympics|2008]]
txt.value=txt.value.replace(/(\d)(\s|-)sq\.?(\s|-|)(feet|foot|ft)/gi, '$1 sq ft');
[[Category:2008 in Portugal|Summer Olympics]]
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|sing=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|sing=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|sing=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|sing=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|sing=on}}$4');


//feet per second
[[de:Olympische Sommerspiele 2008/Teilnehmer (Portugal)]]
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|)(?:ft\/second|ft\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2 ft/s$3');
[[es:Anexo:Portugal en los Juegos Olímpicos de Pekín 2008]]
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)&nbsp;(?:ft\/second|ft\/sec)([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1$2&nbsp;ft/s$3');
[[fr:Portugal aux Jeux olympiques d'été de 2008]]
//feet per second:plural
[[mr:२००८ उन्हाळी ऑलिंपिक खेळात पोर्तुगाल]]
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');
[[nl:Portugal op de Olympische Zomerspelen 2008]]
//feet per second:singular
[[pl:Portugalia na Letnich Igrzyskach Olimpijskich 2008]]
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)foot\sper\ssecond([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1{{convert|$2|ft/s|m/s|sing=on}}$3');
[[pt:Portugal nos Jogos Olímpicos de Verão de 2008]]
//feet per second:abbreviated
[[zh:2008年夏季奥林匹克运动会葡萄牙代表团]]
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|sing=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|sing=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|sing=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|sing=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|sing=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|sing=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\d+[\d,\.]*)(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1{{convert|$2|acre feet}}$3');
//acre foot:singular
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]\d\d+[\d,\.]*)(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1{{convert|$2|acre feet|sing=on}}$3');
//acre foot:abbreviation
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]\d\d+[\d,\.]*)(?:\s|-|&nbsp;|)(?:acre|ac\.?)(?:\s|-|&nbsp;|)(?:foot|feet|ft)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$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(?:\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|sing=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|sing=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|sing=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|sing=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+)(?:\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|sing=on}}$3');
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d?\d\.\d+)(?:\s|-|&nbsp;|)(?:acre|\[\[acre\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1{{convert|$2|acre|m2|sing=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|sing=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|sing=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|sing=on}}$3');
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)pound\sforce([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1{{convert|$2|lbf|N|sing=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|sing=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|sing=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');
//foot: singular
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1{{convert|$2|ft|m|sing=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|sing=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)\s?bps([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 bit/s$2');
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(/(\d)&nbsp;bps([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1&nbsp;bit/s$2');
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');

//change deprecated knot in template code
txt.value=txt.value.replace(/({{convert\|[^}]*knot)\|km\/h mph([^}]*}})/gi, '$1$2');

txt.value=txt.value.replace(/{{convert\|(1.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (2.8 km/h)');
txt.value=txt.value.replace(/{{convert\|(7)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (13 km/h)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?\|km\/h(?:\|\d|)(?:\|lk=on|)}}/gi, '$1 knots (19 km/h)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?\|km\/h(?:\|-1|)(?:\|lk=on|)}}/gi, '$1 knots (20 km/h)');
txt.value=txt.value.replace(/{{convert\|(11)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (20 km/h)');
txt.value=txt.value.replace(/{{convert\|(12)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (22 km/h)');
txt.value=txt.value.replace(/{{convert\|(13)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (24 km/h)');
txt.value=txt.value.replace(/{{convert\|(14)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (26 km/h)');
txt.value=txt.value.replace(/{{convert\|(15)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (28 km/h)');
txt.value=txt.value.replace(/{{convert\|(16)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (30 km/h)');
txt.value=txt.value.replace(/{{convert\|(17)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (31 km/h)');
txt.value=txt.value.replace(/{{convert\|(18)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (33 km/h)');
txt.value=txt.value.replace(/{{convert\|(19)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (35 km/h)');
txt.value=txt.value.replace(/{{convert\|(19\.1)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (35.4 km/h)');
txt.value=txt.value.replace(/{{convert\|(20)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (37 km/h)');
txt.value=txt.value.replace(/{{convert\|(21)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (39 km/h)');
txt.value=txt.value.replace(/{{convert\|(20\.8)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (38.5 km/h)');
txt.value=txt.value.replace(/{{convert\|(21\.06)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (39.00 km/h)');
txt.value=txt.value.replace(/{{convert\|(23)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (43 km/h)');
txt.value=txt.value.replace(/{{convert\|(23\.4)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (43.3 km/h)');
txt.value=txt.value.replace(/{{convert\|(25)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (46 km/h)');
txt.value=txt.value.replace(/{{convert\|(27)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (50 km/h)');
txt.value=txt.value.replace(/{{convert\|(27\.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (50.9 km/h)');
txt.value=txt.value.replace(/{{convert\|(27\.9)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (51.7 km/h)');
txt.value=txt.value.replace(/{{convert\|(28)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (52 km/h)');
txt.value=txt.value.replace(/{{convert\|(29\.98)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (55.52 km/h)');
txt.value=txt.value.replace(/{{convert\|(30)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (56 km/h)');
txt.value=txt.value.replace(/{{convert\|(31)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (57 km/h)');
txt.value=txt.value.replace(/{{convert\|(35\.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (65.7 km/h)');
txt.value=txt.value.replace(/{{convert\|(39)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (72 km/h)');
txt.value=txt.value.replace(/{{convert\|(40)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (74 km/h)');
txt.value=txt.value.replace(/{{convert\|(50)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (93 km/h)');
txt.value=txt.value.replace(/{{convert\|(60)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (110 km/h)');
txt.value=txt.value.replace(/{{convert\|(70)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (130 km/h)');
txt.value=txt.value.replace(/{{convert\|(80)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (150 km/h)');
txt.value=txt.value.replace(/{{convert\|(90)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (170 km/h)');
txt.value=txt.value.replace(/{{convert\|(100)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (190 km/h)');
txt.value=txt.value.replace(/{{convert\|(110)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (200 km/h)');
txt.value=txt.value.replace(/{{convert\|(120)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (220 km/h)');
txt.value=txt.value.replace(/{{convert\|(130)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (240 km/h)');
txt.value=txt.value.replace(/{{convert\|(140)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (260 km/h)');

txt.value=txt.value.replace(/{{convert\|(9\.0)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (17 km/h/10 mph)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (19 km/h/12 mph)');
txt.value=txt.value.replace(/{{convert\|(11)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (20 km/h/13 mph)');
txt.value=txt.value.replace(/{{convert\|(12)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (22 km/h/14 mph)');
txt.value=txt.value.replace(/{{convert\|(13)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (24 km/h/15 mph)');
txt.value=txt.value.replace(/{{convert\|(14)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (26 km/h/16 mph)');
txt.value=txt.value.replace(/{{convert\|(14\.1)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (26.1 km/h/16.2 mph)');
txt.value=txt.value.replace(/{{convert\|(15)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (28 km/h/17 mph)');
txt.value=txt.value.replace(/{{convert\|(16)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (30 km/h/18 mph)');
txt.value=txt.value.replace(/{{convert\|(16\.8)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (31.1 km/h/19.3 mph)');
txt.value=txt.value.replace(/{{convert\|(17)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (31 km/h/20 mph)');
txt.value=txt.value.replace(/{{convert\|(18)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (33 km/h/21 mph)');
txt.value=txt.value.replace(/{{convert\|(19)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (35 km/h/22 mph)');
txt.value=txt.value.replace(/{{convert\|(20)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (37 km/h/23 mph)');
txt.value=txt.value.replace(/{{convert\|(21\.5)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (39.8 km/h/24.7 mph)');
txt.value=txt.value.replace(/{{convert\|(23)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (43 km/h/26 mph)');
txt.value=txt.value.replace(/{{convert\|(24)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (44 km/h/28 mph)');
txt.value=txt.value.replace(/{{convert\|(33\.8)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (62.6 km/h/38.9 mph)');
txt.value=txt.value.replace(/{{convert\|(39)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (72 km/h/45 mph)');

txt.value=txt.value.replace(/{{convert\|(24)\|km\/h\|kno?t?(?:\|\d|)(?:\|lk=on|)}}/gi, '$1 km/h (13 kn)');

txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?\|km\/h(?:\|\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (19 km/h)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?\|km\/h(?:\|-1\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (20 km/h)');
txt.value=txt.value.replace(/{{convert\|(11)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (20 km/h)');
txt.value=txt.value.replace(/{{convert\|(12)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (22 km/h)');
txt.value=txt.value.replace(/{{convert\|(13)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (24 km/h)');
txt.value=txt.value.replace(/{{convert\|(14)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (26 km/h)');
txt.value=txt.value.replace(/{{convert\|(15)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (28 km/h)');
txt.value=txt.value.replace(/{{convert\|(16)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (30 km/h)');
txt.value=txt.value.replace(/{{convert\|(17)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (31 km/h)');
txt.value=txt.value.replace(/{{convert\|(18)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (33 km/h)');
txt.value=txt.value.replace(/{{convert\|(19)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (35 km/h)');
txt.value=txt.value.replace(/{{convert\|(19\.1)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (35.4 km/h)');
txt.value=txt.value.replace(/{{convert\|(19\.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (36.1 km/h)');
txt.value=txt.value.replace(/{{convert\|(20)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (37 km/h)');
txt.value=txt.value.replace(/{{convert\|(23)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (43 km/h)');
txt.value=txt.value.replace(/{{convert\|(27\.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (50.9 km/h)');
txt.value=txt.value.replace(/{{convert\|(28)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (52 km/h)');
txt.value=txt.value.replace(/{{convert\|(30)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (56 km/h)');
txt.value=txt.value.replace(/{{convert\|(39)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (72 km/h)');
txt.value=txt.value.replace(/{{convert\|(40)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (74 km/h)');
txt.value=txt.value.replace(/{{convert\|(50)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (93 km/h)');
txt.value=txt.value.replace(/{{convert\|(60)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (110 km/h)');
txt.value=txt.value.replace(/{{convert\|(70)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (130 km/h)');
txt.value=txt.value.replace(/{{convert\|(80)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (150 km/h)');
txt.value=txt.value.replace(/{{convert\|(90)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (170 km/h)');
txt.value=txt.value.replace(/{{convert\|(100)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (190 km/h)');
txt.value=txt.value.replace(/{{convert\|(110)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (200 km/h)');
txt.value=txt.value.replace(/{{convert\|(120)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (220 km/h)');
txt.value=txt.value.replace(/{{convert\|(130)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (240 km/h)');
txt.value=txt.value.replace(/{{convert\|(140)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (260 km/h)');

txt.value=txt.value.replace(/{{convert\|(9\.0)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (17 km/h/10 mph)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (19 km/h/12 mph)');
txt.value=txt.value.replace(/{{convert\|(11)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (20 km/h/13 mph)');
txt.value=txt.value.replace(/{{convert\|(12)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (22 km/h/14 mph)');
txt.value=txt.value.replace(/{{convert\|(13)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (24 km/h/15 mph)');
txt.value=txt.value.replace(/{{convert\|(14)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (26 km/h/16 mph)');
txt.value=txt.value.replace(/{{convert\|(15)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (28 km/h/17 mph)');
txt.value=txt.value.replace(/{{convert\|(16)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (30 km/h/18 mph)');
txt.value=txt.value.replace(/{{convert\|(16\.8)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (31.1 km/h/19.3 mph)');
txt.value=txt.value.replace(/{{convert\|(17)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (31 km/h/20 mph)');
txt.value=txt.value.replace(/{{convert\|(18)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (33 km/h/21 mph)');
txt.value=txt.value.replace(/{{convert\|(19)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (35 km/h/22 mph)');
txt.value=txt.value.replace(/{{convert\|(20)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (37 km/h/23 mph)');
txt.value=txt.value.replace(/{{convert\|(23)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (43 km/h/26 mph)');
txt.value=txt.value.replace(/{{convert\|(24)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (44 km/h/28 mph)');
txt.value=txt.value.replace(/{{convert\|(39)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (72 km/h/45 mph)');

txt.value=txt.value.replace(/({convert\|[^}]+\|kn)ot(\||})/g, '$1$2');
txt.value=txt.value.replace(/({{convert\|[^}]*kn)ot([^}]*abbr=on}})/gi, '$1$2');

//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 all_dates() {
var txt = document.editform.wpTextbox1;
part_dates();

//Remove full US format dates, ensure that comma is present
txt.value=txt.value.replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d\d?)\]\],?\s?\s?\[\[(\d{1,4})\]\]/gi,'$1, $2');

//Remove month+day and day+month formats
txt.value=txt.value.replace(/\[\[(\d\d?\s(?:January|February|March|April|May|June|July|August|September|October|November|December))\]\]/gi,'$1');
txt.value=txt.value.replace(/\[\[(\d\d?\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\]\]/g,'$1');
txt.value=txt.value.replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d\d?)\]\]/gi,'$1');
txt.value=txt.value.replace(/\[\[((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d\d?)\]\]/g,'$1');

//year: temporary change to protect split linked ISO dates. Undone below
//txt.value=txt.value.replace(/(\[\[\d{1,4}\]\]-\[\[\d\d-\d\d\]\])/gi, 'qq$1');
//year: now remove unprotected linked years
txt.value=txt.value.replace(/([^q])\[\[(\d{1,4})\]\]/gi, '$1$2');
//year: Undo temporary change to protect part linked ISO dates
//txt.value=txt.value.replace(/qq(\[\[)/gi, '$1');

}

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

var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
if (txt.value.indexOf(summary) == -1) {
if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
txt.value += " | ";
}
txt.value += summary;
}
document.editform.wpDiff.click()
}
addOnloadHook(function () {
if(document.forms.editform) {
// addPortletLink('p-cactions', 'javascript:run_part_dates()', 'part dates', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
}
});

function run_all_dates() {
var txt = document.editform.wpTextbox1;
all_dates();
// Add a tag to the summary box
var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
if (txt.value.indexOf(summary) == -1) {
if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
txt.value += " | ";
}
txt.value += summary;
}
// Press the diff button to check it
document.editform.wpDiff.click()
}
addOnloadHook(function () {
if(document.forms.editform) {
// addPortletLink('p-cactions', 'javascript:run_all_dates()', 'all dates', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
}
});




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

// Add a tag to the summary box
var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
if (txt.value.indexOf(summary) == -1) {
if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
txt.value += " | ";
}
txt.value += summary;
}

// Press the diff button to check it
document.editform.wpDiff.click()
}
addOnloadHook(function () {
if(document.forms.editform) {
// addPortletLink('p-cactions', 'javascript:run_year_in_blah()', 'year in blah', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
}
});


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

// Add a tag to the summary box
var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|Script]]-assisted. Units/dates/other";
if (txt.value.indexOf(summary) == -1) {
if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
txt.value += " | ";
}
txt.value += summary;
}

// Press the diff button to check it
document.editform.wpDiff.click()
}
addOnloadHook(function () {
if(document.forms.editform) {
// addPortletLink('p-cactions', 'javascript:run_formatgeneral()', 'units', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
}
});

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

// Add a tag to the summary box
var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
if (txt.value.indexOf(summary) == -1) {
if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
txt.value += " | ";
}
txt.value += summary;
}

// Press the diff button to check it
document.editform.wpDiff.click()
}

addOnloadHook(function () {
if(document.forms.editform) {
// addPortletLink('p-cactions', 'javascript:combined()', 'dates+units', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
// addPortletLink('p-cactions', '', 'Note to users: script commands now in toolbox at bottom left beneath: What links here', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
// addPortletLink('p-cactions', '', 'B', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
}
});

//
function LMmosdate() {
var txt = document.editform.wpTextbox1;
txt.value = txt.value

//MOSDATE remove th in dates followed by -th, others
//.replace(/([^\[])(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d\d?)(th|st|nd|rd)/gi, '$1[[$2 $3]]')
.replace(/(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d\d?)(th|st|nd|rd)/gi, '$1 $2')
.replace(/\[\[(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d\d?)\]\](<sup>)?(th|st|nd|rd)(<\/sup>)?/gi, '[[$1 $2]]')
.replace(/(\D\d\d?)(<sup>)?(th|st|nd|rd)(<\/sup>)?\s(January|February|March|April|May|June|July|August|September|October|November|December)/gi, '$1 $5')
.replace(/\s(\d{3}0)'s(\W)/gi, ' $1s$2');
}


function LMyearinX() {
var monthyear = new RegExp("\\[\\[(January|February|March|April|May|June|July|August|September|October|November|December),? *([0-9][0-9][0-9][0-9])\\]\\]", "g");
var txt = document.editform.wpTextbox1;
txt.value = txt.value.replace(/\[\[[1-2][0-9][0-9][0-9] in [A-Za-z]+\|([1-2][0-9][0-9][0-9])\]\]/g, "[[$1]]");
txt.value = txt.value.replace(/([^,\]] |[^,\] ])\[\[([1-2][0-9][0-9][0-9])\]\]/g, "$1$2");
txt.value = txt.value.replace(monthyear, "$1 $2");
txt.value=txt.value.replace(/{{(?:by|ly)\|(\d{1,4})}}/gi, '$1');
}

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) (11[^\d])/gi, '$1xx$2');
txt.value=txt.value.replace(/(\[\[september)xx(11\]\])/gi, '$1 $2');
txt.value=txt.value.replace(/([^\d]7) (july)/gi, '$1xx$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(/\x02([0-9]+)\x03/g, function(x, n){
return linkmap[n];
});
}

function LMdayMonth(option) {

var daymonth = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\\]\\],? *\\[\\[([0-9][0-9][0-9][0-9])\\]\\]", "g");
var monthday = new RegExp("\\[\\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\](?:st|nd|rd|th|),? *\\[\\[([0-9][0-9][0-9][0-9])\\]\\]", "g");
var daymonth2 = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\\]\\]", "g");
var monthday2 = new RegExp("\\[\\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\](?:st|nd|rd|th|)", "g");
var txt = document.editform.wpTextbox1;

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

if (option == 1) {

//change to dmy
// dd Month
txt.value = txt.value.replace(monthday , "[[$2 $1]] [[$3]]");
txt.value = txt.value.replace(daymonth , "[[$1 $2]] [[$3]]");
txt.value = txt.value.replace(monthday2, "[[$2 $1]]");
txt.value = txt.value.replace(daymonth2, "[[$1 $2]]");

//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');

//Attempt to fix date range errors
//txt.value=txt.value.replace(/ ([0-3][\d]|[\d])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)(?:-|–)([0-3][\d]|[\d])(?:st|nd|rd|th|),? /gi, ' $1-$3 $2 ');
//txt.value=txt.value.replace(/ (January|February|March|April|May|June|July|August|September|October|November|December),? ([0-3][\d]|[\d])(?:-|–)([0-3][\d]|[\d])(?:st|nd|rd|th|),? /gi, ' $2-$3 $1 ');

//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');

//delink ISO
//delink_ISO_to_dmy();

} else {
//change to mdy

// Month dd
txt.value = txt.value.replace(monthday , "[[$1 $2]], [[$3]]");
txt.value = txt.value.replace(daymonth , "[[$2 $1]], [[$3]]");
txt.value = txt.value.replace(monthday2, "[[$1 $2]]");
txt.value = txt.value.replace(daymonth2, "[[$2 $1]]");

//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');

//Attempt to fix date range errors
//txt.value=txt.value.replace(/ ([0-3][\d]|[\d])(?:st|nd|rd|th|)(?:-|–)(January|February|March|April|May|June|July|August|September|October|November|December) ([0-3][\d]|[\d])(?:st|nd|rd|th|),? /gi, ' $2 $1-$3 ');
//txt.value=txt.value.replace(/ ([0-3][\d]|[\d])(?:st|nd|rd|th|)(?:-|–)([0-3][\d]|[\d])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December),? /gi, ' $3 $1-$2 ');

//delink ISO
//delink_ISO_to_mdy();

}
//Attempt to fix date range errors
txt.value=txt.value.replace(/(\d January) January (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d February) February (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d March) March (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d April) April (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d May) May (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d June) June (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d July) July (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d August) August (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d September) September (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d October) October (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d November) November (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d December) December (\d)/gi, '$1 $2');
}
function LMaddDLinks() {
var daymonth = new RegExp("0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December),? *([0-9][0-9][0-9][0-9])", "g");
var monthday = new RegExp("(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|),? *([0-9][0-9][0-9][0-9])", "g");
var daymonth2 = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)\\]\\],? *([0-9][0-9][0-9][0-9])", "g");
var monthday2 = new RegExp("\\[\\[(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\],? *([0-9][0-9][0-9][0-9])", "g");
var daymonth3 = new RegExp("([^0-9\[])0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)([^0-9\\]])", "g");
var monthday3 = new RegExp("([^0-9\[])(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)([^0-9\\]])", "g");
var txt = document.editform.wpTextbox1;
txt.value = txt.value.replace(monthday, "[[$1 $2]], [[$3]]");
txt.value = txt.value.replace(daymonth, "[[$1 $2]] [[$3]]");
txt.value = txt.value.replace(monthday2, "[[$1 $2]], [[$3]]");
txt.value = txt.value.replace(daymonth2, "[[$1 $2]] [[$3]]");
txt.value = txt.value.replace(monthday3, "$1[[$2 $3]]$4");
txt.value = txt.value.replace(daymonth3, "$1[[$2 $3]]$4");
}
function LMremDLinks() {
var daymonth = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)\\]\\],? *\\[\\[([0-9][0-9][0-9][0-9])\\]\\]", "g");
var monthday = new RegExp("\\[\\[(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\](?:st|nd|rd|th|),? *\\[\\[([0-9][0-9][0-9][0-9])\\]\\]", "g");
var daymonth3 = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)\\]\\]", "g");
var monthday3 = new RegExp("\\[\\[(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\](?:st|nd|rd|th|)", "g");
var txt = document.editform.wpTextbox1;
txt.value = txt.value.replace(monthday, "$1 $2, $3");
txt.value = txt.value.replace(daymonth, "$1 $2 $3");
txt.value = txt.value.replace(monthday3, "$1 $2");
txt.value = txt.value.replace(daymonth3, "$1 $2");
}


function delink_dates_to_dmy_or_mdy(option) {
protect_dates();
//run part_dates first because of 'year in blah' code
part_dates();
LMdayMonth(option);
all_dates();
//run function again because it contains a date range bit
LMdayMonth(option);
unprotect_dates();
// Add a tag to the summary box
var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[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_or_mdy_and_year_in_X_and_common_terms(option) {
protect_dates();
//run part_dates first because of 'year in blah' code
part_dates();
LMyearinX();
LMdayMonth(option);
all_dates();
//run function again because it contains a date range bit
LMdayMonth(option);
unprotect_dates();
CommonTerms();
// Add a tag to the summary box
var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[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 all_dates_to_dmy_or_mdy(option) {
protect_dates();
//run part_dates first because of 'year in blah' code
part_dates();
// LMyearinX();
LMaddDLinks();
LMdayMonth(option);
LMremDLinks();
all_dates();
//run function again because it contains a date range bit
LMdayMonth(option);
unprotect_dates();
// Add a tag to the summary box
var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[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 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(/\[\[(act)ress\]\]/gi, '$1or');
txt.value = txt.value.replace(/\[\[(dance)\]\](r)/gi, '$1$2');
txt.value = txt.value.replace(/\[\[model\s\(person\)\|(model)\]\]/gi, '$1');

var txt = document.editform.wpSummary;
var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
if (txt.value.indexOf(summary) == -1) {
if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
txt.value += " | ";
}
txt.value += summary;
}
document.editform.wpDiff.click();
}

addOnloadHook(function () {
if(document.forms.editform) {
addPortletLink('p-tb', 'javascript:CommonTerms()', 'Delink common terms', 't-dmy', 'Regexp common terms', '', '');
addPortletLink('p-tb', 'javascript:run_formatgeneral()', 'Add metric units', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
// addPortletLink('p-tb', 'javascript:Deprecated()', 'General changes', 't-dmy', 'Regexp general changes', '', '');
addPortletLink('p-tb', 'javascript:run_all_dates()', 'Delink dates', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_or_mdy(1)', 'Delink dates to dmy', 't-dmy', 'day month', '', '');
addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_or_mdy(2)', 'Delink dates to mdy', 't-mdy', 'month day', '', '');
addPortletLink('p-tb', 'javascript:all_dates_to_dmy_or_mdy(1)', 'All dates to dmy', 't-dmy', 'day month', '', '');
addPortletLink('p-tb', 'javascript:all_dates_to_dmy_or_mdy(2)', 'All dates to mdy', 't-mdy', 'month day', '', '');
// addPortletLink('p-tb', 'javascript:LMyearinX()' , 'Delink year-in-X dates', 't-yearinX', 'Regexp yearinX', '', '');
// addPortletLink('p-tb', 'javascript:delink_ISO()', 'Delink ISO dates', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_or_mdy_and_year_in_X_and_common_terms(1)', 'Delink dates to dmy+common terms', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_or_mdy_and_year_in_X_and_common_terms(2)', 'Delink dates to mdy+common terms', 'ca-unitfixer', 'Fixes some unit formatting', '', '');

}
});

Revision as of 13:59, 11 October 2008

function delink_ISO() {
    var txt = document.editform.wpTextbox1;
//    delink_ISO();
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');
 
// Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}
 
// Press the diff button to check it
    document.editform.wpDiff.click()
}
addOnloadHook(function () {
    if(document.forms.editform) {
//        addPortletLink('p-cactions', 'javascript:run_delink_ISO()', 'delink ISO', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
    }
});

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

txt.value=txt.value.replace(/\[\[(\d{4})-01-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 January $1');
txt.value=txt.value.replace(/\[\[(\d{4})-02-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 February $1');
txt.value=txt.value.replace(/\[\[(\d{4})-03-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 March $1');
txt.value=txt.value.replace(/\[\[(\d{4})-04-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 April $1');
txt.value=txt.value.replace(/\[\[(\d{4})-05-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 May $1');
txt.value=txt.value.replace(/\[\[(\d{4})-06-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 June $1');
txt.value=txt.value.replace(/\[\[(\d{4})-07-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 July $1');
txt.value=txt.value.replace(/\[\[(\d{4})-08-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 August $1');
txt.value=txt.value.replace(/\[\[(\d{4})-09-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 September $1');
txt.value=txt.value.replace(/\[\[(\d{4})-10-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 October $1');
txt.value=txt.value.replace(/\[\[(\d{4})-11-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 November $1');
txt.value=txt.value.replace(/\[\[(\d{4})-12-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 December $1');

txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[01-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 January $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[02-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 February $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[03-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 March $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[04-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 April $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[05-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 May $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[06-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 June $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[07-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 July $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[08-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 August $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[09-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 September $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[10-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 October $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[11-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 November $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[12-(?:0(\d)|([1-3]\d))\]\]/gi, '$2 December $1');
}

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

txt.value=txt.value.replace(/\[\[(\d{4})-01-(?:0(\d)|([1-3]\d))\]\]/gi, 'January $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-02-(?:0(\d)|([1-3]\d))\]\]/gi, 'February $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-03-(?:0(\d)|([1-3]\d))\]\]/gi, 'March $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-04-(?:0(\d)|([1-3]\d))\]\]/gi, 'April $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-05-(?:0(\d)|([1-3]\d))\]\]/gi, 'May $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-06-(?:0(\d)|([1-3]\d))\]\]/gi, 'June $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-07-(?:0(\d)|([1-3]\d))\]\]/gi, 'July $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-08-(?:0(\d)|([1-3]\d))\]\]/gi, 'August $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-09-(?:0(\d)|([1-3]\d))\]\]/gi, 'September $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-10-(?:0(\d)|([1-3]\d))\]\]/gi, 'October $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-11-(?:0(\d)|([1-3]\d))\]\]/gi, 'November $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})-12-(?:0(\d)|([1-3]\d))\]\]/gi, 'December $2, $1');

txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[01-(?:0(\d)|([1-3]\d))\]\]/gi, 'January $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[02-(?:0(\d)|([1-3]\d))\]\]/gi, 'February $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[03-(?:0(\d)|([1-3]\d))\]\]/gi, 'March $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[04-(?:0(\d)|([1-3]\d))\]\]/gi, 'April $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[05-(?:0(\d)|([1-3]\d))\]\]/gi, 'May $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[06-(?:0(\d)|([1-3]\d))\]\]/gi, 'June $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[07-(?:0(\d)|([1-3]\d))\]\]/gi, 'July $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[08-(?:0(\d)|([1-3]\d))\]\]/gi, 'August $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[09-(?:0(\d)|([1-3]\d))\]\]/gi, 'September $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[10-(?:0(\d)|([1-3]\d))\]\]/gi, 'October $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[11-(?:0(\d)|([1-3]\d))\]\]/gi, 'November $2, $1');
txt.value=txt.value.replace(/\[\[(\d{4})\]\]-\[\[12-(?:0(\d)|([1-3]\d))\]\]/gi, 'December $2, $1');

}


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

txt.value=txt.value.replace(/\[\[\d{1,4}s?\sin\s[^\|\]]+\|(\d{1,4}s?)\]\]/gi, '\[\[$1\]\]');
txt.value=txt.value.replace(/\{\{..\|(d{4})\}\}/gi, '$1');
}

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

//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 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\]\]/gi, '$1century');
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\s(AD|BC|CE|BCE)\]\]/gi, '$1century');
txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th)(?:\s|-))century\]\]/gi, '$1century');
txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th)(?:\s|-))centuries\]\]/gi, '$1centuries');
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th))\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th)(?:\s|-))century\]\]/gi, '$1century');
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th)(?:\s|-))centuries\]\]/gi, '$1centuries');
txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th)(?:\s|-))century\s(AD|BC|CE|BCE)\]\]/gi, '$1century $2');
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th)(?:\s|-))century\s(AD|BC|CE|BCE)\]\]/gi, '$1century $2');
txt.value=txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)(?:\s|-)century\|(\d{1,2}(?:st|nd|rd|th)(?:\s|-))centuries\s(AD|BC|CE|BCE)\]\]/gi, '$1centuries $2');

// decades and years
txt.value=txt.value.replace(/\[\[(\d{1,4})\'?s\]\]/gi, '$1s');
txt.value=txt.value.replace(/\[\[(\d{1,4})\'?(s)?\s(AD|BC|CE|BCE)\]\]/gi, '$1$2 $3');
txt.value=txt.value.replace(/\[\[\d{1,4}\'?s?\s(?:AD|BC|CE|BCE)\|(\d{1,4})\'?(s)?\]\]/gi, '$1$2');
txt.value=txt.value.replace(/\[\[\d{1,4}\'?s?\s(?:AD|BC|CE|BCE)\|(\d{1,4})\'?(s)?\s(AD|BC|CE|BCE)\]\]/gi, '$1$2 $3');
txt.value=txt.value.replace(/\[\[\d{1,4}\'?s?\|(\d{1,4})\'?(s)?\s(AD|BC|CE|BCE)\]\]/gi, '$1$2 $3');
txt.value=txt.value.replace(/\[\[\d{1,4}\'?s?\|(\d{1,4})\'?(s)?\]\]/gi, '$1$2');
txt.value=txt.value.replace(/\[\[\d\d?(?:st|nd|rd|th)\scentur(?:y|ies)\|(\d{1,4})\'?(s)?\]\]/gi, '$1$2');
txt.value=txt.value.replace(/\[\[\w{5,12}\scentur(?:y|ies)\|(\d{1,4})\'?(s)?\]\]/gi, '$1$2');
// solitary day_numbers
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)\|(\d{1,2}(?:th|st|nd|rd))\]\]/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)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th))\]\]/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');

//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');

//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: temporary change to protext preference dates - y?y?y?. Needed to handle 'year in' piped links
txt.value=txt.value.replace(/(\[\[\d\d?\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\],?\s?\s?)\[\[(\d{1,4})\]\]y?y?y?/gi,'$1xx$2xx');
txt.value=txt.value.replace(/(\[\[\d\d?\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\]\],?\s?\s?)\[\[(\d{1,4})\]\]y?y?y?/g,'$1xx$2xx');
txt.value=txt.value.replace(/(\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d\d?\]\],?\s?\s?)\[\[(\d{1,4})\]\]y?y?y?/gi,'$1xx$2xx');
txt.value=txt.value.replace(/(\[\[(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d\d?\]\],?\s?\s?)\[\[(\d{1,4})\]\]y?y?y?/g,'$1xx$2xx');
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]y?y?y?(,?\s?\-?\s?\[\[(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d\d?\]\])/g,'xx$1xx$2');
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]y?y?y?(,?\s?\-?\s?\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d\d?\]\])/gi,'xx$1xx$2');
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]y?y?y?(,?\s?\-?\s?\[\[\d\d?\s(?:January|February|March|April|May|June|July|August|September|October|November|December)\]\])/gi,'xx$1xx$2');
txt.value=txt.value.replace(/\[\[(\d{1,4})\]\]y?y?y?(,?\s?\-?\s?\[\[\d\d\-\d\d\]\]y?y?y?)/gi,'xx$1xx$2');

//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\]\]');

//'present'
txt.value=txt.value.replace(/\[\[Present\s\(time\)\|(Present)\]\]/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\)\|(spring)\]\]/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(/\[\[\s?(January|February|March|April|May|June|July|August|September|October|November|December)\s?\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\]\]/g, '$1');
txt.value=txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\|(January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '$1');
//Treat 'Sept' (i.e. month abbreviation) differently from 'sept' (i.e. family)
txt.value=txt.value.replace(/\[\[(Sept)\]\]/g, '$1');
txt.value=txt.value.replace(/\[\[January\|(Jan)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[February\|(Feb)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[March\|(Mar)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[April\|(Apr)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[May\|(May)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[June\|(Jun)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[July\|(Jul)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[August\|(Aug)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[September\|(Sep)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[October\|(Oct)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[November\|(Nov)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[December\|(Dec)\]\]/g, '$1');

//month piped to number
txt.value=txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December)\|(\d{1,4})\]\]/gi, '$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\]\]');

//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');

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)\|(\d{1,2}(?:th|st|nd|rd))\]\]/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)\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');

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)\|((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{1,2}(?:th|st|nd|rd))\]\]/g, '$1');
//month+day piped into month+day or vice versa
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)\|((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');
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)\|(\d{1,2}(?:th|st|nd|rd)\s(?:January|February|March|April|May|June|July|August|September|October|November|December))\]\]/gi, '$1');

// days of the week in full. Optional plurals
txt.value=txt.value.replace(/\[\[(Mondays?|Tuesdays?|Wednesdays?|Thursdays?|Fridays?|Saturdays?|Sundays?)\]\]/gi, '$1');
// days of the week abbreviated. Leave out 'Sun' as potentially valid link to the Sun. Leave out 'SAT' in upper case as potential link to 'Scholastic achievement/aptitude test'.
txt.value=txt.value.replace(/\[\[(Mon|Tue|Tues|Wed|Thu|Thur|Thurs|Fri)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[(Sat)\]\]/g, '$1');
txt.value=txt.value.replace(/\[\[Mondays?\|(Mondays?|Mon)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[Tuesdays?\|(Tuesdays?|Tues?)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[Wednesdays?\|(Wednesdays?|Wed)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[Thursdays?\|(Thursdays?|Thur?)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[Fridays?\|(Fridays?|Fri)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[Saturdays?\|(Saturdays?|Sat)\]\]/gi, '$1');
txt.value=txt.value.replace(/\[\[Sundays?\|(Sundays?|Sun)\]\]/gi, '$1');

//4 digit years piped into 2
txt.value=txt.value.replace(/\[\[\d{1,4}\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');

}



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|sing=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|sing=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|sing=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|sing=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|sing=on}}$4');

//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|sing=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|sing=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|sing=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|sing=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|sing=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|sing=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|sing=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\d+[\d,\.]*)(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)feet([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1{{convert|$2|acre feet}}$3');
//acre foot:singular
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]\d\d+[\d,\.]*)(?:\s|-|&nbsp;|)acre(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1{{convert|$2|acre feet|sing=on}}$3');
//acre foot:abbreviation
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)([\d,]\d\d+[\d,\.]*)(?:\s|-|&nbsp;|)(?:acre|ac\.?)(?:\s|-|&nbsp;|)(?:foot|feet|ft)([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$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(?:\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|sing=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|sing=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|sing=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|sing=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+)(?:\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|sing=on}}$3');
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d?\d\.\d+)(?:\s|-|&nbsp;|)(?:acre|\[\[acre\]\])([:;,\.?!]?\s[^\d\(\)\/\\])/g, '$1{{convert|$2|acre|m2|sing=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|sing=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|sing=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|sing=on}}$3');
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)pound\sforce([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1{{convert|$2|lbf|N|sing=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|sing=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|sing=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');
//foot: singular
txt.value=txt.value.replace(/([^\d\(\)\/\\]\s)(\d[\d,\.]*)(?:\s|-|&nbsp;|)foot([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1{{convert|$2|ft|m|sing=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|sing=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)\s?bps([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1 bit/s$2');
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(/(\d)&nbsp;bps([:;,\.?!]?\s[^\d\(\)\/\\])/gi, '$1&nbsp;bit/s$2');
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');

//change deprecated knot in template code
txt.value=txt.value.replace(/({{convert\|[^}]*knot)\|km\/h mph([^}]*}})/gi, '$1$2');

txt.value=txt.value.replace(/{{convert\|(1.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (2.8 km/h)');
txt.value=txt.value.replace(/{{convert\|(7)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (13 km/h)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?\|km\/h(?:\|\d|)(?:\|lk=on|)}}/gi, '$1 knots (19 km/h)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?\|km\/h(?:\|-1|)(?:\|lk=on|)}}/gi, '$1 knots (20 km/h)');
txt.value=txt.value.replace(/{{convert\|(11)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (20 km/h)');
txt.value=txt.value.replace(/{{convert\|(12)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (22 km/h)');
txt.value=txt.value.replace(/{{convert\|(13)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (24 km/h)');
txt.value=txt.value.replace(/{{convert\|(14)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (26 km/h)');
txt.value=txt.value.replace(/{{convert\|(15)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (28 km/h)');
txt.value=txt.value.replace(/{{convert\|(16)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (30 km/h)');
txt.value=txt.value.replace(/{{convert\|(17)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (31 km/h)');
txt.value=txt.value.replace(/{{convert\|(18)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (33 km/h)');
txt.value=txt.value.replace(/{{convert\|(19)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (35 km/h)');
txt.value=txt.value.replace(/{{convert\|(19\.1)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (35.4 km/h)');
txt.value=txt.value.replace(/{{convert\|(20)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (37 km/h)');
txt.value=txt.value.replace(/{{convert\|(21)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (39 km/h)');
txt.value=txt.value.replace(/{{convert\|(20\.8)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (38.5 km/h)');
txt.value=txt.value.replace(/{{convert\|(21\.06)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (39.00 km/h)');
txt.value=txt.value.replace(/{{convert\|(23)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (43 km/h)');
txt.value=txt.value.replace(/{{convert\|(23\.4)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (43.3 km/h)');
txt.value=txt.value.replace(/{{convert\|(25)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (46 km/h)');
txt.value=txt.value.replace(/{{convert\|(27)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (50 km/h)');
txt.value=txt.value.replace(/{{convert\|(27\.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (50.9 km/h)');
txt.value=txt.value.replace(/{{convert\|(27\.9)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (51.7 km/h)');
txt.value=txt.value.replace(/{{convert\|(28)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (52 km/h)');
txt.value=txt.value.replace(/{{convert\|(29\.98)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (55.52 km/h)');
txt.value=txt.value.replace(/{{convert\|(30)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (56 km/h)');
txt.value=txt.value.replace(/{{convert\|(31)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (57 km/h)');
txt.value=txt.value.replace(/{{convert\|(35\.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (65.7 km/h)');
txt.value=txt.value.replace(/{{convert\|(39)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (72 km/h)');
txt.value=txt.value.replace(/{{convert\|(40)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (74 km/h)');
txt.value=txt.value.replace(/{{convert\|(50)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (93 km/h)');
txt.value=txt.value.replace(/{{convert\|(60)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (110 km/h)');
txt.value=txt.value.replace(/{{convert\|(70)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (130 km/h)');
txt.value=txt.value.replace(/{{convert\|(80)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (150 km/h)');
txt.value=txt.value.replace(/{{convert\|(90)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (170 km/h)');
txt.value=txt.value.replace(/{{convert\|(100)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (190 km/h)');
txt.value=txt.value.replace(/{{convert\|(110)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (200 km/h)');
txt.value=txt.value.replace(/{{convert\|(120)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (220 km/h)');
txt.value=txt.value.replace(/{{convert\|(130)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (240 km/h)');
txt.value=txt.value.replace(/{{convert\|(140)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (260 km/h)');

txt.value=txt.value.replace(/{{convert\|(9\.0)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (17 km/h/10 mph)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (19 km/h/12 mph)');
txt.value=txt.value.replace(/{{convert\|(11)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (20 km/h/13 mph)');
txt.value=txt.value.replace(/{{convert\|(12)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (22 km/h/14 mph)');
txt.value=txt.value.replace(/{{convert\|(13)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (24 km/h/15 mph)');
txt.value=txt.value.replace(/{{convert\|(14)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (26 km/h/16 mph)');
txt.value=txt.value.replace(/{{convert\|(14\.1)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (26.1 km/h/16.2 mph)');
txt.value=txt.value.replace(/{{convert\|(15)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (28 km/h/17 mph)');
txt.value=txt.value.replace(/{{convert\|(16)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (30 km/h/18 mph)');
txt.value=txt.value.replace(/{{convert\|(16\.8)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (31.1 km/h/19.3 mph)');
txt.value=txt.value.replace(/{{convert\|(17)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (31 km/h/20 mph)');
txt.value=txt.value.replace(/{{convert\|(18)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (33 km/h/21 mph)');
txt.value=txt.value.replace(/{{convert\|(19)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (35 km/h/22 mph)');
txt.value=txt.value.replace(/{{convert\|(20)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (37 km/h/23 mph)');
txt.value=txt.value.replace(/{{convert\|(21\.5)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (39.8 km/h/24.7 mph)');
txt.value=txt.value.replace(/{{convert\|(23)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (43 km/h/26 mph)');
txt.value=txt.value.replace(/{{convert\|(24)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (44 km/h/28 mph)');
txt.value=txt.value.replace(/{{convert\|(33\.8)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (62.6 km/h/38.9 mph)');
txt.value=txt.value.replace(/{{convert\|(39)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)}}/gi, '$1 knots (72 km/h/45 mph)');

txt.value=txt.value.replace(/{{convert\|(24)\|km\/h\|kno?t?(?:\|\d|)(?:\|lk=on|)}}/gi, '$1 km/h (13 kn)');

txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?\|km\/h(?:\|\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (19 km/h)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?\|km\/h(?:\|-1\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (20 km/h)');
txt.value=txt.value.replace(/{{convert\|(11)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (20 km/h)');
txt.value=txt.value.replace(/{{convert\|(12)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (22 km/h)');
txt.value=txt.value.replace(/{{convert\|(13)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (24 km/h)');
txt.value=txt.value.replace(/{{convert\|(14)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (26 km/h)');
txt.value=txt.value.replace(/{{convert\|(15)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (28 km/h)');
txt.value=txt.value.replace(/{{convert\|(16)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (30 km/h)');
txt.value=txt.value.replace(/{{convert\|(17)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (31 km/h)');
txt.value=txt.value.replace(/{{convert\|(18)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (33 km/h)');
txt.value=txt.value.replace(/{{convert\|(19)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (35 km/h)');
txt.value=txt.value.replace(/{{convert\|(19\.1)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (35.4 km/h)');
txt.value=txt.value.replace(/{{convert\|(19\.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (36.1 km/h)');
txt.value=txt.value.replace(/{{convert\|(20)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (37 km/h)');
txt.value=txt.value.replace(/{{convert\|(23)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (43 km/h)');
txt.value=txt.value.replace(/{{convert\|(27\.5)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (50.9 km/h)');
txt.value=txt.value.replace(/{{convert\|(28)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (52 km/h)');
txt.value=txt.value.replace(/{{convert\|(30)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (56 km/h)');
txt.value=txt.value.replace(/{{convert\|(39)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (72 km/h)');
txt.value=txt.value.replace(/{{convert\|(40)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (74 km/h)');
txt.value=txt.value.replace(/{{convert\|(50)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (93 km/h)');
txt.value=txt.value.replace(/{{convert\|(60)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (110 km/h)');
txt.value=txt.value.replace(/{{convert\|(70)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (130 km/h)');
txt.value=txt.value.replace(/{{convert\|(80)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (150 km/h)');
txt.value=txt.value.replace(/{{convert\|(90)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (170 km/h)');
txt.value=txt.value.replace(/{{convert\|(100)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (190 km/h)');
txt.value=txt.value.replace(/{{convert\|(110)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (200 km/h)');
txt.value=txt.value.replace(/{{convert\|(120)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (220 km/h)');
txt.value=txt.value.replace(/{{convert\|(130)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (240 km/h)');
txt.value=txt.value.replace(/{{convert\|(140)\|kno?t?\|km\/h(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (260 km/h)');

txt.value=txt.value.replace(/{{convert\|(9\.0)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (17 km/h/10 mph)');
txt.value=txt.value.replace(/{{convert\|(10)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (19 km/h/12 mph)');
txt.value=txt.value.replace(/{{convert\|(11)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (20 km/h/13 mph)');
txt.value=txt.value.replace(/{{convert\|(12)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (22 km/h/14 mph)');
txt.value=txt.value.replace(/{{convert\|(13)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (24 km/h/15 mph)');
txt.value=txt.value.replace(/{{convert\|(14)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (26 km/h/16 mph)');
txt.value=txt.value.replace(/{{convert\|(15)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (28 km/h/17 mph)');
txt.value=txt.value.replace(/{{convert\|(16)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (30 km/h/18 mph)');
txt.value=txt.value.replace(/{{convert\|(16\.8)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (31.1 km/h/19.3 mph)');
txt.value=txt.value.replace(/{{convert\|(17)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (31 km/h/20 mph)');
txt.value=txt.value.replace(/{{convert\|(18)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (33 km/h/21 mph)');
txt.value=txt.value.replace(/{{convert\|(19)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (35 km/h/22 mph)');
txt.value=txt.value.replace(/{{convert\|(20)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (37 km/h/23 mph)');
txt.value=txt.value.replace(/{{convert\|(23)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (43 km/h/26 mph)');
txt.value=txt.value.replace(/{{convert\|(24)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (44 km/h/28 mph)');
txt.value=txt.value.replace(/{{convert\|(39)\|kno?t?(?:\|-?\d|)(?:\|lk=on|)\|sing=on(?:\|lk=on|)}}/gi, '$1 knot (72 km/h/45 mph)');

txt.value=txt.value.replace(/({convert\|[^}]+\|kn)ot(\||})/g, '$1$2');
txt.value=txt.value.replace(/({{convert\|[^}]*kn)ot([^}]*abbr=on}})/gi, '$1$2');

//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 all_dates() {
    var txt = document.editform.wpTextbox1;
    part_dates();

//Remove full US format dates, ensure that comma is present
txt.value=txt.value.replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d\d?)\]\],?\s?\s?\[\[(\d{1,4})\]\]/gi,'$1, $2');

//Remove month+day and day+month formats
txt.value=txt.value.replace(/\[\[(\d\d?\s(?:January|February|March|April|May|June|July|August|September|October|November|December))\]\]/gi,'$1');
txt.value=txt.value.replace(/\[\[(\d\d?\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\]\]/g,'$1');
txt.value=txt.value.replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December)\s\d\d?)\]\]/gi,'$1');
txt.value=txt.value.replace(/\[\[((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d\d?)\]\]/g,'$1');

//year: temporary change to protect split linked ISO dates. Undone below
//txt.value=txt.value.replace(/(\[\[\d{1,4}\]\]-\[\[\d\d-\d\d\]\])/gi, 'qq$1');
//year: now remove unprotected linked years
txt.value=txt.value.replace(/([^q])\[\[(\d{1,4})\]\]/gi, '$1$2');
//year: Undo temporary change to protect part linked ISO dates
//txt.value=txt.value.replace(/qq(\[\[)/gi, '$1');

}

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

    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}
    document.editform.wpDiff.click()
}
addOnloadHook(function () {
    if(document.forms.editform) {
//        addPortletLink('p-cactions', 'javascript:run_part_dates()', 'part dates', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
    }
});

function run_all_dates() {
    var txt = document.editform.wpTextbox1;
    all_dates();
// Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}
// Press the diff button to check it
    document.editform.wpDiff.click()
}
addOnloadHook(function () {
    if(document.forms.editform) {
//        addPortletLink('p-cactions', 'javascript:run_all_dates()', 'all dates', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
    }
});




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

// Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}

// Press the diff button to check it
    document.editform.wpDiff.click()
}
addOnloadHook(function () {
    if(document.forms.editform) {
//        addPortletLink('p-cactions', 'javascript:run_year_in_blah()', 'year in blah', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
    }
});


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

// Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|Script]]-assisted. Units/dates/other";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}

// Press the diff button to check it
    document.editform.wpDiff.click()
}
addOnloadHook(function () {
    if(document.forms.editform) {
//        addPortletLink('p-cactions', 'javascript:run_formatgeneral()', 'units', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
    }
});

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

// Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}

// Press the diff button to check it
    document.editform.wpDiff.click()
}

addOnloadHook(function () {
    if(document.forms.editform) {
//        addPortletLink('p-cactions', 'javascript:combined()', 'dates+units', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
//        addPortletLink('p-cactions', '', 'Note to users: script commands now in toolbox at bottom left beneath: What links here', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
//        addPortletLink('p-cactions', '', 'B', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
    }
});

//
function LMmosdate() {
   var txt = document.editform.wpTextbox1;
   txt.value = txt.value

   //MOSDATE remove th in dates followed by -th, others
    //.replace(/([^\[])(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d\d?)(th|st|nd|rd)/gi, '$1[[$2 $3]]')
    .replace(/(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d\d?)(th|st|nd|rd)/gi, '$1 $2')
    .replace(/\[\[(January|February|March|April|May|June|July|August|September|October|November|December)\s(\d\d?)\]\](<sup>)?(th|st|nd|rd)(<\/sup>)?/gi, '[[$1 $2]]') 
    .replace(/(\D\d\d?)(<sup>)?(th|st|nd|rd)(<\/sup>)?\s(January|February|March|April|May|June|July|August|September|October|November|December)/gi, '$1 $5')
    .replace(/\s(\d{3}0)'s(\W)/gi, ' $1s$2');
}


function LMyearinX() {
   var monthyear = new RegExp("\\[\\[(January|February|March|April|May|June|July|August|September|October|November|December),? *([0-9][0-9][0-9][0-9])\\]\\]", "g");
   var txt = document.editform.wpTextbox1;
   txt.value = txt.value.replace(/\[\[[1-2][0-9][0-9][0-9] in [A-Za-z]+\|([1-2][0-9][0-9][0-9])\]\]/g, "[[$1]]");
   txt.value = txt.value.replace(/([^,\]] |[^,\] ])\[\[([1-2][0-9][0-9][0-9])\]\]/g, "$1$2");
   txt.value = txt.value.replace(monthyear, "$1 $2");
   txt.value=txt.value.replace(/{{(?:by|ly)\|(\d{1,4})}}/gi, '$1');
}

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) (11[^\d])/gi, '$1xx$2');
txt.value=txt.value.replace(/(\[\[september)xx(11\]\])/gi, '$1 $2');
txt.value=txt.value.replace(/([^\d]7) (july)/gi, '$1xx$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(/\x02([0-9]+)\x03/g, function(x, n){
        return linkmap[n];
    });
}

function LMdayMonth(option) {

   var daymonth = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\\]\\],? *\\[\\[([0-9][0-9][0-9][0-9])\\]\\]", "g");
   var monthday = new RegExp("\\[\\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\](?:st|nd|rd|th|),? *\\[\\[([0-9][0-9][0-9][0-9])\\]\\]", "g");
   var daymonth2 = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\\]\\]", "g");
   var monthday2 = new RegExp("\\[\\[(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\](?:st|nd|rd|th|)", "g");
 
   var txt = document.editform.wpTextbox1;

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

   if (option == 1) {

//change to dmy
      // dd Month
      txt.value = txt.value.replace(monthday , "[[$2 $1]] [[$3]]");
      txt.value = txt.value.replace(daymonth , "[[$1 $2]] [[$3]]");
      txt.value = txt.value.replace(monthday2, "[[$2 $1]]");
      txt.value = txt.value.replace(daymonth2, "[[$1 $2]]");

//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');

//Attempt to fix date range errors
//txt.value=txt.value.replace(/ ([0-3][\d]|[\d])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)(?:-|–)([0-3][\d]|[\d])(?:st|nd|rd|th|),? /gi, ' $1-$3 $2 ');
//txt.value=txt.value.replace(/ (January|February|March|April|May|June|July|August|September|October|November|December),? ([0-3][\d]|[\d])(?:-|–)([0-3][\d]|[\d])(?:st|nd|rd|th|),? /gi, ' $2-$3 $1 ');

//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');

//delink ISO
//delink_ISO_to_dmy();

   } else {
//change to mdy

      // Month dd
      txt.value = txt.value.replace(monthday , "[[$1 $2]], [[$3]]");
      txt.value = txt.value.replace(daymonth , "[[$2 $1]], [[$3]]");
      txt.value = txt.value.replace(monthday2, "[[$1 $2]]");
      txt.value = txt.value.replace(daymonth2, "[[$2 $1]]");

//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');

//Attempt to fix date range errors
//txt.value=txt.value.replace(/ ([0-3][\d]|[\d])(?:st|nd|rd|th|)(?:-|–)(January|February|March|April|May|June|July|August|September|October|November|December) ([0-3][\d]|[\d])(?:st|nd|rd|th|),? /gi, ' $2 $1-$3 ');
//txt.value=txt.value.replace(/ ([0-3][\d]|[\d])(?:st|nd|rd|th|)(?:-|–)([0-3][\d]|[\d])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December),? /gi, ' $3 $1-$2 ');

//delink ISO
//delink_ISO_to_mdy();

   }
//Attempt to fix date range errors
txt.value=txt.value.replace(/(\d January) January (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d February) February (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d March) March (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d April) April (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d May) May (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d June) June (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d July) July (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d August) August (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d September) September (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d October) October (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d November) November (\d)/gi, '$1 $2');
txt.value=txt.value.replace(/(\d December) December (\d)/gi, '$1 $2');
}
 
function LMaddDLinks() {
   var daymonth = new RegExp("0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December),? *([0-9][0-9][0-9][0-9])", "g");
   var monthday = new RegExp("(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|),? *([0-9][0-9][0-9][0-9])", "g");
   var daymonth2 = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)\\]\\],? *([0-9][0-9][0-9][0-9])", "g");
   var monthday2 = new RegExp("\\[\\[(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\],? *([0-9][0-9][0-9][0-9])", "g");
   var daymonth3 = new RegExp("([^0-9\[])0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)([^0-9\\]])", "g");
   var monthday3 = new RegExp("([^0-9\[])(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)([^0-9\\]])", "g");
   var txt = document.editform.wpTextbox1;
   txt.value = txt.value.replace(monthday, "[[$1 $2]], [[$3]]");
   txt.value = txt.value.replace(daymonth, "[[$1 $2]] [[$3]]");
   txt.value = txt.value.replace(monthday2, "[[$1 $2]], [[$3]]");
   txt.value = txt.value.replace(daymonth2, "[[$1 $2]] [[$3]]");
   txt.value = txt.value.replace(monthday3, "$1[[$2 $3]]$4");
   txt.value = txt.value.replace(daymonth3, "$1[[$2 $3]]$4");
}
 
function LMremDLinks() {
   var daymonth = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)\\]\\],? *\\[\\[([0-9][0-9][0-9][0-9])\\]\\]", "g");
   var monthday = new RegExp("\\[\\[(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\](?:st|nd|rd|th|),? *\\[\\[([0-9][0-9][0-9][0-9])\\]\\]", "g");
   var daymonth3 = new RegExp("\\[\\[0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|) (January|February|March|April|May|June|July|August|September|October|November|December)\\]\\]", "g");
   var monthday3 = new RegExp("\\[\\[(January|February|March|April|May|June|July|August|September|October|November|December) 0?([1-3][0-9]|[0-9])(?:st|nd|rd|th|)\\]\\](?:st|nd|rd|th|)", "g");
   var txt = document.editform.wpTextbox1;
   txt.value = txt.value.replace(monthday, "$1 $2, $3");
   txt.value = txt.value.replace(daymonth, "$1 $2 $3");
   txt.value = txt.value.replace(monthday3, "$1 $2");
   txt.value = txt.value.replace(daymonth3, "$1 $2");
}


function delink_dates_to_dmy_or_mdy(option) {
   protect_dates();
//run part_dates first because of 'year in blah' code
   part_dates();
   LMdayMonth(option);
   all_dates();
//run function again because it contains a date range bit
   LMdayMonth(option);
   unprotect_dates();
// Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[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_or_mdy_and_year_in_X_and_common_terms(option) {
   protect_dates();
//run part_dates first because of 'year in blah' code
   part_dates();
   LMyearinX();
   LMdayMonth(option);
   all_dates();
//run function again because it contains a date range bit
   LMdayMonth(option);
   unprotect_dates();
   CommonTerms();
// Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[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 all_dates_to_dmy_or_mdy(option) {
   protect_dates();
//run part_dates first because of 'year in blah' code
   part_dates();
//   LMyearinX();
   LMaddDLinks();
   LMdayMonth(option);
   LMremDLinks();
   all_dates();
//run function again because it contains a date range bit
   LMdayMonth(option);
   unprotect_dates();
// Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[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 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(/\[\[(act)ress\]\]/gi, '$1or');
txt.value = txt.value.replace(/\[\[(dance)\]\](r)/gi, '$1$2');
txt.value = txt.value.replace(/\[\[model\s\(person\)\|(model)\]\]/gi, '$1');

    var txt = document.editform.wpSummary;
    var summary = "[[User:Lightmouse/monobook.js/script.js|script]]-assisted date/terms audit; see [[Wikipedia:MOSNUM#Date_autoformatting|mosnum]], [[wp:overlink]]";
	if (txt.value.indexOf(summary) == -1) {
		if (txt.value.match(/[^\*\/\s][^\/\s]?\s*$/)) {
			txt.value += " | ";
		}
		txt.value += summary;
	}
   document.editform.wpDiff.click();
}

addOnloadHook(function () {
    if(document.forms.editform) {
        addPortletLink('p-tb', 'javascript:CommonTerms()', 'Delink common terms', 't-dmy', 'Regexp common terms', '', '');
        addPortletLink('p-tb', 'javascript:run_formatgeneral()', 'Add metric units', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
//        addPortletLink('p-tb', 'javascript:Deprecated()', 'General changes', 't-dmy', 'Regexp general changes', '', '');
        addPortletLink('p-tb', 'javascript:run_all_dates()', 'Delink dates', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
        addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_or_mdy(1)', 'Delink dates to dmy', 't-dmy', 'day month', '', '');
        addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_or_mdy(2)', 'Delink dates to mdy', 't-mdy', 'month day', '', '');
        addPortletLink('p-tb', 'javascript:all_dates_to_dmy_or_mdy(1)', 'All dates to dmy', 't-dmy', 'day month', '', '');
        addPortletLink('p-tb', 'javascript:all_dates_to_dmy_or_mdy(2)', 'All dates to mdy', 't-mdy', 'month day', '', '');
//        addPortletLink('p-tb', 'javascript:LMyearinX()'  , 'Delink year-in-X dates', 't-yearinX',  'Regexp yearinX', '', '');
//        addPortletLink('p-tb', 'javascript:delink_ISO()', 'Delink ISO dates', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
        addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_or_mdy_and_year_in_X_and_common_terms(1)', 'Delink dates to dmy+common terms', 'ca-unitfixer', 'Fixes some unit formatting', '', '');
        addPortletLink('p-tb', 'javascript:delink_dates_to_dmy_or_mdy_and_year_in_X_and_common_terms(2)', 'Delink dates to mdy+common terms', 'ca-unitfixer', 'Fixes some unit formatting', '', '');

    }
});