Utilisateur:Darkoneko/nekotb fc 1.0.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.
/*
Auteur : user:Darkoneko
tous les id css et fonctions js non génériques sont préfixées de nekotb_fc (pour "NEKO ToolBox - Fusionneur de Contribs") 
   afin d'éviter toute possibilité de conflit de noms avec d'autres scripts.
*/


window.nekotb_fc_addLinkToLeftBar = function () {
   var ul = document.getElementById("p-navigation").getElementsByTagName("ul")[0]
   var li = document.createElement("li")
   li.classList.add("mw-list-item")
   li.appendChild( $("<a>", {href: "#", text: "@Fusion contribs 1.0", onclick: "return nekotb_fc_init()"})[0] )
   ul.appendChild( li ) 
};
$(nekotb_fc_addLinkToLeftBar)



//utilisés pour la coloration des lignes de chaque user
var nekotb_fc_bgcolor_list = new Array(
  "lightblue",
  "yellow",
  "lightgreen",
  "white",
  "#FCC",
  "#CCC",
  "lightyellow",
  "green",
  "orange",
  "#88F"
) //note : pas de virgule après le dernier terme ou ça plante !
var nekotb_fc_user_count = 0;

window.nekotb_fc_init = function () {
   //titre de l'outil
   document.getElementById("firstHeading").firstChild.nodeValue = "Neko toolbox : fusionneur de contribs,  v1.0.4 du 06/09/2015"

   var content = document.getElementById("bodyContent")
   removeChildNodes(content)    //supprimer le contenu initial de la zone 'article".

   var root = content.appendChild( document.createElement("div") )
   root.id = "nekotb_fc_formulaire"

      //choix de date 
   var curDate = new Date();
   root.appendChild( document.createTextNode("Fusionner entre le ") )

   var temp = root.appendChild( document.createElement("input") )
   temp.id = "nekotb_fc_date_debut"
   temp.value = curDate.getFullYear()+"-01-01" //date par défaut


   root.appendChild( document.createTextNode(" et le ") )

   temp = root.appendChild( document.createElement("input") )
   temp.id = "nekotb_fc_date_fin"
   temp.value = curDate.getFullYear()+"-12-31" //date par défaut

   root.appendChild( document.createElement("hr") )

      //ajout des users
   var form = root.appendChild( document.createElement("form") )
   temp = form.appendChild( document.createElement("input") )
   temp.id = "nekotb_fc_user_input"
   form.appendChild( document.createTextNode(" ")  )
   temp = form.appendChild( document.createElement("input")  )
   temp.type = "submit"
   temp.value = "ajouter cet utilisateur"
   
   form.setAttribute("onsubmit", "return nekotb_fc_add_user();");
      
   temp = root.appendChild( document.createElement("ul") ) //la liste des users ajoutés sera affichée dans cet element
   temp.id = "nekotbfc_liste_users"

   root.appendChild( document.createElement("hr") )
   root.appendChild( $("<a>", {href: "#", text: "lancer la fusion", onclick: "return nekotb_fc_show_fusion()"})[0] )

   root.appendChild( document.createElement("hr") )
   root.appendChild( nekotb_fc_make_help() ) //afficher l'aide
};



// l'aide
window.nekotb_fc_make_help = function () {
   var div = document.createElement("div")
   
   div.appendChild( document.createTextNode(
      "Ici l'aide de l'utilitaire. Sera plus détaillé dans une prochaine version... :)"
   ) )
   div.appendChild( document.createElement("br") )
   div.appendChild( document.createElement("br") )
   div.appendChild( document.createTextNode(
      "le fusionneur de contribs permet d'afficher simultanément les contributions de plusieurs utilisateurs,"
      + " classée par ordre antéchronologique. Les contribs de chaque utilisateurs sont différenciées par une couleur de fond différente. Cet outil sert typiquement dans la détection de faux nez"
   ) )
   div.appendChild( document.createElement("br") )

   div.appendChild( document.createTextNode(
      "Les dates sont [jour indiqué inclu] et  à indiquer au format yyyy-mm-dd (année-mois-jour). Vérifiez bien"
   ) )

   return div
};


window.nekotb_fc_add_user = function () {
   var input = document.getElementById("nekotb_fc_user_input")
   var name = input.value
   input.value = ''

   if(name.length < 1 ) return false //si champ vide, on ignore

   var ul = document.getElementById("nekotbfc_liste_users")
   
   var li = ul.appendChild( document.createElement("li") )
   var randomNumber = Math.floor(Math.random()*100001)
   li.id = "nekotb_fc_"+randomNumber //generation d'un id [a priori] unique, comme le nom peut contenir des chars non valides
   li.appendChild( document.createTextNode( name + " ") ) 
   li.setAttribute("onclick", "deleteNodeById('nekotb_fc_"+randomNumber +"')" );

   var img = li.appendChild( document.createElement("img") )
   img.src = "http://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Pictogram_voting_delete.svg/15px-Pictogram_voting_delete.svg.png"
   //on vide le champ 
   return false
};



