User:DStoykov/formatter.js

/* */

function fixInfobox { var textbox = document.editform.wpTextbox1; var scrollPosition = textbox.scrollTop; var txt, selStart = textbox.selectionStart, selEnd = textbox.selectionEnd; if (selStart == selEnd) return; txt = textbox.value.substring(selStart, selEnd);

// "$2");    //  " }}" ->  "}}"    txt = txt.replace(/\s*\}\}(\s*)$/,"\n}}$1");    //  "| \n" ->  "\n|"    txt = txt.replace(/\| *\n/g,"\n|");

txt = txt.replace(/^\| *([^=\|]+[^=\| ]) *= *(([^\|\{\}\[\]]---|---\[\^\[\+\]\]---|---\{\{[^\{\}]+\}\})*[^ |]?) *$/gm,"| $1 = $2");

//   txt = txt.replace(/\{\{(.+\S)((\n\| (.+) = (.+))*)\s*\|\s*(.+)\s*=\s*(.+)\s*((\s*\|\s*(.+)\s*=\s*(.+))*)\s*\}\}/mg,    ""); //   txt = txt.replace(/\s*\|\s*(.+)\s*=\s*(.+)/mg,"\n| $1 = $2"); textbox.value = textbox.value.substring(0,selStart)+txt+textbox.value.substring(selEnd); textbox.scrollTop = scrollPosition; }

function format { var textbox = document.editform.wpTextbox1; var scrollPosition = textbox.scrollTop; var txt, selStart = textbox.selectionStart, selEnd = textbox.selectionEnd; if (selStart == selEnd) { txt = textbox.value; } else { txt = textbox.value.substring(selStart, selEnd); }   txt = catFixer(txt); //txt = entities(txt); txt = fixheadings(txt); txt = fixsyntax(txt); //txt = linkfixer(txt, false); //txt = imagefixer(txt); txt = whitespace(txt); txt = linksimplifyer(txt); txt = custom(txt); if (selStart == selEnd) { textbox.value = trim(txt)+'\n'; } else { textbox.value = textbox.value.substring(0,selStart)+txt+textbox.value.substring(selEnd); }   textbox.scrollTop = scrollPosition; }

function custom(str){ str = str.replace(/\{\{\s*(tv\.com|tvtome) (show|person|episode)\s*\|\s*((id)\s*=)?\s*([^\|\}]*[^\s\|\}])\s*\|\s*((title|name)\s*=)?\s*([^\|\}]*[^\s\|\}])\s*\}\}/g, ""); str = str.replace(/\{\{\s*(tv\.com|tvtome) (show|person|episode)\s*\|\s*((title|name)\s*=)\s*([^\|\}]*[^\s\|\}])\s*\|\s*((id)\s*=)\s*([^\|\}]*[^\s\|\}])\s*\}\}/g, ""); str = str.replace(/\{\{\s*(imdb|tcmdb|nndb|ibdb|isfdb|amg) (name|title|episode)\s*\|\s*((id)\s*=)?\s*([^\|\}]*[^\s\|\}])\s*\|\s*((title|name|episode)\s*=)?\s*([^\|\}]*[^\s\|\}])\s*\}\}/g, ""); str = str.replace(/\{\{\s*(imdb|tcmdb|nndb|ibdb|isfdb|amg) (name|title|episode)\s*\|\s*((title|name|episode)\s*=)\s*([^\|\}]*[^\s\|\}])\s*\|\s*((id)\s*=)\s*([^\|\}]*[^\s\|\}])\s*\}\}/g, "");

str = str.replace(/((http|https):\/\/[\w\-\.]+)([^:\/\w\-\.]|$)/g, "$1/$3");

// This will replace September 1,2000 with September 10, 2000 str = str.replace(/(\[\[(January|February|March|April|May|June|July|August|September|October|November|December) \d\d?\]\])[ ,](\[\[\d{4}\]\])/g, "$1, $3");

