MediaWiki:Gadget-CatWatch.js: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
fix encodeURIComponent in createWatchlistEl
Maintenance: Remove use of internal wgMonthNamesShort data. phab:T219340
 
(19 versioni intermedie di 4 utenti non mostrate)
Riga 5:
*
* Il funzionamento si basa sull'utilizzo di [[mw:API:Categorymembers]]:
* quando l'utente visita [[Speciale:OsservatiSpeciali]] vienelo scaricatascript ottiene la lista di tutte ledelle 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.
*
* Riscrittura da zero di:
* 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
* che a sua volta lo importava da:
* http://en.wikipedia.org/w/index.php?title=User:Ais523/catwatch.js&oldid=216824057
*
* @author [[https://it.wikipedia.org/wiki/Utente:Rotpunkt]]
*/
/*jslint unparam:global truemediaWiki, evil: truejQuery */
/*global CategorieOsservate: false, alert: false, confirm: false, document: false, mediaWiki: false, jQuery: false */
 
( function ( mw, $ ) {
'use strict';
 
var i18n = {
// Massimo numero di pagine monitorate per categoria (max 500)
en : {
var maxPagesInCategory = 100,
errorGet: 'Error retrieving',
// Configurazione utente
msgConfig: 'Category watchlist not found. Do you want to create a new one?',
userConfig = 'Utente:' + mw.config.get('wgUserName') + '/CategorieOsservate.js',
monthNames: [ "", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
// Modello di configurazione
category: 'Category'
configModel = 'MediaWiki:Gadget-CatWatch.js/CategorieOsservateTemplate.js',
},
// Messaggio di aiuto per la prima attivazione
it : {
msgHelp = '[Gadget-CatWatch] Non hai ancora una lista di categorie da controllare. Vuoi crearne una?';
errorGet: 'Errore nel leggere',
msgConfig: 'Non hai ancora una lista di categorie da controllare. Vuoi crearne una?',
monthNames: ["","gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],
category: 'Categoria'
}
};
// Massimo numero di pagine monitorate per categoria (max configurabile 500)
var maxPagesInCategory = 100;
// Configurazione utente
var userConfig = 'User:' + mw.config.get( 'wgUserName' ) + '/CategorieOsservate.js';
// Modello di configurazione
var configModel = 'MediaWiki:Gadget-CatWatch.js/CategorieOsservateTemplate.js';
 
/**
// Ritorna la variabile CategorieOsservate nel CategorieOsservate.js dell'utente
* Restituisce il messaggio con un certo identificativo, in una delle lingue supportate.
function getUserConfig(categoryHandler) {
*
$.ajax({
* @param {string} key - L'identificativo del messaggio
url: mw.config.get('wgScript'),
* @return {string} Il messaggio nella lingua configurata
data: {
*/
title: userConfig,
function msg( key ) {
action: 'raw',
var msgs = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.en;
ctype: 'text/javascript'
return msgs[ key ];
},
}
dataType: 'script',
cache: false
/**
})
* Ottiene la variabile CategorieOsservate nel CategorieOsservate.js dell'utente.
.done(function (data) {
*
try {
* @param {function} categoryHandler - La funzione da richiamare con il risultato
eval(data);
*/
} catch (e) {
function getUserConfig( categoryHandler ) {
alert('[Gadget-CatWatch] Errore in ' + userConfig);
$.ajax( {
return;
url: mw.config.get( 'wgScript' ),
}
data: {
if (CategorieOsservate !== undefined) {
title: userConfig,
if (CategorieOsservate.length > 0) {
action: 'raw',
categoryHandler(CategorieOsservate);
ctype: 'text/javascript'
}
},
} else if (confirm(msgHelp)) {
dataType: 'script',
document.___location = mw.config.get('wgScript') +
cache: false
'?action=edit&title=' + userConfig +
} )
'&preload=' + configModel;
.done( function ( data ) {
}
if ( window.CategorieOsservate !== undefined ) {
})
if ( window.CategorieOsservate.length > 0 ) {
.fail(function (jqXHR, textStatus, errorThrown) {
categoryHandler( window.CategorieOsservate );
if (mw.util.getParamValue('debug')) {
}
alert('[Gadget-CatWatch] Errore nel leggere ' +
} else if ( confirm( '[CatWatch] ' + msg( 'msgConfig' ) ) ) {
userConfig + ': ' + errorThrown);
document.___location = mw.config.get( 'wgScript' ) +
}
'?action=edit&title=' + userConfig +
});
'&preload=' + configModel;
}
}
} )
.fail( function ( jqXHR, textStatus, errorThrown ) {
if ( mw.util.getParamValue( 'debug' ) ) {
alert( '[CatWatch] ' + msg( 'errorGet' ) + ' ' +
userConfig + ': ' + errorThrown );
}
} );
}
 
/**
// Ritorna la lista delle pagine in una categoria (in formato JSON)
* Ottiene la lista di pagine in una categoria.
function getCategoryPages(name, pageHandler) {
*
$.ajax({
* @param {string} name - Nome della categoria
url: mw.util.wikiScript('api'),
* @param {string} end - Data di fine
data: {
* @param {function} pageHandler - La funzione da richiamare con il risultato
action: 'query',
*/
list: 'categorymembers',
function getCategoryPages( name, end, pageHandler ) {
cmtitle: 'Categoria:' + name,
new mw.Api().get( {
cmlimit: maxPagesInCategory,
action: 'query',
cmprop: 'title|timestamp',
list: 'categorymembers',
cmsort: 'timestamp',
cmtitle: 'Category:' + name,
cmdir: 'desc',
cmlimit: maxPagesInCategory,
format: 'json'
cmprop: 'title|timestamp',
},
cmsort: 'timestamp',
dataType: 'json'
cmdir: 'desc',
})
cmend: end,
.done(function (data) {
format: 'json'
pageHandler(data.query.categorymembers);
} ).done( function ( data ) {
});
pageHandler( data.query.categorymembers );
}
} );
}
 
