MediaWiki:Common.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.
/* Questa pagina è divisa in 3 sezioni:
 * - IMPORT dei vari altri script 
 * - Definizione delle VARIABILI globali
 * - FUNZIONI richiamate al document.ready()
*/

//SEZIONE IMPORT

//serve per i popup e per la manipolazione delle immagini delle pagine in modalità view
mw.loader.load(["jquery.ui"]);

// IMPORTANTE: Base.js deve essere importato prima di poter usare qualunque altro script da wikisource.org
mw.loader.load('//wikisource.org/w/index.php?title=MediaWiki:Base.js&action=raw&ctype=text/javascript');

// Iw_pages: Trasclusione di pagine tra sottodomini tramite le API
mw.loader.load('//wikisource.org/w/index.php?title=MediaWiki:InterWikiTransclusion.js&action=raw&ctype=text/javascript');

// Script per il confronto fra testi
mw.loader.load('//wikisource.org/w/index.php?title=MediaWiki:Compare.js&action=raw&ctype=text/javascript');

//Ricerca in Wikidata
mw.loader.load("//en.wikipedia.org/w/index.php?title=MediaWiki:Wdsearch.js&action=raw&ctype=text/javascript");

//FINE SEZIONE IMPORT



//SEZIONE VARIABILI

//disable ThomasV's "simplified lst"
self.proofreadpage_raw_lst = true;

// traduzione dei messaggi javascript
self.ws_messages = {

	'iwtrans': 'Il suo testo proviene da',
	'iwtrans2': 'Il suo testo proviene da un altro sottodominio di Wikisource.',

	'compare_with': 'Confronto con:',
	'compare_texts': 'Confronta testi'
};

//FINE SEZIONE VARIABILI


//SEZIONE FUNZIONI


/* RIPORTO QUI find_stringa() e count() perché sono veramente stufo del ResourceLoader che le carica quando vuole lui! */
function find_stringa(testo, idi, idf, dc, x) {
	idip = testo.indexOf(idi);
	idfp = testo.indexOf(idf, idip + idi.length) + idf.length;
	if (idip > -1 && idfp > -1) {
		if (x !== "") {
			while (count(testo.slice(idip, idfp), x) > count(testo.slice(idip, idfp), idf)) {
				idfp = testo.indexOf(idf, idfp) + idf.length;
			}
		}
		if (dc === 0) {
			vvalore = testo.slice(idip + idi.length, idfp - idf.length);
		} else {
			vvalore = testo.slice(idip, idfp);
		}
	} else {
		vvalore = "";
	}
	return vvalore;
}
/* conta il numero di occorrenze di stringa dentro testo; esce se testo === "" oppure stringa ==="" */
function count(testo, stringa) {
	var n = 0;
	if (testo !== "" && stringa !== "") {
		while (testo.indexOf(stringa) > -1) {
			n = n + 1;
			testo = testo.replace(stringa, "");
		}
	}
	return n;
}



/* 
NON USATA in Common.js - Valutare se tenerla, cancellarla o spostarla
Nuova funzione interrogazione ajax interprogetto
 title:titolo pagina (es: Giacomo_Leopardi)
 site: sito (es: it.wikipedia.org)
 query: tipo di interrogazione (valori ammessi: text|html , recupera wikitesto o html pagina)
 callback: funzione callback da eseguire sui dati (opzionale)
 
le azioni di default sono il lancio di un'interrogazione ajax utilizzando API e:
 l'intero oggetto json viene salvato in $("body").data("outputAjax")
 i dati veri e propri (text o html) vengono salvati in $("body").data("bareData")
*/
function getIwPage(title, site, query, callback) {
	if (query === undefined) query = "text";

	if (query == "html" || query === undefined) data = {
			format: 'json',
			action: 'parse',
			page: title,
			prop: 'text'
	};
	if (query == "text") data = {
			format: 'json',
			action: 'query',
			titles: title,
			prop: 'revisions',
			rvlimit: '1',
			rvprop: 'content'
	};
	$.ajax({
		url: 'https://' + site + '/w/api.php',
		async: false,
		data: data,
		dataType: 'jsonp' // this is the important one!
	}).done(function (data) {
		$("body").data("outputAjax", data);
		if (query === "text") {
			if (data.query.pages[-1] === undefined) {
				l = [];
				for (var i in data.query.pages) {
					l.push(i);
				}
				bareData = data.query.pages[l[0]].revisions[0]["*"];
			} else {
				bareData = "Pagina non esistente";
			}
		}
		if (query === "html") {
			if (data.error === undefined) {
				bareData = data.parse.text["*"];
			} else {
				bareData = "Pagina non esistente";
			}
		}

		$("body").data("bareData", bareData);
		if (callback !== undefined) {
			callback();
		}
	});
}

