ویکی‌پدیا:Gadget-ArticlesManquants.js

از ویکی‌پدیا، دانشنامهٔ آزاد
/*
== Code JavaScript ==

* Licence : Domaine public

{{Projet:JavaScript/Script}} 
{{Boîte déroulante début|titre=Articles Manquants et Liens Rouges}}<!--
*/
// --><nowiki>

// Adresses API

// Liste des pages
// mw.config.get( 'wgServer' ) + '/w/api.php?action=query&list=categorymembers&cmlimit='+APILimit+'&cmtitle=' + CATEGORIE + '&cmcontinue='

// Liste des liens
// mw.config.get( 'wgServer' )+'/w/api.php?action=query&prop=links&titles='+PAGE+'&plnamespace=0&pllimit='+APILimit+'&plcontinue='



var WantedPages_ModeleDefautDebut = '{{Articles manquants\n'
                  + '|pageportail=$1\n'
                  + '|catégorie=$2\n'
                  + '|hauteur=\n'
                  + '|intro=\n'
                  + '}}\n'

var WantedPages_ModeleDefautFin = '{{Articles manquants fin}}\n';

var WantedPages_ResumeModif = 'Mise à jour du modèle {{Articles manquants}} ([[:$1]]).';



var  RedPages_DebutModele = '<!-- Ce tableau est créé automatiquement par un robot. Pages Rouges DEBUT -->\n';
var  RedPages_FinModele = '<!-- Ce tableau est créé automatiquement par un robot. Pages Rouges FIN -->\n'

var  WantedPages_DebutModele = '<!-- Ce tableau est créé automatiquement par un robot. Articles Manquants DEBUT -->\n';
var  WantedPages_FinModele = '<!-- Ce tableau est créé automatiquement par un robot. Articles Manquants FIN -->\n'

var WantedPages_DebutTableauTriable = '{| class="wikitable centre sortable" width="100%"\n'


var WantedPages_DebutTableauTriable2 = '{| class="wikitable centre sortable"\n'

var WantedPages_Minimum = 10;

var WantedPages_CreateRecapTable = true;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

var WantedPages_Adresse = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' ) + "?title=";
if( (mw.config.get( 'wgAction' )!="edit")&&(mw.config.get( 'wgAction' )!="submit") ){
     $(WantedPages_MakeLinks);
}

var WantedPages_StartButton = '<img height="50" width="50" src="//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Crystal_Clear_action_exit.svg/50px-Crystal_Clear_action_exit.svg.png" alt="Lancer la mise à jour">';
 
var WantedPages_WorkingButton = '<img height="50" width="50" src="//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif" alt="Mise à jour en cours">';


 
// ///////////////////////////////////////////////////// FONCTION DE REQUÊTE ///////////////

var WantedPages_ajax = {
  http: function(bundle) {
    // mandatory: bundle.url
    // optional:  bundle.async
    // optional:  bundle.method
    // optional:  bundle.headers
    // optional:  bundle.data
    // optional:  bundle.onSuccess (xmlhttprequest, bundle)
    // optional:  bundle.onFailure (xmlhttprequest, bundle)
    // optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure
    var xmlhttp;
    try {
      xmlhttp = new XMLHttpRequest(); 
    } catch(e) { 
      try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) { 
        try {
          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
          xmlhttp = false
        }
      }
    }
 
    if (xmlhttp) {
      xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4)
          WantedPages_ajax.httpComplete(xmlhttp,bundle);
      };
      xmlhttp.open(bundle.method ? bundle.method : "GET",bundle.url,bundle.async == false ? false : true);
      if (bundle.headers) {
        for (var field in bundle.headers)
          try {
            xmlhttp.setRequestHeader(field,bundle.headers[field]);
          } catch(err) {
            //Argos42 : pour rendre LiveRC fonctionnel sur chrome
          }
      }
      xmlhttp.send(bundle.data ? bundle.data : null); 
    }
    return xmlhttp;
  }, 
  httpComplete: function(xmlhttp,bundle) {
    if (xmlhttp.status == 200 || xmlhttp.status == 302) {
      if (bundle.onSuccess)
        bundle.onSuccess(xmlhttp,bundle);
    } else if (bundle.onFailure) {
      bundle.onFailure(xmlhttp,bundle);
 
    } else {
      // A activer en debug mode ?
         //  alert(xmlhttp.status+xmlhttp.responseText);
    }
  }
};

