User:Ais523/bracketmatch.js

// User:ais523/bracketmatch.js - Colour matching brackets in a copy of the edit box.

// By User:ais523, on a suggestion by User:Absidy.

$(function(){

var p=document.getElementById('wikiPreview');

if(p==null) p=document.getElementById('viewsourcetext');

if(p)

p.innerHTML+="

";

try

{

var edh=document.getElementsByClassName('editHelp')[0];

if(bm_useparsebutton)

edh.innerHTML='

' type="button" tabindex="6" value="Show parsed" title="Show how braces parse in this text" '+

' onclick="bm_showparsed()"/>  '+edh.innerHTML;

} catch(x) {}

});

function bm_parsebrackets()

{

var t=document.getElementById('wpTextbox1').value;

var a=sajax_init_object();

var p='action=expandtemplates&generatexml=1&format=json&callback=bm_callback&text='+encodeURIComponent(t);

a.open('POST', mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php');

a.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

a.setRequestHeader("Content-length", p.length);

a.setRequestHeader("Connection", "close");

a.onreadystatechange=function(){bm_apirespond(a)};

a.send(p);

}

function bm_showparsed()

{

bm_parsebrackets();

return 0;

}

function bm_apirespond(a)

{

try

{

if(a.readyState==4)

eval(a.responseText);

}

catch(e)

{

document.getElementById('bm_parseres').innerHTML=

"Could not parse due to a server error. Parse";

}

}

var colang;

function bm_hexdigit(n)

{

var i=Math.floor(n);

if(i<10) return i+'';

if(i==10) return 'A';

if(i==11) return 'B';

if(i==12) return 'C';

if(i==13) return 'D';

if(i==14) return 'E';

if(i==15) return 'F';

}

function bm_tohex(n)

{

var i=Math.floor(n);

return bm_hexdigit(i/16)+bm_hexdigit(i%16);

}

function bm_gencol(ang)

{

var r=Math.sin(ang)+1;

var g=Math.sin(ang+3.14159*2/3)+1;

var b=Math.sin(ang-3.14159*2/3)+1;

return bm_tohex(r*127.5)+bm_tohex(g*127.5)+bm_tohex(b*127.5);

}

function bm_callback(o)

{

var subs={"tplarg":"{{{",

"/tplarg":"}}}",

"template":"{{",

"/template":"}}",

"part":"|",

"ext":"&"+"lt;",

"/attr":"&"+"gt;",

"attr/":"&"+"gt;"};

var h=o.parsetree["*"].split("<");

var i=h.length;

var r;

var n;

var sp=0;

var st=new Array();

var col;

colang=0;

while(--i)

{

col="";

n=1;

h[i]=h[i].split(">");

h[i][0]=h[i][0].split(" ");

r=subs[h[i][0][0]];

if(r==undefined) r="";

if(r=='}}}'||r=='}}')

{

st[sp]=bm_gencol(colang);

col=st[sp];

sp++;

colang+=2.4; //golden angle in radians, approx

}

else if(r=='{{{'||r=='{{')

{

sp--;

col=st[sp];

n=2;

}

if(col!="")

r=""+r+"";

h[i][0]=r;

h[i]=h[i].join("");

}

document.getElementById('bm_parseres').innerHTML=

"

"+h.join("").split("\n").join("
")+

"

Parse
";

}

function bm_highlight(x,c)

{

document.getElementById('bm_f'+x+'1').style.backgroundColor=c;

document.getElementById('bm_f'+x+'2').style.backgroundColor=c;

if(c=="black")

window.setTimeout("bm_highlight('"+x+"','transparent')",3000);

}

//

//test: {{{a|b}}} {{a|b}} {{c|{{e|a=b|3=c}}|f}}abc

//test: fgh

//test: i {{{{{{{{j}}}}}}}}

/* test:

{{startofline}}

  • /