User:Emt147/monobook.js/pagefix.js

From Wikipedia, the free encyclopedia

Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.

//'winc' function allows buttons to be added toolbar
 
winc('User:Omegatron/monobook.js/addlink.js');
 
function pagefix() {
    var txt = document.editform.wpTextbox1;
 
    // Convert degree symbols into ° symbol, ensure preceding space
    txt.value = txt.value.replace(/°/g, '°');
    txt.value = txt.value.replace(/º/g, '°');
    txt.value = txt.value.replace(/°\s?([CF])/g, '°$1');
    txt.value = txt.value.replace(/°\s?(celsius)/gi, '°C');
    txt.value = txt.value.replace(/(\d)\s?(°[CF])/g, '$1 $2');
    //Fix spelling error
    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');
 
    // Convert &sup into superscript ² symbol
    txt.value = txt.value.replace(/²/g, '²');
    txt.value = txt.value.replace(/³/g, '³');
 
    // Convert cubic inches into in³
    txt.value = txt.value.replace(/(\d)\s?cu[\s\-\.]in/gi, '$1 in³');
 
    // Convert the word ohm(s) or the html entity into the actual Ω symbol (Omega, not the actual ohm symbol Ω) and make sure it is spaced
    txt.value = txt.value.replace(/(\d)\s?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|µ|μ|µ|n|p|f|a|z|y)?\s?(Ω|ohm|Ohm)s?([\s,.;:\)\(\\/)])/g, '$1 $2Ω$4');
 
    // Convert various micro symbols into the actual micro symbol, make sure it is spaced
    txt.value = txt.value.replace(/(\d)\s?(μ|μ|µ)(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|Ω|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)([\s,.;:\)\(\\/)])/g, '$1 µ$3$4');
 
    // Convert capital K to lowercase k in units
    txt.value = txt.value.replace(/(\d)\s?K(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|Ω|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)([\s,.;:\)\(\\/)])/g, '$1 k$2$3');
    txt.value = txt.value.replace(/(\d)\-K(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|Ω|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)([\s,.;:\)\(\\/)])/g, '$1 k$2$3');
    txt.value = txt.value.replace(/(\d) K(g|s|m|A|K|mol|cd|rad|sr|Hz|N|J|W|Pa|lm|lx|C|V|Ω|F|Wb|T|H|S|Bq|Gy|Sv|kat|M)([\s,.;:\)\(\\/)])/g, '$1 k$2$3');
 
    // Hertz
    txt.value = txt.value.replace(/(\d)\s?(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|µ|μ|µ|n|p|f|a|z|y)?hz/gi, '$1 $2Hz');
    txt.value = txt.value.replace(/(\d)\-(Y|Z|E|P|T|G|M|k|K|h|da|d|c|m|µ|μ|µ|n|p|f|a|z|y)?hz/gi, '$1 $2Hz');
 
    // Fix kilometres
    txt.value = txt.value.replace(/(\d)\s?kms?([\s,.;:\)\(\\/)])/gi, '$1 km$2');
    txt.value = txt.value.replace(/(\d)\-kms?([\s,.;:\)\(\\/)])/gi, '$1 km$2');
    txt.value = txt.value.replace(/(\d) kms?([\s,.;:\)\(\\/)])/gi, '$1 km$2');
 
    // Standardise kilometres per hour
    txt.value = txt.value.replace(/km\/hr/gi, 'km/h');
    txt.value = txt.value.replace(/kph/gi, 'km/h');
    txt.value = txt.value.replace(/kmph/gi, 'km/h');
    txt.value = txt.value.replace(/(\d)\s?kmh/gi, '$1 km/h');
    txt.value = txt.value.replace(/km\/h/gi, 'km/h');
    txt.value = txt.value.replace(/(\d)\s?km\/h/gi, '$1 km/h');
    txt.value = txt.value.replace(/(\d)\-km\/h/gi, '$1 km/h');
    txt.value = txt.value.replace(/(\d) km\/h/gi, '$1 km/h');
 
    // Standardise 'per second'
    txt.value = txt.value.replace(/ft\/second/gi, 'ft/s');
    txt.value = txt.value.replace(/ft\/sec/gi, 'ft/s');
    txt.value = txt.value.replace(/m\/second/gi, 'm/s');
    txt.value = txt.value.replace(/m\/sec/gi, 'm/s');
 
    // Space before horsepower symbol
    txt.value = txt.value.replace(/(\d)\s?hp/gi, '$1 hp');
    txt.value = txt.value.replace(/(\d)\s?bhp/gi, '$1 bhp');
    txt.value = txt.value.replace(/(\d)\s?shp/gi, '$1 shp');
 
    // Space before units
    txt.value = txt.value.replace(/(\d)\s?cc([\s,.;:\)\(\\/)])/gi, '$1 cc$2');
    txt.value = txt.value.replace(/(\d)\-cc([\s,.;:\)\(\\/)])/gi, '$1 cc$2');
    txt.value = txt.value.replace(/(\d)\s?ft([\s,.;:\)\(\\/)])/gi, '$1 ft$2');
    txt.value = txt.value.replace(/(\d)\s?in([\s,.;:\)\(\\/)])/gi, '$1 in$2');
    txt.value = txt.value.replace(/(\d)\s?ft²([\s,.;:\)\(\\/)])/gi, '$1 ft²$2');
    txt.value = txt.value.replace(/(\d)\-ft([\s,.;:\)\(\\/)])/gi, '$1 ft$2');
    txt.value = txt.value.replace(/(\d)\s?rpm/gi, '$1 rpm');
    txt.value = txt.value.replace(/(\d)\-rpm/gi, '$1 rpm');
    txt.value = txt.value.replace(/(\d)\s?kg([\s,.;:\)\(\\/)])/gi, '$1 kg$2');
    txt.value = txt.value.replace(/(\d)\-kg([\s,.;:\)\(\\/)])/gi, '$1 kg$2');
    //space before 'm' only when lower case
    txt.value = txt.value.replace(/(\d)\s?m([\s,.;:\)\(\\/)])/g, '$1 m$2');
    txt.value = txt.value.replace(/(\d)\s?m²([\s,.;:\)\(\\/)])/g, '$1 m²$2');
    txt.value = txt.value.replace(/(\d)\-m([\s,.;:\)\(\\/)])/g, '$1 m$2');
    //txt.value = txt.value.replace(/(\d)\s?ml([\s,.;:\)\(\\/)])/g, '$1 ml$2');
    //txt.value = txt.value.replace(/(\d)\-ml([\s,.;:\)\(\\/)])/g, '$1 ml$2');
    txt.value = txt.value.replace(/(\d)\s?m(\W)/g, '$1 m$2');
    txt.value = txt.value.replace(/(\d)\s?m(\w?\W)/g, '$1 m$2');
 
    // miles per hour
    txt.value = txt.value.replace(/m\.p\.h\./gi, 'mph');
    txt.value = txt.value.replace(/mph([\s,.;:\)\(\\/)])/gi, 'mph$1');
    txt.value = txt.value.replace(/(\d)\s?mph/gi, '$1 mph');
    txt.value = txt.value.replace(/(\d)\-mph/gi, '$1 mph');
 
    // Standardise symbol for pounds
    txt.value = txt.value.replace(/(\d)\s?lbs?/gi, '$1 lb');
    txt.value = txt.value.replace(/(\d\+?)\s?lbs?/gi, '$1 lb');
    txt.value = txt.value.replace(/(\d) lbs?/gi, '$1 lb');
    txt.value = txt.value.replace(/(\d)\s?(\[\[lbs\]\])/gi, '$1 \[\[Pound (mass)|lb\]\]');
 
    // Standardise symbol for newton metres
    //txt.value = txt.value.replace(/(N•m)/gi, 'N·m');
 
    // Standardise symbol for kilowatts
    //txt.value = txt.value.replace(/(\d)\s?kW([\s,.;:\)\(\\/)])/gi, '$1 kW$2');
    //txt.value = txt.value.replace(/(\d)\-kW([\s,.;:\)\(\\/)])/gi, '$1 kW$2');
 
    // Standardise symbol for foot pounds
    txt.value = txt.value.replace(/ft[ -.·•\/]lb[fs]/gi, 'ft·lbf');
    txt.value = txt.value.replace(/ft[ -.·•\/]lbf/gi, 'ft·lbf');
    txt.value = txt.value.replace(/ft[ -.·•\/]lbff/gi, 'ft·lbf');
    //the next two suspended until solution is found for wing loading (i.e. pounds per square foot)
    //txt.value = txt.value.replace(/lb[fs][ -.•\/]ft/gi, 'ft·lbf');
    //txt.value = txt.value.replace(/lb[ -.•\/]ft/gi, 'ft·lbf');
 
    // Symbols for feet and inches
    txt.value = txt.value.replace(/([^;°]\s)(\d{1,4})\s?['’]\s?(\d{1,2})\s?["”]/gi, '$1$2 ft $3 in');
 
    // Give digital value a percent symbol '%' instead of word
    txt.value = txt.value.replace(/(\d)\s?per ?cent([^aei])/gi, '$1%$2');
    txt.value = txt.value.replace(/(\d)\-per ?cent([^aei])/gi, '$1%$2');
 
    // Add a space before dB
    txt.value = txt.value.replace(/(\d)\s?(dB)\b/g, '$1 $2');
 
    // Add a space before several units that were missed before
    //txt.value = txt.value.replace(/(\d)\s?(G|M|k|K|h|da|d|c|m|µ|n)?(g|m|Hz|N|W|Pa|V|Ω|F|)([\s,.;:\)\(\\/)])/g, '$1 $2$3$4');
 
    // bps or b/s or bits/s --> bit/s
    txt.value = txt.value.replace(/([KkMmGgTtPpEeYyZz])(bps|bits?\/s|b\/s)/g, '$1bit/s');
    txt.value = txt.value.replace(/(\d)\s?(bps)/gi, '$1 bit/s');
 
    // Bps or byte/s or bytes/s --> B/s
    txt.value = txt.value.replace(/([KkMmGgTtPpEeYyZz])(Bps|bytes?\/s)/g, ' $1B/s');
 
    // Make capitalization correct
    txt.value = txt.value.replace(/K(bit|B)\/s/g, 'k$1/s');
    txt.value = txt.value.replace(/m(bit|B)\/s/g, 'M$1/s');
    txt.value = txt.value.replace(/g(bit|B)\/s/g, 'G$1/s');
 
    // Ensure space is used
    txt.value = txt.value.replace(/(\d)\s?(k|M|G)(bit|B)/g, '$1 $2$3');
 
    // Common error
    txt.value = txt.value.replace(/mibi(bit|byte)/g, 'mebi$1');
 
    // century without AD,BC etc
    txt.value = txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th))[ \-]century\]\]/gi, '$1 century');
    txt.value = txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))[ \-]century\]\]/gi, '$1 century');
    txt.value = txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))[ \-]centuries\]\]/gi, '$1 centuries');
    // century with AD,BC etc
    txt.value = txt.value.replace(/\[\[(\d{1,2}(?:st|nd|rd|th))[ \-]century\s(AD|BC|CE|BCE)\]\]/gi, '$1 century $2');
    txt.value = txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))[ \-]century\s(AD|BC|CE|BCE)\]\]/gi, '$1 century $2');
    txt.value = txt.value.replace(/\[\[\d{1,2}(?:st|nd|rd|th)[ \-]century\|(\d{1,2}(?:st|nd|rd|th))[ \-]centuries\s(AD|BC|CE|BCE)\]\]/gi, '$1 centuries $2');
 
    // piped decades and years
    txt.value = txt.value.replace(/\[\[(\d{1,4}'?s)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[(\d{1,4}s? (?:AD|BC|CE|BCE))\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[\d{1,4}s? (?:AD|BC|CE|BCE)\|(\d{1,4})\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[\d{1,4}s? (?:AD|BC|CE|BCE)\|(\d{1,4}s? (?:AD|BC|CE|BCE))\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[\d{1,4}s?\|(\d{1,4}s? (?:AD|BC|CE|BCE))\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[\d{1,4}s?\|(\d{1,2}s?)\]\]/gi, '$1');
 
    // months
    txt.value = txt.value.replace(/\[\[(January|February|March|April|May|June|July|August|September|October|November|December)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[January\|(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)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d{3,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) (\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) \d?\d)\]\](?:th|st|nd|rd)/gi, '\[\[$1\]\]');
    txt.value = txt.value.replace(/\[\[(\d?\d)(?:th|st|nd|rd) (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) \d?\d)\]\](\s?\-?\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/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) \d?\d)\]\](\s?&[nm]dash;\s?)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\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) \d?\d)\]\](\/)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4');
 
    txt.value = txt.value.replace(/([^\[]{4})\[\[((?:January|February|March|April|May|June|July|August|September|October|November|December) \d?\d)\]\](\s?\-?\s?)\[\[(\d{1,2})\]\]/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) \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) \d?\d)\]\](\/)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4');
 
    txt.value = txt.value.replace(/([^\[]{4})\[\[(\d?\d) (?: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) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4');
    //same again but with ndash instead of hyphen
    txt.value = txt.value.replace(/([^\[]{4})\[\[(\d?\d) (?: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) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4');
    //same again but with slash instead of hyphen
    txt.value = txt.value.replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\/)\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1$2$3$4');
 
    txt.value = txt.value.replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\s?\-?\s?)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4');
    //same again but with ndash instead of hyphen
    txt.value = txt.value.replace(/([^\[]{4})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\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})\[\[(\d?\d) (?:January|February|March|April|May|June|July|August|September|October|November|December)\]\](\/)\[\[(\d{1,2})\]\]/gi, '$1$2$3$4');
 
    txt.value = txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2})\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[\d{1,2} (?:January|February|March|April|May|June|July|August|September|October|November|December)\|(\d{1,2})\]\]/gi, '$1');
 
    txt.value = txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{1,2})\]\]/gi, '$1');
 
 
    // solitary day_numbers
    txt.value = txt.value.replace(/\[\[(?:January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}\|(\d{1,2}(?:th|st|nd|rd))\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[\d{1,2} (?: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');
 
    // 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?)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[Tuesdays?\|(Tuesdays?)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[Wednesdays?\|(Wednesdays?)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[Thursdays?\|(Thursdays?)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[Fridays?\|(Fridays?)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[Saturdays?\|(Saturdays?)\]\]/gi, '$1');
    txt.value = txt.value.replace(/\[\[Sundays?\|(Sundays?)\]\]/gi, '$1');
 
    //4 digit years piped into 2
    txt.value = txt.value.replace(/\[\[\d{1,4}\|(\d{1,2})\]\]/gi, '$1');
 
    //year: examine characters in link on left for date, examine characters in link on right for date
    txt.value = txt.value.replace(/((?:[^yhletramub\s]..|[^rcianlse\d\s].|[^yhletr\d])\]\]\s?,?\-?\s?)\[\[(\d{1,4})\]\](\s?,?\-?\s?\[\[(?:[^jfmasond\d]|.[^aepuco\d\s]|..[^jfmasondbrylgptvc \s\-]))/gi, '$1$2$3');
    //year pair: examine characters in link on left for date, examine characters in link on right for date
    txt.value = txt.value.replace(/((?:[^yhletramub\s]..|[^rcianlse\d\s].|[^yhletr\d])\]\]\s?,?\-?\s?)\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\](\s?,?\-?\s?\[\[(?:[^jfmasond\d]|.[^aepuco\d\s]|..[^jfmasondbrylgptvc\s\-]))/gi, '$1$2$3$4$5');
 
    //year: examine characters in link on left for date, avoid links on right
    txt.value = txt.value.replace(/((?:[^yhletramub\s]..|[^rcianlse\d\s].|[^yhletr\d])\]\]\s?,?\-?\s?)\[\[(\d{1,4})\]\]([^\[]{4})/gi, '$1$2$3');
    //year pair: examine characters in link on left for date, avoid links on right
    txt.value = txt.value.replace(/((?:[^yhletramub\s]..|[^rcianlse\d\s].|[^yhletr\d])\]\]\s?,?\-?\s?)\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\]([^\[]{4})/gi, '$1$2$3$4$5');
 
    //year: check for line-ends, text on left, avoid links on right. Run twice to deal better with lists.
    txt.value = txt.value.replace(/([\w\(\);=:.'\*\|\&]\s?,?\-?\s?|\n)\[\[(\d{1,4})\]\]([^\[]{4}|\n)/gi, '$1$2$3');
    txt.value = txt.value.replace(/([\w\(\);=:.'\*\|\&]\s?,?\-?\s?|\n)\[\[(\d{1,4})\]\]([^\[]{4}|\n)/gi, '$1$2$3');
    //year pair: check for line-ends, text on left, avoid links on right
    txt.value = txt.value.replace(/([\w\(\);=:.'\*\|\&]\s?,?\-?\s?)\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\]([^\[]{4}|\n)/gi, '$1$2$3$4$5');
 
    //year: avoid links on left, examine characters in link on right for date
    txt.value = txt.value.replace(/([^\]]{4})\[\[(\d{1,4})\]\](\s?,?\-?\s?\[\[(?:[^jfmasond\d]|.[^aepuco\d\s]|..[^jfmasondbrylgptvc \s\-]))/gi, '$1$2$3');
    //year pair: avoid links on left, examine characters in link on right for date
    txt.value = txt.value.replace(/([^\]]{4})\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\](\s?,?\-?\s?\[\[(?:[^jfmasond\d]|.[^aepuco\d\s]|..[^jfmasondbrylgptvc \s\-]))/gi, '$1$2$3$4$5');
 
    //year:avoid links on left, text on right
    txt.value = txt.value.replace(/([^\]]{4})\[\[(\d{1,4})\]\](\s?,?\-?\s?[\w\(\);=:.'\*\|\&])/gi, '$1$2$3');
    //year pair: avoid links on left, text on right
    txt.value = txt.value.replace(/([^\]]{4})\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\](\s?,?\-?\s?[\w\(\);=:.'\*\|\&])/gi, '$1$2$3$4$5');
 
    //year:text on left, text on right
    txt.value = txt.value.replace(/([\w\(\);=:.'\*\|\&]\s?,?\-?\s?)\[\[(\d{1,4})\]\](\s?,?\-?\s?[\w\(\);=:.'\*\|\&])/gi, '$1$2$3');
    //year pair: avoid links on left, text on right
    txt.value = txt.value.replace(/([\w\(\);=:.'\*\|\&]\s?,?\-?\s?)\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\](\s?,?\-?\s?[\w\(\);=:.'\*\|\&])/gi, '$1$2$3$4$5');
 
    //year:avoid links on left, hyphen but no digits (to avoid ISO date) in link on right. Currently suspended because it isn't fully tested.
    //txt.value = txt.value.replace(/([^\]]{4})\[\[(\d{1,4})\]\](\s?,?\-?\s?\[\[[^\d])/gi, '$1$2$3');
 
    //year:avoid links on both sides
    txt.value = txt.value.replace(/([^\]]{4})\[\[(\d{1,4})\]\]([^\[]{4})/gi, '$1$2$3');
    //year pair: avoid links on both sides
    txt.value = txt.value.replace(/([^\]]{4})\[\[(\d{1,4})\]\](.?.?.?.?.?.?)\[\[(\d{1,4})\]\]([^\[]{4})/gi, '$1$2$3$4$5');
 
    // Add a tag to the summary box
    var txt = document.editform.wpSummary;
    var summary = "dates and numbers per [[WP:DATE]]";
	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) {
        addLink('p-cactions', 'javascript:pagefix()', 'pagefix', 'ca-unitfixer', 'Fixes some date and unit formatting', '', '');
    }
});