window.nekotb_fc_back_to_form = function () {
   //supprimer le div de resultat complement
   var div2 = document.getElementById("nekotb_fc_fusion")
   div2.parentNode.removeChild(div2) 

   //afficher le formulaire tel qu'il était au moment de l'envoi (avec les noms selectionnés et date)
   document.getElementById("nekotb_fc_formulaire").style.display = "block"

   return false
};



window.nekotb_fc_show_fusion = function () {
    //recuperer la liste de noms et les dates (/nekotb_fc_date_fin)
   var users = nekotb_fc_get_user_list()
   var fin = document.getElementById("nekotb_fc_date_fin").value
   var debut = document.getElementById("nekotb_fc_date_debut").value

    //ici tests si les valeurs sont exactes. 
   var reg_date = new RegExp(/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/)
   if( ! reg_date.test(fin) || ! reg_date.test(debut) ) {
       alert("une des dates est incorrecte")
       return false
   }
   if( users.length < 1 )  {
       alert("aucun utilisateur selectionné")
       return false
   }

   var newest_timestamp = fin + "T23:59:59Z"
   var oldest_timestamp = debut + "T00:00:00Z" 

   nekotb_fc_user_count = 0 //mise ou remise à 0 du compteur utilisé pour la colorisation

   //masquer le div du formulaire (sans le supprimer)
    document.getElementById("nekotb_fc_formulaire").style.display = "none"

   //creer le div qui contiendra les resultats
   var div2 = document.getElementById("bodyContent").appendChild( document.createElement("div") )
   div2.id = "nekotb_fc_fusion"
   
   div2.appendChild( $("<a>", {href: "#", text: "revenir au formulaire", onclick: "return nekotb_fc_back_to_form()"})[0] )
   div2.appendChild( document.createElement("br") )
   div2.appendChild( document.createTextNode("Fusion du " + debut + " au " + fin + " inclus" ) )

   var tmp = document.createElement("h2") //utilisé pour jouer avec l'affichage en temps réel de la recup de contribs
   tmp.appendChild( document.createTextNode("Récupération des contributions") )
   div2.appendChild( tmp )

   var tmp = document.createElement("ul") //utilisé pour jouer avec l'affichage en temps réel de la recup de contribs
   tmp.id = "nekotb_fc_fusion_user_list"
   div2.appendChild( tmp )

   var editList = get_all_users_contributions( users , oldest_timestamp, newest_timestamp )
   div2.appendChild( document.createElement("br") )

   var tmp = document.createElement("h2") //utilisé pour jouer avec l'affichage en temps réel de la recup de contribs
   tmp.appendChild( document.createTextNode("Liste des contributions fusionnées") )
   div2.appendChild( tmp )

   var ul = document.createElement("ul")
   div2.appendChild( ul ) 
   for(var a = 0, len = editList.length ; a < len ; a++ ) {
       ul.appendChild( nekotb_fc_create_contrib_line(editList[a]) )
   }

   return false
};



window.nekotb_fc_get_user_list = function () {
   var tab = new Array()
   var array_li =  document.getElementById("nekotbfc_liste_users").getElementsByTagName("li")
   for(var a=0, nb = array_li.length ; a < nb ; a++) {
      tab.push( array_li[a].firstChild.nodeValue  )
   }
   return tab
};