// ///////////////////////////////////////////////////// recherche des modèles de la page et ajout des liens de mise à jour

function WantedPages_MakeLinks(){
     var count=-1;
     var Cadres = document.getElementsByTagName('div');
     for(s=0;s<Cadres.length;s++){
            if( hasClass(Cadres[s], 'categoryWantedPages') ){          
                  count++
                  Cadres[s].id = 'WantedPages_'+count;
                  var ParamCategorie = Cadres[s].firstChild.innerHTML;
                  var ParamPage = Cadres[s].firstChild.title;
                  var NewButton = '<a id="WantedPagesLink_'+count+'" href="javascript:WantedPages_GetParams('+count+ ');" title="Catégorie ' + ParamCategorie.replace(/Catégorie:/ig,'') + ' - Page '+ParamPage+'" >'+WantedPages_StartButton+'</a>' ;
                  Cadres[s].innerHTML += NewButton ;
            }
     }
}

function WantedPages_GetParams(ID){
     var Modele = document.getElementById('WantedPages_'+ID);
     if(!Modele) return;
     var Cadre = Modele.firstChild;
     if(!Cadre) return;
     var ParamCategorie = Cadre.innerHTML;
     var ParamPage = Cadre.title;
     var Pop1 = 'Limite basse du nombre d\'occurrences :\n'
     var Minimum = prompt(Pop1, WantedPages_Minimum);
     if(Minimum){
          if(Minimum!=''){
               Minimum = parseInt(Minimum);
               if(Minimum!="NaN") WantedPages_Minimum = Minimum;
          }
     }
     WantedPages_CreateRecapTable = confirm('Générer le tableau récapitulatif ?');
     var Pop2 = 'Catégorie à vérifier :\n'
              + '* '+ParamCategorie+'\n\n'
              + 'Page à mettre à jour :\n'
              + '* '+ParamPage+'\n\n'
              + 'Minimum :\n'
              + '* '+WantedPages_Minimum+'\n\n'
              + 'Tableau récapitulatif :\n'
              + '* '+(WantedPages_CreateRecapTable ? 'oui' : 'non')+'\n\n'
              + 'Continuer ?';
     var SurEtCertain = confirm(Pop2);
     if(SurEtCertain){
          Modele.innerHTML += '<br /><span id="WorkingFunction" ></span><br /><span id="WorkingPage" ></span>';
          WantedPages_CheckCategory({paramPage:ParamPage, paramCategory:ParamCategorie});
          var Lien = document.getElementById('WantedPagesLink_'+ID)
          if(Lien){
               Lien.innerHTML = WantedPages_WorkingButton ;
               Lien.title = "Arrêter la mise à jour" ;
               Lien.href = "javascript:window.location.reload();";
               Lien.blur();
          }
     }
}

// ///////////////////////////////////////////////////// REQUÊTE PAGES DE LA CATÉGORIE /////////////////////////
 
function WantedPages_CheckCategory(Args){
      if(!Args.PageList) Args.PageList = new Array();
      if(!Args.ParamContinue) Args.ParamContinue='';
      if( (mw.config.get( 'wgUserGroups' ).indexOf("sysop")!=-1)||(mw.config.get( 'wgUserGroups' ).indexOf("bot")!=-1) ){
           var APILimit=4999;
      }else{
           var APILimit=499;
      }
      document.getElementById('WorkingFunction').innerHTML = "Listage des pages";
      document.getElementById('WorkingPage').innerHTML = Args.paramCategory+ ' ' + Args.ParamContinue;
      WantedPages_ajax.http({ url: mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' )Path + '/api.php?format=xml&action=query&list=categorymembers&cmlimit='+APILimit+'&cmtitle=' + encodeURIComponent(Args.paramCategory) +  Args.ParamContinue,
                onSuccess: WantedPages_CheckCategoryDone,
                args:Args
      });
}

