MediaWiki:Gadget-MagnusEditBox.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*
* MagnusEditBox (basé sur Less edit clutter de Magnus Manske
* [[en:User:Magnus_Manske/less_edit_clutter.js]])
*
* Divise le fenêtre d'édition en plusieurs fenêtres : une fenêtre pour l'en-tête (infobox, image),
* une fenêtre pour l'article en lui même, une fenêtre pour les catégories, une fenêtre pour les
* interwikis et une fenêtre pour les références
*
* Auteur : Magnus Manske
* Dernière révision : 8 janvier 2009
* {{Projet:JavaScript/Script|MagnusEditBox}}
*/
//<nowiki>

/* globals mw, $ */

(function () {

  var lec_sort_category = false;

  var lec_parse_references = 0 ;

  var lec_parent ;
  var lec_tb1 ;
  var lec_original ;
  var lec_tb_top ;
  var lec_tb_ill ;
  var lec_tb_cat ;
  var lec_tb_bt ;
  var lec_tb_ref ;
  var lec_active ;
  var lec_last_edited = null ;


  function less_edit_clutter_init () {
    lec_active = 1 ;
    less_edit_clutter_create_elements () ;
    less_edit_clutter_hook_button ( 'wpSave' ) ;
    less_edit_clutter_hook_button ( 'wpPreview' ) ;
    less_edit_clutter_hook_button ( 'wpDiff' ) ;
    less_edit_clutter_parse_main_textbox () ;
  }

  function less_edit_clutter_insert_at_cursor ( field , value ) {
    if (document.selection) {
      field.focus();
      var sel = document.selection.createRange();
      sel.text = value;
    } else if (field.selectionStart || field.selectionStart == '0') {
      var startPos = field.selectionStart;
      var endPos = field.selectionEnd;
      field.value = field.value.substring(0, startPos)+ value+ field.value.substring(endPos, field.value.length);
    }
  }

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

  function less_edit_clutter_delete_reference () {
    var si = lec_tb_ref.selectedIndex ;
    if ( si == null || si == -1 ) return false; // Nothing selected
    var text = lec_tb_ref[si].firstChild.nodeValue ;
    text = text.split ( ' : ' ) ;
    var value = text.shift() ;

    var key = '<<REF' + value + '>>' ;
    lec_tb_top.value = lec_tb_top.value.split(key).join('') ;
    lec_tb1.value = lec_tb1.value.split(key).join('') ;
    lec_tb_bt.value = lec_tb_bt.value.split(key).join('') ;
    less_edit_clutter_rejoin () ;
    less_edit_clutter_parse_main_textbox () ;
    return false ;
  }

  function less_edit_clutter_insert_new_reference () {
    if ( lec_last_edited == null ) return false;

    var refstuff = prompt ( "Enter reference name:" , '' ) ;
    if ( null == refstuff ) return false; // Cancel
    var text = prompt ( "Enter reference contents:" , '' ) ;
    if ( null == text ) return false; // Cancel

    var max = lec_tb_ref.length + 2 ;

    less_edit_clutter_insert_at_cursor ( lec_last_edited , '<<REF' + max + '>>' ) ;

    text = max + ' : ' + refstuff + ' | ' + text ;

    var opt = document.createElement ( 'option' ) ;
    opt.value = max-1 ;
    opt.appendChild ( document.createTextNode ( text ) ) ;
    lec_tb_ref.appendChild ( opt ) ;

    less_edit_clutter_rejoin () ;
    less_edit_clutter_parse_main_textbox () ;
    return false ;
  }

  function less_edit_clutter_mark_text_range ( ctrl , from , to ) {
    if(ctrl.setSelectionRange) {
      ctrl.focus();
      ctrl.setSelectionRange ( from , to ) ;
    }
    else if (ctrl.createTextRange) {
      var range = ctrl.createTextRange();
      range.collapse ( true ) ;
      range.moveEnd ( 'character', from ) ;
      range.moveStart ( 'character', to ) ;
      range.select();
    }
  }

  function less_edit_clutter_tb1_select ( ta ) {
    var selection = ta.value.substr(ta.selectionStart, ta.selectionEnd - ta.selectionStart);
    if ( ! /^<*REF\d+>*$/.test ( selection ) ) return ;
    var num = selection.match ( /^<*REF(\d+)>*$/ ) ;
    num = num.pop() ;
    num-- ;
    lec_tb_ref[num].selected = true ;
  }

  function less_edit_clutter_find_and_mark ( text , ctrl ) {
    var pos = ctrl.value.search ( text ) ;
    if ( pos < 0 ) return true ; // Continue search
    less_edit_clutter_mark_text_range ( ctrl , pos , pos + text.length ) ;
    return false ;
  }

  function less_edit_clutter_refsel_changed () {
    var si = lec_tb_ref.selectedIndex + 1 ;
    var key = '<<REF' + si + '>>' ;
    var cont = true ;
    if ( cont ) cont = less_edit_clutter_find_and_mark ( key , lec_tb_top ) ;
    if ( cont ) cont = less_edit_clutter_find_and_mark ( key , lec_tb1 ) ;
    if ( cont ) cont = less_edit_clutter_find_and_mark ( key , lec_tb_bt ) ;
    if ( cont ) alert ( "Something's wrong - could not find reference " + key + "! Better reload this edit in the standard edit box!" ) ;
  }

  function less_edit_clutter_refsel_edit () {
    var si = lec_tb_ref.selectedIndex ;
    if ( si == null || si == -1 ) return false; // Nothing selected
    var text = lec_tb_ref[si].firstChild.nodeValue ;
    text = text.split ( ' : ' ) ;
    var value = text.shift() ;
    text = text.join ( ' : ' ) ;
    text = text.split ( ' | ' ) ;
    var refstuff = text.shift() ;
    text = text.join ( ' | ' ) ;
    refstuff = prompt ( "Entrez le nom de la référence :" , refstuff ) ;
    if ( null == refstuff ) return ; // Cancel
    text = prompt ( "Entrez le contenu de la référence :" , text ) ;
    if ( null == text ) return ; // Cancel
    lec_tb_ref[si].firstChild.nodeValue = value + ' : ' + refstuff + ' | ' + text ;
    return false;
  }

  // compare be-x-old:xxx and be:xxx doesn't work as expected
  // we must sort on the lang code only
  function less_edit_clutter_compare_lang(a, b) {
     a = a.split(':')[0];
     b = b.split(':')[0];
     if (a > b)
        return 1;
     else if (a < b)
        return -1;
     return 0;
  }

  function less_edit_clutter_rejoin () {
    var v, n, i, s ;

    if ( lec_active != 1 ) return ;
    v = lec_tb_top.value ;
    v = v.replace(/^\s+|\s+$/g,"") ;
    if ( v != '' ) v += "\n" ;
    v += lec_tb1.value ;
    v = v.replace(/^\s+|\s+$/g,"") ;
    if ( v != '' ) v += "\n\n" ;
    v += lec_tb_bt.value ;
    // Conserver autant que possible le formatage des modèles de bas
    // de page sans chercher à conserver la mixin de cat/interwikis et
    // de modèles
    //v = v.replace(/^\s+|\s+$/g,"") ;
    if ( v != '' ) v += "\n" ;

    // Categories
    n = lec_tb_cat.value.split ( "\n" ) ;
    if (lec_sort_category)
      n = n.sort() ;
    for ( i = 0 ; i < n.length ; i++ ) {
      s = n[i].replace(/^\s+|\s+$/g,"") ;
      if ( s == '' ) continue ;
      v += '[[Catégorie:' +
           s + "]]\n" ;
    }
    v = v.replace(/^\s+|\s+$/g,"") ;
    if ( v != '' ) v += "\n\n" ;

    // Interlanguage links
    n = lec_tb_ill.value.split ( "\n" ) ;
    n = n.sort(less_edit_clutter_compare_lang) ;
    for ( i = 0 ; i < n.length ; i++ ) {
      s = n[i].replace(/^\s+|\s+$/g,"") ;
      if ( s == '' ) continue ;
      v += '[[' + s + "]]\n" ;
    }
    v = v.replace(/^\s+|\s+$/g,"") ;

    if ( lec_parse_references ) {
      for ( n = lec_tb_ref.firstChild ; n ; n = n.nextSibling ) {
        var text = n.firstChild.nodeValue ;
        text = text.split ( ' : ' ) ;
        var value = text.shift() ;
        text = text.join ( ' : ' ) ;
        text = text.split ( ' | ' ) ;
        var refstuff = text.shift() ;
        text = text.join ( ' | ' ) ;
        if ( refstuff != '' ) refstuff = ' name="' + refstuff + '"' ;
        text = '<ref' + refstuff + '>' + text + '</ref>' ;
        var key = '<<REF' + value + '>>' ;
        v = v.split(key).join(text) ;
      }
    }

    lec_tb1.value = v ;
  }

  function less_edit_clutter_create_elements () {
    lec_tb1 = document.getElementById ( 'wpTextbox1' ) ;
    lec_parent = lec_tb1.parentNode ;

    lec_tb_top = document.createElement ( 'textarea' ) ;
    lec_tb_top.id = 'lec_tb_top' ;
    lec_tb_top.name = 'lec_tb_top' ;
    lec_tb_top.cols = 80 ;
    lec_tb_top.rows = 5 ;

    lec_tb_ill = document.createElement ( 'textarea' ) ;
    lec_tb_ill.id = 'lec_tb_ill' ;
    lec_tb_ill.name = 'lec_tb_ill' ;
    lec_tb_ill.cols = 30 ;
    lec_tb_ill.rows = 5 ;

    lec_tb_cat = document.createElement ( 'textarea' ) ;
    lec_tb_cat.id = 'lec_tb_cat' ;
    lec_tb_cat.name = 'lec_tb_cat' ;
    lec_tb_cat.cols = 30 ;
    lec_tb_cat.rows = 5 ;

    lec_tb_bt = document.createElement ( 'textarea' ) ;
    lec_tb_bt.id = 'lec_tb_bt' ;
    lec_tb_bt.name = 'lec_tb_bt' ;
    lec_tb_bt.cols = 30 ;
    lec_tb_bt.rows = 5 ;

    var lec_bottom_table = document.createElement ( 'table' ) ;
    var lec_bottom_tbody = document.createElement ( 'tbody' ) ;
    var lec_bottom_tr = document.createElement ( 'tr' ) ;
    var lec_bottom_tr2 = document.createElement ( 'tr' ) ;
    var lec_bottom_td1 = document.createElement ( 'td' ) ;
    var lec_bottom_td2 = document.createElement ( 'td' ) ;
    var lec_bottom_td3 = document.createElement ( 'td' ) ;

    lec_bottom_td1.style.width = '40%' ;
    lec_bottom_td2.style.width = '30%' ;
    lec_bottom_td3.style.width = '30%' ;

    lec_bottom_td1.appendChild ( document.createTextNode ( 'Modèles de bas de page et mots magiques' ) ) ;
    lec_bottom_td1.appendChild ( document.createElement ( 'br' ) ) ;
    lec_bottom_td1.appendChild ( lec_tb_bt ) ;

    lec_bottom_td2.appendChild ( document.createTextNode ( 'Catégories' ) ) ;
    lec_bottom_td2.appendChild ( document.createElement ( 'br' ) ) ;
    lec_bottom_td2.appendChild ( lec_tb_cat ) ;

    lec_bottom_td3.appendChild ( document.createTextNode ( 'Liens interwikis' ) ) ;
    lec_bottom_td3.appendChild ( document.createElement ( 'br' ) ) ;
    lec_bottom_td3.appendChild ( lec_tb_ill ) ;

    if ( lec_parse_references ) {
      lec_tb1.onselect = function () { less_edit_clutter_tb1_select ( lec_tb1 ) ; } ;
      lec_tb_top.onselect = function () { less_edit_clutter_tb1_select ( lec_tb_top ) ; } ;
      lec_tb_bt.onselect = function () { less_edit_clutter_tb1_select ( lec_tb_bt ) ; } ;

      lec_tb1.onfocus = function () { lec_last_edited = lec_tb1 ; } ;
      lec_tb_top.onfocus = function () { lec_last_edited = lec_tb_top ; } ;
      lec_tb_bt.onfocus = function () { lec_last_edited = lec_tb_bt ; } ;

      lec_tb_ref = document.createElement ( 'select' ) ;
      lec_tb_ref.id = 'lec_tb_ref' ;
      lec_tb_ref.name = 'lec_tb_ref' ;
      lec_tb_ref.size = 5 ;
      lec_tb_ref.style.width = '100%' ;
      lec_tb_ref.onchange = less_edit_clutter_refsel_changed ;
      lec_tb_ref.ondblclick = less_edit_clutter_refsel_edit ;

      var a_new_reference = document.createElement ( 'a' ) ;
      a_new_reference.appendChild ( document.createTextNode ( 'ajouter' ) ) ;
      a_new_reference.href = '#' ;
      a_new_reference.onclick = less_edit_clutter_insert_new_reference ;

      var a_delete_reference = document.createElement ( 'a' ) ;
      a_delete_reference.appendChild ( document.createTextNode ( 'supprimer' ) ) ;
      a_delete_reference.href = '#' ;
      a_delete_reference.onclick = less_edit_clutter_delete_reference ;

      var a_edit_reference = document.createElement ( 'a' ) ;
      a_edit_reference.appendChild ( document.createTextNode ( 'éditer' ) ) ;
      a_edit_reference.href = '#' ;
      a_edit_reference.onclick = less_edit_clutter_refsel_edit ;

      var lec_bottom_td4 = document.createElement ( 'td' ) ;
      lec_bottom_td4.appendChild ( document.createTextNode ( 'Références (' ) ) ;
      lec_bottom_td4.appendChild ( a_new_reference ) ;
      lec_bottom_td4.appendChild ( document.createTextNode ( ' | ' ) ) ;
      lec_bottom_td4.appendChild ( a_delete_reference ) ;
      lec_bottom_td4.appendChild ( document.createTextNode ( ' | ' ) ) ;
      lec_bottom_td4.appendChild ( a_edit_reference ) ;

      lec_bottom_td4.appendChild ( document.createTextNode ( ')' ) ) ;
      lec_bottom_td4.appendChild ( document.createElement ( 'br' ) ) ;
      lec_bottom_td4.appendChild ( lec_tb_ref ) ;
      lec_bottom_td4.colSpan = '3' ;

      lec_bottom_tr2.appendChild ( lec_bottom_td4 ) ;
      lec_bottom_tbody.appendChild ( lec_bottom_tr2 ) ;
    }

    lec_bottom_tr.appendChild ( lec_bottom_td1 ) ;
    lec_bottom_tr.appendChild ( lec_bottom_td2 ) ;
    lec_bottom_tr.appendChild ( lec_bottom_td3 ) ;
    lec_bottom_tbody.appendChild ( lec_bottom_tr ) ;
    lec_bottom_table.appendChild ( lec_bottom_tbody ) ;

    var a = document.createElement ( 'a' ) ;
    a.href = '#' ;
    a.appendChild ( document.createTextNode ( "basculer en mode d'édition traditionnelle" ) ) ;
    a.onclick = function () {
      var u = document.getElementById('lec_div_top') ;
      u.parentNode.removeChild ( u ) ;
      u = document.getElementById('lec_div_bottom') ;
      u.parentNode.removeChild ( u ) ;
      lec_tb1.value = lec_original ;
      lec_active = 0 ;
      return false ;
    };

    var b = document.createElement ( 'a' ) ;
    b.href = '#' ;
    b.appendChild ( document.createTextNode ( "refaire pour le contenu courant" ) ) ;
    b.onclick = function () {
      less_edit_clutter_rejoin () ;
      less_edit_clutter_parse_main_textbox () ;
      return false ;
    };
    var top = document.createElement ( 'div' ) ;
    top.id = 'lec_div_top' ;

    var adiv = document.createElement ( 'div' ) ;
    adiv.style.display = 'block' ;
    adiv.appendChild ( document.createTextNode ( "Cœur de l'article (" ) ) ;
    adiv.appendChild ( a ) ;
    adiv.appendChild ( document.createTextNode ( " | " ) ) ;
    adiv.appendChild ( b ) ;
    adiv.appendChild ( document.createTextNode ( ")" ) ) ;

    top.appendChild ( document.createTextNode ( "Modèles d'en-tête et images" ) ) ;
    top.appendChild ( lec_tb_top ) ;
    top.appendChild ( adiv ) ;

    var bottom = document.createElement ( 'div' ) ;
    bottom.id = 'lec_div_bottom' ;

    bottom.appendChild ( document.createTextNode ( 'Bas de page' ) ) ;
    bottom.appendChild ( lec_bottom_table ) ;

    lec_parent.insertBefore ( bottom , lec_tb1.nextSibling ) ;
    lec_parent.insertBefore ( top , lec_tb1 ) ;

    lec_bottom_table.id = 'lec_tb_bottom' ;
    lec_bottom_table.style.width = '100%' ;
    lec_bottom_table.style.cellSpacing = '2' ;
    lec_bottom_table.style.cellPadding = '2' ;


    less_edit_clutter_append_show_hide ( 'lec_tb_top' ) ;
    less_edit_clutter_append_show_hide ( 'lec_tb_bottom' ) ;
  }

  function less_edit_clutter_toggle_show_hide ( id , a ) {
    var x = document.getElementById ( id ) ;
    if ( x.style.display == 'none' ) {
      x.style.display = '' ;
      while ( a.firstChild ) a.removeChild ( a.firstChild ) ;
      a.appendChild (  document.createTextNode ( 'masquer' ) ) ;
    } else {
      x.style.display = 'none' ;
      while ( a.firstChild ) a.removeChild ( a.firstChild ) ;
      a.appendChild ( document.createTextNode ( 'voir' ) ) ;
    }
  }

  function less_edit_clutter_append_show_hide ( id ) {
    var x = document.getElementById ( id ) ;
    var n = document.createElement ( 'span' ) ;

    var a = document.createElement ( 'a' ) ;
    a.href = '#' ;
    a.onclick = function () { less_edit_clutter_toggle_show_hide ( id , this ) ; return false ; };
    a.appendChild ( document.createTextNode ( 'masquer' ) ) ;

    n.appendChild ( document.createTextNode ( ' (' ) ) ;
    n.appendChild ( a ) ;
    n.appendChild ( document.createTextNode ( ')' ) ) ;
    n.appendChild ( document.createElement ( 'br' ) ) ;

    x.parentNode.insertBefore ( n , x ) ;
  //  x.style.display = 'none' ;
  }

  function less_edit_clutter_validate_langlink(lc, no_ws, lines, languages) {
    // Not completly correct as [[foo:bar]] will be identified as a lang link
    // even foo isn't one, for now handle only image:. Problem not solvable
    // unless we keep a complete liste of valid lang links (in a cookie filled from
    // sitematrix via api.php and a 24h expiration time ?)
    if ( lc.match(/^\[\[\w+(-\w+)?(-\w+)?\:.*\]\]$/) &&
         !lc.match(/^\[\[(image|file|fichier)\:.*\]\]$/) ) {
        lines.pop() ;
        var s = no_ws.substr ( 2 ) ;
        s = s.replace ( /\]\]$/ , "" ) ;
        languages.push ( s ) ;
        return true;
    }
    return false;
  }

  function less_edit_clutter_parse_main_textbox () {
    lec_original = lec_tb1.value ;
    var lines = lec_original.split("\n") ;
    var in_template = 0 ;
    var begin_templates = "" ;

    // References
    if ( lec_parse_references && /<<REF\d+>>/.test ( lec_original ) ) lec_parse_references = 0 ; // Already contains pattern, aborting
    if ( lec_parse_references ) {
      var cnt = 1 ;
      var v = lec_original ;
      v = v.split ( /<ref/ig ) ;
      var o = v.shift () ;
      var refs = [] ;
      while ( lec_tb_ref.firstChild ) lec_tb_ref.removeChild ( lec_tb_ref.firstChild ) ;
      for ( var i = 0 ; i < v.length ; i++ ) {
        if ( v[i].substr(0,1) != ' ' && v[i].substr(0,1) != '>' ) { // Something that is not a reference tag
          o += '<ref' + v[i] ;
          continue ;
        }
        var n = v[i].split ( '>' ) ;
        if ( n.length < 2 ) { o += '<ref' + v[i] ; continue ; }
        var refstuff = n.shift() ;
        refstuff = refstuff.match ( /name=\"(.*)\"\s*$/ ) ;
        if ( null == refstuff ) refstuff = '' ;
        else refstuff = refstuff.pop() ;
        n = n.join ( '>' ) ;
        n = n.split ( '</ref>' ) ;
        if ( n.length < 2 ) { o += '<ref' + v[i] ; continue ; }
        var refcontents = n.shift() ;
  //      if ( n.length > 1 ) { o += '<ref' + v[i] ; continue ; }
        n = n.join ( '</ref>' ) ;
        o += '<<REF' + cnt + '>>' + n ;
        refs.push ( cnt + ' : ' + refstuff + ' | ' + refcontents ) ;
        cnt++ ;
      }
      for ( var j = 0 ; j < refs.length ; j++ ) {
        var opt = document.createElement ( 'option' ) ;
        opt.value = j ;
        opt.appendChild ( document.createTextNode ( refs[j] ) ) ;
        lec_tb_ref.appendChild ( opt ) ;
      }
      lines = o.split("\n") ;
    }

    var no_ws ;

    // Begin of text
    while ( lines.length > 0 ) {
      no_ws = lines[0].replace(/^\s+|\s+$/g,"") ;
      var no_comment = no_ws.replace(/<!--.*-->/g, "").toLowerCase();
      if ( no_ws == "" ) {
        lines.shift() ;
        if ( begin_templates != '' ) begin_templates += "\n" ;
      } else if ( no_comment.match(/^\{\{[^\{\}]*\}\}$/) ) {
        lines.shift() ;
        begin_templates = begin_templates + no_ws + "\n" ;
      } else if ( no_comment.match(/^\{\{[^\{\}]*$/) ) {
        begin_templates = begin_templates + lines.shift() + "\n" ;
        in_template++ ;
      } else if ( in_template && no_comment.match(/^[^\}\{]*\}\}\s*$/) ) {
        begin_templates = begin_templates + lines.shift() + "\n" ;
        in_template-- ;
      } else if ( in_template > 0 ) {
        begin_templates = begin_templates + lines.shift() + "\n" ;
      } else if ( no_comment.match(/^[-_]+$/) || no_comment.match(/^\s*<hr\s*\/*>\s*$/) ) {
        begin_templates = begin_templates + lines.shift() + "\n" ;
      } else if ( no_comment.match(/^\[\[(image|file|fichier)\:.*\]\]$/) ) {
        begin_templates = begin_templates + lines.shift() + "\n" ;
      } else break ;
    }

    begin_templates = begin_templates.replace(/^\s+|\s+$/g,"") ;


    var categories = [] ;
    var languages = [] ;
    var end_templates = "" ;

    // End of text
    in_template = 0 ;
    var end_templates_append = "" ;
    while ( lines.length > 0 ) {
      var lp = lines.length - 1 ;
      no_ws = lines[lp].replace(/^\s+|\s+$/g,"") ;
      var lc = no_ws.toLowerCase() ;
      if ( lc == "" ) {
        lines.pop() ;
        if ( end_templates != '' ) end_templates = "\n" + end_templates ;
      } else if ( lc.substr ( 0 , 12 ) == "[[catégorie:" ) {
        lines.pop() ;
        var s = no_ws.substr ( 12 ) ;
        s = s.replace ( /\]\]$/ , "" ) ;
        categories.push ( s ) ;
      } else if (less_edit_clutter_validate_langlink(lc, no_ws, lines, languages)) {
        // less_edit_clutter_validate_langlink() save the lang link
      } else if ( lc.match(/^\{\{defaultsort\s*[\|\:].*\}\}$/) ) {
        end_templates_append += "\n\n" + lines.pop() ;
      } else if ( lc.match(/^<!--.*-->$/) ) {
        end_templates = lines.pop() + "\n" + end_templates ;
      } else if ( lc.match(/^\{\{.*\}\}$/) ) {
        end_templates = lines.pop() + "\n" + end_templates ;
      } else if ( lc.match(/^[^\{\}]*\}\}$/) ) {
        end_templates = lines.pop() + "\n" + end_templates ;
        in_template++ ;
      } else if ( lc.match(/^\{\{[^\{\}]*$/) ) {
        end_templates = lines.pop() + "\n" + end_templates ;
        in_template-- ;
      } else if ( no_ws.match(/^__NOTOC__$/) ) {
        end_templates = lines.pop() + "\n" + end_templates ;
      } else if ( in_template > 0 ) {
        end_templates = lines.pop() + "\n" + end_templates ;
      } else break ;
    }

    categories.reverse();

    var oet ;
    do {
      oet = end_templates ;
      end_templates = end_templates.split("\n\n\n").join("\n\n") ;
    } while ( end_templates != oet ) ;
    end_templates = end_templates.replace(/^\s+|\s+$/g,"") ;
    end_templates_append = end_templates_append.replace(/^\s+|\s+$/g,"") ;
    if ( end_templates != '') {
      if (end_templates_append != '')
         end_templates += "\n\n" ;
      else
         end_templates += "\n" ;
    }
    end_templates += end_templates_append ;

    // Set boxes
    lec_tb_top.value = begin_templates ;
    if (lec_sort_category)
      lec_tb_cat.value = categories.sort().join("\n") ;
    else
      lec_tb_cat.value = categories.join("\n") ;
    lec_tb_ill.value = languages.sort(less_edit_clutter_compare_lang).join("\n") ;
    lec_tb_bt.value = end_templates ;
    lec_tb1.value = lines.join("\n") ;
  }



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

})();

//</nowiki>