MediaWiki:Common.js
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 + '"> ⇔</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);
}
});