Utilisateur:Chphe/SuiviCat.js
Un article de Wikipédia, l'encyclopédie libre.
Note : Après avoir publié la page, vous devrez forcer son rechargement pour voir les changements : Mozilla / Konqueror / Firefox : Shift-Ctrl-R, Internet Explorer / Opera : Ctrl-F5, Safari : Cmd-R.
/** * Présentation : [[:fr:Utilisateur:Chphe/SuiviCat]] * Auteur : Chphe * [[Catégorie:MediaWiki:Fonction Monobook en JavaScript]] */ //////////////////////ZONE PERSONNALISABLE////////////////////// var suivicat_cat = "Cat(%C3%A9|é)gorie"; // selon la langue de l'interface (fr -> Catégorie = Cat%C3%A9gorie ; Catégorie pour IE 6) var suivicat_tab_aff_sv = ["actu", "préc", "raz", "indef"]; var suivicat_tab_aff_types = {"pages":"p", "subcats":"sc", "files":"f", "size": "t"}; /////////////////FIN DE LA ZONE PERSONNALISABLE///////////////// var suivicat_server = wgServer.replace(/http:\/\//, ""); var suivicat_tab_types = ["pages", "subcats", "files"]; //et "size" var suivicat_estIE; var suivicat_div_sauveg_IE; var suivicat_compteur; var suivicat_tableau; var suivicat_dateActu; var suivicat_datePred; var suivicat_div_liste; function suivicat_initialiserLireVal() { if(suivicat_estIE) suivicat_div_sauveg_IE.load("sc_sauveg_IE"); } function suivicat_finaliserEcrireVal() { if(suivicat_estIE) suivicat_div_sauveg_IE.save("sc_sauveg_IE"); } function suivicat_lireVal(nom) { var res; if(typeof globalStorage != "undefined") //FF { res = globalStorage[suivicat_server].getItem(nom); }else if(suivicat_estIE) //IE { res = suivicat_div_sauveg_IE.getAttribute(nom.replace(/\s/g, "_").replace(/%/g, "P")); } if(res) return res+""; // pour éviter retour par référence else return null; } function suivicat_ecrireVal(nom, val) { if(typeof globalStorage != "undefined") //FF { globalStorage[suivicat_server].setItem(nom, val); }else if(suivicat_estIE) //IE { if(val) suivicat_div_sauveg_IE.setAttribute(nom.replace(/\s/g, "_").replace(/%/g, "P"), val); else suivicat_div_sauveg_IE.removeAttribute(nom.replace(/\s/g, "_").replace(/%/g, "P")); } } function suivicat_concatNb(ligneTab, suff) // jamais utilisé avec le suffixe "_ds" { var conc = ligneTab["pages"+suff]+"|"+ligneTab["subcats"+suff]+"|"+ligneTab["files"+suff]+"|"+ligneTab["size"+suff]+"|"; if(suff == "_pr") return conc+suivicat_datePred; else return conc+suivicat_dateActu; } function suivicat_deconcatNb(ligneTab, suff, chaine) { var tab = chaine.split("|"); ligneTab["pages"+suff] = tab[0]; ligneTab["subcats"+suff] = tab[1]; ligneTab["files"+suff] = tab[2]; ligneTab["size"+suff] = tab[3]; if(suff == "_ds") ligneTab.date_ds = tab[4]; } function suivicat_affichageVal(val) { if(val>0) { var ts2 = document.createElement("span"); ts2.className='mw-plusminus-pos'; ts2.innerHTML = "+"+val; return ts2; }else if(val<0) { var ts2 = document.createElement("span"); ts2.className='mw-plusminus-neg'; ts2.innerHTML = val; return ts2; }else { var texte_0 = document.createElement("small"); texte_0.innerHTML = "0"; return texte_0; } } function suivicat_majCase(laCase, ligneTableau, type) { if(ligneTableau.cptOuDet == "cpt") { var nbActu = ligneTableau[type]; var nbPred = ligneTableau[type+"_pr"]; var nbDerS = ligneTableau[type+"_ds"]; laCase.innerHTML += " - <b>"+suivicat_tab_aff_types[type]+"</b> : "+nbActu; laCase.appendChild(document.createTextNode(" : ")); if(nbPred) { var diff = parseInt(nbActu)-parseInt(nbPred); laCase.appendChild(suivicat_affichageVal(diff)); } else { laCase.appendChild(document.createTextNode(".")); } laCase.appendChild(document.createTextNode(" / ")); if(nbDerS) { var diff = parseInt(nbActu)-parseInt(nbDerS); laCase.appendChild(suivicat_affichageVal(diff)); } else { laCase.appendChild(document.createTextNode(".")); } }else { laCase.appendChild(document.createTextNode(" - ")); var b = document.createElement("b"); b.innerHTML = suivicat_tab_aff_types[type]; laCase.appendChild(b); if(type != "size") laCase.appendChild(document.createTextNode(" : "+ligneTableau["tabMem"+type].length)); else laCase.appendChild(document.createTextNode(" : "+(ligneTableau.tabMempages.length+ligneTableau.tabMemsubcats.length+ligneTableau.tabMemfiles.length))); if( (type != "size" && ligneTableau["memEnPlus"+type]) || (type == "size" && ligneTableau.memEnPluspages) ) { laCase.appendChild(document.createTextNode(" : ")); var lien_aff = document.createElement("a"); lien_aff.style.color = "black"; lien_aff.href = "javascript:;"; lien_aff.onclick = function(){ suivicat_afficherDiffMembres(ligneTableau, type);} laCase.appendChild(lien_aff); var np; if(type != "size") np = ligneTableau["memEnPlus"+type].length; else np = ligneTableau.memEnPluspages.length + ligneTableau.memEnPlussubcats.length + ligneTableau.memEnPlusfiles.length; if(type != "size") nm = ligneTableau["memEnMoins"+type].length; else nm = ligneTableau.memEnMoinspages.length + ligneTableau.memEnMoinssubcats.length + ligneTableau.memEnMoinsfiles.length; lien_aff.appendChild(suivicat_affichageVal(np)); lien_aff.appendChild(document.createTextNode(" - ")); lien_aff.appendChild(suivicat_affichageVal(-nm)); } else { laCase.appendChild(document.createTextNode(" : . - .")); } } } function suivicat_miseAJourToutesLesDerS(valActu) { suivicat_initialiserLireVal(); var liste = suivicat_div_liste.getElementsByTagName("tr"); for(var i=0; i<suivicat_tableau.length; i++) { if( suivicat_tableau[i].cptOuDet && (valActu != 1 || suivicat_tableau[i].cptOuDet == "cpt") ) { suivicat_miseAJourDerS_b(suivicat_tableau[i], valActu); } } suivicat_finaliserEcrireVal() } function suivicat_miseAJourDerS(ligneTableau, valActu) { suivicat_initialiserLireVal(); suivicat_miseAJourDerS_b(ligneTableau, valActu); suivicat_finaliserEcrireVal(); } function suivicat_miseAJourDerS_b(ligneTableau, valActu) { var tab_tmp = ligneTableau.item.getElementsByTagName("span"); var nouv_texte = tab_tmp[tab_tmp.length-1]; if(!nouv_texte) return; nouv_texte.style.color = "orange"; var suf=""; var debNom = "sc"+ligneTableau.nomCat; if(valActu==0) { nouv_texte.innerHTML = "<small>"+suivicat_dateActu+"</small>"; }else if(valActu==1) { suf = "_pr"; nouv_texte.innerHTML = "<small>"+suivicat_datePred+"</small>"; } else //valActu==2 { nouv_texte.innerHTML = "<small><i>"+suivicat_tab_aff_sv[3]+"</i></small>"; } if(ligneTableau.cptOuDet == "cpt") { if(valActu <= 1) suivicat_ecrireVal(debNom+"cpt_ds", suivicat_concatNb(ligneTableau, suf)); else suivicat_ecrireVal(debNom+"cpt_ds", null); } else { if(valActu == 0) // et pas valActu <= 1, car pas de sauvegarde pour pred (valActu = 1) { var texte_sv = ""; for(var i = 0; i<suivicat_tab_types.length; i++) { var tabMem = ligneTableau["tabMem"+suivicat_tab_types[i]]; if(tabMem.length == 0) texte_sv += "suivicat_vide|||"; else texte_sv += (tabMem.join("||") + '|||'); } suivicat_ecrireVal(debNom+"det_ds", texte_sv+suivicat_dateActu); } else { suivicat_ecrireVal(debNom+"det_ds", null); } } } function suivicat_decrCompteur() { suivicat_compteur--; if(suivicat_compteur == 0) { suivicat_finaliserEcrireVal(); var liste_titres = suivicat_div_liste.getElementsByTagName("th"); if(liste_titres.length < 2) return; //lien sauvegarde actu var lien = document.createElement("a"); lien.href = "javascript:;"; lien.onclick = function(){ suivicat_miseAJourToutesLesDerS(0);} lien.innerHTML=suivicat_tab_aff_sv[0]+" : <small>"+suivicat_dateActu+"</small>"; liste_titres[1].appendChild(lien); liste_titres[1].appendChild(document.createTextNode(" - ")); //lien sauvegarde pred if(suivicat_datePred) { var lien_p = document.createElement("a"); lien_p.href = "javascript:;"; lien_p.onclick = function(){ suivicat_miseAJourToutesLesDerS(1);} lien_p.innerHTML=suivicat_tab_aff_sv[1]+" : <small>"+suivicat_datePred+"</small>"; liste_titres[1].appendChild(lien_p); }else { var pas_lien_b = document.createElement("small"); pas_lien_b.innerHTML = "<i>"+suivicat_tab_aff_sv[3]+"</i>"; liste_titres[1].appendChild(pas_lien_b); } liste_titres[1].appendChild(document.createTextNode(" - ")); //lien remise à zéro sauvegarde var lien_raz = document.createElement("a"); lien_raz.href = "javascript:;"; lien_raz.onclick = function(){ suivicat_miseAJourToutesLesDerS(2);} lien_raz.innerHTML=suivicat_tab_aff_sv[2]; liste_titres[1].appendChild(lien_raz); } } function suivicat_afficherDiffMembres(ligneTableau, type) { var tableDiff = document.getElementById("suivicat_diff"); if(tableDiff) { tableDiff.parentNode.removeChild(tableDiff); } caseTitre = document.createElement("th"); caseTitre.colSpan="2"; var ligneTitre = document.createElement("tr"); ligneTitre.appendChild(caseTitre); listeP = document.createElement("ul"); var caseP = document.createElement("td"); caseP.appendChild(listeP); listeM = document.createElement("ul"); var caseM = document.createElement("td"); caseM.appendChild(listeM); var ligneDiff = document.createElement("tr"); ligneDiff.appendChild(caseP); ligneDiff.appendChild(caseM); var tbody = document.createElement("tbody"); tbody.appendChild(ligneTitre); tbody.appendChild(ligneDiff); tableDiff = document.createElement("table"); tableDiff.id = "suivicat_diff"; tableDiff.className = "wikitable"; tableDiff.appendChild(tbody); ligneTableau.item.appendChild(tableDiff); var a = document.createElement("a"); a.href = "javascript:;"; a.onclick = function(){ tableDiff.parentNode.removeChild(tableDiff); } a.innerHTML = "[–]"; var div_a = document.createElement("div"); if(suivicat_estIE) div_a.style.styleFloat= "right"; //IE else div_a.style.cssFloat= "right"; //FF div_a.appendChild(a); caseTitre.appendChild(div_a); caseTitre.appendChild(document.createTextNode(type+" ")); for(var t=0; t<suivicat_tab_types.length; t++) { if(type != "size" && type != suivicat_tab_types[t]) continue; var tabPlus = ligneTableau["memEnPlus"+suivicat_tab_types[t]]; var tabMoins = ligneTableau["memEnMoins"+suivicat_tab_types[t]]; for(var i=0; i<tabPlus.length; i++) { var a = document.createElement("a"); a.href = "/wiki/"+tabPlus[i]; a.title = tabPlus[i]; a.innerHTML = tabPlus[i]; var li = document.createElement("li"); li.innerHTML = '<font style="color:green">+</span>'; li.appendChild(a); listeP.appendChild(li); } for(var i=0; i<tabMoins.length; i++) { var a = document.createElement("a"); a.href = "/wiki/"+tabMoins[i]; a.title = tabMoins[i]; a.innerHTML = tabMoins[i]; var li = document.createElement("li"); li.innerHTML = '<font style="color:red">-</span>'; li.appendChild(a); listeM.appendChild(li); } } } function suivicat_affLiensMaj(item, ligneTableau) { item.appendChild(document.createTextNode(" - ")); //date dernière sauvegarde var texte_date_DerS = document.createElement("small"); if(ligneTableau.date_ds) texte_date_DerS.innerHTML = "<span>"+ligneTableau.date_ds+"</span>"; else texte_date_DerS.innerHTML = "<span><i>"+suivicat_tab_aff_sv[3]+"</i></span>"; item.appendChild(texte_date_DerS); item.appendChild(document.createTextNode(" ")); //lien sauvegarde actu var lien = document.createElement("a"); lien.href = "javascript:;"; lien.onclick = function(){ suivicat_miseAJourDerS(ligneTableau, 0);} lien.innerHTML=suivicat_tab_aff_sv[0]; item.appendChild(lien); item.appendChild(document.createTextNode(" ")); if(ligneTableau.cptOuDet == "cpt") { //lien sauvegarde pred if(suivicat_datePred) { var lien_p = document.createElement("a"); lien_p.href = "javascript:;"; lien_p.onclick = function(){ suivicat_miseAJourDerS(ligneTableau, 1);} lien_p.innerHTML=suivicat_tab_aff_sv[1]; item.appendChild(lien_p); }else { var pas_lien_b = document.createElement("small"); pas_lien_b.innerHTML = "<i>"+suivicat_tab_aff_sv[3]+"</i>"; item.appendChild(pas_lien_b); } item.appendChild(document.createTextNode(" ")); } //lien remise à zéro sauvegarde var lien_raz = document.createElement("a"); lien_raz.href = "javascript:;"; lien_raz.onclick = function(){ suivicat_miseAJourDerS(ligneTableau, 2);} lien_raz.innerHTML="<small>"+suivicat_tab_aff_sv[2]+"</small>"; item.appendChild(lien_raz); } function suivicat_nbPages(item, nomCat, mode_cpt) { var num = suivicat_tableau.length; suivicat_tableau[num]=new Object(); var ligneTableau = suivicat_tableau[num]; if(mode_cpt) // on compte les pages, subcats, fichiers { var sc_http = new sajax_init_object() ; sc_http.open('GET', wgScriptPath + "/api.php?action=query&list=allcategories&acfrom=" + nomCat + "&acprop=size&aclimit=1&format=json", true); sc_http.onreadystatechange = function() { if(typeof sc_http == "undefined") return; if (sc_http.readyState == 4) { ligneTableau.cptOuDet = "cpt"; ligneTableau.item = item; ligneTableau.nomCat = nomCat; var texte = eval('('+sc_http.responseText+')'); var texteb = texte.query.allcategories[0]; if(texteb) { ligneTableau.pages = texteb.pages; ligneTableau.subcats = texteb.subcats; ligneTableau.files = texteb.files; ligneTableau.size = texteb.size; } //récupérer sauvegarde visite précédente var nb = suivicat_lireVal("sc"+nomCat+"cpt_pr"); if(nb) { suivicat_deconcatNb(ligneTableau, "_pr", nb); } suivicat_ecrireVal("sc"+nomCat+"cpt_pr", suivicat_concatNb(ligneTableau, "")); //récupérer dernière sauvegarde var nb = suivicat_lireVal("sc"+nomCat+"cpt_ds"); if(nb) { suivicat_deconcatNb(ligneTableau, "_ds", nb); } for(var i=0; i<suivicat_tab_types.length; i++) { suivicat_majCase(item, ligneTableau, suivicat_tab_types[i]); } suivicat_majCase(item, ligneTableau, "size"); suivicat_affLiensMaj(item, ligneTableau); suivicat_decrCompteur(); } }; sc_http.send(null); } else // on cherche les différences dans les membres des listes de pages, subcats, fichiers { var sc_http = new sajax_init_object() ; var url = wgScriptPath + "/api.php?action=query&list=categorymembers&cmtitle=Category:"+nomCat+"&cmlimit=500&format=json"; sc_http.open('GET', url, true); sc_http.onreadystatechange = function() { if(typeof sc_http == "undefined") return; if (sc_http.readyState == 4) { var texte = eval('('+sc_http.responseText+')'); var liste = texte.query.categorymembers; while(texte["query-continue"] != null) { var sc_http_cont = new sajax_init_object() ; sc_http_cont.open('GET', url+"&cmcontinue="+texte["query-continue"].categorymembers.cmcontinue, false); sc_http_cont.send(null); texte = eval('('+sc_http_cont.responseText+')'); liste = liste.concat(texte.query.categorymembers); } ligneTableau.cptOuDet = "det"; ligneTableau.item = item; ligneTableau.nomCat = nomCat; ligneTableau.tabMempages = new Array(); ligneTableau.tabMemsubcats = new Array(); ligneTableau.tabMemfiles = new Array(); for(var i=0; i<liste.length; i++) { if(liste[i].ns == "14") ligneTableau.tabMemsubcats.push(liste[i].title); else if(liste[i].ns == "6") ligneTableau.tabMemfiles.push(liste[i].title); else ligneTableau.tabMempages.push(liste[i].title); // ns à 0 ou 10 (modèle), ou autres } ligneTableau.tabMempages.sort(); ligneTableau.tabMemsubcats.sort(); ligneTableau.tabMemfiles.sort(); var donnees_ds = suivicat_lireVal("sc"+nomCat+"det_ds"); if(donnees_ds) { var tab_ds = donnees_ds.split("|||"); for(var t=0; t<suivicat_tab_types.length; t++) { var v_type = suivicat_tab_types[t]; var ancTabMembres; if(tab_ds[t] == "suivicat_vide") ancTabMembres = new Array(); else ancTabMembres = tab_ds[t].split("||"); var tabMembres = ligneTableau["tabMem"+v_type]; ligneTableau["memEnPlus"+v_type] = new Array(); ligneTableau["memEnMoins"+v_type] = new Array(); var i=0 ; var j=0; while(i<tabMembres.length && j<ancTabMembres.length) { if(tabMembres[i] == ancTabMembres[j]) { i++; j++;} else if(tabMembres[i] < ancTabMembres[j]) { ligneTableau["memEnPlus"+v_type].push(tabMembres[i] ); i++;} else { ligneTableau["memEnMoins"+v_type].push(ancTabMembres[j]); j++;} } while(i<tabMembres.length) {ligneTableau["memEnPlus"+v_type].push(tabMembres[i] ); i++;} while(j<ancTabMembres.length) {ligneTableau["memEnMoins"+v_type].push(ancTabMembres[j]); j++;} } ligneTableau.date_ds = tab_ds[3]; } for(var t=0; t<suivicat_tab_types.length; t++) { suivicat_majCase(item, ligneTableau, suivicat_tab_types[t]); } suivicat_majCase(item, ligneTableau, "size"); suivicat_affLiensMaj(item, ligneTableau); suivicat_decrCompteur(); } }; sc_http.send(null); } } function suivicat_lancer() { suivicat_div_liste = document.getElementById("suivicat"); if(! suivicat_div_liste) return; suivicat_estIE = (navigator.appName == "Microsoft Internet Explorer"); if(suivicat_estIE) { suivicat_div_sauveg_IE = document.createElement("div"); suivicat_div_sauveg_IE.style.display = "none"; suivicat_div_sauveg_IE.style.behavior = "url('#default#userData')" suivicat_div_liste.appendChild(suivicat_div_sauveg_IE); } suivicat_tableau = new Array(); suivicat_initialiserLireVal(); suivicat_dateActu = new Date(); suivicat_dateActu = suivicat_dateActu.getDate()+"/"+(parseInt(suivicat_dateActu.getMonth())+1)+"/"+suivicat_dateActu.getFullYear()+" ("+suivicat_dateActu.getHours()+":"+suivicat_dateActu.getMinutes()+":"+suivicat_dateActu.getSeconds()+")"; suivicat_datePred = suivicat_lireVal("sc_datePred"); suivicat_ecrireVal("sc_datePred", suivicat_dateActu); if(typeof categoryTreeLoadChildren == 'function') // est-ce que la fonction existe ? { // http://fr.wikipedia.org/w/extensions/CategoryTree/CategoryTree.js var f_reg = /^function categoryTreeLoadChildren\(([^\)]*)\) {(.*)}$/; var tab_f = f_reg.exec(categoryTreeLoadChildren.toString().replace(/\n/g, " ").replace(/div\); *}/, "div); };")); // le dernier replace est pour ajouter un ";" à la fin de retryLink.onclick=... var code_f = tab_f[2].replace(/result;/, "result; suivicat_depliementCat(cat, div);"); categoryTreeLoadChildren = new Function (tab_f[1], code_f); } var liste = suivicat_div_liste.getElementsByTagName("tr"); var reg_cat = new RegExp("^.*/wiki/"+suivicat_cat+":"); suivicat_compteur = 1; for(var i=0; i<liste.length; i++) { var t_l = liste[i].getElementsByTagName("td"); var ligne = t_l[1]; if(!ligne) {continue;} var mode_cpt = (t_l[0].innerHTML == ""); for(var c=0; c<ligne.childNodes.length; c++) { var ch = ligne.childNodes[c]; if(ch.nodeName.toLowerCase()=="a" && reg_cat.test(ch.href)) { suivicat_compteur++; suivicat_nbPages(ligne, ch.href.replace(reg_cat, ""), mode_cpt); break; }else if(ch.className=="CategoryTreeTag") { var tab = ch.getElementsByTagName("div"); for(var e=0; e<tab.length; e++) if(tab[e].className == "CategoryTreeItem") { suivicat_compteur++; suivicat_nbPages(tab[e], tab[e].childNodes[2].href.replace(reg_cat, ""), mode_cpt); } break; } } } suivicat_decrCompteur(); } function suivicat_depliementCat(catPere, div) { var tab_d = div.getElementsByTagName("div"); var mode_cpt; for(var e=0; e<suivicat_tableau.length; e++) if(suivicat_tableau[e].nomCat == catPere) { mode_cpt = (suivicat_tableau[e].cptOuDet=="cpt"); break; } var reg_cat = new RegExp("^.*/wiki/"+suivicat_cat+":"); for(var i =0; i<tab_d.length; i++) if(tab_d[i].className == "CategoryTreeItem") suivicat_nbPages(tab_d[i], tab_d[i].childNodes[1].href.replace(reg_cat, ""), mode_cpt); } addOnloadHook(function() { if(wgTitle.match("/SuiviCat") && wgAction=="view") suivicat_lancer(); });