/**
// Parsifica un timestamp in date (1 gen 2001) e time (01:23)
* Funzione di utilità per parseWatchlistDOM, crea un timestamp
function parseTimestamp(timestamp) {
* a partire da una data nel formato di OsservatiSpeciali, es. 1 gen 2012.
var date, hours, minutes, months;
*
* @param {string} text - Data nel formato di OsservatiSpeciali
* @return {string} Il timestamp risultante
*/
function makeTimestamp( text ) {
var months, month, date = text.split( ' ' );
months = msg( 'monthNames' );
month = months.indexOf( date[ 1 ] );
return month !== -1 ? ( date[ 2 ] + '-' + padleft0( month ) + '-' + padleft0( parseInt( date[ 0 ], 10 ) ) + 'T00:00:00Z' ) : null;
}
 
/**
date = new Date(timestamp);
* Parsifica l'elenco di pagine di OsservatiSpeciali in un object con
hours = date.getHours();
* - chiavi: le date presenti nella pagina
minutes = date.getMinutes();
* - valori: un object contenente l'ora e l'elemento jQuery per quella riga
months = [
*
'gen', 'feb', 'mar', 'apr', 'mag', 'giu',
* @return {object} Object che contiene le pagine in OS, suddivise per data e ora
'lug', 'ago', 'set', 'ott', 'nov', 'dic'
*/
];
function parseWatchlistDOM() {
return {
var date, ret = {};
date: date.getDate() + ' ' + months[date.getMonth()] + ' ' +
// ogni giorno è un <h4>
date.getFullYear(),
$( 'h4' ).each( function () {
time: (hours < 10 ? '0' + hours : hours) + ':' +
date = $( this ).text();
(minutes < 10 ? '0' + minutes : minutes)
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()' )
} );
}
} );
ret.oldestDate = date ? makeTimestamp( date ) : null;
 
return ret;
// 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;
* Formatta un numero con uno zero iniziale se minore di 10.
urlcat = mw.config.get('wgArticlePath').replace('$1', 'Categoria:' + category);
*
$cron = $('<a>').attr('href', url + '&action=history').text('cron');
* @param {string} num - Il numero da formattare
$cat = $('<a>').attr('href', urlcat).text('Categoria:' + category);
* @return {string} La stringa risultante
$page = $('<a>').attr('href', mw.config.get('wgArticlePath')
*/
.replace('$1', encodeURIComponent(title))).text(title);
function padleft0( num ) {
$last = $('<a>').attr('href', url + '&diff=last').text('last');
return ( num < 10 ? '0' : '' ) + num;
return $('<li>').css('font-weight', 'bold')
}
.append('(diff) (', $cron, ') . . ', $cat, '; ', time,
' . . (+ ', $page, ' (', $last, '))');
}
 
/**
// Parsifica l'elenco di pagine di OsservatiSpeciali
* Funzione di utilità per watchlistAdd, parsifica un timestamp in date (1 gen 2001) e time (01:23).
function parseWatchlistDOM() {
*
var ret = {};
* @param {string} timestamp - Timestamp da parsificare
// ogni giorno è un <h4>
* @return {object} Oggetto con date e time parsificati separatamente
$('h4').each(function () {
*/
var date = $(this).text();
function parseTimestamp( timestamp ) {
ret[date] = [];
var date, hours, minutes, months;
// 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;
}
 
