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(/</g,'<'); resultat = resultat.replace(/>/g,'>'); resultat = resultat.replace(/"/g,'\"'); resultat = resultat.replace(/&/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"; } }