Utilisateur:Dr Brains/ChercheDansSousCategories.js

Une page de Wikipédia, l'encyclopédie libre.
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
//<!-- [[Catégorie:JavaScript du Wiktionnaire|ChercheDansSousCatégories.js]] -->
// --------------------------------------------------------------------------------------------
// Recherche de mots dans une catégorie et ses sous-catégories
//
// --------------------------------------------------------------------------------------------
// Code en partie inspiré de w:MediaWiki:Gadget-RenommageCategorie.js, par Dr Brains
// Le reste est fait par ArséniureDeGallium, sous CC-BY-SA.
// Version 1.0, juillet 2012.
// Version 2.0, ne refais pas les requêtes à chaque fois, juillet 2012.
// Version 2.1, option wikicode, juillet 2012.
// --------------------------------------------------------------------------------------------

// Libellé de l'onglet
var CherCats_Text_Onglet = "Chercher dans la catégorie";

// --------------------------------------------------------------------------------------------
// Variables globales

var CherCats_CategMere = mw.config.get('wgPageName').replace(/_/g, " "); // page en cours, non modifiable
var CherCats_Stop = 1;    //arrêt du traitement
var CherCats_Scanned = 0;

var CherCats_Pause = 900; //millisecondes entre 2 cats
var CherCats_MaxLevel = 4; //niveau maximum d'exploration autorisées
var CherCats_MaxRequest = 250; //nombre maximum de requête autorisé

if( mw.config.get('wgUserGroups') && (mw.config.get('wgUserGroups').indexOf("bot")!=-1) ){
  CherCats_Pause = 10; //millisecondes entre 2 cats
  CherCats_MaxLevel = 25; //niveau maximum d'exploration autorisé
  CherCats_MaxRequest = 25000; //nombre maximum de requête autorisé
}
var CherCats_APIlimit = (mw.config.get('wgUserGroups') && (mw.config.get('wgUserGroups').indexOf('bot')!=-1 || mw.config.get('wgUserGroups').indexOf('sysop')!=-1 ) ? 4999 : 499);

var CherCats_MaxRequestEnabled = true;
var CherCats_MaxRequestCount = 0;

var CherCats_RegExp = false;
var CherCats_TimeOut = false;

var CherCats_ResultTxt = "Attention !\n"
    + "Ce script peut prendre beaucoup de temps et faire beaucoup de requêtes"
    + " sur le serveur si vous l'utilisez sur une catégorie ayant beaucoup de"
    + " sous-catégories.\n\n"
    + "Une pause de " + (CherCats_Pause/1000)
    + "s est observée entre deux catégories successives";
if(CherCats_MaxRequestEnabled) CherCats_ResultTxt += " et le nombre total de requêtes est limité à " + CherCats_MaxRequest 

CherCats_ResultTxt += ".";


// --------------------------------------------------------------------------------------------
// Ajout du lien dans les onglets après "renommer" & cie

if ( mw.config.get( 'wgNamespaceNumber' ) == 14 ) { //limiter aux catégories
    addOnloadHook(CherCats_AddLink);
}

function CherCats_AddLink(){
     var OngletsCactions = document.getElementById('p-cactions');
     if(OngletsCactions){
          var CactionsUl = OngletsCactions.getElementsByTagName('ul')[0];
          CactionsUl.innerHTML += '<li><a href="javascript:CherCats_OpenMenu();">'+CherCats_Text_Onglet+'</a></li>';
          if(OngletsCactions.className){
               OngletsCactions.className = OngletsCactions.className.replace(/[ ]*emptyPortlet[ ]*/, " ");
          }
     }
}

/***********************************************************************************************/
/*                          BOITE DE DIALOGUE                                                  */
/***********************************************************************************************/

// --------------------------------------------------------------------------------------------
// Détermination de la hauteur de l'écran
 
function CherCats_GetScreenHeight(){
     var ScreenHeight = 0;
     if( typeof( window.innerHeight ) == 'number' ) {
          ScreenHeight = parseInt(window.innerHeight);
     }else if( document.documentElement && document.documentElement.clientHeight ){
          ScreenHeight = parseInt(document.documentElement.clientHeight);
     }else if( document.body && document.body.clientHeight ){
          ScreenHeight = parseInt(document.body.clientHeight);
     }
     return ScreenHeight;
}
 
