Wikiversità:Monobook.js/Catwatch.js

Da Wikiversità, l'apprendimento libero.

/* Il "Controllo categorie" (grazie a wikipedia:en:User:ais523 che per primo ha avuto l'idea) aggiunge elementi alla watchlist se una pagina viene aggiunta ad una categoria (ed e' ancora presente al momento del controllo). Questo evento apparira' solo se un'altra pagina della watchlist e' stata modificata quel giorno (se l'aggiunta e' l'unica cosa successa non apparira').
La ricategorizzazione di una pagina appartenente ad una categoria osservata verra' segnalata anche se la modifica riguardava un'altra categoria (a meno che quella osservata venga cancellata).
I cancellamenti dalla categoria controllata non verranno visualizzati.
Le categorie contenenti piu' di 100 pagine non vengono gestite per problemi di sovraccarico dei server e ne sarete avvisati tramite popup.
Se cercate di monitorare una categoria inesistente o vuota verrete avvisati per correggere errori di battitura.
L'ora delle modifiche si riferisce a quella dei server, potrebbe essere differente da quella locale.

Per ogni pagina aggiunta verranno mostrati i seguenti link:

  • Alla relativa categoria
  • Alla pagina aggiunta
  • All'ultima modifica della pagina
  • Alla cronologia della pagina

Alcune pagine provocano dei falsi positivi, vengono mostrate come se fosse stata cambiata la categorizzazione, mentre in realta' non e' successo. E' un problema dovuto al sistema di query interno e non si riesce a trovare la soluzione. Le pagine "incriminate" sono sempre le stesse, imparerete a riconoscerle.

*/

//=== inizio: CATEGORY WATCH ===
var cwwpajax;
// From [[WP:US]] mainpage (wpajax renamed to cwwpajax)
cwwpajax={
   download:function(bundle) {
      // mandatory: bundle.url
      // optional:  bundle.onSuccess (xmlhttprequest, bundle)
      // optional:  bundle.onFailure (xmlhttprequest, bundle)
      // optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure

      var x = window.XMLHttpRequest ? new XMLHttpRequest()
      : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP")
      : false;

      if (x) {
         x.onreadystatechange=function() {
            x.readyState==4 && cwwpajax.downloadComplete(x,bundle);
         };
         x.open("GET",bundle.url,true);
         x.send(null); 
      }
      return x;
   },

   downloadComplete:function(x,bundle) {
      x.status==200 && ( bundle.onSuccess && bundle.onSuccess(x,bundle) || true )
      || ( bundle.onFailure && bundle.onFailure(x,bundle) || alert(x.statusText));
   }
};

