MediaWiki:Gadget-trovaTitoliSimili.js

Da Wikisource.

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
/*
bozza di un gadget per trovare pagine con titoli simili da disambiguare

roadmap:
1. recuperare elenco di tutte le pagine > OK
2. per le sottopagine, prendere solo l'ultima parte del titolo; e scartare la punteggiatura, le parentesi ecc.
4. costruire una mappa che riunisce le pagine che hanno stesso titolo
5. da capire: prendere le pagine di disambigua e capire quali titoli potrebbero essere aggiunti 
   e quali nuove pagine di disambigua si potrebbero creare
*/
$(function() {
	
	// mantenere l'ordine alfabetico!
	paroleBanali = ['a chi legge', "a' lettori", 'ad urbano', 'ai cortesi lettori', 'ai lettori', 'al lettore', 'al medesimo', 'allegati', 'allegato', 
	'alli lettori', 'a monsignor niccolò claudio fabri di peiresc', 'annotazione', 'annotazioni', 'appendice', 'argomento', 'articolo', 'atto', 'avvertenza', 'avvertenze', 'avvertimento', 'avviso', 'beneficenza', 'bibliografia', 
	'biografia', 'canto', 'canzona', 'canzone', 'canzoni', 'cap.', 'Cap i', 'cap v', 'capitoli', 'capitolo', 'capo', 'caput', 'carmen', 'catalogo', 'choro', 'citazione', 'classe', 'commedie', 'conclusione', 'conclusioni', 
	'continua', 'convenzione', 'copertina', 'correzioni', 'dedica', 'definizione', 'definizioni', 'diffinitione', 'discorso', 'documenti', 'documento', 'educazione ed istruzione', 'egloga', 'elegia', 'elegie', 'epigramma', 'epigrammi', 'epilogo', 
	'epistola', 'Er còllera mòribbus', 'errata', 'esercizi', 'esodo', 'favola', 'frammenti', 'frammento', 'frontespizio', 'glossario', 'illustrazioni al libro', 'imprimatur', 'indice', 'indici', 'inno', 
	'interlocutori', 'introduzione', "l'autore a chi legge", "l'editore", 'lauda', 'lettera', 'lettere', 'lezione', 'libro', 'madrigale', 'madrigali', 
	'nota storica', 'nota', 'note', 'notiziario', 'notizie varie', 'novella', 'novelle', 'operazione', 'opere', 'ottavo', 'paragrafo', 'parere della commissione', 'parodo', 'parte', 'personaggi', 'poesias', 
	'poesia', 'poesie', 'preambolo', 'precetto', 'prefazione', 'premessa', 'presentazione', 'prima ', 'primo ', 'proemio', 'prologo', 'propositione', 'proposizione', 'proposizioni', 'protocolli', 
	'quarta ', 'quarto ', 'quinta ', 'quinto ', 'rassegna bibliografica', 'rätoromanische chrestomathie', 'relazione', 'religione', 'rime', 'ringraziamenti', 'risoluzione', 'ritratto', 'satira', 'scena', 
	'secolo', 'seconda ', 'secondo ', 'sermone', 'sesta ', 'sesto ', 'settimo', 'sezione', 'società amici del bene', 'sommario', 'sonetti', 'sonetto', 'stanza', 'suppositione', 'tavola', 'tavole', 'terza ', 
	'terzo ', 'testo', 'titolo', 'tomo', 'tragedie', 'traduzioni', 'trattato', 'varianti'
	];
	
	loadPages = function(from, array) {
		console.log("Loading pages from " + from);
		
		var api = new mw.Api();
		api.post({
			action: 'query',
			list: 'allpages',
			apfrom: from,
			aplimit: 5000,
			apfilterredir: 'nonredirects',
			format: 'json',
			array: array
		}).done(function (data, textStatus, jqXHR) {
			array = this.array;
			$.each(data.query.allpages, function(index, element) {
				array.push(element.title);
			});
			$('#titoliCount').html(array.length);
			
			if (data['continue'])
				loadPages(data['continue'].apcontinue);
			else {
				$('.trova-titoli-box-main .loader').html('- terminato.').removeClass('loader');
				
				map = {};
				for (i = 0; i < array.length; i++) {
					titolo = array[i];
					titoloCompleto = titolo;
					//console.log(titolo);
					if (titolo.indexOf('/') != -1)
						titolo = titolo.substring(titolo.lastIndexOf('/') + 1);
					titolo = titolo.replace(/\(.*?\)/g, '') // togli le cose tra parentesi
						.replace(/[A-Z][A-Z]+/g, '')		// togli numeri romani (2 o più lettere maiuscole consecutive)
						.replace(/^\d+\./, '')				// togli i numeri iniziali seguiti da punto
						.replace(/[,;\:\.\!\?\«»"]/g, '')	// togli punteggiatura
						.replace(/-/g, ' ')					// togli trattino
						.replace(/^\./, '')					// togli eventuale punto iniziale rimasto da precedenti replace
						.trim();
					if (isNaN(titolo) && titolo.toUpperCase() != titolo && titolo.length > 3) {
						titolo = titolo.toLowerCase();
						scarta = false;
						for (j = 0; j < paroleBanali.length; j++) {
							if (titolo.startsWith(paroleBanali[j])) {
								//console.log('scarto: ' + titolo + ' - ' + paroleBanali[j]);
								scarta = true;
							}
						}
						if (!scarta) {
							if (!map.hasOwnProperty(titolo))
								map[titolo] = [];
							map[titolo].push(titoloCompleto);
						}
					}
				}
				//console.log(map);
				$('.trova-titoli-box-main').append('<ol>');
				$.each(map, function(parteComune, titoli) {
					if (titoli.length > 1) {
						for (i = 0; i < titoli.length; i++) {
							titoli[i] = '<a target="_new" href="/wiki/' + titoli[i] + '">' + titoli[i] + '</a>';
						}
						links = titoli.join(', ');
						
						parteComune = parteComune[0].toUpperCase() + parteComune.substring(1);
						$('.trova-titoli-box-main ol').append('<li data-count="' + titoli.length + '">' + parteComune + ': ' + titoli.length
						+ ' - ' + links + '</li>');
					}
				});
				$(".trova-titoli-box-main li").sort(function(a, b) {
				    return ($(b).data('count')) > ($(a).data('count')) ? 1 : -1;
				}).appendTo('.trova-titoli-box-main ol');
				
				// carica le disambigua ed evidenziale in verde nella lista
				var api = new mw.Api();
				api.post({
					action: 'query',
					list: 'categorymembers',
					cmtitle: 'Categoria:Disambigua',
					cmprop: 'title',
					cmnamespace: 0,
					cmlimit: 5000,
					format: 'json'
				}).done(function (data, textStatus, jqXHR) {
					list = data.query.categorymembers;
					for (i = 0; i < list.length; i++) {
						$('.trova-titoli-box-main').find('[href="' + list[i].title + '"]').css('color', 'green');
					}
				});
			}
		});
	};
	
	mw.util.addPortletLink(
		'p-tb',
		'#',
		'Trova titoli simili',
		't-trovaTitoliSimili',
		'Trova titoli simili (per disambigua)'
	);
	
	$('#t-trovaTitoliSimili').click(function(e) {
		e.preventDefault();
		array = [];
		$('.trova-titoli-box').remove();
		
		var box = '<div class="box trova-titoli-box">'
			+ '<div class="box-title">Trova titoli simili<span class="icon-close"></span></div>'
			+ '<div class="box-main trova-titoli-box-main"></div></div>';
		$("body").append(box);
		$('.trova-titoli-box').draggable();
		$('.trova-titoli-box').draggable('option', 'cancel', '.box-main');
		
		$('.trova-titoli-box-main').append('<p>Caricamento titoli: <span id="titoliCount">0</span> <span class="loader"></span></p>');
		$('.trova-titoli-box .icon-close').click(function() {
			$('.trova-titoli-box').remove();
		});
		
		loadPages("'", array);
	});
});