// --------------------------------------------------------------------------------------------
// Détermination de la largeur de l'écran
 
function CherCats_GetScreenWidth(){
     var ScreenWidth = 0;
     if( typeof( window.innerWidth ) == 'number' ) {
          ScreenWidth = parseInt(window.innerWidth);
     }else if( document.documentElement && document.documentElement.clientWidth ){
          ScreenWidth = parseInt(document.documentElement.clientWidth);
     }else if( document.body && document.body.clientWidth ){
          ScreenWidth = parseInt(document.body.clientWidth);
     }
     return ScreenWidth;
}

// --------------------------------------------------------------------------------------------
// Création de la boite de dialogue
 
function CherCats_OpenMenu(){
    if(document.getElementById('CherCats_IdMenu')){ // boiboite déjà ouverte
        CherCats_CloseMenu();
        return; 
    }
    var ResultTxt = CherCats_ResultTxt;

    var LargeurEcran = CherCats_GetScreenWidth();
    var HauteurEcran = CherCats_GetScreenHeight();
 
    // création boiboite en html
    var Menu = document.createElement('div');
    Menu.id='CherCats_IdMenu';
    Menu.className ='CherCats_IdMenu';
    Menu.style.position='fixed';
    Menu.style.zIndex= 500;
    Menu.style.padding='5px';
    Menu.style.backgroundColor='white';
    Menu.style.border='3px double black';
    Menu.style.width= '450px';
    Menu.style.height= '260px';
    document.body.appendChild(Menu);
    PositionGauche = parseInt((LargeurEcran-Menu.clientWidth)/2) ;
    PositionHaut = parseInt((HauteurEcran-Menu.clientHeight)/10) ;
    Menu.style.left=PositionGauche + 'px';
    Menu.style.top=PositionHaut + 'px'; 
    var Select = '<select id="IdLevel">';
    for(var a=1,l=CherCats_MaxLevel;a<(l+1);a++){
        Select += '<option value="'+a+'">'+a+'</option>';
    }
    Select += '</select>';
    var MenuContent = ''
    + '<label for="IdCategMere">Catégorie : </label>'
    + '<input type="text" id="IdCategMere" value="' + CherCats_CategMere + '" disabled="disabled" size="50"/>'
    + '<br />' ////
    + '<label for="IdJokers">Chercher : </label>'
    + '<input type="text" id="IdJokers" value="*" size="22"/>'
    + '<label for="IdJokers" style="font-size: 80%">regexp</label>'
    + '&nbsp;&nbsp;'
    + Select
    + '<label for="IdLevel" style="font-size: 80%">Niveau de catégories à explorer</label>'
    + '<br />' ////
    + '<input type="checkbox" id="IdWikiCode" style="cursor:pointer;" />'
    + '<label for="IdWikiCode" style="font-size: 80%">Résultat en code wiki</label>'
    + '<br />' ////
    + '<textarea id="IdResult" name="Résultat" rows="10" cols="30" readonly="readonly">'
    + ResultTxt + '</textarea>'
    + '<br />' ////
    + '<center>'
    + '<input type="button" id="OKbutton" style="cursor:pointer;" value="Chercher" onclick="CherCats_CheckMenu();"/>'
    + '&nbsp;&bull;&nbsp;' ////
    + '<input type="button" id="Cancel" style="cursor:pointer;" value="Quitter" title="Quitter" onclick="CherCats_CloseMenu();""/>'
    + '</center>';
    Menu.innerHTML = MenuContent;

    // initialisations de la boiboite
    document.getElementById("IdJokers").focus();
}

// --------------------------------------------------------------------------------------------
// Traitement du bouton "arrêter"
// --------------------------------------------------------------------------------------------
function CherCats_StopMenu(){
    CherCats_Stop = 1; //pour arrêter le script s'il est en cours
    document.getElementById('IdResult').value = "Traitement arrêté par l'utilisateur";
    clearTimeout(CherCats_TimeOut);
    CherCats_TimeOut = setTimeout("CherCats_ListCat99()",10);
}

