
//FORMATTAZIONE TESTI
//tempi lunghi per operazioni elaborate: mi limito a spezzare le sillabe, in modo che le parole di un'allineamento giustificato non siano troppo allargate.
//limitazioni: gli unici tag HTML supportati siano del tipo:
// 1) <1_carattere>...</1_carattere>: non ritengo attualmente che vigano altre possibiltà altre al corsivo o la sottolineatura.
// 2) immagini: il tag va scritto maiuscolo: <IMG


var ar_vocali=new Array("a","e","i","o","u","à","è","é","í","ì","ò","ú","ù","A","E","I","O","U","È");
var ar_segni=new Array(" ",".",",",";",":","-","'","?","!",'"',"(",")");
var ar_sillabe=new Array();
var i;
var j;
var k;
var l;
var m;
var n;
var lettera_0;
var lettera_1;
var lettera_2;
var lettera_3;
var tipolettera_1;
var tipolettera_2;
var tipolettera_3;
var stato;
var gruppo;
var s="-"; //"&shy;"; //trattino di a-capo di HTML: è manifesto solo al margine destro di un corpo di testo
var testo;
var testo_0;
var fine_frase;

//---------------------------

//con i vocaboli preter-italiani le regole di sillabazione fanno solo che casino
//(prevedo un massimo di 4 ricorrenze per paragrafo):
function no_italiano(PAROLA, CORREZIONE){ //subroutine di function f(OGGETTO){
if(gruppo.indexOf(PAROLA)>-1){
 for(j=0;j<4;j++){
  gruppo=gruppo.replace(PAROLA, CORREZIONE);
 };;;
};;
};

//---------------------------

