MediaWiki:Gadget-CatWatch.js

Versione del 9 apr 2014 alle 10:17 di Rotpunkt (discussione | contributi) (fix encodeURIComponent in createWatchlistEl)

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]]
 */
/*jslint unparam: true, evil: true */
/*global CategorieOsservate: false, alert: false, confirm: false, document: false, mediaWiki: false, jQuery: false */

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

    // Massimo numero di pagine monitorate per categoria (max 500)
    var maxPagesInCategory = 100,
    // Configurazione utente
        userConfig = 'Utente:' + mw.config.get('wgUserName') + '/CategorieOsservate.js',
    // Modello di configurazione
        configModel = 'MediaWiki:Gadget-CatWatch.js/CategorieOsservateTemplate.js',
    // Messaggio di aiuto per la prima attivazione
        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'
            },
            dataType: 'script',
            cache: false
        })
            .done(function (data) {
                try {
                    eval(data);
                } catch (e) {
                    alert('[Gadget-CatWatch] Errore in ' + userConfig);
                    return;
                }
                if (CategorieOsservate !== undefined) {
                    if (CategorieOsservate.length > 0) {
                        categoryHandler(CategorieOsservate);
                    }
                } else if (confirm(msgHelp)) {
                    document.___location = mw.config.get('wgScript') +
                                        '?action=edit&title=' + userConfig +
                                        '&preload=' + configModel;
                }
            })
            .fail(function (jqXHR, textStatus, errorThrown) {
                if (mw.util.getParamValue('debug')) {
                    alert('[Gadget-CatWatch] Errore nel leggere ' +
                          userConfig + ': '  + errorThrown);
                }
            });
    }

    // 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'
            },
            dataType: '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', encodeURIComponent(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 <h4> 
        $('h4').each(function () {
            var date = $(this).text();
            ret[date] = [];
            // la pagina di ogni giorno è un <li> in un <ul class='special'>
            $(this).next('ul.special').find('li').each(function () {
                ret[date].push({
                    time: $(this).find('span.mw-changeslist-date').text(),
                    el: $(this)
                });
            });
            // retrocompatibilità con il vecchio CatWatch: con la vista raggruppata
            // visualizzava le pagine del CatWatch al fondo del giorno
            if (ret[date].length === 0) {
                ret[date].push({
                    time: '23:59',
                    el: $(this).next('div').find('table:last-child()')
                });
            }
        });
        return ret;
    }

    // Aggiunge una pagina ad OsservatiSpeciali, se quel giorno è visualizzato
    function watchlistAdd(watchlist, page, category) {
        var ts, el, daypages, prepended = false;

        ts = parseTimestamp(page.timestamp);
        daypages = watchlist[ts.date];
        if (daypages) {
            el = createWatchlistEl(page.title, ts.time, category);
            // per tutte le pagine di quel giorno cerca quella col time antecedente 
            $.each(daypages, function (i, entry) {
                if (ts.time > entry.time) {
                    entry.el.before(el);
                    daypages.splice(i, 0, { time: ts.time, el: el });
                    prepended = true;
                    return false;
                }
            });
            if (!prepended) {
                daypages[daypages.length - 1].el.after(el);
                daypages.push({ time: ts.time, el: el });
            }
        }
    }

    $(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));