function WantedPages_CheckCategoryDone(Req, data){
      var Args = data.args;
      var ObjetXML = Req.responseXML; 
      var Pages = ObjetXML.getElementsByTagName('cm');
      for(a=0;a<Pages.length;a++){
            var TitrePage = Pages[a].getAttribute('title');
            var NS = Pages[a].getAttribute('ns');
            if(NS==="0" && Args.PageList.indexOf(TitrePage)==-1){
                  Args.PageList.push(TitrePage);
            }
      }
      var AutreRequeteNecessaire = ObjetXML.getElementsByTagName('query-continue')[0];
      if(AutreRequeteNecessaire){
            Args.ParamContinue = '&cmcontinue=' + encodeURIComponent(AutreRequeteNecessaire.getElementsByTagName('categorymembers')[0].getAttribute('cmcontinue'));
            WantedPages_CheckCategory(Args);
      }else{
            WantedPages_GetLinks(Args);
      }
}

// ///////////////////////////////////////////////////// REQUÊTE LIENS DE CHAQUE PAGE /////////////////////////

function WantedPages_GetLinks(Args){
      if(!Args.position) Args.position = 0;
      if(!Args.RedLinkTable) Args.RedLinkTable = new Array();
      if(!Args.RedLinks) Args.RedLinks = 0;
      if(!Args.PageLinkTable) Args.PageLinkTable = new Array();
      if(!Args.TotalLinks) Args.TotalLinks = 0;
      if(!Args.gplcontinue) Args.gplcontinue = '';
      var Page = Args.PageList[Args.position];
      if(!Page){
            WantedPages_SortLinks(Args);
            return;
      }
      if( (mw.config.get( 'wgUserGroups' ).indexOf("sysop")!=-1)||(mw.config.get( 'wgUserGroups' ).indexOf("bot")!=-1) ){
           var APILimit=4999;
      }else{
           var APILimit=499;
      }
      var AdresseRequete = mw.config.get( 'wgServer' )+mw.config.get( 'wgScript' )Path+'/api.php?format=xml&action=query&generator=links&titles='+encodeURIComponent(Page)+'&prop=info&gpllimit='+APILimit+'&gplnamespace=0'+encodeURIComponent(Args.gplcontinue);
      document.getElementById('WorkingFunction').innerHTML = "Listage des liens";
      document.getElementById('WorkingPage').innerHTML = Page;
      WantedPages_ajax.http({ url: AdresseRequete,
                onSuccess: WantedPages_GetLinksDone,
                args:Args
      });
}
var Test = "";
function WantedPages_GetLinksDone(Req, data){
      var Args = data.args;
      var ObjetXML = Req.responseXML;
      var Links = ObjetXML.getElementsByTagName('page');
      for(a=0;a<Links.length;a++){
            var TitrePage = Links[a].getAttribute('title');
            var NS = Links[a].getAttribute('ns');
            if(NS!=0 && NS!="0") continue;
            if(TitrePage.indexOf("Modèle discussion:")!=-1) continue;
            if(TitrePage.indexOf(")")!=-1 && TitrePage.indexOf("(")==-1) continue;
            Args.TotalLinks++
            var Missing = Links[a].getAttribute('missing');
            if(Missing!=null && Args.PageList.indexOf(""+TitrePage)==-1){
                  Test += "* "+Args.PageList[Args.position]+" : "+TitrePage+"\n"
                  Args.RedLinks++
                  var RedLinkLigne = '$1$2|-\n'
                                   + '| [[Special:Whatlinkshere/'+TitrePage+'|$1 occurrences]]\n'
                                   + '| [['+TitrePage+']]\n'
                  Args.RedLinkTable.push(RedLinkLigne);
            }
      }
      var AutreRequeteNecessaire = ObjetXML.getElementsByTagName('query-continue')[0];
      if(AutreRequeteNecessaire){
            Args.ParamContinue = '&gplcontinue=' + encodeURIComponent(AutreRequeteNecessaire.getElementsByTagName('links')[0].getAttribute('gplcontinue'));
            WantedPages_GetLinks(Args);
      }else{
            var Avancement = Math.round( ( (Args.TotalLinks-Args.RedLinks) / Args.TotalLinks ) * 100 );
            var zeroAvancement = "";
            if(Avancement<10) zeroAvancement += "0"; 
            if(Avancement<100) zeroAvancement += "0";
            var PageLinkLigne = '|-\n'
                              + '| [['+Args.PageList[Args.position]+']]\n'
                              + '| align="right" | '+Args.RedLinks+'\n'
                              + '| align="right" | '+Args.TotalLinks+'\n'
                              + '| {{Avancement|'+ Avancement+'|||||'+zeroAvancement+Avancement+'%}}\n'
            Args.PageLinkTable[Args.position] =PageLinkLigne;

            Args.position++
            Args.TotalLinks = 0;
            Args.RedLinks = 0;
            WantedPages_GetLinks(Args);
      }
}