str = str.replace(/\{\{\s*DEFAULTSORT\s*\|/ig, "{{DEFAULTSORT:"); str = str.replace(/ *\{\{DEFAULTSORT:(.+)\}\} *\n\n\[\[ *(Category|Категория) *:/m, "{{DEFAULTSORT:$1}}\n[[$2:");

str = str.replace(/\{\{\s*министър2\s*\|\s*([^\|\}]*)\s*\|\s*([^\|\}]*)\s*\|\s*([^\|\}]*)\s*\|\s*([^\|\}]*)\s*\|\s*([^\|\}]*)\s*\}\}/ig, ""); str = str.replace(/\|\s*независим}}/g,"|}}"); str = str.replace("","","g"); return str; }

function whitespace(str){ str = str.replace(/\t/g, " ");

str = str.replace(/^ ? ? \n/gm, "\n"); str = str.replace(/(\n\n)\n+/g, "$1"); str = str.replace(/== ? ?\n\n==/g, "==\n=="); str = str.replace(/\n\n(\* ?\[?http)/g, "\n$1");

str = str.replace(/^ ? ? \n/gm, "\n"); str = str.replace(/\n\n\*/g, "\n*"); str = str.replace(/[ \t][ \t]+/g, " "); str = str.replace(/([=\n]\n)\n+/g, "$1"); str = str.replace(/ \n/g, "\n");

//* bullet points str = str.replace(/^([\*#]+) /gm, "$1"); str = str.replace(/^([\*#]+)/gm, "$1 ");

//==Headings== str = str.replace(/^(={1,4}) ?(.*?) ?(={1,4})$/gm, "$1 $2 $3");

//dash — spacing //str = str.replace(/ ?(–|&#150;|–|&#8211;|&#x2013;) ?/g, "$1"); //str = str.replace(/ ?(—|&#151;|&mdash;|&#8212;|&#x2014;) ?/g, "$1"); //str = str.replace(/(—|&#151;|&mdash;|&#8212;|&#x2014;|–|&#150;|–|&#8211;|&#x2013;)/g, " $1 ");

return str; }

function entities(str){ //str = str.replace(//g, ""); //str = str.replace(/&#150;|&#8211;|&#x2013;/g, "–"); //str = str.replace(/&#151;|&#8212;|&#x2014;/g, "&mdash;"); // str = str.replace(/(cm| m|km|mi)2/g, "$1²"); //str = str.replace(/&sup2;/g, "²"); //str = str.replace(/&deg;/g, "°");

return str; }

//Fix ==See also== and similar section common errors. function fixheadings(str) { if( !str.match(/= ?See also ?=/) ) str = str.replace(/(== ?)(see also:?|related topics:?|related articles:?|internal links:?|also see:?)( ?==)/gi, "$1See also$3");

str = str.replace(/(== ?)(external links?:?|outside links?:?|web ?links?:?|exterior links?:?)( ?==)/gi, "$1External links$3"); str = str.replace(/(== ?)(reference:?)( ?==)/gi, "$1References$3"); str = str.replace(/(== ?)(sources?:?)( ?==)/gi, "$1Sources$3"); str = str.replace(/(== ?)(further readings?:?)( ?==)/gi, "$1Further reading$3");

return str; }

function catFixer(str){ str = str.replace(/\[\[\s*(Category|Категория)\s*:\s*/ig, "[[$1:");   return str; }

//fixes many common syntax problems function fixsyntax(str) { //replace html with wiki syntax if( !str.match(/'<\/?[ib]>|<\/?[ib]>'/gi) ) {   str = str.replace(/(.*?)<\/i>/gi, "$1"); str = str.replace(/(.*?)<\/b>/gi, "$1"); } str = str.replace(//gi, " "); return str; }

//formats links in standard fashion function linkfixer(str, checkImages) {  str = str.replace(/\]\[/g, "] ["); var m = str.match(/\[?\^\*?\]\]?/g); if (m) {   for (var i = 0; i < m.length; i++) {     var x = m[i].toString; var y = x;

//internal links only if ( !y.match(/^\[?\[http:\/\//i) && !y.match(/^\[?\[image:/i) ) {       if (y.indexOf(":") == -1 && y.substr(0,3) != "_") == -1)        {          if (y.indexOf("|") == -1)            y = y.replace(/_/g, " ");          else            y = y.replace( y.substr(0, y.indexOf("|")), y.substr(0, y.indexOf("|")).replace(/_/g, " "));        }          y = y.replace(/ ?\| ?/, "|").replace("|", "| ]]"); }

str = str.replace(x, y); } }

