Suradnik:Elfix/common.js

Izvor: Wikipedija

Napomena: Nakon objave možda ćete trebati očistiti međuspremnik svog preglednika kako biste vidjeli promjene.

  • Firefox / Safari: držite Shift i pritisnite Reload, ili pritisnite bilo Ctrl-F5 ili Ctrl-R (⌘-R na Macu)
  • Google Chrome: pritisnite Ctrl-Shift-R (⌘-Shift-R na Macu)
  • Internet Explorer / Edge: držite Ctrl i kliknite Refresh, ili pritisnite Ctrl-F5
  • Opera: pritisnite Ctrl-F5.
/* petites fonctions pratiques  - Darkoneko, 09/01/2008 */
 
//créé un lien et le retourne.
//le parametre onclick est facultatif.
function createAdressNode(href, texte, onclick) {
  var a = document.createElement('a')
  a.href = href
  a.appendChild(document.createTextNode( texte ) )
  if(arguments.length == 3) {   a.setAttribute("onclick", onclick )  }
 
  return a
}

/*
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.
*/
 
 
function nekotb_fc_addLinkToLeftBar() {
   var ul = document.getElementById("p-navigation").getElementsByTagName("ul")[0]
   var li = document.createElement("li")
   li.appendChild( createAdressNode( '#', '@Fusion contribs', 'return nekotb_fc_init()' ) )
   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",
  "fuchsia",
  "#4BFF00",
  "#3F345E",
  "#7FFAEA",
  "#A5F700"
) //note : pas de virgule après le dernier terme ou ça plante !
var nekotb_fc_user_count = 0;
 
function nekotb_fc_init() {
   //titre de l'outil
   document.getElementById("firstHeading").firstChild.nodeValue = "Neko toolbox : fusionneur de contribs,  v1.0.2 du 03/12/2010"
 
   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 
   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( createAdressNode("#", "lancer la fusion", "return nekotb_fc_show_fusion()") )
 
   root.appendChild( document.createElement("hr") )
   root.appendChild( nekotb_fc_make_help() ) //afficher l'aide
}
 
 
 
// l'aide
function nekotb_fc_make_help() {
   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
}
 
 
function nekotb_fc_add_user() {
   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
}
 
 
 
function nekotb_fc_back_to_form() {
   //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
}
 
 
 
function nekotb_fc_show_fusion() {
    //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. 
   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( createAdressNode("#", "revenir au formulaire", "return nekotb_fc_back_to_form()") )
   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
}
 
 
 
function nekotb_fc_get_user_list() {
   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
}
 
 
function nekotb_fc_create_contrib_line(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( createAdressNode( "/w/index.php?title="+tab['title']+"&oldid="+tab['revid'], timestamp ) )
   li.appendChild( document.createTextNode(" (") )
   li.appendChild( createAdressNode( "/w/index.php?title="+tab['title']+"&oldid="+tab['revid']+"&diff=prev", "diff" ) )
   li.appendChild( document.createTextNode(" | ") )
   li.appendChild( createAdressNode( "/w/index.php?title="+tab['title']+"&action=history", "hist" ) )
   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( createAdressNode( "/wiki/"+tab['title'], tab['title'] ) )
   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
*/ 
function get_contribution_list(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 = sajax_init_object()
   http_request.overrideMimeType('text/xml');
 
   var tableau = new Array()
   var compteur_tableau = 0
 
   var nb_loop = 0 //compteur de protection
   var nb_loop_allowed = 15 //  max de contribs retournée pour un compte = 500 x cette valeur
   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&list=usercontribs&uclimit=500&ucuser=" + p_user + "&ucend=" + p_end_time + "&ucstart=" + p_start_time
 
     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."
 
     query_continue =  http_request.responseXML.documentElement.getElementsByTagName("query-continue")
     if( query_continue && query_continue.length > 0 )  {
        p_start_time = query_continue[0].getElementsByTagName("usercontribs")[0].getAttribute('ucstart')
        if( p_start_time && p_start_time != 'undefined' ) { //protection
           continue_do_while = true
        }
     }
   }  while( continue_do_while );
 
   return tableau
}
 
 
 
function get_all_users_contributions( 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).
function removeChildNodes(a) {
  while (a.hasChildNodes() )  {
    a.removeChild(a.firstChild);
  }
}
 
function deleteNodeById(idnode) {
   var node = document.getElementById(idnode)
   node.parentNode.removeChild(node) 
}