// ///////////////////////////////////////////////////// TRI DES LIENS /////////////////////////

function WantedPages_SortLinks(Args){ 
      var ParamPage = Args.paramPage;
      var ParamCategorie = Args.paramCategory
      var RedLinkTable = Args.RedLinkTable;
      var PageLinkTable = Args.PageLinkTable;
      document.getElementById('WorkingFunction').innerHTML = "Triage des liens";
      document.getElementById('WorkingPage').innerHTML = '';
      var TempLinkList = RedLinkTable.sort();
      var NewRedLinkTable = new Array();
      var NewRedLinkTableCount = new Array();
      var index = 0;
      var NbLiens = 1;
      for(var a=0;a<TempLinkList.length;a++){            
            if(TempLinkList[a]==TempLinkList[(a+1)]){
                  NbLiens++
            }else{
                  NewRedLinkTable[index] = TempLinkList[a];
                  NewRedLinkTableCount[index] = NbLiens;
                  index++
                  NbLiens = 1;
            }
      }
      for(var a=0;a<NewRedLinkTable.length;a++){
            var Occurrences = NewRedLinkTableCount[a];
            var ZeroOccurrences = "";
            if(Occurrences<10) ZeroOccurrences +="0";
            if(Occurrences<100) ZeroOccurrences +="0";
            if(Occurrences<1000) ZeroOccurrences +="0";
            if(Occurrences>(WantedPages_Minimum-1)){
                  NewRedLinkTable[a] = NewRedLinkTable[a].split('$1').join(ZeroOccurrences + Occurrences);
            }else{
                  NewRedLinkTable[a] = false;
            }
      }
      NewRedLinkTable = NewRedLinkTable.sort();
      for(var a=0;a<NewRedLinkTable.length;a++){
            if(NewRedLinkTable[a]) NewRedLinkTable[a] = NewRedLinkTable[a].split('$2')[1];
      }
      var NewArgs = {paramPage:ParamPage, paramCategorie:ParamCategorie, paramRedLinkTable:NewRedLinkTable, paramPageLinkTable:PageLinkTable}
      var AdresseRequete = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' ) + "?title=" + encodeURIComponent(ParamPage) + '&action=edit';
      WantedPages_ajax.http({ url: AdresseRequete,
                onSuccess: WantedPages_Edit,
                args:NewArgs
      });
}

// ///////////////////////////////////////////////////// ÉDITION /////////////////////////

