Usuário:Elfix/common.js: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Elfix (discussão | contribs)
new
 
Elfix (discussão | contribs)
-
 
Linha 1:
/*
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 )
}
addOnloadHook(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"
) //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)
}