//Aggiunge le catwatch alla watchlist
//xmlreq=risultato della query (es:http://it.wikipedia.org/w/query.php?what=category&cptitle=Guerre%20Stellari&cplimit=100&cpextended&format=xml)
//data=nome della categoria
function cwOntoWatchlist(xmlreq, data)
{
   var a=xmlreq.responseText;
   var c=data.catname;
   var i;
   if(a.indexOf("<error>")!=-1) //cat e' vuota, niente da fare qui
   {
      var inoltre;
      if (c.indexOf("Categoria:")!=-1)
         inoltre="Ti ricordo che non va inserita la parte \"Categoria:\"";
      else
         inoltre="";
      if (showWarning.indexOf("disabilita")==-1)
         alert("La categoria \""+c+"\" sembra vuota.\nControlla se il nome e' scritto giusto.\n"+inoltre);
      return;
   }
   if(a.indexOf("<category next=")!=-1) //cat ha piu' di 100 elementi, i risultati verranno eliminati
   {
      if (showWarning.indexOf("disabilita")==-1)
         alert("La categoria \""+c+"\" ha piu' di 100 elementi e non puo' essere monitorata.\n"+
               "Considera la possibilita' di dividerla in sottocategorie");
      return;
   }
   a=a.split("<timestamp>");
   var latesttime=0;
   var latestpage="";
   var listaPagine=new Array();
   var listaTime=new Array();
   var temp, temp2;
   var counter=0;
   for(i in a)
   {
      temp=a[i].indexOf("</timestamp>");
      if(temp!=-1)
      {
         temp=new Number(a[i].substr(0,temp));
         if(temp>latesttime)
         {
            listaTime[counter]=temp;
            a[i]=a[i].substr(a[i].indexOf("<title>")+7);
            listaPagine[counter]=a[i].substr(0,a[i].indexOf("</title>"));
            counter++;
         }
      }
   }

   var dates=document.getElementsByTagName("h4"); //recupera le date dalla pagina della watchlist
   var monthname=new Array();
   monthname['01']="gen";
   monthname['02']="feb";
   monthname['03']="mar";
   monthname['04']="apr";
   monthname['05']="mag";
   monthname['06']="giu";
   monthname['07']="lug";
   monthname['08']="ago";
   monthname['09']="set";
   monthname['10']="ott";
   monthname['11']="nov";
   monthname['12']="dic";

   i=dates.length;
   var totcycle=listaPagine.length; // numero delle pagine della Categoria corrente
   while(i--) // Per ogni giorno della lista
   {
      for (var loopTimes=0;loopTimes<totcycle;loopTimes++) // Per ogni pagina della lista
      {
         latestpage=listaPagine[loopTimes];
         latesttime=listaTime[loopTimes];
         latesttime=new String(latesttime);

         // es: temp=2006 dic 25
         temp=""+new Number(latesttime.substr(6,2))+" "+monthname[latesttime.substr(4,2)]+" "+latesttime.substr(0,4);

         // se la data che stiamo esaminando corrisponde alla data della pagina
         if(dates[i].firstChild.nodeValue==temp)
         {
            temp=dates[i].nextSibling.firstChild;

            // Questo while dovrebbe inserire la modifica in ordine cronologico
            // tra le altre modifiche. Funzionava solo nella versione inglese e l'ho
            // lasciata qui perché qualche anima pia potrebbe in futuro correggerla
            while(temp!=null)
            {
               if(temp.tagName!=null)
                  if(temp.tagName.toLowerCase()=="li")
                  {
                     temp2=temp.innerHTML.match(/; ([0-9][0-9]):([0-9][0-9]) \. \./);
                     temp2=new Number(temp2[1])*100+new Number(temp2[2]);
                     if(temp2<new Number(latesttime.substr(8,4))) {temp2=temp; break;}
                  }
               temp2=temp; temp=temp.nextSibling;
               if(temp==null) break;
            }
            
            // l'elemento che andrà inserito
            temp3=document.createElement("li");
            
            // se l'ordinamento aveva funzionato (ovvero mai)
            if (temp2!=null)
            {
               dates[i].nextSibling.insertBefore(temp3,temp2);
            }
            else
            {
               dates[i].appendChild(temp3);
            }

            //Correzione di sintassi per il nome della pagina (la presenza di ' e " tronca a metà il titolo)
            var ciclo=0;
            while (ciclo<latestpage.length)
            {
               if (latestpage.charAt(ciclo) == '"')
               {
                  var before=latestpage.substr(0,ciclo);
                  var after=latestpage.substr(ciclo+1);
                  latestpage=before + "\\\"" + after;
                  ciclo=ciclo+1;
               }
               ciclo=ciclo+1;
            }
            
            var lpString="http://it.wikiversity.org/wiki/"+encodeURIComponent(latestpage);
            var diffString="http://it.wikiversity.org/w/index.php?title="+encodeURIComponent(latestpage)+"&diff=last";
            var cronString="http://it.wikiversity.org/w/index.php?title="+encodeURIComponent(latestpage)+"&action=history";
            // riempi l'item con i dati necessari
            temp3.innerHTML="<font size=-1>Modifiche in <a href='http://it.wikiversity.org/wiki/Categoria:"+encodeURIComponent(c)+
                     "'>Categoria:"+c+"</a>; "+latesttime.substr(8,2)+":"+latesttime.substr(10,2)+" . . (+ "+
                     "<a href="+lpString+">"+latestpage+"</a> (<a href="+diffString+">diff</a>) "+
                     "(<a href="+cronString+">cron</a>))</font>";
         }
      }
   }
}

var CategorieOsservate; //evita errori se ancora non esiste una cat-watchlist
var showWarning; //evita errori se ancora non esiste una cat-watchlist

//Un esempio di query per il controllo di una categoria potrebbe essere
//http://it.wikiversity.org/w/query.php?what=category&cptitle=Guerre%20Stellari&cplimit=100&cpextended&format=xml
$(function(){
   // se siamo nella watchlist
   if(wgPageName=="Speciale:OsservatiSpeciali")
   {
      if(CategorieOsservate==undefined) // se non e' mai stata creata la lista personale delle Categorie
      {
         if(confirm("Ancora non hai una lista di categorie da controllare. Vuoi crearne una?"))
            location.href='http://it.wikiversity.org/w/index.php?title=Utente:'+wgUserName+
                          '/CategorieOsservate.js&action=edit&preload=Utente:Jalo/CategorieOsservateTemplate.js';
      }
      else // la lista gia' esiste
      {
         var i;
         for(i in CategorieOsservate) // Per ogni cateoria lancia il controllo
         {
            var a=CategorieOsservate[i];
            cwwpajax.download({url:'http://it.wikiversity.org/w/query.php?what=category&cptitle='+encodeURIComponent(a)+
                                   '&cplimit=100&cpextended&format=xml', onSuccess:cwOntoWatchlist, catname:a});
         }
      }
   }
});

// aggiungi la watchlist delle categorie dell'utente
document.write('<script type="text/javascript" src="http://it.wikiversity.org'
             + '/w/index.php?title=Utente:'+wgUserName+'/CategorieOsservate.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

//=== fine: CATEGORY WATCH ===
/* 

*/