// --------------------------------------------------------------------------------------------
// Traitement du bouton "fermer"
// * ferme la boite de dialogue
// --------------------------------------------------------------------------------------------
function CherCats_CloseMenu(){
    CherCats_Stop = 1; //pour arrêter le script s'il est en cours
    var Menu = document.getElementById('CherCats_IdMenu');
    if(Menu) Menu.parentNode.removeChild(Menu);
}

// --------------------------------------------------------------------------------------------
// Traitement du bouton "lancer"
// --------------------------------------------------------------------------------------------
function CherCats_CheckMenu(){

    // récupération de la regexp
    var riri = document.getElementById('IdJokers').value;
    if (riri=="") riri="*";
    riri="^"+riri+"$"
    riri= riri.split("^*").join("*").split("*$").join("*")
    var Reg = new RegExp( riri.split("*").join(".*").split("?").join(".") );
    if(Reg != CherCats_RegExp) CherCats_Scanned = 0;
    CherCats_RegExp = Reg;
    alert(CherCats_RegExp);

    // bouton transformé en "arrêter"
    var OKb = document.getElementById("OKbutton");
    OKb.value = "Stop";
    OKb.onclick = CherCats_StopMenu;

    // recherche des mots
    clearTimeout(CherCats_TimeOut);
    if (CherCats_Scanned){
        CherCats_TimeOut = setTimeout("CherCats_ListCat3()",10);
    }else{
        CherCats_Stop = 0;
        CherCats_TimeOut = setTimeout("CherCats_ListCat0()",10);
    }
}

/***********************************************************************************************/
/*                    recherche dans toutes les sous-catégories                                  */
/***********************************************************************************************/

// --------------------------------------------------------------------------------------------
// 0 : initialisation, création des vars globales,
// puis aller en (1) pour la cat mère
// --------------------------------------------------------------------------------------------
function CherCats_ListCat0() {

    //initialisation fifo des sous-cats
    SousCatFifo = new Array();
    SousCatFifo.push(CherCats_CategMere);

    SousCatLevels = new Array();
    SousCatLevels[CherCats_CategMere] = 0;
    SousCatmaxlevel = document.getElementById("IdLevel").value;

    SousCatFifoPtrOut = 0;
    CherCats_MaxRequestCount = 0;

    //initialisation liste des mots
    SousCatListeMots = new Array();

    //lancement listage à partir de la racine
    clearTimeout(CherCats_TimeOut);
    CherCats_TimeOut = setTimeout("CherCats_ListCat1()",10);
}

// --------------------------------------------------------------------------------------------
// 1 : requête api du contenu de la cat en cours
// la fonction ajax ira normalement en (2) lorsqu'elle aura fini
// --------------------------------------------------------------------------------------------
function CherCats_ListCat1(categoryindex, categorycontinue){
    if (CherCats_Stop) return; //arrêt demandé par l'utilisateur

    if(!categoryindex) {
        categoryindex=0;
        var category = SousCatFifo[0];    
        document.getElementById('IdResult').value = "Traitement en cours, veuillez patienter (cela peut être un peu long).\n>"
        + SousCatFifoPtrOut + " : "
        + category + "...";
    }else{
        var category = SousCatFifo[categoryindex];
        if(!category){
            CherCats_Scanned = 1;
            clearTimeout(CherCats_TimeOut);
            CherCats_TimeOut = setTimeout("CherCats_ListCat3()",10);
            return;
        }
    } 
    var level = SousCatLevels[category];
    if(!categorycontinue) categorycontinue = '';
    var URL = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query&list=categorymembers'
            + '&cmtitle=' + encodeURIComponent(category) 
            + '&cmlimit=' + CherCats_APIlimit;
            + '&cmnamespace='
            + categorycontinue;

    CherCats_MaxRequestCount++;

    CherCats_ajax.http({ 
          url: URL,
          index:categoryindex,
          cat: category,
          level: level,
          onSuccess:CherCats_ListCat2
    });
}
 
