Utilisateur:Pinocchio/automate.js
De BoyWiki
Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
- Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
- Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
- Internet Explorer / Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
- Opera : appuyez sur Ctrl + F5.
/* Robot - Édition groupée de pages - Destiné aux remplacements/modifications simples et répétitifs */
/* Creation formulaire */
function botcreateform() {
var botfrm = document.getElementById('automate');
var contxt = '<form method="post" action="#" name="frm1">';
contxt += '<fieldset><legend>Liste des pages à traiter</legend>';
contxt += '<label for="lang">Wiki</label><select name="lang"><option value="fr">Français</option><option value="en">English</option><option value="de">Deutsch</option><option value="media">Media</option></select>';
contxt += '<label for="nmsp">Espace</label><select name="nmsp"><option value=0>Principal</option><option value=2>Utilisateur</option><option value=6></option><option value=4>BoyWiki</option><option value=10>Modèle</option><option value=12>Aide</option><option value=14>Catégorie</option><option value=104>Référence</option></select>';
contxt += '<label for="prfx">Préfixe</label><input name="prfx" type="text" />';
contxt += '<label for="filtr">Filtre</label><input name="filtr" type="text" />';
contxt += '<br><input type="button" name="valid1" value="Lister" onclick="botfindpageslist()" />';
contxt += '<br><textarea readonly="readonly" name="list"></textarea>';
contxt += '<p id="msg1"></p>';
contxt += '</fieldset>';
contxt += '<br><fieldset><legend>Traitement à effectuer</legend>';
contxt += '<label for="srch1">Chercher</label><input name="srch1" type="text" />';
contxt += '<label for="repl1">Remplacer par</label><input name="repl1" type="text" />';
contxt += '<br><br><label for="srch2">Chercher</label><input name="srch2" type="text" />';
contxt += '<label for="repl2">Remplacer par</label><input name="repl2" type="text" />';
contxt += '<br><br><label for="smry">Résumé</label><input name="smry" type="text" />';
contxt += '<br><br><fieldset><legend>Modes</legend>';
contxt += '<input type="checkbox" name="glob">Remplacement global';
contxt += '<input type="checkbox" name="nocs">Ignore la casse';
contxt += '<input type="checkbox" name="simu">Simulation';
contxt += '<input type="checkbox" name="step">Pas à pas';
contxt += '<input type="hidden" name="curn" value="0" />';
contxt += '</fieldset>';
contxt += '<br><input type="button" name="start" value="Démarrer" onclick="botexecpagedit()" />';
contxt += '<br><br><fieldset><legend>Journal des traitements</legend>';
contxt += '<div name="logs"></div></fieldset>';
contxt += '</fieldset></form>';
botfrm.innerHTML = contxt;
document.forms['frm1'].elements['start'].disabled = true;
}
/* Liste pages a editer - lance par bouton Lister */
function botfindpageslist() {
var botselpgtab = new Array();
document.forms['frm1'].elements['list'].value = 'Requête en cours...';
var lang = document.forms['frm1'].elements['lang'].value;
var nmsp = document.forms['frm1'].elements['nmsp'];
var ns = nmsp.value;
var selid = nmsp.selectedIndex;
var nsname = nmsp.options[selid].text;
var prfx = document.forms['frm1'].elements['prfx'].value;
var filtr = document.forms['frm1'].elements['filtr'].value;
var regstr = new RegExp(filtr,'');
var suite = ' ';
var xhr = createxhrobject();
while (suite!=null) {
xhr.open('GET', '/'+lang+'/api.php?action=query&list=allpages&apfilterredir=nonredirects&apnamespace='+ns+'&apprefix='+prfx+'&aplimit=500&format=xml&apfrom='+suite, false);
xhr.send('');
if (xhr.readyState != 4 || xhr.status != 200) {
alert('Erreur requête liste pages - Abandon');
return;
}
var pglst = xhr.responseXML.documentElement;
if (pglst.getElementsByTagName('query-continue').length) {
suite = pglst.getElementsByTagName('allpages')[0].getAttribute('apcontinue');
var pgobj = pglst.getElementsByTagName('allpages')[1].childNodes;
} else {
suite = null;
var pgobj = pglst.getElementsByTagName('allpages')[0].childNodes;
}
for (var i = 0; i < pgobj.length ; i++) {
var pg = pgobj[i].getAttribute('title');
if (filtr.length ==0) {
botselpgtab[botselpgtab.length] = pg;
continue;
}
if (pg.match(regstr)) {
botselpgtab[botselpgtab.length] = pg;
}
}
}
if (botselpgtab.length >0) {
botselpgtab.sort (alphacompare);
document.forms['frm1'].elements['list'].value = botselpgtab.join('\n');
document.getElementById('msg1').innerHTML = "Il y a "+botselpgtab.length+" pages dans la liste";
document.forms['frm1'].elements['curn'].value = 0;
document.forms['frm1'].elements['start'].disabled = false;
}
}
/* Boucle édition des pages - lancé par bouton Démarrer */
function botexecpagedit() {
var flg1,flg2 = "";
var logs = document.forms['frm1'].elements['logs'];
var lang = document.forms['frm1'].elements['lang'].value;
if (document.forms['frm1'].elements['list'].value.length ==0) return;
var botselpgtab = document.forms['frm1'].elements['list'].value.split("\n");
if (document.forms['frm1'].elements['srch1'].value.length ==0) return;
if (document.forms['frm1'].elements['glob'].checked) flg1 = "g";
if (document.forms['frm1'].elements['nocs'].checked) flg2 = "i";
var regsrch1 = new RegExp(document.forms['frm1'].elements['srch1'].value, flg1+flg2);
var repl1 = document.forms['frm1'].elements['repl1'].value;
if (document.forms['frm1'].elements['srch2'].value.length) {
var regsrch2 = new RegExp(document.forms['frm1'].elements['srch2'].value, flg1+flg2);
} else var regsrch2 = "";
var repl2 = document.forms['frm1'].elements['repl2'].value;
botfieldsdisable(true);
//jeton edit
var edittoken = mw.user.tokens.get('editToken');
if (edittoken ==null || edittoken.length <5) {
alert('Erreur edittoken - Abandon');
return;
}
var xhr = createxhrobject();
var n = document.forms['frm1'].elements['curn'].value;
for (var n=n; n < botselpgtab.length; n++) {
if (botselpgtab[n].length ==0) continue;
logs.innerHTML += '<br>'+botselpgtab[n]+' : ';
xhr.open('GET', '/'+lang+'/api.php?action=query&prop=info|revisions&intoken=edit&rvprop=timestamp|content&titles='+encodeURIComponent(botselpgtab[n])+'&format=xml',false);
xhr.send('');
if (xhr.readyState != 4 || xhr.status != 200) {
alert('Erreur requête info page '+botselpgtab[n]+' - Abandon');
logs.innerHTML += 'erreur info page';
return;
}
var pg = xhr.responseXML.documentElement;
var basetimestamp = pg.getElementsByTagName('revisions')[0].childNodes[0].getAttribute('timestamp');
var starttimestamp = pg.getElementsByTagName('pages')[0].childNodes[0].getAttribute('starttimestamp');
var content = pg.getElementsByTagName('revisions')[0].childNodes[0].textContent;
if (basetimestamp ==null || starttimestamp ==null || content ==null) {
alert('Erreur réponse info page '+botselpgtab[n]+' - Abandon');
logs.innerHTML += 'erreur info page';
return;
}
var smry = document.forms['frm1'].elements['smry'].value;
var contentorg = content;
var nbrpl1 = content.match(regsrch1).length;
content = content.replace(regsrch1, repl1);
if (regsrch2) {
var nbrpl2 = content.match(regsrch2).length;
content = content.replace(regsrch2, repl2);
} else nbrpl2 = 0;
logs.innerHTML += nbrpl1+'+'+nbrpl2+' remplacement(s)';
if (document.forms['frm1'].elements['simu'].checked ==false && (nbrpl1 + nbrpl2) >0 && content != contentorg) {
var boundary = '--------------23242526272829';
data = boundary+'\n';
data += 'Content-Disposition: form-data; name="action"\n\nedit\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="title"\n\n'+botselpgtab[n]+'\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="bot"\n\n1\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="basetimestamp"\n\n'+basetimestamp+'\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="starttimestamp"\n\n'+starttimestamp+'\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="contentformat"\n\ntext/x-wiki\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="contentmodel"\n\nwikitext\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="text"\n';
data += 'Content-Type: text/plain; charset=UTF-8\n';
data += 'Content-Transfer-Encoding: 8bit\n\n';
data += content+'\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="summary"\n\n'+smry+'\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="token"\n\n'+edittoken+'\n';
data += boundary+'\n';
data += 'Content-Disposition: form-data; name="format"\n\nxml\n';
data += boundary+'--\n';
xhr.open('POST', '/'+lang+'/api.php',false);
xhr.setRequestHeader("Charset", "utf-8");
xhr.setRequestHeader("Content-type", "multipart/form-data; boundary=--------------23242526272829");
xhr.setRequestHeader("Content-length", String(data.length));
xhr.setRequestHeader("Connection", "close");
xhr.send(data);
if (xhr.readyState != 4 || xhr.status != 200) {
alert('Erreur écriture page '+botselpgtab[n]+' - Abandon');
logs.innerHTML += ' erreur écriture';
return;
}
var result = xhr.responseXML.documentElement;
if (!result.getElementsByTagName('edit')[0].getAttribute('result').match(/uccess/)) {
logs.innerHTML += ' OK';
} else {
logs.innerHTML += ' ERREUR';
}
} else {
if (document.forms['frm1'].elements['simu'].checked) logs.innerHTML += ' mode simulation';
if ((nbrpl1 + nbrpl2) ==0 || content == contentorg) logs.innerHTML += ' aucun changement';
}
document.forms['frm1'].elements['curn'].value = n;
if (n == botselpgtid.length) botfieldsdisable(false);
if (document.forms['frm1'].elements['step'].checked) return;
}
}
function botfieldsdisable(state) {
document.forms['frm1'].elements['prfx'].readOnly = state;
document.forms['frm1'].elements['filtr'].readOnly = state;
document.forms['frm1'].elements['nmsp'].disabled = state;
document.forms['frm1'].elements['lang'].disabled = state;
document.forms['frm1'].elements['valid1'].disabled = state;
document.forms['frm1'].elements['srch1'].readOnly = state;
document.forms['frm1'].elements['repl1'].readOnly = state;
document.forms['frm1'].elements['srch2'].readOnly = state;
document.forms['frm1'].elements['repl2'].readOnly = state;
document.forms['frm1'].elements['glob'].disabled = state;
document.forms['frm1'].elements['nocs'].disabled = state;
document.forms['frm1'].elements['simu'].disabled = state;
document.forms['frm1'].elements['list'].readOnly = state;
//document.forms['frm1'].elements['start'].disabled = state;
}