Utente:Alex brollo/pagelistParsing.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.
// parsing del tag pagelist (WIP)
function convPaginaLink(pagina,n) {
if (n==undefined) {sel=selection(); n=sel[1];}//si cattura la selezione
if (pagina==undefined) // caso in cui si stia sulla pagina Pagina
{
pagina=wgPageName.replace("Pagina:","Indice:");
pagina=pagina.substring(0,pagina.lastIndexOf("/"));
}
html=$.ajax({url:"http://it.wikisource.org/w/index.php?action=raw&title="+pagina,async:false}).responseText;
html=find_stringa(html,'<section begin="Pagine"/>','<section end="Pagine"/>',1);
pagelist=produciLista(html,"<pagelist","/>",1).join("");
nPaginaDjvu=p2d(n,pagelist);
sel[1]="[["+pagina.replace("Indice:","Pagina:")+"/"+nPaginaDjvu+"|"+n+"]]";
scriviBox(sel.join(""));
}
// html=$.ajax({url:"https://it.wikisource.org/w/index.php?action=raw&title=Pagina:Manzoni.djvu/135",async:false}).responseText;
function p2d(n,pagelist) {
nRom=false;nCif=false;
if (/[ivxlcdm]+/i.test(n)) {
nRom=true; nCif=false;
n=r2n(n);
}
else {
if (/\d+/i.test(n)) {nRom=false; nCif=true;}
}
if (nRom==nCif) {alert("Numero pagina con valori errati");return;} //OK
// cmax=0;
paginaDjvu=n;
pp=parsePagelist(pagelist);
coppie=pp[0]; romani=pp[1]; // OK
for (i=0;i<coppie.length;i+=1){
if (n>=coppie[i][1]*1 ) { //&& coppie[i][0]>=cmax
p=n*1+coppie[i][0]*1-coppie[i][1]*1;
pRom=isInRomanInterval(p,romani);
if (pRom==nRom) {
paginaDjvu=p;
//cmax=coppie[i][0];
}
}
}
return paginaDjvu;
}
function d2p(paginaDjvu,pg) {
// default: i numeri pagina coincidono
paginaCarta=paginaDjvu;
// caso in cui nel pagelist esistono sintassi delta tipo 9=1
if (/\d+=\d+/g.test(pg)) {
coppie=pg.match(/\d+=\d+/g);
// per ognuna delle coppie si calcola il delta finchè il numero pagina djvu è superiore al primo elemento della coppia
// sulla base della presunzione che le coppie siano ordinate progressivamente
for (i=0;i<coppie.length;i+=1) {
coppia=coppie[i].split("=");
if (paginaDjvu>=coppia[0])
paginaCarta=paginaDjvu*1-(coppia[0]-coppia[1]);
else break;
}
}
// analisi del caso in cui esista una sintassi tipo 9to15=roman|highroman
if (/\d+to\d+=roman|\d+to\d+=highroman|\d+to\d+=empty/g.test(pg))
{
// tal costrutto es. 9to15=roman si estraggono i tre dati in una lista: es. ["9","15","roman"]
romani=pg.match(/\d+to\d+=roman|\d+to\d+=highroman|\d+to\d+=empty/g);
for (i=0;i<romani.length;i+=1)
romaniv=romani[i].match(/(\d)+to(\d+)=(roman|highroman)/);
if (paginaDjvu>=romaniv[1] && paginaDjvu<=romaniv[2]) {
// default: numeri romani minuscoli
paginaCarta=n2r(paginaCarta).toLocaleLowerCase();
// caso highroman: il numero romano viene maiuscolizzato
if (romaniv[3]=="highroman") paginaCarta=paginaCarta.toLocaleUpperCase;
}
}
return paginaCarta;
}
function isInRomanInterval(n,lr) {
var romano=false;
for (i=0;i<lr.length;i+=1) {
if (n>=lr[i][1] && n<=lr[i][2]) {
romano=true; break;
}
}
return romano;
}
function parsePagelist (pagelist) {
var romani=[]; var romaniv=[];
if (/\d+to\d+=roman|\d+to\d+=highroman|\d+to\d+=empty/g.test(pagelist)) {
// dal costrutto es. 9to15=roman si estraggono i tre dati in una lista: es. ["9","15","roman"]
romani=pagelist.match(/\d+to\d+=roman|\d+to\d+=highroman/g);
for (i=0;i<romani.length;i+=1) {
romaniv.push(romani[i].match(/(\d)+to(\d+)=(roman|highroman)/));
}
}
var coppie=[];
if (/\d+=\d+/g.test(pagelist)) {
coppie=pagelist.match(/\d+=\d+/g);
}
for (i=0;i<coppie.length;i+=1){
coppie[i]=coppie[i].split("=");
}
return [coppie,romaniv];
}
// funzione da romano a arabo; riceve un numero romano maiuscolo o minuscolo. Non esegue verifica formale di congruità
function r2n(numeroRomano){
// minuscolizzo
nr=numeroRomano.toLocaleLowerCase();
cv={"m":1000,"d":500,"c":100,"l":50,"x":10,"v":5,"i":1};
n=0;
// per ognuna delle lettere incremento l'accumulatore sulla base del dizionario cv
for (i=0;i<nr.length;i+=1) {n+=cv[nr.substring(i,i+1)];}
// sporco trucco per la gestione di ix, xc, cm :-) (l'algoritmo precedente conteggia 21 in caso di xix...)
if (nr.indexOf("ix")>-1 || nr.indexOf("iv")>-1) n-=2;
if (nr.indexOf("xc")>-1 || nr.indexOf("xl")>-1) n-=20;
if (nr.indexOf("cm")>-1 || nr.indexOf("cd")>-1) n-=200;
return n;
}