« Utilisateur:Pinocchio/citations images du jour.js » : différence entre les versions

De BoyWiki
(modif code citation du jour)
(m)
Ligne 320 : Ligne 320 :
   var n = 0;
   var n = 0;
   for (var i=1; i < 3000 ; i++) {
   for (var i=1; i < 3000 ; i++) {
       if (pagesrch.query.pages[i]) {
       if (pagesrch.query.embeddedin[i]) {
         tabpagecit[n] = new Array();
         tabpagecit[n] = new Array();
         tabpagecit[n]['title'] = pagesrch.query.embeddedin[i].title;
         tabpagecit[n]['title'] = pagesrch.query.embeddedin[i].title;

Version du 16 décembre 2010 à 18:02

/************* Images du jour ****************/

/* Lancé par bouton page Utilisateur:Pinocchio/citation_du_jour.js */
/* Recherche images disponibles, sélection pseudo aléatoire,
/* maj sous-page Accueil/image du jour */

var prepareidjtabimgs = new Array();

/* liste img dispo - requête premier lot (lots suivants enchainés par prepare_idj_receiver) */
function prepare_idj_exec() {
   var progressop = document.getElementById('progress_op');
   progressop.innerHTML += '<br /><br />Recherche images disponibles...<br />';
   prepareidjtabimgs[0] = '0';
   prepare_idj_reqlistimg();
}

// prepare_idj_exec continue apres fin load listes imgs
function prepare_idj_exec_cont() {
   var progressop = document.getElementById('progress_op');
   progressop.innerHTML += 'images trouvées : '+ (parseInt(prepareidjtabimgs.length)-1) +'<br />';
   
   var tabid = new Array();
   // filtrage img admises (si inclus modele mainpix)
   for (var ni=1; ni<prepareidjtabimgs.length; ni++) {
      var dscr = prepareidjtabimgs[ni]['descr'];
      // test des types à prévoir
      if (!dscr.replace(/\\|"/g,'').match('id=mainpix lang=fr')) {
         prepareidjtabimgs[ni]['cksum'] = 0;
         continue;
      }

      // filtre commentaire de mainpix
      var comment = dscr.match(/mainpix[^>]+>([^<]*)/)[1];
      if (comment.length ==0) {
         // si comment. vide recup 1ere ligne non vide hors mainpix
         comment = dscr.match(/.{8,}/);
      }
      prepareidjtabimgs[ni]['descr'] = comment;

      // recup id
      tabid[tabid.length] = prepareidjtabimgs[ni]['cksum'];
   }

   progressop.innerHTML += 'images retenues : '+tabid.length+'<br />';


   progressop.innerHTML += 'Lecture état actuel...';
   var xhr_object = createxhrobject();
   if (xhr_object == null) {
      progressop.innerHTML = 'Erreur 1 - Abandon';
      return;
   }

   // init requete serveur - lecture sous-page Accueil/image
   xhr_object.open('GET', '/w/index.php?title=BoyWiki:Accueil/Image_du_jour&action=edit', false);
   xhr_object.send('');
   if (xhr_object.readyState != 4 || xhr_object.status != 200) {
      progressop.innerHTML += 'Erreur 2 - Abandon';
      return;
   }

   // recup contenu utile
   var pagedit = xhr_object.responseText.split(/<textarea[^>]*>|<\/textarea>/gi);

   // init date du jour - date min - date max
   var now = new Date();
   var today = formatdateyyyymmdd(now);
   now.setDate(now.getDate() - 2);
   var minday = formatdateyyyymmdd(now);
   now.setDate(now.getDate() + 30);
   var maxday = formatdateyyyymmdd(now);

   // découpe contenu par cas du switch
   var tabsw = pagedit[1].split(/\n ?\| ?/);
   // conserve début page jusqu'à switch
   var buf = tabsw[0];

   // parcourt dates: compte jours restant, élimine cas obsolètes, copie dans buf cas conservés
   var nbj = 0;
   var jtop = '00000000';
   var rtop = '0';
   for (var i = 1; i < tabsw.length ; i++) {
      var cas = tabsw[i].match(/^([0-9]{8})=/);
      if (cas != null) {
         if (cas[1] > jtop) jtop = cas[1];
         if (cas[1] >= minday) buf += '\n| '+tabsw[i];
         if (cas[1] > today) nbj++;
      }
   }
   if (jtop == '00000000') jtop = today;
   // recup id top
   var rdm = tabsw[i-1].match(/--([0-9a-f]{40})--/);
   if (rdm) rtop = rdm[1];

   if (nbj >= 30) {progressop.innerHTML += 'Le nombre maximum (30) de jours couverts est atteint'; return;}
   else if (nbj > 1) progressop.innerHTML += 'Il y a actuellement '+nbj+' jours couverts<br />';
   else progressop.innerHTML += 'Il y a actuellement '+nbj+' jour couvert<br />';
   
   // date de jtop
   var djtop = new Date(jtop.substr(0,4)+','+jtop.substr(4,2)+','+jtop.substr(6,2));


   progressop.innerHTML += 'Tri images par ordre id...<br />';
   // tri par ordre cksum
   tabid.sort();

   progressop.innerHTML += 'Tirage de '+(30 - nbj)+' images...<br />';

   // cherche rtop (ids tirés dans ordre croissant à partir du plus haut actuel)
   for (var ta = 0; ta < tabid.length ; ta++) {
      if (tabid[ta] > rtop) break;
   }
   // si fin table des ids reprend au début (>30 imgs dispo)
   if (ta >= tabid.length) ta = 0;
   // tirage de 30 - nbj id > rtop
   var tirage = new Array();
   for (var tb=0; tb < (30 - nbj) ; tb++) {
      tirage[tb] = tabid[ta++];
      if (ta >= tabid.length) ta = 0;
   }
   // récup images tirées et ajoute dans buf page
   for (var tb=0; tb < tirage.length ; tb++) {
      // jour suivant
      djtop.setDate(djtop.getDate() + 1);
      var nextday = formatdateyyyymmdd(djtop);

      // trouve titre et descr correspondant chaque id
      for (var ni=1; ni < prepareidjtabimgs.length; ni++) {
         if (prepareidjtabimgs[ni]['cksum'] == tirage[tb]) {
            buf += '\n| '+nextday+'=';

            // reduct. taille img affich.
            var x = prepareidjtabimgs[ni]['width'];
            var y = prepareidjtabimgs[ni]['heigh'];
            var ymax = 700;
            var xmax = 900;
            // calcul
            if (y > ymax) {
               x = x * (ymax / y);
               y = ymax;
            }
            if (x > xmax) {
               y = y * (xmax / x);
               x = xmax;
            }

            // ajout titre dim et descr
            buf += '[['+prepareidjtabimgs[ni]['title']+'|'+Math.round(x)+'x'+Math.round(y)+'px|frameless]]';
            buf += '<p id="idjdsc">'+prepareidjtabimgs[ni]['descr']+'</p>';
            break;
         }
      }
   }

   // ajoute fin switch et id top
   buf += '\n|#default=\n}}<!--'+tirage[tb-1]+'-->';
   // remplace html entities (pb dû à texte orig format edit vers view) */
   buf = buf.replace(/&lt;/g, '<');
   buf = buf.replace(/&gt;/g, '>');
   buf = buf.replace(/&amp;/g, '&');
   buf = buf.replace(/&quot;/g, '"');

   progressop.innerHTML += 'Mise à jour sous-page image...<br />';

   // récup éléments du formulaire
   pagedit = pagedit[0]+pagedit[2];
   pagedit = pagedit.replace(/\n/g, '');
   var startime = pagedit.match(/wpSection.*name="wpStarttime/i);
   startime = startime[0].replace(/.*value="([0-9]+)" name="wpStarttime/i, '$1');
   var editime = pagedit.match(/wpStarttime.*name="wpEdittime/i);
   editime = editime[0].replace(/.*value="([0-9]+)" name="wpEdittime/i, '$1');
   var editoken = pagedit.match(/.{80}name="wpEditToken/i);
   editoken = editoken[0].replace(/.*value="([0-f+]+)" name="wpEditToken/i, '$1');
   var autosummary = pagedit.match(/wpAutoSummary.{1,30}value="[^"]+"/i);
   autosummary = autosummary[0].replace(/.*value="([0-f]+)"/i, '$1');
   var summary = 'Routine prepare image du jour';

   // init requete serveur - maj sous-page Accueil/Image
   var boundary = '--------------23242526272829';
   var data = '';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpSection"\r\n\r\n\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpScrolltop"\r\n\r\n0\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpStarttime"\r\n\r\n'+startime+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpEdittime"\r\n\r\n'+editime+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpEditToken"\r\n\r\n'+editoken+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpSummary"\r\n\r\n'+summary+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpSave"\r\n\r\nPublier\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpTextbox1"\r\n\r\n'+buf+'\r\n';
   data += '--'+boundary+'--\r\n';

   xhr_object.open('POST', '/w/index.php?title=BoyWiki:Accueil/Image_du_jour&action=submit', false);
   xhr_object.setRequestHeader("Charset", "utf-8");
   xhr_object.setRequestHeader("Content-Type", "multipart/form-data; boundary="+boundary);
   xhr_object.setRequestHeader("Content-Length", String(data.length));
   xhr_object.send(data);
   
   if (xhr_object.readyState != 4 || xhr_object.status != 200) {
      progressop.innerHTML += 'Erreur 6 - Abandon';
   }
   else progressop.innerHTML += 'Fin procédure.';
}


/* Traitement recept lots img et lancemt suite ou fin */
/* Attention pages_id < 2000 (à ajuster pour no pgimg max) */
function prepare_idj_receiver(jsondata) {
   // si suite indic reprise (50 max par req)
   if (jsondata['query-continue']) prepareidjtabimgs[0] = jsondata['query-continue'].allpages.gapfrom;
   else prepareidjtabimgs[0] = null;

   // récup infos nom_img, descr, cksum (pour id)
   var ni = prepareidjtabimgs.length;
   for (var i=0; i<2000; i++) {
      if (jsondata['query'].pages[i]) {
         prepareidjtabimgs[ni] = new Array();
         prepareidjtabimgs[ni]['cksum'] = jsondata.query.pages[i].imageinfo[0].sha1;
         prepareidjtabimgs[ni]['title'] = jsondata.query.pages[i].title;
         prepareidjtabimgs[ni]['descr'] = jsondata.query.pages[i].revisions[0].*;
         prepareidjtabimgs[ni]['width'] = jsondata.query.pages[i].imageinfo[0].width;
         prepareidjtabimgs[ni]['heigh'] = jsondata.query.pages[i].imageinfo[0].height;
         ni++;
      }
   }
   
   // requete suite liste img ou continue
   if (prepareidjtabimgs[0] == null) prepare_idj_exec_cont();
   else prepare_idj_reqlistimg();
   
   // prevoir nbre boucles maxi
}


/* requete transfert liste pages et prop images espace 6 sans redirect format json (par lot 50 max) */
function prepare_idj_reqlistimg() {
   var scrtag = document.createElement('script');
   scrtag.type = 'text/javascript';
   scrtag.src = 'https://media.boywiki.org/w/api.php?action=query&generator=allpages&gaplimit=50&gapnamespace=6&gapfilterredir=nonredirects&prop=revisions|imageinfo&rvprop=content&rvexpandtemplates&iiprop=user|size|sha1&format=json&gapfrom='+prepareidjtabimgs[0]+'&callback=prepare_idj_receiver';
   document.getElementsByTagName('head')[0].appendChild(scrtag);
}



/************ Citations du jour ***************/

/* Lancé par bouton page Utilisateur:Pinocchio/citation_du_jour.js */
/* Recherche des pages de citations, extract citations, 
/* sélection pseudo aléatoire, maj sous-page Accueil/Citation du jour */

function prepare_cdj_exec() {
   var progressop = document.getElementById('progress_op');

   var xhr_object = createxhrobject();
   if (xhr_object == null) {
      progressop.innerHTML = 'Erreur 1 - Abandon';
      return;
   }
   
   progressop.innerHTML = 'Lecture état actuel...';
   
   // init requete serveur - lecture sous-page citations
   xhr_object.open('GET', '/w/index.php?title=BoyWiki:Accueil/Citation_du_jour&action=edit', false);
   xhr_object.send('');
   if (xhr_object.readyState != 4 || xhr_object.status != 200) {
      progressop.innerHTML += 'Erreur 2 - Abandon';
      return;
   }

   // recup contenu utile
   var pagedit = xhr_object.responseText.split(/<textarea[^>]*>|<\/textarea>/gi);

   // init date du jour - date min - date max
   var now = new Date();
   var today = formatdateyyyymmdd(now);
   now.setDate(now.getDate() - 2);
   var minday = formatdateyyyymmdd(now);
   now.setDate(now.getDate() + 30);
   var maxday = formatdateyyyymmdd(now);

   // découpe contenu par cas du switch
   var tabsw = pagedit[1].split(/\n ?\| ?/);
   // conserve début page jusqu'à switch
   var buf = tabsw[0];

   // parcourt les dates compte jours restant, élimine cas obsolètes, copie dans buf cas conservés
   var nbj = 0;
   var jtop = '00000000';
   var rtop = '0000000';
   for (var i = 1; i < tabsw.length ; i++) {
      var cas = tabsw[i].match(/^([0-9]{8})=/);
      if (cas == null) break;
      if (cas[1] > jtop) {
         jtop = cas[1];
         var rdm = tabsw[i].match(/\{\{[Ee]xtrait\|id=([0-9]{6,9})\|/);
         rtop = rdm[1];
      }
      if (cas[1] >= minday) buf += '\n| '+tabsw[i];
      if (cas[1] > today) nbj++;
   }
   if (jtop == '00000000') jtop = today;

   if (nbj >= 30) {progressop.innerHTML += 'Le nombre maximum (30) de jours couverts est atteint'; return;}
   else if (nbj > 1) progressop.innerHTML += 'Il y a actuellement '+nbj+' jours couverts<br />';
   else progressop.innerHTML += 'Il y a actuellement '+nbj+' jour couvert<br />';
   
   // date de jtop
   var djtop = new Date(jtop.substr(0,4)+','+jtop.substr(4,2)+','+jtop.substr(6,2));
   
   // recherche liste pages citations
   progressop.innerHTML += 'Recherche pages de citations...<br />';
   xhr_object.open('GET', '/w/api.php?action=query&list=embeddedin&eititle=Modèle:Extrait&einamespace=0&eilimit=500&format=json', false);
   xhr_object.send('');
   if (xhr_object.readyState != 4 || xhr_object.status != 200) {
      progressop.innerHTML += 'Erreur 3 - Abandon';
      return;
   }
   // recup contenu utile
   var pagesrch = JSON.parse(xhr_object.responseText);
   var tabpagecit = new Array();
   // sauve liste des pages (Attention pageid < 3000 à augmenter)
   var n = 0;
   for (var i=1; i < 3000 ; i++) {
      if (pagesrch.query.embeddedin[i]) {
         tabpagecit[n] = new Array();
         tabpagecit[n]['title'] = pagesrch.query.embeddedin[i].title;
         n++;
      }
   }

   progressop.innerHTML += 'Pages trouvées : '+n+'<br />Recherche liste des citations...<br />';
   // crée sous-tableaux citations
   var nbc = 0;
   for (var i = 0; i < n ; i++) {
      progressop.innerHTML += '...'+tabpagecit[i]["title"]+'...<br />';
      tabpagecit[i]['list'] = getabcitationperpage(xhr_object, '/wiki/'+tabpagecit[i]['title']);
      nbc += tabpagecit[i]['list'].length;
   }
   progressop.innerHTML += 'Citations trouvées : '+nbc+'<br />';
   
   progressop.innerHTML += 'Tri par ordre d’identifiants...<br />';
   // récup et tri des id
   var tabid = new Array();
   var ri = 0;
   var rc = 0;
   for (var i = 0; i < n ; i++) {
      while (tabpagecit[i]['list'][rc] != undefined) tabid[ri++] = tabpagecit[i]['list'][rc++]['id'];
      rc = 0;
   }
   tabid = tabid.sort();

   // controle doublons
   for (var db = 1; db < tabid.length ; db++) {
      if (tabid[db] == tabid[db-1]) progressop.innerHTML += '<font color="red">Trouvé identifiant en double : '+tabid[db]+'</font><br />';
   }
   
   progressop.innerHTML += 'Tirage de '+(30 - nbj)+' citations...<br />';
   // cherche rtop (les ids sont tirés dans ordre croissant à partir du plus haut actuel dans liste des citations)
   for (var ta = 0; ta < tabid.length ; ta++) {
      if (tabid[ta] > rtop) break;
   }
   // si fin de la table des ids reprend au début
   if (ta >= tabid.length) ta = 0;
   // tirage de 30 - nbj id > rtop
   var tirage = new Array();
   for (var tb = 0; tb < (30 - nbj) ; tb++) {
      tirage[tb] = tabid[ta++];
      if (ta >= tabid.length) ta = 0;
   }
   // récup citations tirées et ajoute dans buf page citations
   for (var tb = 0; tb < tirage.length ; tb++) {
      // jour suivant
      djtop.setDate(djtop.getDate() + 1);
      var nextday = formatdateyyyymmdd(djtop);
	  
      // cherche texte et page pour chaque id choisi
   stop: for (var np = 0; np < tabpagecit.length; np++) {
         for (var rx = 0; rx < tabpagecit[np]['list'].length; rx++) {
            if (tabpagecit[np]['list'][rx]['id'] == tirage[tb]) {
               buf += '\n| '+nextday+'='+tabpagecit[np]['list'][rx]['cit'];
               buf += '\n<p id="cdjlnk">→ Citation extraite de la page [['+tabpagecit[np]['title']+']]</p>';
               break stop;
            }
         }
      }
   }
 
   // ajoute fin switch
   buf += '\n|#default=\n}}';
   // remplace html entities (dues à texte origine edit vers view)
   buf = buf.replace(/&lt;/g, '<');
   buf = buf.replace(/&gt;/g, '>');
   buf = buf.replace(/&amp;/g, '&');
   buf = buf.replace(/&quot;/g, '"');

   progressop.innerHTML += 'Mise à jour page des citations...<br />';
   
   // récup éléments du formulaire
   pagedit = pagedit[0]+pagedit[2];
   pagedit = pagedit.replace(/\n/g, '');
   var startime = pagedit.match(/wpSection.*name="wpStarttime/i);
   startime = startime[0].replace(/.*value="([0-9]+)" name="wpStarttime/i, '$1');
   var editime = pagedit.match(/wpStarttime.*name="wpEdittime/i);
   editime = editime[0].replace(/.*value="([0-9]+)" name="wpEdittime/i, '$1');
   var editoken = pagedit.match(/.{80}name="wpEditToken/i);
   editoken = editoken[0].replace(/.*value="([0-f+]+)" name="wpEditToken/i, '$1');
   var autosummary = pagedit.match(/wpAutoSummary.{1,30}value="[^"]+"/i);
   autosummary = autosummary[0].replace(/.*value="([0-f]+)"/i, '$1');
   var summary = 'Routine prepare citation du jour';

   // init requete serveur - maj sous-page Accueil/Citation
   var boundary = '--------------23242526272829';
   var data = '';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpSection"\r\n\r\n\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpScrolltop"\r\n\r\n0\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpStarttime"\r\n\r\n'+startime+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpEdittime"\r\n\r\n'+editime+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpEditToken"\r\n\r\n'+editoken+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpSummary"\r\n\r\n'+summary+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpAutoSummary"\r\n\r\n'+autosummary+'\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpSave"\r\n\r\nPublier\r\n';
   data += '--'+boundary+'\r\nContent-Disposition: form-data; name="wpTextbox1"\r\n\r\n'+buf+'\r\n';
   data += '--'+boundary+'--\r\n';

   xhr_object.open('POST', '/w/index.php?title=BoyWiki:Accueil/Citation_du_jour&action=submit', false);
   xhr_object.setRequestHeader("Charset", "utf-8");
   xhr_object.setRequestHeader("Content-Type", "multipart/form-data; boundary="+boundary);
   xhr_object.setRequestHeader("Content-Length", String(data.length));
   xhr_object.send(data);
   
   if (xhr_object.readyState != 4 || xhr_object.status != 200) {
      progressop.innerHTML += 'Erreur 6 - Abandon';
   }
   else progressop.innerHTML += 'Fin procédure.';
}


/* retourne un tableau des citations extraites par id pour chaque page href */

function getabcitationperpage(xhr_object,href) {
   // init requete serveur - lecture page href
   href = href.replace(/\/wiki\//, '/w/index.php?title=')+'&action=edit';
   xhr_object.open('GET', href, false);
   xhr_object.send('');
   if (xhr_object.readyState != 4 || xhr_object.status != 200) {
      progressop.innerHTML = 'Erreur 4 - Abandon';
      return;
   }

   var tabcit = new Array();
   // recup contenu utile
   var pagedit = xhr_object.responseText.split(/<textarea[^>]*>|<\/textarea>/gi);
   // recherche chaines modèles {{Extrait}}
   var content = pagedit[1].split(/\{\{[Ee]xtrait\|/g);
   if (content == null) return;
   
   // pour chaque modèle trouvé
   var nc = 0;
   for (var m = 1; m < content.length ; m++) {
      // recherche fin modèle (parenthèses de fermeture) - extract contenu
      var open = 1;
      var close = 0;
      for (var i = 0; i < content[m].length ; i++) {
         if (content[m][i] == '{' && content[m][i+1] == '{') {open++; i++;}
         if (content[m][i] == '}' && content[m][i+1] == '}') {close++; i++;}
         if (open == close) break;
      }
      var submodl = content[m].substr(0,i-1);
      // controle args (si id absent ou cdj=non)
      var id = submodl.match(/^id=([0-9]{6,9})\|/);
      if (id == null) continue;
      if (submodl.match(/^ ?cdj=non ?\|/)) continue;
  
      // tronque citation si trop longue
      var nbchrmax = 1000;
      var citrc = '';
      var trc = submodl.split(/\{\{[Rr]éf [Ll]ivre\|/);
      if (trc[0].length > nbchrmax) {
         citrc = trc[0].substr(0,(nbchrmax-10));
         citrc = citrc.substr(0, citrc.lastIndexOf(' '));
         if (trc[1] != undefined) citrc = citrc+' (...)\n{{Réf Livre|'+trc[1];
         else citrc = citrc+' (...)';
      }

      // copie contenu modèle
      tabcit[nc] = new Array();
      tabcit[nc]['id'] = id[1];
      if (citrc.length > 0) tabcit[nc]['cit'] = '{{Extrait|'+citrc+'}}';
      else tabcit[nc]['cit'] = '{{Extrait|'+submodl+'}}';
      nc++;
   }
   return tabcit;
}