Utente:Alex brollo/pagelistParsing.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.
// 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;
}