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++) {
         if (nsname == 'Principal') var pg = pgobj[i].getAttribute('title');
         else var pg = pgobj[i].getAttribute('title').replace(regns,'');
         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;
}