window.nekotb_fc_create_contrib_line = function (tab) {
   var li = document.createElement("li")
   li.style.backgroundColor = tab['bgcolor']
  
   var timestamp = tab['timestamp'].replace("T", " à ").replace("Z", "") //mise en page du timestamp
   li.appendChild( $("<a>", {href: "/w/index.php?title="+tab['title']+"&oldid="+tab['revid'], text: timestamp})[0] )
   li.appendChild( document.createTextNode(" (") )
   li.appendChild( $("<a>", {href: "/w/index.php?title="+tab['title']+"&oldid="+tab['revid']+"&diff=prev", text: "diff"})[0] )
   li.appendChild( document.createTextNode(" | ") )
   li.appendChild( $("<a>", {href: "/w/index.php?title="+tab['title']+"&action=history", text: "hist"})[0] )
   li.appendChild( document.createTextNode(") ") )
   if( tab['new'] != null ) {
       var tmp = document.createElement("span") 
       tmp.className = "newpage"
       tmp.appendChild( document.createTextNode("N") )
       li.appendChild( tmp )
   }
   if( tab['minor'] != null ) {
       var tmp = document.createElement("span") 
       tmp.className = "minor"
       tmp.appendChild( document.createTextNode("m") )
       li.appendChild( tmp )
   }
   li.appendChild( document.createTextNode(" ") )
   li.appendChild( $("<a>", {href: "/wiki/"+tab['title'], text: tab['title']})[0] )
   var tmp = document.createElement("span")

   if( tab['comment'] != null && tab['comment'] != "" ) {
      li.appendChild( document.createTextNode(" (") )
      li.appendChild( tmp )
      tmp.className = "comment"
      tmp.appendChild( document.createTextNode(tab['comment']) )
      li.appendChild( document.createTextNode(")") )
   }
   if( tab['top'] != null ) {
       li.appendChild( document.createTextNode(" ") )
       var tmp = document.createElement("span") 
       tmp.className = "mw-uctop"
       tmp.appendChild( document.createTextNode("(dernière)") )
       li.appendChild( tmp )
   }
   return li
};


/*
  retourne un tableau a partir d'une (ou plusieurs) requetes API
  pour la zone de temps à traiter, p_end_time est la date la plus ancienne, p_start_time la plus recente
*/ 
window.get_contribution_list = function (p_user, p_end_time, p_start_time) {
   // choix de la couleur de fond 
   var bgcolor = nekotb_fc_bgcolor_list[nekotb_fc_user_count]
   nekotb_fc_user_count++

   var ul = document.getElementById('nekotb_fc_fusion_user_list') // pour faire joujou avec l'affichage
   var li = document.createElement("li")
   ul.appendChild( li )
   li.style.backgroundColor = bgcolor 
   li.appendChild( document.createTextNode(" ") ) //initialisation du textNode

   var http_request = new XMLHttpRequest()
   http_request.overrideMimeType('text/xml');

   var tableau = new Array()
   var compteur_tableau = 0
 
   var nb_loop = 0 //compteur de protection
   var nb_loop_allowed = 25 //  max de contribs retournée pour un compte = 500 x cette valeur
   var uccontinue = false
   do {
     nb_loop++
     if( nb_loop > nb_loop_allowed ) { //pas plus de z boucles (limite en dur)
        li.firstChild.nodeValue += "Limite atteinte."
        break; 
     }
  
     var continue_do_while = false
     var address = "/w/api.php?format=xml&action=query&rawcontinue=&list=usercontribs&uclimit=500&ucuser=" + p_user + "&ucend=" + p_end_time + "&ucstart=" + p_start_time

     if( uccontinue ) {
        address += "&uccontinue="+uccontinue
     }
     http_request.open('GET', address , false)
     http_request.send(null)
 
     var lignes = http_request.responseXML.documentElement.getElementsByTagName("item")
   
     for (var a = 0, len = lignes.length ; a < len ; a++) { 
        tableau[compteur_tableau] = new Array()
      
        for (var b = 0, len2 = lignes[a].attributes.length ; b < len2; b++) {
            tableau[compteur_tableau][ lignes[a].attributes.item(b).name ] = lignes[a].attributes.item(b).value
        }
        tableau[compteur_tableau]['bgcolor'] = bgcolor //affectée ici pour ne pas avoir à reparser le tableau plus tard
 
        compteur_tableau ++
     }
     li.firstChild.nodeValue = p_user + " : " + tableau.length + " contributions récupérées."

     var query_continue =  http_request.responseXML.documentElement.getElementsByTagName("query-continue")
     if( query_continue && query_continue.length > 0 )  {
        uccontinue = query_continue[0].getElementsByTagName("usercontribs")[0].getAttribute('uccontinue')

        if( uccontinue && uccontinue != 'undefined' ) { //protection
           continue_do_while = true
        }
     }
   }  while( continue_do_while );

   return tableau
};



window.get_all_users_contributions = function (liste, p_oldtime, p_newtime) {
   var contributions = new Array()

   for(var a=0, len = liste.length ; a < len ; a++) {
       var temp = get_contribution_list( liste[a], p_oldtime, p_newtime )
       contributions = contributions.concat(temp);
   }

   contributions.sort(function(a, b){ //tri chronologique descendant
      return b['revid'] -a['revid'] 
   })
   return contributions
};





/* fonctions generiques */
//supprime tous les sous nodes d'un node (pas besoin d'être récursif).
window.removeChildNodes = function (a) {
  while (a.hasChildNodes() )  {
    a.removeChild(a.firstChild);
  }
};

window.deleteNodeById = function (idnode) {
   var node = document.getElementById(idnode)
   node.parentNode.removeChild(node) 
};