// --------------------------------------------------------------------------------------------
// 2 : récupération des résultats de la requête api
// s'il reste encore des résultats à récupérer sur la même cat, alors retour en (1)
// sinon passage en (1) pour traiter une autre cat
// --------------------------------------------------------------------------------------------
function CherCats_ListCat2(Req, data){    
     if (CherCats_Stop) return; //arrêt demandé par l'utilisateur

     var wiki = document.getElementById('IdWikiCode').checked;
     var fifi = CherCats_RegExp;

     var category = data.cat;
     var level = data.level;
     var categoryindex =data.index;
     var ElementTraitement = Req.responseXML; 
     var Pages = ElementTraitement.getElementsByTagName('cm');
     for(a=0;a<Pages.length;a++){
          var TitrePage = Pages[a].getAttribute('title');
          var NS = parseInt(Pages[a].getAttribute('ns'));
          if(NS==14 && SousCatFifo.indexOf(TitrePage)==-1){
               SousCatLevels[TitrePage] = (level+1);
               if(SousCatLevels[TitrePage]<(SousCatmaxlevel+1)) SousCatFifo.push(TitrePage);              
          }else if(NS==0 && SousCatListeMots.indexOf(TitrePage)==-1){
               if (fifi.test(TitrePage)){
                   SousCatListeMots.push(TitrePage);
               }
          }
     }
     if(CherCats_MaxRequestEnabled && CherCats_MaxRequestCount>CherCats_MaxRequest){
         CherCats_ListCat3();
         return;
     }
     var CatContinue = ElementTraitement.getElementsByTagName('query-continue')[0];
     if(CatContinue){
          //suite de la requête api
          document.getElementById('IdResult').value += ".";
          var AutreRequeteContinue = '&cmcontinue=' + encodeURIComponent(CatContinue.firstChild.getAttribute("cmcontinue"));
          CherCats_ListCat1(categoryindex, AutreRequeteContinue);
     }else{
          categoryindex++
          clearTimeout(CherCats_TimeOut);
          CherCats_TimeOut = setTimeout("CherCats_ListCat1("+categoryindex+",false)",10);
     }
}


// --------------------------------------------------------------------------------------------
// 3 : affichage du résultat
// --------------------------------------------------------------------------------------------
function CherCats_ListCat3() {
    var nbsc = SousCatFifo.length-1;
    var wiki = document.getElementById('IdWikiCode').checked;
    var ResultTxt = "";
    if(CherCats_MaxRequestCount<CherCats_MaxRequest){
        ResultTxt += "Recherche arrêtée : dépassement du nombre de requêtes autorisé\n\n";
    }
    for (var k=0; k<SousCatListeMots.length; k++ ){
        if (wiki){
             ResultTxt += "* [[" + SousCatListeMots[k] + "]]\n";
        }else{
             ResultTxt += SousCatListeMots[k] + "\n";
        }
    }
    ResultTxt = SousCatListeMots.length + " terme(s) trouvé(s) pour  «\u00a0" + document.getElementById('IdJokers').value + "\u00a0» dans «\u00a0"
        + mw.config.get('wgTitle') + "\u00a0» et ses "
        + nbsc + " sous-catégories :\n\n"
        + ResultTxt
        + "\n-------------------\nCatégories analysées :\n";
    for(var k=0;k<SousCatFifo.length;k++){
        ResultTxt += "∙ " + SousCatFifo[k] + "\n";
    }
    document.getElementById('IdResult').value = ResultTxt;
    clearTimeout(CherCats_TimeOut);
    CherCats_TimeOut = setTimeout("CherCats_ListCat99()",10);
}
 
// --------------------------------------------------------------------------------------------
// 99 : bouton rétabli en "lancer"
// --------------------------------------------------------------------------------------------
function CherCats_ListCat99() {
    var OKb = document.getElementById("OKbutton");
    OKb.value = "Chercher";
    OKb.onclick = CherCats_CheckMenu;
}

// --------------------------------------------------------------------------------------------
// Fonction de requête ajax
// --------------------------------------------------------------------------------------------
var CherCats_ajax = {
  http:function(bundle){ 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){ CherCats_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){}}}; 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{ }}
};