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('&nbsp;', 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);
});