Utilisateur:Dr Brains/WatchCategoryMembers.js
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./*
Fonction : Ajoute, dans les pages Catégorie:, un lien permettant de suivre/ne plus suivre toutes les pages contenues dans la catégorie.
Ne concerne que les pages directement incluses dans la catégorie. Les sous-catégories et leur contenu ne sont pas concernées.
{{Projet:JavaScript/Script}}
*/
////////////////////////////////<source lang=javascript><pre><nowiki>
var WatchCategoryMembers_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){ WatchCategoryMembers_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{ }}
};
///////////////////////// LANCEMENT //////////////////////////////
if((mw.config.get('wgNamespaceNumber')==14)&&(mw.config.get('wgAction')=="view"||mw.config.get('wgAction')=="purge")){
addOnloadHook(WatchCategoryMembers_AddLinks);
}
///////////////////////// AJOUT DU LIEN //////////////////////////////
function WatchCategoryMembers_AddLinks(){
var ElementParent = document.getElementById('bodyContent');
if(!ElementParent) ElementParent = document.getElementById('mw_contentholder');
if(!ElementParent) ElementParent = document.getElementById('article');
if(!ElementParent) return;
var Element = document.createElement('div');
Element.id = 'ElementControle';
ElementParent.insertBefore(Element, ElementParent.firstChild);
var Small = document.createElement('small');
ElementParent.insertBefore(Small, Element);
var NouveauLienSuivre = document.createElement('a');
NouveauLienSuivre.innerHTML = 'Suivre';
NouveauLienSuivre.href = "javascript:WatchCategoryMembers(true)";
Small.appendChild(NouveauLienSuivre);
Small.appendChild(document.createTextNode("/"));
var NouveauLienStop = document.createElement('a');
NouveauLienStop.innerHTML = 'Ne plus suivre';
NouveauLienStop.href = "javascript:WatchCategoryMembers(false)";
Small.appendChild(NouveauLienStop);
Small.appendChild(document.createTextNode(" les pages de cette catégorie"));
}
///////////////////////// LISTAGE DES PAGES //////////////////////////////
var PageToWatch = new Array();
var PageToWatchCount = 0;
var PagesInCategory = 0;
var PagesinWatchlist = 0;
var PagesWithError = new Array();
function WatchCategoryMembers(Watch, categorycontinue){
if(!categorycontinue) categorycontinue = '';
var NouvelleRequete = new XMLHttpRequest()
var AdresseRequete = mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?format=xml&action=query&list=categorymembers&cmlimit=499&cmtitle=' + mw.config.get('wgPageName').replace(/&/g, "%26") + categorycontinue;
NouvelleRequete.open("GET", AdresseRequete, true);
NouvelleRequete.onreadystatechange = function() {
if(NouvelleRequete.readyState == 4 && NouvelleRequete.status == 200) {
PagesInCategory++
document.getElementById('ElementControle').innerHTML = 'Listage des pages de la catégorie <b>' + mw.config.get('wgTitle') + '</b>, page ' + PagesInCategory;
var ElementTraitement = NouvelleRequete.responseXML;
var Pages = ElementTraitement.getElementsByTagName('cm');
var AutreRequeteNecessaire = false;
for(a=0;a<Pages.length;a++){
var TitrePage = Pages[a].getAttribute("title");
if(TitrePage.indexOf(mw.config.get('wgFormattedNamespaces')[14]+':')==-1){
PageToWatch[PageToWatchCount] = TitrePage;
PageToWatchCount++
}
}
var AutreRequete = ElementTraitement.getElementsByTagName('query-continue')[0];
if(AutreRequete){
AutreRequeteNecessaire = true;
var AutreRequeteContinue = '&cmcontinue=' + AutreRequete.getElementsByTagName("categorymembers")[0].getAttribute("cmcontinue");
}
if(AutreRequeteNecessaire==true){
WatchCategoryMembers(Watch,AutreRequeteContinue);
}else{
WatchCategoryMembers_getPageToken(0, Watch);
}
}
}
NouvelleRequete.send(null);
}
///////////////////////// AJOUT/RETRAIT DE LA LISTE DE SUIVI //////////////////////////////
// Récupération du token
function WatchCategoryMembers_getPageToken(position, Watch){
if(!position) position = 0;
var PageASuivre = PageToWatch[position];
if(!PageASuivre){
WatchCategoryMembers_AllPageInWatchlist(Watch);
return;
}
var AdresseRequete = mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?format=xml&action=query&prop=info&titles='+encodeURIComponent(PageASuivre)+"&intoken=watch";
var NouvelleRequete = new XMLHttpRequest();
NouvelleRequete.open("GET", AdresseRequete, true);
NouvelleRequete.onreadystatechange = function() {
if(NouvelleRequete.readyState == 4 && NouvelleRequete.status == 200) {
var token = false;
try{
var ObjectXML = NouvelleRequete.responseXML;
var PageInfos = ObjectXML.getElementsByTagName('page')[0];
token = PageInfos.getAttribute('watchtoken');
//token=token.split("+\\").join("");
}catch(e){}
if(token){
WatchCategoryMembers_AddPageToWatchlist(position, Watch, token);
}else{
document.getElementById('ElementControle').innerHTML = '<span class="error">Erreur de récupération du token pour la page <b>« ' + PageASuivre + ' »</b>.</span>';
PagesWithError.push(PageASuivre);
WatchCategoryMembers_getPageToken((position+1), Watch);
}
}
}
NouvelleRequete.send(null);
}
// Ajout/retrait de la liste de suivi
function WatchCategoryMembers_AddPageToWatchlist(position, Watch, token){
if(!position) position = 0;
var PageASuivre = PageToWatch[position];
if(!PageASuivre){
WatchCategoryMembers_AllPageInWatchlist(Watch);
return;
}
var Action = ( Watch ? "" : "&unwatch=1" );
var Text = ( Watch ? "ajoutée à" : "retirée de" );
var requestEditData = 'title=' + encodeURIComponent(PageASuivre)
+ '&token=' + encodeURIComponent(token)
+ Action
var headers = {"Content-Type": "application/x-www-form-urlencoded"};
WatchCategoryMembers_ajax.http({url : mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=watch',
method : "POST",
headers : headers,
data : requestEditData
});
document.getElementById('ElementControle').innerHTML = 'La page <b>« ' + PageASuivre + ' »</b> a été '+Text+' votre liste de suivi.';
PagesinWatchlist++
WatchCategoryMembers_getPageToken((position+1), Watch);
}
///////////////////////// MESSAGE DE FIN //////////////////////////////
function WatchCategoryMembers_AllPageInWatchlist(Watch){
document.getElementById('ElementControle').innerHTML = '';
var Action = ( Watch ? "ajoutées à" : "retirées de" );
document.getElementById('ElementControle').innerHTML += PagesinWatchlist + ' pages ont été '+Action+' votre liste de suivi.';
if(PagesWithError.length!=0){
var Error = 'Une erreur est apparue pour '+PagesWithError.length+' page'+(PagesWithError.length==1 ? '':'s') +' :<ul>'
for(var a=0,l=PagesWithError.length;a<l;a++){
Error += '<li>'+PagesWithError[a]+'</li>';
}
Error += '</ul>';
document.getElementById('ElementControle').innerHTML += Error;
}
document.getElementById('ElementControle').innerHTML += '<br /><p><b><a href="javascript:window.location=document.URL;">Recharger la page</a></b></p>';
}
////////////////////////////////////////////////////////////////</nowiki></pre></source>