MediaWiki:FasiAvanzamento.js
Go to top
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/*
FasiAvanzamento.js
Raccolta di funzioni correlate a [[Aiuto:Fasi di sviluppo]].
Servono per visualizzare accanto al nome dei libri il rispettivo stato di avanzamento:
0%, 25%, 50%, 75%, 100%
*/
function Avanzamenti() {
// Simboli degli stati di avanzamento
var symbols = {
'0': '//upload.wikimedia.org/wikipedia/commons/8/8f/00%25.png',
'00': '//upload.wikimedia.org/wikipedia/commons/8/8f/00%25.png',
'25': '//upload.wikimedia.org/wikipedia/commons/5/5b/25%25.png',
'50': '//upload.wikimedia.org/wikipedia/commons/3/3a/50%25.png',
'75': '//upload.wikimedia.org/wikipedia/commons/c/cd/75%25.png',
'100': '//upload.wikimedia.org/wikipedia/commons/6/64/100%25.png',
};
function iconaAvanzamentoTab() {
// Segnala sul tab "modulo" la fase di avanzamento del modulo visualizzato
var cls = $('#textquality').attr('class');
if(cls) {
var avzPercent = cls.replace('%', '');
if(symbols[avzPercent]) { /* Gestisco il caso di avanzamenti "strani" */
var newChild = $('<img/>', {'src': symbols[avzPercent], 'alt': cls});
$('#ca-nstab-main a').append(' ', newChild);
}
}
}
function fixDPLLists() {
// Rende compatibili i ripiani fatti con DPL al sistema degli avanzamenti
$('.avanzamenti a').each(function(){
$('<span></span>')
.addClass('avz_placeholder')
.css('margin-left', '3px')
.insertAfter(this)
.text($(this).text());
});
}
function iconeAvanzamentoLinks() {
// Aggiunge le icone degli stati di avanzamento ai link sulla pagina.
var queue = [];
// Trova dove mettere gli avanzamenti,
// identifica ogni pagina con una classe apposita,
// mette in lista le pagine da verificare.
$('.avz_placeholder').each(function() {
var page = $(this).text();
var title = (new mw.Title(page)).getMain();
// Identifica gli avanzamenti di ciascuna pagina
$(this).removeClass('avz_placeholder')
.addClass('avz_' + title.replace(/[^a-zA-Z0-9-_]/g, ""))
.text('');
// Mette la pagina in coda, se non lo è già
if($.inArray(title, queue) == -1)
queue.push(title);
});
// Ci interessa controllare solo le categorie "Libri xy%" e "Moduli xy%"
var categorie_avanzamento = ['0%', '25%', '50%', '75%', '100%']
.map((av) => ['Category:Libri ' + av, 'Category:Moduli ' + av])
.reduce((a, b) => a.concat(b), []);
while(queue.length !== 0) {
// Processa 50 pagine alla volta con l'API, perché gli utenti anonimi non possono andare oltre.
var queryDict = {
action: 'query',
prop: 'categories',
cllimit: 'max',
clcategories: categorie_avanzamento,
titles: queue.splice(0, 50),
format: 'json',
};
continuedAPICall(queryDict, processPages);
}
}
function continuedAPICall(params, callback) {
// Inizializza l'API MediaWiki.
var api = new mw.Api();
// Continua a chiamare l'API di MediaWiki finché non esaurisce i dati
api.post(params).done(
callback,
function(data) {
if('continue' in data) {
params['continue'] = data['continue'];
continuedAPICall(params, callback);
}
});
}
function processPages(data) {
// Ha ottenuto l'elenco delle categorie delle pagine richieste.
// Ora mette le icone degli avanzamenti al posto giusto.
// Trova solo le categorie che mi interessano
var categoria_avanzamento_regex = /(?:Libri|Moduli) (\d+)%/;
for(var page_id in data.query.pages) {
var page = data.query.pages[page_id];
if(!('categories' in page))
continue;
var title = (new mw.Title(page.title)).getMain().replace(/[^a-zA-Z0-9-_]/g, "");
for(var category of page.categories) {
// C'è una categoria "(Libri|Moduli) xx%" ?
var match = categoria_avanzamento_regex.exec(category.title);
if(match) {
// Trova la classe corrispondente a quel libro
var cls = '.avz_' + title;
// Aggiunge il simbolo dell'avanzamento a tutte le istanze del libro
$('<img/>', {'src': symbols[match[1]], 'alt': 'Avanzamento: ' + match[1] + '%'})
.appendTo(cls);
break;
}
}
}
}
// Parte con le richieste.
iconeAvanzamentoLinks();
iconaAvanzamentoTab();
fixDPLLists();
}
$.when(
mw.loader.using( ['mediawiki.api', 'mediawiki.util', 'mediawiki.Title'] )
).then(function () {
$(document).ready(Avanzamenti);
});