function  WantedPages_Edit(Req, data){
      var Args = data.args;
      var ParamPage = Args.paramPage;
      var ParamCategorie = Args.paramCategorie;
      var NewRedLinkTable = Args.paramRedLinkTable;
      var PageLinkTable = Args.paramPageLinkTable;
      while(document.body.firstChild){document.body.removeChild(document.body.firstChild);} 
      document.body.innerHTML = Req.responseText;

      var Aujourdhui = new Date();
      var Minutes   = Aujourdhui.getMinutes()
      if(Minutes<10){ var ZeroMinutes = "0" ; }else{ var ZeroMinutes = "";}
      var Heures   = Aujourdhui.getHours()
      if(Heures<10){ var ZeroHeures = "0" ; }else{ var ZeroHeures = "";}
      var Jour   = Aujourdhui.getDate();
      if(Jour<10){ var ZeroJour = "0" ; }else{ var ZeroJour = "";}
      var Mois = Aujourdhui.getMonth() + 1;
      if(Mois<10){ var ZeroMois = "0" ; }else{ var ZeroMois = "";}
      var Annee  = Aujourdhui.getYear();
      if (Annee < 2000){
            Annee = Annee + 1900;
      }

      var TitreHaut = '\'\'Tableau [[Modèle:Articles manquants/Documentation|mis à jour]] le ' + ZeroJour + Jour + '/' + ZeroMois + Mois + '/' + Annee + ' à ' + ZeroHeures + Heures + ':' + ZeroMinutes + Minutes + '\'\'\n';
      var TableauTriable = WantedPages_DebutTableauTriable
                         + '|+ ' + TitreHaut
                         + '|-\n'
                         + '! align="center" | Occurences\n'
                         + '! align="center" | Page\n';

// ---------------- Classement pages demandées ----------------


      for(a=(NewRedLinkTable.length-1);a>-1;a--){
            if(NewRedLinkTable[a]) TableauTriable += NewRedLinkTable[a];
      }
      TableauTriable += '|}\n';
      var TableauComplet = WantedPages_DebutModele+TableauTriable+WantedPages_FinModele;

      var TableauTriableRedPages = ''
      if(WantedPages_CreateRecapTable){
            TableauTriableRedPages += WantedPages_DebutTableauTriable2
                                    + '|+ ' + TitreHaut
                                    + '|-\n'
                                    + '! align="center" width="40%" | Page\n'
                                    + '! align="center" width="20%" | Liens rouges\n'
                                    + '! align="center" width="20%" | Total liens\n'
                                    + '! align="center" width="20%" | Avancement\n';

            for(a=0;a<PageLinkTable.length;a++){
                  TableauTriableRedPages += PageLinkTable[a];
            }
            TableauTriableRedPages += '|}\n';
      }
      var TableauCompletRedPages = RedPages_DebutModele+TableauTriableRedPages +RedPages_FinModele;


      WantedPages_ModeleDefautDebut = WantedPages_ModeleDefautDebut.split('$1').join(ParamPage);
      WantedPages_ModeleDefautDebut= WantedPages_ModeleDefautDebut.split('$2').join(ParamCategorie);
      //alert(WantedPages_ModeleDefautDebut);

      var ContenuPage = document.getElementById("wpTextbox1").value;
      var AncienResumeModif = document.editform.wpSummary.value;

      if( (ContenuPage.indexOf(WantedPages_DebutModele)!=-1)&&(ContenuPage.indexOf(WantedPages_FinModele)!=-1) ){         
// ----------------- Déja le modèle : remplacement tableau
            debutTexte = ContenuPage.substring(0, ContenuPage.indexOf(WantedPages_DebutModele));
            AncienModele = ContenuPage.substring(0, ContenuPage.indexOf(WantedPages_FinModele)) + WantedPages_FinModele;
            AncienModele = AncienModele.replace(debutTexte, "");       
            finTexte = ContenuPage.split(debutTexte).join('').split(AncienModele).join('');
            var TexteFinal = debutTexte + TableauComplet + finTexte;
      }else{
// ------------------------------------------------Pas de modèle : ajout modèle + tableau
            var TexteFinal = WantedPages_ModeleDefautDebut + TableauComplet + WantedPages_ModeleDefautFin + ContenuPage;
      }
      if( (TexteFinal.indexOf(RedPages_DebutModele)!=-1)&&(TexteFinal.indexOf(RedPages_FinModele)!=-1) ){ 
// ----------------- Déja le modèle : remplacement tableau
            var newdebutTexte = TexteFinal.substring(0, TexteFinal.indexOf(RedPages_DebutModele));
            var newAncienModele = TexteFinal.substring(0, TexteFinal.indexOf(RedPages_FinModele)) + RedPages_FinModele;
            newAncienModele = newAncienModele.replace(newdebutTexte, "");       
            var newfinTexte = TexteFinal.split(newdebutTexte).join('').split(newAncienModele).join('');
            TexteFinal = newdebutTexte + TableauCompletRedPages + newfinTexte;
      }else{
// ------------------------------------------------Pas de modèle : ajout modèle + tableau
            var TexteFinal = WantedPages_ModeleDefautDebut + TableauCompletRedPages + WantedPages_ModeleDefautFin + TexteFinal;
      }                                        
      document.getElementById ("wpTextbox1").value = TexteFinal ;
      document.editform.wpSummary.value = AncienResumeModif + WantedPages_ResumeModif.split('$1').join(ParamCategorie);

      document.editform.submit();
}

//</nowiki>{{Boîte déroulante fin}}