User:Magnus Manske/tmpl.js

// if ( ( mw.config.get('wgAction') == "submit" || mw.config.get('wgAction') == "edit" ) && mw.config.get('wgNamespaceNumber') == 0 ) { addOnloadHook ( init_tmpl ) ; }

var tmpl_active = 0 ; var tmpl_original = '' ; var tmpl_template_texts = new Array ; var tmpl_keys = new Array ;

function init_tmpl { tmpl_hook_button ( 'wpSave' ) ; tmpl_hook_button ( 'wpPreview' ) ; tmpl_hook_button ( 'wpDiff' ) ; tmpl_parse_textbox ; }

function tmpl_hook_button ( id ) { var b = document.getElementById ( id ) ; b.onclick = function { tmpl_rejoin ; return true ; } ; }

function tmpl_rejoin { if ( tmpl_active == 0 ) return ; var tb = document.getElementById('wpTextbox1') ; var all = tb.value ; for ( var akey in tmpl_keys ) { var key = tmpl_keys[akey] ; if ( null == key.match ( /^##TEMPLATE\d+:/ ) ) continue ; var text = tmpl_template_texts[akey] ; all = all.split(key).join(""); } tmpl_active = 0 ; tb.value = all ; }

function tmpl_parse_textbox { if ( tmpl_active == 1 ) return ; tmpl_active = 1 ; var tb = document.getElementById('wpTextbox1') ; tmpl_original = tb.value ; var tcnt = 0 ; var ts = '' ; var ns = '' ; var curt = 0 ; for ( var a = 0 ; a < tmpl_original.length ; a++ ) { if ( tmpl_original[a] == '{' && tmpl_original[a+1] == '{' ) { tcnt++ ; a++ ; if ( tcnt > 1 ) ts += '{{' ; } else if ( tmpl_original[a] == '}' && tmpl_original[a+1] == '}' ) { if ( tcnt > 1 ) ts += '}}' ; if ( tcnt > 0 ) tcnt-- ; if ( tcnt == 0 ) { if ( 1 == ts.split('\|').length ) { // Just a simple template, no parameters ns += "" ; } else { curt++ ; var tname = tmpl_get_template_name ( ts ) ; var key1 = "##TEMPLATE" + curt + ":" + tname + "##" ; tmpl_keys[curt] = key1 ; ns += key1 ; tmpl_template_texts[curt] = ts ; }       ts = '' ; }     a++ ; } else { if ( tcnt == 0 ) { ns += tmpl_original[a] ; } else { ts += tmpl_original[a] ; }   }  }  tb.value = ns ; tb.ondblclick = tmpl_textbox_dblclick ; }

function tmpl_get_template_name ( text ) { text = text.split('\|').shift ; text = text.split('\{').shift ; text = text.replace ( /\s+$/, '' ) ; text = text.replace ( /^\s+/, '' ) ; return text ; }

function tmpl_textbox_dblclick { var tb = document.getElementById('wpTextbox1') ; var len = tb.value.length; var start = tb.selectionStart-2; var end = tb.selectionEnd+1; if ( start < 0 ) return ; if ( end >= tb.value.length ) return ; var sel = tb.value.substring(start, end);

if ( null == sel.match ( /^##TEMPLATE\d+:$/ ) ) return ;

var num = sel.match ( /\d+/ ) ; var text = tmpl_template_texts[num] ;

alert ( num + " stands for:\n" + text ) ; } //