Utilisateur:Delhovlyn/recursubst.js

Un article de Wikipédia, l'encyclopédie libre.

Note : Après avoir publié la page, vous devrez forcer son rechargement pour voir les changements : Mozilla / Konqueror / Firefox : Shift-Ctrl-R, Internet Explorer / Opera : Ctrl-F5, Safari : Cmd-R.

/*
 *           - 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>'; 
}
}
addOnloadHook(addButtonRecursubst);
 
 
//// Fonction appelée par le bouton ////
function 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/index.php?title=Special:ExpandTemplates&input=' + selText + '&removecomments=1&contexttitle=' +  wgPageName);
} else {
var modele = encodeURI(window.prompt('Le modèle à substituer (avec accolades, et paramètres si nécessaire)','{{}}'));
makeRequest('http://fr.wikipedia.org/w/index.php?title=Special:ExpandTemplates&input=' + modele + '&removecomments=1&contexttitle=' +  wgPageName);
}
}
 
//// Exécution de la requête ////
function makeRequest(url) {
        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 : ////
var texte = httpRequest.responseText;
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);
}
            } else {
                alert('Un problème est survenu avec la requête.');
            }
        }
        if (httpRequest.readyState == 1 || httpRequest.readyState == 3) {
              document.body.style.cursor = "progress";
        }
    }