function f(OGGETTO, DETTAGLI){
//accetta un paragrafo e lo restituisce sillabandolo con i trattini di a-capo

var ar_subsegni=new Array();
var ar_immagini=new Array();

//per abbreviare analizzo le parole di un paragrafo dopo il 60° carattere
testo=OGGETTO.innerHTML;
if(testo.substr(testo.length-2,2)==")."){
 fine_frase=").";
 testo=testo.substr(0,testo.length-2);
}else{
 fine_frase=".";
 testo=testo.substr(0,testo.length-1);
};;
i=testo.indexOf(" ",60);
//posso farlo solo se non ho di mezzo però dei tag HTML
k=testo.indexOf("<");
if(k<60 && k>-1){
 j=testo.indexOf(">");
 if(j>=60){
  i=testo.indexOf(" ",j);
 };;
};;
testo_0=testo.substr(0,i);
testo=testo.substr(i);
//devo inoltre considerare che se, prima del ". finale" o di "). finale", non ci fosse una vocale (ad es. c'è una data o un nome strano) il vocabolo verrebbe troncato
//dato che intanto non spezzerei mai in sillabe l'ultima parola di una frase, tantovale ricercare lo spazio
i=testo.lastIndexOf(" ");
fine_frase=testo.substr(i)+fine_frase;
testo=testo.substr(0,i);

//resetto alcune variabili globali
ar_sillabe=ar_sillabe.splice(0,0);
k=0;
l=0;

//costruzione dell'array delle sillabe:

for(i=0;i<testo.length;i++){ 

 lettera_0=testo.substr(i,1);
 lettera_1=testo.substr((1+i),1);
 lettera_2=testo.substr((2+i),1);

 for(j=0;j<ar_vocali.length;j++){

  if(lettera_0==ar_vocali[j]){ //se ho trovato una vocale valuto come spezzare la sillaba

   //vedo cosa c'è dopo la vocale in questione (C=consonante, V=vocale)
   tipolettera_1="C";
   tipolettera_2="C";
   for(m=0;m<ar_vocali.length;m++){
    if(lettera_1==ar_vocali[m]){
     tipolettera_1="V";
     break;
    };;
   };;;
   for(m=0;m<ar_vocali.length;m++){
    if(lettera_2==ar_vocali[m]){
     tipolettera_2="V";
     break;
    };;
   };;;
   stato=tipolettera_1+tipolettera_2

   if(stato=="VC"){ //di fatto il comportamento sillabico è analogo, per cui unifico i 2 casi
    stato="VV";
   };;

   switch(stato){

    case "VV": //a-iola, gio-ele, ie-orgia; ca-orle, chio-ma, co-eso
     gruppo=lettera_0+lettera_1;
     stato=0; //spezzo la sillaba in lettera_0
     if(gruppo=="ia"||gruppo=="ie"||gruppo=="io"||gruppo=="iu"){ //spezzo la sillaba in lettera_1
      stato=1; //la spezzo in lettera_1
      //inoltre devo valutare eccezioni del tipo ingIOTTire, striscIANTe che vanno spezzate in lettera_2
      lettera_3=testo.substr((3+i),1);
      tipolettera_3="C";
      for(m=0;m<ar_vocali.length;m++){
       if(lettera_3==ar_vocali[m]){
        tipolettera_3="V";
        break;
       };;
      };;;
      if(tipolettera_2=="C" && tipolettera_3=="C"){
       stato=2;
      };;
     };;
     break;

    case "CV": //ca-sa, ca-storo
     stato=0; //spezzo sempre la sillaba in lettera_0
     break;

    case "CC": //a-strazione, ac-qua, at-tuale, al-trimenti, e-spro-prio... discorso variegato
     //spezzo la sillaba in lettera_0 solo nelle seguenti casistiche, altrimenti in lettera_1
     //-bl, -br
     //-cl, -cr,
     //-dl, -dr
     //-fl, -fr
     //-gl, -gr, -gn
     //-kl, -kr
     //-pl, -pr, -ps
     //-sl, -sr, -sb, -sc, -sd, -sf, -sg, -sk, -sm, -sn, -sp, -sq, -st, -sv
     //-tl, -tr
     //-vl, -vr
     //tutti i casi in cui lettera_2 sia una h
     stato=1;
     if(lettera_2=="l" || lettera_2=="r"){
      if(lettera_1=="b"||lettera_1=="c"||lettera_1=="d"||lettera_1=="f"||lettera_1=="g"||lettera_1=="k"||lettera_1=="p"||lettera_1=="s"||lettera_1=="t"||lettera_1=="v"){
       stato=0;
      };;
     };;
     if(stato==1 && lettera_1=="s"){
      if(lettera_2=="b"||lettera_2=="c"||lettera_2=="d"||lettera_2=="f"||lettera_2=="g"||lettera_2=="k"||lettera_2=="m"||lettera_2=="n"||lettera_2=="p"||lettera_2=="q"||lettera_2=="t"||lettera_2=="v"){
       stato=0;
      };;
     };;
     if(lettera_1=="g" && lettera_2=="n"){
      stato=0;
     };;
     if(lettera_1=="p" && lettera_2=="s"){
      stato=0;
     };;
     if(lettera_2=="h"){
      stato=0;
     };;
     break;

   };

  i=(i+stato);

  if(k==0){
   k=-1;
  };;
  ar_sillabe[l]=testo.substring((1+k),(1+i));
  l++;

  k=i;
  break;

  };;

 };;;

};;;

 

//associazione al testo: alcuni dettagli da correggere

gruppo=ar_sillabe.join(s)+fine_frase;

//per abbreviare l'esecuzione estraggo il sottoinsieme utile dell'array dei segni, dato che normalmente solo pochi di essi compaiono
ar_subsegni[0]=s;
k=1;
for(i=0;i<ar_segni.length;i++){
 if(gruppo.indexOf(ar_segni[i])>-1){
  ar_subsegni[k]=ar_segni[i];
  k++;
 };;
};;

//ciclo su gruppo adottando una formula pratica-empirica
k=(2+1.5*Math.sqrt(ar_sillabe.length));
if(k<6){
 k=6
};;
for(n=0;n<k/2;n++){
 //anomalia vocali
 for(i=0;i<ar_subsegni.length;i++){
  gruppo=gruppo.replace(s+ar_subsegni[i],ar_subsegni[i]);
  gruppo=gruppo.replace(s+"a"+ar_subsegni[i],"a"+ar_subsegni[i]);
  gruppo=gruppo.replace(s+"e"+ar_subsegni[i],"e"+ar_subsegni[i]);
  gruppo=gruppo.replace(s+"i"+ar_subsegni[i],"i"+ar_subsegni[i]);
  gruppo=gruppo.replace(s+"o"+ar_subsegni[i],"o"+ar_subsegni[i]);
  gruppo=gruppo.replace(s+"u"+ar_subsegni[i],"u"+ar_subsegni[i]);
 };;;
};;;
//anomalia spazio
for(n=0;n<4*k;n++){
 gruppo=gruppo.replace(" "+s," ");
 gruppo=gruppo.replace(s+" "," ");
};;;
//anomalia vocali accentate, Q, un'
for(n=0;n<k/3;n++){
 for(i=0;i<ar_subsegni.length;i++){
  gruppo=gruppo.replace(s+"è"+ar_subsegni[i],"è"+ar_subsegni[i]);
  gruppo=gruppo.replace(s+"ò"+ar_subsegni[i],"ò"+ar_subsegni[i]);
  gruppo=gruppo.replace(s+"ú"+ar_subsegni[i],"ú"+ar_subsegni[i]);
 };;
 gruppo=gruppo.replace("qu"+s,"qu");
 gruppo=gruppo.replace("Qu"+s,"Qu");
};;;

//la restante parte non compare quasi mai per cui la subordino a condizioni aggiuntive

if(DETTAGLI==1){ //prefazione e introduzione
 //tag di sottolineatura o corsivo
 l=(OGGETTO.id).substr(1);
 l=1*l;
 k=0;
 if(l==1||l==9||l==10||l==12||l==13||l==19||l==32||l==33||l==40||l==42||l==45||l==49||l==50||l==55||l==64){
  k=1;
 };;
 if(l==4||l==7||l==8||l==11||l==14||l==46||l==54||l==56||l==59||l==62){
  k=2;
 };;
 if(l==43||l==44||l==47||l==48||l==52||l==66){
  k=3;
 };;
 if(l==17||l==51||l==67){
  k=4;
 };;
 if(l==31){
  k=5;
 };;
//alert(gruppo);
 for(j=0;j<k;j++){
  gruppo=gruppo.replace("<"+s,"<");
  gruppo=gruppo.replace(">"+s,">");
  gruppo=gruppo.replace(s+"<","<");
  gruppo=gruppo.replace(s+">",">");
  gruppo=gruppo.replace(" "+s," ");
//alert("j="+j+"_____"+gruppo);
 };;;
 // lemmi preter-italiani
 no_italiano("Fran"+s+"k","Frank"); //corregge Fran-k
 no_italiano("craf"+s+"t","craft"); //c. Lovecraf-t
 no_italiano("no"+s+"ch","noch"); //c. Eno-ch
 no_italiano("H"+s+"B","HB"); //c. AH-BH
 no_italiano("Nui"+s+"th","Nuith"); //c. Nui-th
 no_italiano("a."+s+"C","a.C"); //c. a.-C
 no_italiano("for"+s+"d","ford"); //c. Langfor-d
 no_italiano("Luh"+s+"n","Luhn"); //c. Lhu-n
 no_italiano("Har"+s+"n","Harn"); //c. Har-n
 no_italiano("de Cam"+s+"p","de Camp"); //c. de Cam-p
 no_italiano("Bri"+s+"ti Mu","British Mu"); //c. Briti
 no_italiano("Lo"+s+"gae"+s+"th","Lo"+s+"ga"+s+"eth"); //c. Logae-th
 no_italiano("ies"+s+"t","ie"+s+"st"); //c. Trie-ste
 //immagini
 if(gruppo.indexOf("<IM")>-1){
  ar_immagini=gruppo.split("<IM");
  for(n=1;n<ar_immagini.length;n++){
   i=ar_immagini[n].indexOf(">");
   for(j=0;j<i;j++){
    k=ar_immagini[n].indexOf(s,j);
    l=s.length;
    i=(i-l);
    if(k>i){
     break;
    };;
    ar_immagini[n]=ar_immagini[n].substr(0,k)+ar_immagini[n].substr((k+l));
   };;;
  };;;
 gruppo=ar_immagini.join("<IM");
 };;
 //eccezioni
 if(l==13){
  gruppo=gruppo.replace(s+"<I>"+s,"<I>");
 };;
};;

if(DETTAGLI==2){ //Shauthenerom
 if(OGGETTO.id=="t130"){
  for(k=0;k<2;k++){
   gruppo=gruppo.replace("<"+s,"<");
   gruppo=gruppo.replace(">"+s,">");
   gruppo=gruppo.replace(s+"<","<");
   gruppo=gruppo.replace(s+">",">");
   gruppo=gruppo.replace(" "+s," ");
  };;;
 };;
 no_italiano("ax"+s+"yr","a"+s+"xyr"); //c. Nax-yr
 no_italiano("yph","y"+s+"ph"); //c. Typhon
 no_italiano("ar"+s+"yx","a"+s+"ryx"); //c. Nar-yx
 no_italiano("chto"+s+"nh","ch"+s+"tonh"); //c. Ichto-nh
 no_italiano("No"+s+"den"+s+"s","No"+s+"dens"); //c. Noden-s
 no_italiano("uh"+s+"r","uhr"); //c. Nuhr
 no_italiano("ah"+s+"n","ahn"); //c. Dahn
 no_italiano("goh"+s+"r","gohr"); //c. Aanghor
 no_italiano("ca  kg","ca 90 kg"); //c. il numero quando è parte finale dell'array verrebbe troncato
};;

if(DETTAGLI==3){ //Necronomicon
 no_italiano("ax"+s+"yr","a"+s+"xyr"); //c. Nax-yr
 no_italiano("O"+s+"th.","Oth."); //c. O-th
 no_italiano("g"+s+"go"+s+"th","g"+s+"goth"); //c. Shoggo-th

 no_italiano("ar"+s+"yx","a"+s+"ryx"); //c. Nar-yx
 no_italiano("chto"+s+"nh","ch"+s+"tonh"); //c. Ichto-nh
 no_italiano("No"+s+"den"+s+"s","No"+s+"dens"); //c. Noden-s
 no_italiano("uh"+s+"r","uhr"); //c. Nuhr
 no_italiano("ah"+s+"n","ahn"); //c. Dahn
 no_italiano("goh"+s+"r","gohr"); //c. Aanghor
 no_italiano("ca  kg","ca 90 kg"); //c. il numero quando è parte finale dell'array verrebbe troncato
};;

OGGETTO.innerHTML=testo_0+gruppo;

};