//repair bad internal links str = str.replace(/([^\[]|^)\[?\[([^\]]*?)\]\]?([^\]]|$)/gm, "$1$2$3"); str = str.replace(/\[\[ ?([^\]]*?) ?\]\]/g, "$1"); str = str.replace(/\[\[([^\]]*?)( |_)#([^\]]*?)\]\]/g, "$1");

//repair bad external links str = str.replace(/\[?\[http:\/\/([^\]]*?)\]\]?/gi, "[http://$1]"); str = str.replace(/\[http:\/\/([^\]]*?)\|([^\]]*?)\]/gi, "[http://$1 $2]");

return str; }

//fixes images function imagefixer(str) {

//remove external images str = str.replace(/\\]?/gi, "[http://$1]");

//fix links within internal images var m = str.match(/\[?\[image:[^\[\]]*?(\[?\^\*?\]*?[^\[\]]*?)*?\]+/gi); if (m) {   for (var i = 0; i < m.length; i++) {     var x = m[i].toString; var y = x;

y = y.replace(/^\[\[i/i, "I").replace(/\]\]$/, ""); y = y.replace(/(\^\*?)$/, "$1]"); y = linkfixer(y, true); y = "" + y + "";

str = str.replace(x, y); } }

return str; }

//simplifies some links e.g. dog to dog and dogs to dogs function linksimplifyer(str){ var m = str.match(/\[\[([^[]*?)\|([^[]*?)\]\]/g); if (m) {   for (var i = 0; i < m.length; i++) {     var n_arr = m[i].toString.match(/\[\[([^[]*?)\|([^[]*?)\]\]/); var n = n_arr[0]; var a = n_arr[1]; var b = n_arr[2];

if (b.indexOf(a) == 0 || b.indexOf(TurnFirstToLower(a)) == 0) {       var k = n.replace(/\[\[([^\]\|]*?)\|(\1)([\w]*?)\]\]/i, "$2$3"); str = str.replace(n, k); }   }  }

str = str.replace(/\[\[([^\]\|]+)\|([^\]\|]+)\]\]([A-Za-z\'][A-Za-z]*)([\.\,\;\:\"\!\?\s\n])/g, "$2$3$4");

return str; }

//trim start and end, trim spaces from the end of lines function trim(str) { str = str.replace(/ $/gm, ""); return str.replace(/^\s*|\s*$/g, ""); }

//turns first character to lowercase function TurnFirstToLower(input) { if (input != "") {   var input = trim(input); var temp = input.substr(0, 1); return temp.toLowerCase + input.substr(1, input.length); } else return ""; }

//entities that should never be unicoded function noUnicodify(str) { str = str.replace(" &amp; ", " & "); str = str.replace("&amp;", "&amp;amp;").replace("&amp;lt;", "&amp;amp;lt;").replace("&amp;gt;", "&amp;amp;gt;").replace("&amp;quot;", "&amp;amp;quot;").replace("&amp;apos;", "&amp;amp;apos;"); str = str.replace("&minus;", "&amp;minus;").replace("&times;", "&amp;times;");

str = str.replace(" ", "&amp;nbsp;").replace("&thinsp;", "&amp;thinsp;").replace("&shy;", "&amp;shy;"); str = str.replace("&prime;", "&amp;prime;"); str = str.replace(/&(#0?9[13];)/, "&amp;$1"); str = str.replace(/&(#0?12[345];)/, "&amp;$1");

return str; }

$(function {  if(document.forms.editform) {    mw.util.addPortletLink('p-cactions', 'javascript:format', 'format', 'ca-format', 'Format article', '', document.getElementById('ca-defaultsort'));  } });

/* */