/*
	interwikiExtra: carica i collegamenti alle versioni straniere ed alternative
*/
function interwikiExtra() {
	// ripeti per tutti gli elementi <span>
	for (var i = 0; i < document.getElementsByTagName("span").length; i++) {
		a = document.getElementsByTagName("span")[i];
		
		// se si trova uno span "linkInfo"
		if (a.className == "interwiki-info") {
			// ripeti per tutti gli elementi <li>
			var count = 0;

			for (var j = 0; j < document.getElementsByTagName("li").length; j++) {
				b = document.getElementsByTagName("li")[j];
				
				if (b.className == "interlanguage-link interwiki-" + a.id) {
					// se c'è già il testo default toglilo
					b.innerHTML = b.innerHTML.replace(/\(orig\.\)/g, "") + " " + a.title;
					if (a.title == "(orig.)") {
						b.title = "Testo originale";
					}
				} else if (b.className == "interlanguage-link interwiki-" + a.id.substr(0, a.id.length - 1)) {
					count = count + 1;
					if (a.id.charAt(a.id.length - 1) == count) {
						b.innerHTML = b.innerHTML.replace(/\(orig\.\)/g, "") + " " + a.title;
					}
				}
			}
		}
		if (a.className == "AltraVersione") {
			p = a.title.indexOf("|");
			pvers = document.getElementById("p-version");
			if (pvers === null) {
				c = document.getElementById("column-one");
				if (c) {
					c.innerHTML = c.innerHTML + '<div class="portlet" id="p-version"><h3>Altre versioni</h3><div class="pBody"><ul>' +
						"</ul></div>";
					pvers = document.getElementById("p-version");
				}
				//fix per vector
				else {
					c = document.getElementById("mw-panel");
					if (c) {
						c.innerHTML = c.innerHTML + '<div class="vector-menu-portal portal expanded" id="p-version"><h3>Altre versioni</h3>' +
							'<div class="vector-menu-content"><ul class="vector-menu-content-list"></ul></div>';
						pvers = document.getElementById("p-version");
					}
				}
			}
			e = pvers.getElementsByTagName("ul")[0];
			etichetta = a.title.substr(p + 1, a.title.length - 1);
			nuovoLink = $(e).html() + "<li><a href=\"/wiki/" + a.title.substr(0, p) + "\" title=\"" + a.title.substr(0, p) + "\" >" + etichetta + "</a>";

			//link per il confronto tra due testi di it.source
			$(e).html(nuovoLink + '<a href="#" onclick="compare_ajax(\'it\', \'' + a.title.substr(0, p).replace(/\'/g, "\\'") + '\')" title="' 
				+ ws_messages.compare_texts + '">&nbsp;⇔</a></li>');
		}
	}
}
$(document).ready(interwikiExtra);


//invocata prima del salvataggio di una pagina Pagina
function verificaPagina() {
	// se esiste mw.editSection e e mw.editSection.status=="sect" clicca buttonAll per ricostruire il testo
		
		if (mw.sectionEdit && mw.sectionEdit.status && mw.sectionEdit.status==="sect") {
			$("#buttonAll").click();
			console.log("cliccato buttonAll");
		
		}
	var editbox = document.getElementsByName('wpTextbox1')[0];
	editbox.value = editbox.value.replace(/—/g, "— ").replace(/—\ \ /g, "— ");
	
	// qui inserire la gestione [[Categoria:Pagine con testo greco]]
	var r=/[\u0370-\u03FF\u1F00-\u1FFF]{2}/i;
	var rc=/\[\[Categoria:Pagine con testo greco\]\]/i;
	if (r.test(editbox.value) ) {
		if 	(rc.test(leggiBox(2))===false ) scriviBox(leggiBox(2)+"[[Categoria:Pagine con testo greco]]",2);
	} else {
		if 	(rc.test(leggiBox(2))===true ) scriviBox(leggiBox(2).replace("[[Categoria:Pagine con testo greco]]",""),2);
	}
	
	//sistemiamo i section mal formattati (apici mancanti, slash mancante...)
	editbox.value = editbox.value.replace(/<section\s+(begin|end)\=([a-zA-Z0-9]+)\s*\/?>/gi, '<section $1="$2" />');

	if (mw.config.get("wgPageName").indexOf("Pagina:La_Sacra_Bibbia_(Diodati_1885).djvu") === 0) {
		bibbia1();
	}
}


//invocata prima del salvataggio di una pagina ns0
function verificaNs0() {
	var editbox = document.getElementsByName('wpTextbox1')[0];

	//controlla che la pagina contenga il template:Qualità (se non è una pagina di disambigua o un redirect o la pagina principale o una sezione di pagina)
	if (editbox.value.search(/\{\{[Qq]ualità\|/) == -1
	 && editbox.value.search(/\{\{[Dd]isambigua/) == -1 
	 && editbox.value.search(/#RINVIA/) == -1 
	 &&	editbox.value.search(/#REDIRECT/) == -1 
	 && mw.config.get("wgTitle").search(/Pagina principale/) == -1
	 && $('[name=wpSection]').val() !== undefined 
	 && $('[name=wpSection]').val() === '') {
		alert("Si prega di assegnare una qualità alla pagina, selezionando una delle icone qualità in basso");
		return false;
	}

	//compila automaticamente il campo "URL della versione cartacea a fronte" se è vuoto ma c'è un tag pages
	if (editbox.value.search(/<pages index=\".*?\"/) != -1 && editbox.value.search(/URL della versione cartacea a fronte\s*=\s*\n/) != -1) {
		m = editbox.value.match(/<pages index=\"(.*?)\"/);
		editbox.value = editbox.value.replace(/URL della versione cartacea a fronte\s*=\s*\n/, "URL della versione cartacea a fronte =Indice:" + m[1] +
			"\n");
	}

	//URL della versione cartacea a fronte deve puntare ad una pagina Indice (oppure essere vuoto). Non sono ammessi url o altre cose
	if (editbox.value.search(/URL della versione cartacea a fronte/) != -1) {
		var val = editbox.value.match(/URL della versione cartacea a fronte\s*= *(.*)\n/)[1];
		if (val !== null && val !== '' && val.search(/^Indice:.+/) == -1) {
			alert('Il campo "URL della versione cartacea a fronte" non sembra contenere una pagina Indice valida (esempio: Indice:Testo.djvu)');
			return false;
		}
	}

	//se l'utente vuole passare al 100%, ma non ha indicato una pagina Indice come fonte nel campo "URL della versione cartacea a fronte"
	if (editbox.value.search(/\{\{[Qq]ualità\|avz\=100%/) != -1
	 && editbox.value.search(/\{\{[Dd]isambigua/) == -1 
	 && editbox.value.search(/#RINVIA/) == -1 
	 &&	editbox.value.search(/#REDIRECT/) == -1 
	 && mw.config.get("wgTitle").search(/Pagina principale/) == -1
	 && $('[name=wpSection]').val() !== undefined 
	 && $('[name=wpSection]').val() === ''
	 && editbox.value.search(/URL della versione cartacea a fronte\s*=\s*\n/) != -1) {
		alert("Non hai indicato una versione cartacea a fronte! \nSe il testo non è dotato di versione cartacea a fronte, debitamente riletta, non può raggiungere il livello SAL 100%!");
		return false;
	}

	if (editbox.value.search("to= fromsection") != -1 || editbox.value.search('to="" fromsection') != -1 || editbox.value.search('to=NaN') != -1) {
		alert('Il tag "<pages>" non è corretto: devi compilare il parametro "to" con il numero della pagina dove termina il testo.');
		return false;
	}

	editbox.value = editbox.value.replace("—", "— ").replace("—  ", "— ");

	//funzione importata da Mediawiki:Areadati.js
	creaAreaDatiNs0();
}

//invocata prima del salvataggio di una pagina Autore
function verificaAutore() {
	var editbox = document.getElementsByName('wpTextbox1')[0];
	editbox.value = editbox.value.replace("—", "— ").replace("—  ", "— ");

	//funzione importata da Mediawiki:Areadati.js
	creaAreaDatiAutore();
}

//aggancia i vari verifica...() all'evento onSubmit
mw.loader.using(['ext.gadget.common']).then(function () {
	if (mw.config.get("wgCanonicalNamespace") == "Page") {
		impostaBottoni(verificaPagina);
	} else if (mw.config.get("wgCanonicalNamespace") === "") {
		impostaBottoni(verificaNs0);
	} else if (mw.config.get("wgNamespaceNumber") == 102) {
		impostaBottoni(verificaAutore);
	}
});


// elabora al volo il testo un attimo dopo il caricamento
function elabNs0() {
	var editbox = document.getElementsByName('wpTextbox1')[0];

	//nasconde l'area dati (il ciclo serve a trovare eventuali aree dati duplicate)
	areaDati = find_stringa(editbox.value, "<!-- Area dati:", "a qui -->", true, "");
	while (areaDati !== "") {
		editbox.value = editbox.value.replace(areaDati, "");
		areaDati = find_stringa(editbox.value, "<!-- Area dati:", "a qui -->", true, "");
	}

	//nasconde il Conteggio pagine
	editbox.value = editbox.value.replace("{{Conteggio pagine|[[Speciale:Statistiche]]}}", "");
}

//aggancia elabNs0
function elabNs0_onEdit() {
	// predisposizione variabile areaDati  e routine di pre-elaborazione al caricamento della pagina di edit
	areaDati = "valore iniziale di areadati";
	// toppa Alex per area dati Indice
	if (mw.config.get("wgNamespaceNumber") == 110 && $("[name=wpprpindex-Volumi]").length > 0) {
		var testoVolumi = $("[name=wpprpindex-Volumi]").val();
		areaDati = find_stringa(testoVolumi, "}}<!-- Area dati:", "<!-- a qui -->{{nop", 1);
		if (areaDati !== "") $("[name=wpprpindex-Volumi]").val(testoVolumi.replace(areaDati, ""));
		return;
	}

	// Solo ns0, Autore o Discussioni indice e edit
	if ( (mw.config.get("wgNamespaceNumber") === 0 || mw.config.get("wgNamespaceNumber") == 102 || mw.config.get("wgNamespaceNumber") == 111) && $('#wpTextbox1').length) {

		elabNs0();
	}
}
$(document).ready(elabNs0_onEdit);


/* Correzioni post-OCR automatiche alla creazione di una nuova Pagina  */
if (mw.config.get("wgCanonicalNamespace") == "Page" && mw.config.get("wgAction") == "edit" && mw.config.get("wgArticleId") === 0) {
	mw.loader.using('ext.proofreadpage.page', function () {
		$(document).ready(function () {
			var editbox = document.getElementsByName('wpTextbox1')[0];
			editbox.value = editbox.value.replace(/'/g, '’').replace(/’’’/g, '\'\'\'').replace(/’’/g, '\'\'').replace(/ \n/g, '\n');
			// tento di disabilitare la riunione delle righe spezzate
			//.replace(/-\n/g, '')
			//.replace(/- \n/g, '');  
			
			editbox.value = editbox.value.replace(/([^|])[-¬] *\n([^ \n]*)[ ]*[\n]?/g,"$1$2\n"); // importo da cleanup()
			// dehyphen(editbox.value) 
			// eseguo temporaneamente dehyphen in attesa di costruire/trovare la regex giusta
			editbox.value = editbox.value.replace(/ì’/g, 'l’')
				.replace(/1’/g, 'l’')
				.replace(/\bdeir\b\s*/g, 'dell’')
				.replace(/\bair\b\s*/g, 'all’')
				.replace(/\bneir\b\s*/g, 'nell’')
				.replace(/\bcoir\b\s*/g, 'coll’')
				.replace(/\bperche\b/g, 'perchè')
				.replace(/\bpoiche\b/g, 'poichè')
				.replace(/\bpiu\b/g, 'più')
				.replace(/\bpiti\b/g, 'più')
				.replace(/\s+([,;.:!?])/g, '$1')
				.replace(/«\s+/g, '«')
				.replace(/\s+»/g, '»')
				.replace(/([bcdfghlmnprstvzBCDFGHLMNPRSTV])’\s+/g, '$1’')
				.replace(/eh’/g, 'ch’')
				.replace(/\s+$/, '')
				.replace(/fi/, 'fi');
			console.log("Eseguite correzioni post-OCR automatiche");
		});
	});
}

//TODO: documentare!
function dehyphen(testo) {
	while (true) {
		pos = testo.indexOf("-\n");
		if (pos == -1) break;
		testo = testo.replace("-\n", "");
		for (i = pos; i < testo.length; i += 1) {
			if (testo.substring(i, i + 1) == " ") {
				testo = testo.substring(0, i) + "\n" + testo.substring(i + 1);
				break;
			}
		}
	}
	return testo;
}


/* La funzione restituisce testo, in cui tutte le istanze di a sono sostituite con b, esattamente come il metodo .replace() di python.
Nel caso in cui a==b oppure a=="" restituisce testo immodificato 
Nota: testo,a,b sono di tipo stringa */
function replaceAll(testo, a, b) {
	if (a == b) return testo;
	if (a === "") return testo;
	if (testo.indexOf(a) == -1) return testo;

	while (testo.indexOf(a) > -1) {
		testo = testo.replace(a, b);
	}
	return testo;
}



//numerazione versi: "ricordati" a che verso sei arrivato a numerare
//modifica un dato link settando il parametro par in fondo all'URL
function setURLVar(link, par, val) {
	if (link) {
		href = link.attr("href");
		if (href) {
			//rimuovi il parametro se c'era gia'
			if (href.indexOf(par) != -1) {
				regex = new RegExp(par + "=([a-z0-9]*)");
				href = href.replace(regex, "");
			}
	
			if (href.indexOf("?") == -1) {
				href += "?" + par + "=" + val;
			} else {
				href += "&" + par + "=" + val;
			}
			link.attr("href", href);
		}
	}
}
if (mw.config.get("wgCanonicalNamespace") == "Page" && mw.config.get('wgAction') != 'history') {
	mw.loader.using( ['mediawiki.util', 'ext.proofreadpage.page'] ).done(function(){

		// se trovo il parametro verso in request, lo porto avanti alla pagina successiva
		// (e in modifica di quella attuale)
		verso = mw.util.getParamValue('verso');
		if (verso) {
			setURLVar($("#ca-next span a"), "verso", verso);
			setURLVar($("#ca-edit span a"), "verso", verso);
		}
		pagina = mw.util.getParamValue('pagina');
		if (pagina) {
			setURLVar($("#ca-next span a"), "pagina", pagina);
			setURLVar($("#ca-edit span a"), "pagina", pagina);
		}

		// se la pagina corrente è numerata, prendo l'ultimo numero ed uso quello in ogni caso
		// (anche se avevo un numero dalla request)
		testo = $("div.pagetext div.poem:last").html();
		num = $("div.pagetext div.poem:last span.numeroriga:last").html();
		if (num) {
			verso = parseInt(num);
			span = "<span class=\"numeroriga\" id=\"riga" + num + "\" style=\"float:right;color:#666;font-size:70%\">" + num + "</span>";
			testo = testo.substring(testo.lastIndexOf(span) + span.length);
			righe = testo.split("\n");
			for (i = 1; i < righe.length; i++) {
				riga = righe[i].replace(/<\/?[^>]+(>|$)/g, "");
				if (riga.length > 0) verso++;
			}
			setURLVar($("#ca-next span a"), "verso", verso + 1);
			setURLVar($("#ca-edit span a"), "verso", verso + 1);
		}
		pagina = $("title");
	});
}

//mostra il tab Fonte anche quando si usa il template:Iwpages
mw.loader.using( 'mediawiki.util' ).done(function() {
	$(document).ready(function () {
		$('.iwpages').eq(0).each(function (index) {
			title = $(this).attr('title').split('|')[1];
			html = '<li id="ca-proofread-source"><span><a href="' + mw.util.getUrl("Indice:" + title) +
				'" title="Edizione scansionata utilizzata per ricavare questo testo">Fonte</a></span></li>';
			$(html).insertAfter($("#ca-nstab-main"));
		});
	});
});


/* ottiene il codice html ed altre informazioni di una pagina di it.wikisource.org
- Carica un oggetto js in $("body").data("parsedPage")
- Restituisce una lista t con l'html di header,body,footer (l'html base è nell'elemento t[1])
*/
function getPageCode(pagina) {
	if (pagina === undefined) pagina = mw.config.get("wgPageName");
	
	var content = $.ajax({
		url: "//it.wikisource.org/w/api.php?action=parse&format=json&page=" + pagina,
		async: false
	}).responseText; //
	
	var txt=JSON.parse(content);
	$("body").data("parsedPage",content);
	txt=txt.parse.text["*"];
	var l = produciLista(txt, "<noinclude>", "</noinclude>", 1);
	t = [];
	t[0] = l[0];
	t[2] = l[l.length - 1];
	t[1] = txt.replace(t[0], "").replace(t[2], "");
	return t;
}


$(document).ready(function() {
//fix bug della barra qualità (le colonne con larghezza 0% vengono mostrate con larghezza 1px sui browser WebKit)
	$('.mw-special-IndexPages .pr_quality td').each(function(index) {
		//sistemo mettendo display:none alle colonne di larghezza zero
		if ($(this).attr('style').indexOf('width:0') != -1) {
			$(this).hide();
		}
	});
	// apertura degli interwiki esterni in una finestra/scheda diversa dalla corrente; follow
	$(".extiw, .external.text").attr("target","extiw");
	
	// avviso per pagine dell'allineatore di Alex
	if ($('#allineatore').length) {
		var origine = $('#allineatore').data('origine') + '.wikisource.org';
		var pagename = mw.config.get('wgPageName').replace('Pagina:', '');
		$('.quality-msg-text').removeClass('quality-msg-text').addClass('quality-msg-text2')
			.html('Il testo è stato caricato automaticamente da ' +
			'<a href="//' + origine + '/wiki/Page:' + pagename + '">' + origine + '</a>. ' +
			'<br><b>Si prega di non modificare questa pagina!</b>');
	}
	
	// nel testo a due colonne che usa Template:Colonne allineate, allinea tra loro le righe corrispondente delle due colonne
	if (mw.config.get("wgCanonicalNamespace") == 'Page') {
		setInterval(function() {
			$('.colonne-allineate p').each(function(i) {
				var p1 = $('.colonne-allineate p:nth-child(' + i + ')');
				var p2 = $('.colonna:nth-of-type(2) p:nth-child(' + i + ')');
				$('.colonna p:nth-child(' + i + ')').css('height', Math. max(p1.height(), p2.height()));
			});
		}, 1000);
	}
});