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) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*
 *           - RecurSubst -
 *
 *  ¤ Ajoute un bouton dans la barre d'outils
 *    pour faire de la « substitution récursive »
 *    à partir d'un modèle (appliquer le préfixe
 *    subst: au modèle appelé ainsi qu'à tous
 *    les modèles imbriqués, et ainsi de suite).
 *
 *  ¤ Auteur : Delhovlyn
 *
 *  ¤ Compatibilité : Fonctionne avec Firefox et Safari,
 *    pas avec Opera ni Internet Explorer pour l'instant.
 *
 */

//// Affichage du bouton ////
function addButtonRecursubst() {
var var1 = document.getElementById('toolbar');
if (var1) {
var1.innerHTML += '<a title="Substitution récursive" href="javascript:recursubst();"><img alt="Substitution récursive" style="cursor: pointer;" src="http://upload.wikimedia.org/wikipedia/commons/2/21/Button_invalid_template.png" border="0" height="22" width="23"></a>'; 
}
}
$(addButtonRecursubst);


//// Fonction appelée par le bouton ////
function recursubst() {
alert('Passe dans fonction recursubst.');
/* ###############################################
 * Reprise fonction insertTags dans http://fr.wikipedia.org/skins-1.5/common/wikibits.js?141
 * */
var txtarea;
if (document.editform) {
	txtarea = document.editform.wpTextbox1;
} else {
	var areas = document.getElementsByTagName('textarea');
	txtarea = areas[0];
}
var selText, isSample = false;

if (document.selection  && document.selection.createRange) { // IE/Opera
	if (document.documentElement && document.documentElement.scrollTop)
		var winScroll = document.documentElement.scrollTop
	else if (document.body)
		var winScroll = document.body.scrollTop;
	txtarea.focus();
	var range = document.selection.createRange();
	selText = range.text;
	range.select();   
	if (document.documentElement && document.documentElement.scrollTop)
		document.documentElement.scrollTop = winScroll
	else if (document.body)
		document.body.scrollTop = winScroll;

} else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla
	var textScroll = txtarea.scrollTop;
	txtarea.focus();
	var startPos = txtarea.selectionStart;
	var endPos = txtarea.selectionEnd;
	selText = txtarea.value.substring(startPos, endPos);
	txtarea.scrollTop = textScroll;
}
// ###############################################

//// Faire la requête avec texte sélectionné si existant, sinon définir avec prompt ////
//if (selText) {
//makeRequest('http://fr.wikipedia.org/w/api.php?format=xml&action=expandtemplates&text=' + selText + '&title=' + mw.config.get('wgPageName'));
//} else {
var modele = encodeURI(window.prompt('Le modèle à substituer (avec accolades, et paramètres si nécessaire)','{{}}'));
if (modele != null) {
alert('On lance !');
makeRequest('http://fr.wikipedia.org/w/api.php?format=xml&action=expandtemplates&text=' + modele + '&title=' +  mw.config.get('wgPageName'));
} else { alert('Ah ben non.'); }
alert('A lancé la requête.');
//}
}

//// Exécution de la requête ////
function makeRequest(url) {
alert('A commencé la requête.');
        var httpRequest = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            httpRequest = new XMLHttpRequest();
            if (httpRequest.overrideMimeType) {
                httpRequest.overrideMimeType('text/xml');
            }
        }
        else if (window.ActiveXObject) { // IE
            try {
                httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e) {
                try {
                    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch (e) {}
            }
        }
        if (!httpRequest) {
            alert('Abandon :( Impossible de créer une instance XMLHTTP');
            return false;
        }
        httpRequest.onreadystatechange = function() { alertContents(httpRequest); };
        httpRequest.open('GET', url, true);
        httpRequest.send(null);
    }

    function alertContents(httpRequest) {
        if (httpRequest.readyState == 4) {
            if (httpRequest.status == 200) {
//// Si tout est OK : ////
alert('Commence le traitement du résultat.');
var texte = httpRequest.responseXML.childNodes[0].nodeValue;
var resultat = texte.substring(texte.lastIndexOf('"readonly">'),texte.lastIndexOf('</textarea>'));
resultat = resultat.substring(11);
resultat = resultat.replace(/&lt;/g,'<');
resultat = resultat.replace(/&gt;/g,'>');
resultat = resultat.replace(/&quot;/g,'\"');
resultat = resultat.replace(/&amp;/g,'&');

/* ###############################################
 * Reprise fonction insertTags dans http://fr.wikipedia.org/skins-1.5/common/wikibits.js?141
 * */
var txtarea;
if (document.editform) {
	txtarea = document.editform.wpTextbox1;
} else {
	var areas = document.getElementsByTagName('textarea');
	txtarea = areas[0];
}
var selText, isSample = false;

if (document.selection  && document.selection.createRange) { // IE/Opera
	if (document.documentElement && document.documentElement.scrollTop)
		var winScroll = document.documentElement.scrollTop
	else if (document.body)
		var winScroll = document.body.scrollTop;
	txtarea.focus();
	var range = document.selection.createRange();
	selText = range.text;
	range.select();   
	if (document.documentElement && document.documentElement.scrollTop)
		document.documentElement.scrollTop = winScroll
	else if (document.body)
		document.body.scrollTop = winScroll;

} else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla
	var textScroll = txtarea.scrollTop;
	txtarea.focus();
	var startPos = txtarea.selectionStart;
	var endPos = txtarea.selectionEnd;
	selText = txtarea.value.substring(startPos, endPos);
	txtarea.scrollTop = textScroll;
}
// ###############################################

document.body.style.cursor = "default";
//if (txtarea) {
//txtarea.value = txtarea.value.substring(0,startPos) + resultat + txtarea.value.substring(endPos);
//}
alert('Ouvre la fenêtre ?');
window.open('about:blank','newWindow','width=300px,height=150px');
//newWindow.title = 'Substitution récursive : résultat');
newWindow.document.write(resultat);
            } else {
                alert('Un problème est survenu avec la requête.');
            }
        }
        if (httpRequest.readyState == 1 || httpRequest.readyState == 3) {
              document.body.style.cursor = "progress";
        }
    }