MediaWiki:Gadget-CatWatch.js

Questa pagina definisce alcuni parametri di aspetto e comportamento generale di tutte le pagine. Per personalizzarli vedi Aiuto:Stile utente.


Nota: dopo aver salvato è necessario pulire la cache del proprio browser per vedere i cambiamenti (per le pagine globali è comunque necessario attendere qualche minuto). Per Mozilla / Firefox / Safari: fare clic su Ricarica tenendo premuto il tasto delle maiuscole, oppure premere Ctrl-F5 o Ctrl-R (Command-R su Mac); per Chrome: premere Ctrl-Shift-R (Command-Shift-R su un Mac); per Konqueror: premere il pulsante Ricarica o il tasto F5; per Opera può essere necessario svuotare completamente la cache dal menù Strumenti → Preferenze; per Internet Explorer: mantenere premuto il tasto Ctrl mentre si preme il pulsante Aggiorna o premere Ctrl-F5.

/**
 * Gadget-CatWatch.js
 * Quando si visita [[Speciale:OsservatiSpeciali]] questo gadget vi aggiunge anche ogni voce
 * a cui è stata inserita una delle categorie monitorate (non la rimozione).
 *
 * Il funzionamento si basa sull'utilizzo di [[mw:API:Categorymembers]]:
 * quando l'utente visita [[Speciale:OsservatiSpeciali]] viene scaricata la lista di tutte le pagine
 * che si trovano in quel momento nelle categorie monitorate. Ogni pagina, se la data di categorizzazione
 * è presente in OsservatiSpeciali, viene allora aggiunta a quelle già presenti in OsservatiSpeciali.
 * 
 * Questa è una riscrittura da zero a partire dalla versione inizialmente scritta e ideata da [[:en:User:Ais523]]:
 * http://it.wikipedia.org/w/index.php?title=Wikipedia:Monobook.js/Catwatch.js&oldid=52893797
 *
 * @author [[Utente:Rotpunkt]]
 */

(function (mw, $) {
    'use strict';

    // Massimo numero di pagine monitorate per categoria (max 500)
    var maxPagesInCategory = 100;
    // Configurazione utente
    var userConfig = 'Utente:' + mw.config.get('wgUserName') + '/CategorieOsservate.js'
    // Modello di configurazione
    var configModel = 'Utente:Rotpunkt/Gadgets/Gadget-CatWatch.js/CategorieOsservateTemplate.js';
    // Messaggio di aiuto per la prima attivazione
    var msgHelp = '[Gadget-CatWatch] Non hai ancora una lista di categorie da controllare. Vuoi crearne una?';

    // Ritorna la variabile CategorieOsservate nel CategorieOsservate.js dell'utente
    function getUserConfig(categoryHandler) {
        $.ajax({
            url: mw.config.get('wgScript'),
            data: {
                title: userConfig,
                action: 'raw',
                ctype: 'text/javascript'
            },
            cache: false,
        })
        .done(function(data) {
            try {
                eval(data);
            } catch(e) {
                alert('[Gadget-CatWatch] Errore in ' + userConfig);
                return;
            }
            if (typeof CategorieOsservate !== 'undefined') {
                if (CategorieOsservate.length > 0)
                    categoryHandler(CategorieOsservate);
            } else if (confirm(msgHelp))
                document.___location = mw.config.get('wgScript') +
                                    '?action=edit&title='+ userConfig +
                                    '&preload=' + configModel;
        });
    }

    // Ritorna la lista delle pagine in una categoria (in formato JSON)
    function getCategoryPages(name, pageHandler) {
        $.ajax({
            url: mw.util.wikiScript('api'),
            data: {
                action: 'query',
                list: 'categorymembers',
                cmtitle: 'Categoria:' + name,
                cmlimit: maxPagesInCategory,
                cmprop: 'title|timestamp',
                cmsort: 'timestamp',
                cmdir: 'desc',
                format: 'json'
            }
        })
        .done(function (data) {
            pageHandler(data.query.categorymembers);
        });
    }

    // Parsifica un timestamp in date (1 gen 2001) e time (01:23)
    function parseTimestamp(timestamp) {
        var date, hours, minutes, months;

        date = new Date(timestamp);
        hours = date.getHours();
        minutes = date.getMinutes();
        months = [
            'gen', 'feb', 'mar', 'apr', 'mag', 'giu', 
            'lug', 'ago', 'set', 'ott', 'nov', 'dic'
        ];
        return {
            date: date.getDate() + ' ' + months[date.getMonth()] + ' ' +
                  date.getFullYear(),
            time: (hours < 10 ? '0' + hours : hours) + ':' +
                  (minutes < 10 ? '0' + minutes : minutes)
        }
    }
    
    // Crea un nuovo elemento di OsservatiSpeciali
    function createWatchlistEl(title, time, category) {
        var url, urlcat, cron, cat, page, last;

        url = mw.config.get('wgScript') + '?title=' + title;
        urlcat = mw.config.get('wgArticlePath').replace('$1', 'Categoria:' + category);
        cron = $('<a>').attr('href', url + '&action=history').text('cron');
        cat = $('<a>').attr('href', urlcat).text('Categoria:' + category);
        page = $('<a>').attr('href', mw.config.get('wgArticlePath').replace('$1', title)).text(title);
        last = $('<a>').attr('href', url + '&diff=last').text('last');
        return $('<li>').css('font-weight', 'bold')
                .append('(diff) (', cron, ') . . ', cat, '; ', time,
                        '  . . (+ ', page, ' (', last, '))');
    }

    // Parsifica l'elenco di pagine di OsservatiSpeciali
    function parseWatchlistDOM() {
        var ret = {};
        // ogni giorno è un <ul class='special'>
        $('ul.special').each(function () {
            // la data è nell'<h4> precedente l'ul.special
            var date = $(this).prev().text();
            ret[date] = [];
            // la pagina di ogni giorno è un <li>
            $(this).find('li').each(function () {
                ret[date].push({
                    time: $(this).find('span.mw-changeslist-date').text(),
                    el: $(this)
                });
            });
        });
        return ret;
    }

    // Aggiunge una pagina ad OsservatiSpeciali, se quel giorno è visualizzato
    function watchlistAdd(watchlist, page, category) {
        var ts = parseTimestamp(page.timestamp);
        if (watchlist[ts.date]) {
            $.each(watchlist[ts.date], function(i, entry) {
                if (entry.time < ts.time) {
                     var el = createWatchlistEl(page.title, ts.time, category);
                     entry.el.before(el);
                     // aggiorna l'array
                     watchlist[ts.date].splice(i, 0, el);
                     return false;
                 }
            });
        }
    }

    $(document).ready(function () {
        // Se la pagina corrente è Speciale:OsservatiSpeciali
        if (mw.config.get('wgPageName') == 'Speciale:OsservatiSpeciali') {
            // scarica la lista delle categorie da monitorare.
            getUserConfig(function (categories) {
                // Parsifica OsservatiSpeciali.
                var watchlist = parseWatchlistDOM();
                // Per ogni categoria da monitorare
                $.each(categories, function (i, category) {
                    // scarica la lista delle pagine in quella categoria.
                    getCategoryPages(category, function (categorymembers) {
                        // Per ogni pagina nella categoria monitorata
                        $.each(categorymembers, function (i, page) {
                            // aggiunge la pagina a OsservatiSpeciali.
                            watchlistAdd(watchlist, page, category);
                        });
                    });
                });
            });
        }
    });
}(mediaWiki, jQuery));