date = new Date( timestamp );
// Aggiunge una pagina ad OsservatiSpeciali, se quel giorno è visualizzato
hours = date.getHours();
function watchlistAdd(watchlist, page, category) {
minutes = date.getMinutes();
var ts, el, daypages, prepended = false;
months = msg( 'monthNames' );
return {
date: date.getDate() + ' ' + months[ date.getMonth() + 1 ] + ' ' +
date.getFullYear(),
time: padleft0( hours ) + ':' + padleft0( minutes )
};
}
 
/**
ts = parseTimestamp(page.timestamp);
* Funzione di utilità per watchlistAdd, crea un nuovo elemento di OsservatiSpeciali.
daypages = watchlist[ts.date];
*
if (daypages) {
* @param {string} title - Nome della pagina
el = createWatchlistEl(page.title, ts.time, category);
* @param {string} time - Ora di categorizzazione
// per tutte le pagine di quel giorno cerca quella col time antecedente
* @param {string} category - Nome categoria
$.each(daypages, function (i, entry) {
* @return {jQuery} L'elemento jQuery da aggiungere alla pagina
if (ts.time > entry.time) {
*/
entry.el.before(el);
function createWatchlistEl( title, time, category ) {
daypages.splice(i, 0, { time: ts.time, el: el });
var url, urlcat, $cron, $cat, $page, $last;
prepended = true;
return false;
}
});
if (!prepended) {
daypages[daypages.length - 1].el.after(el);
daypages.push({ time: ts.time, el: el });
}
}
}
 
url = mw.config.get( 'wgScript' ) + '?title=' + title;
$(document).ready(function () {
urlcat = mw.config.get( 'wgArticlePath' ).replace( '$1', 'Category:' + category );
// Se la pagina corrente è Speciale:OsservatiSpeciali
$cron = $( '<a>' ).attr( 'href', url + '&action=history' ).text( 'cron' );
if (mw.config.get('wgPageName') === 'Speciale:OsservatiSpeciali') {
$cat = $( '<a>' ).attr( 'href', urlcat ).text( msg( 'category' ) + ':' + category );
// scarica la lista delle categorie da monitorare.
$page = $( '<a>' ).attr( 'href', mw.config.get( 'wgArticlePath' )
getUserConfig(function (categories) {
.replace( '$1', encodeURIComponent( title ) ) + '?redirect=no' ).text( title );
// Parsifica OsservatiSpeciali.
$last = $( '<a>' ).attr( 'href', url + '&diff=last' ).text( 'last' );
var watchlist = parseWatchlistDOM();
return $( '<li>' ).css( 'font-weight', 'bold' )
// Per ogni categoria da monitorare
.append( '(diff | ', $cron, ') . . ', $cat, '; ', time,
$.each(categories, function (i, category) {
' . . (+ ', $page, ' (', $last, '))' );
// scarica la lista delle pagine in quella categoria.
}
getCategoryPages(category, function (categorymembers) {
 
// Per ogni pagina nella categoria monitorata
/**
$.each(categorymembers, function (i, page) {
* Aggiunge una pagina ad OsservatiSpeciali, se quel giorno è visualizzato.
// aggiunge la pagina a OsservatiSpeciali.
*
watchlistAdd(watchlist, page, category);
* @param {Object} watchlist - Gli OsservatiSpeciali come parsificati da parseWatchlistDOM
});
* @param {string} page - La pagina da aggiungere agli OS
});
* @param {string} category - La categoria in cui quella pagina è stata categorizzata
});
*/
});
function watchlistAdd( watchlist, page, category ) {
}
var ts, el, daypages, prepended = false;
});
 
}(mediaWiki, jQuery));
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 } );
}
}
}
 
$( function () {
// Se la pagina corrente è Speciale:OsservatiSpeciali
if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Watchlist' ) {
mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ] )
.done( function () {
// ottiene la lista delle categorie da monitorare.
getUserConfig( function ( categories ) {
// Parsifica OsservatiSpeciali.
var watchlist = parseWatchlistDOM();
// Per ogni categoria da monitorare
$.each( categories, function ( i, category ) {
// ottiene la lista delle pagine in quella categoria.
getCategoryPages( category, watchlist.oldestDate, function ( categorymembers ) {
// Per ogni pagina nella categoria monitorata
$.each( categorymembers, function ( i, page ) {
// aggiunge la pagina a OsservatiSpeciali.
watchlistAdd( watchlist, page, category );
} );
} );
} );
} );
} )
.fail( function () {
console.error( 'Impossibile avviare l\'accessorio CatWatch.' );
} );
}
} );
}( mediaWiki, jQuery ) );