/**** komenco de pho. versio 0.3.1.0***/
// ŝanĝu la sekvajn variablojn por eksperimenti

var longecoNormalaVokalo = 45  ;  // en milisekundoj; longeco de normala vokalo (estis 55 milisekundoj) 
var longecoAkcentitaVokalo = 105; // ... de akcentita vokalo(estis 140)
var longecoAntauPunkto = 60;     // ... de vokalo antaŭ punkto (estis 115)
var longecoAntauKomo = 60;       // ... de vokalo antaŭ komo (estis 115)
var longecoAntauSpaco = 60;       // ... de vortfina vokalo estis 100

var tonoAntauKomo= 150;     // Tonalteco en Hz. fino de nelasta frazoparto (ekz. antaŭ komo, dukomo, punkto-komo)) ŝanĝo1 estis 160
var tonoAntauPunkto= 130;   // fino de lasta frazoparto kiu finas per punkto. // ********sângĥo1 estis 150
var tonoAntauDemando = 185; // fino de lasta frazoparto kiu finas per demando-signo.
var tonoAntauKrio = 195;    // fino de lasta frazoparto kiu finas per kri-signo.

var akcentAltigo = 30;     // la antaŭlasta silabo estas dirita 30 Hz pli alte. (estis 35)
var faloAntaŭKomo = -20;   // la lasta silabo antaŭ komo estas dirita 20 Hz malpli alte.
var faloAntaŭPunkto = -30; // la lasta silabo antaŭ punkto estas dirita 30 Hz malpli alte.
// Notu ke en demando, tiuj 3 valoroj estas inversaj (*-1)

var supraTono = 185;    // la maksimuma supra tono, en Hz. Tamen povas aldoniĝi laŭHazardaVarioDeLaTonoAlteco. Notu ke ĝi estas malpli alta ol kelkaj antaŭaj valoroj. Tio NE estas eraro.
var malsupraTono = 120; // la minimuma malsupra tono. Tamen...  // ********sângĥo1 estis 155

var tonFalo = 2;    // la tona falas de 2 Hz de la komenco al la fino de frazoparto.
var laŭHazardaVarioDeLaTonoAlteco = 25; // Jus antaŭ la tonalteco estas elektita, aldonu + aŭ - Hz laŭhazarde. estis 20)
var kiam = "10"; //  povus esti: 25 180 100 x   (la x estas jam antaŭkalkulita lasta tonalteco, kalkulita en prozodio
//                   ĉi tie 10 signifas ke la tonalteco x Hz estos atingita post 10% de la tuta daûro de la vokalo
//                   25 180 100 x signifas ke la tonalteco de 180 Hz estos atingita post 25% de la daŭro de la vokalo, 
//                   kaj altiĝos (aŭ malaltiĝos) ĝis x Hz je la fino de la daŭro.

/*** la longeco de konsonantoj estas aparte difinita por ĉiu konsonanto ekde linio 800. ***/

/*** iam uzita dum provoj 
var koDe = 170; // fino de nelasta frazoparto (ekz. antaŭ komo) en frazo kiu finiĝas per demando-signo. (ne plu uzita)
var koEk = 195; // fino de nelasta frazoparto (ekz. antaŭ komo) en frazo kiu finiĝas per kri-signo. (ne plu uzita)
***/

/*** ŝanĝo de la rapideco ***/
// var rapideco = 1.0; // se vi deziras iri al pollando, ekzercu vian aŭdokapablon: Uzu 0.5. la teksto estos legata dufoje pli rapide. (Uzu 2.0 por dufoje malpli rapide).

/****
lastaj ŝanĝoj :
0.2.5 literumado
0.2.8 12a 10-ono
0.2.10 datoj kaj tempoj 2005-08-05 14:00:30
0.2.11 pli bona literumado, pritrakto de kelkaj fremdaj literoj, pli multe el la greka
0.2.12 pritrakto de ciferoj post la komo. 123,00123 = cent dudek tri komo nul nul unu du tri
0.2.13 pritrakto de poemoj
0.2.14 mall.: kg i.a k.a. ĉ. p. UN
pli bona literumado
pritrakto de punkto meze de vortoj kiel "lernu PUNKTO net"
ŝanĝo de la pritrakto de dato 2005-08-05 iĝos kvina de aŭgusto du mil kvin.
0.2.15 ignori inter [- kaj -]
0.2.16 pritrakto de la cirila
0.2.17 pritrakto de esklamo !
0.2.18 w W devus funkcii en parolu.jar
°C = celsiaj gradoj
aldonaj mallongigoj: PS. atm. kHz k. sekv. MET NB OET. PV prez. p-ro ptm., Univ.
0.2.19 © kopirajto UTF htlm
0.2.20 apostrofoj, longa streko, GMT k. (kaj) cit/malcit MBROLI MBOROLA
plibonigo de poezio (vokalo + apostrofo)
diri komencajn nulojn
pritrakto de ķ ē
0.2.21 pritrakto de F12 (sed pli bone estus FO DEK DU - tion poste)
0.2.22 km/h 12-a atm ptm
0.2.23 Eo
0.2.24 La vario en la alteco de la tono estas pli hazarda, por eviti monotonecon.
0.2.25 la konsonanto ĝ estis ŝanĝita
0.2.26 korekto de "finaĵoj" ks. Antaŭe okazis ke akcento estis malbone metita se ĉĝĥĵŝ en la lasta silabo.
0.2.27 plilongigo de la verbaj finaĵoj -as -is -os -us -i -u, kaj paŭzeto poste
0.2.28 la tono estas foje tro malalta.
forigo de kelkaj asimiladoj kiel ai (skribu AI anstataŭ ai)
a. Kr. (antaŭ Kristo) m2 (kvadratmetroj) cm (centimetroj)
— (longa streko por mallonga paŭzo)
0.3.0.1 −(/u2212) minus ; -(/u002D) streko; –(/u2013) ĝis ; —(/u2014) paŭzo.
paŭzo post a de aŭ por plibonigi la a sono
la longeco de vokaloj estis ŝanĝita
Ebleco facile ŝanĝi kelkajn valoroj, kiel longeco de vokaloj, ktp.
0.3.0.2 demandoj estas iom pli bone pritraktitaj. Poste mi aldonos pliajn regulojn, por la lastaj kazoj.
0.3.0.3 ĝenerala prozodio estis iom plibonigita
unusilabaj interjekcioj iom ŝanĝitaj (sed ne tute kontentige)
literumado ŝanĝita.
f-ino mll por fraŭlino
0.3.0.4 la literumado estas ŝanĝita (kontrolota - kelkaj kazoj estas dube pritraktitaj)
Tute nova pritrakto de kelkaj specialaj kazoj.
UEA. Ĝis! Ĉu?
ha! he! he ho! hej! help! hihi! hik! hm! ho! hoj! hola! hop! hu! hu ha! hu hu! huj!
hura! huŝ! hu-u-u!
prozodio de demandoj iom ŝanĝita. Pli kompleta solvo poste.
0.3.0.5 Klaketo forigita por [-xxx-] kaj kelkaj aliaj kazoj
Ŝanĝita pritrakto de streketoj. ĝis kaj minus nur antaŭ ciferoj
Konsonanto L plibonigita.
0.3.0.6 Plilongigo de la fina, kaj meza N.
Intervokala paŭzeto plilongigita al 5 ms (estis 1)
intervortaj hiatoj pritraktitaj kiel envortaj
0.3.0.7 pritrakto de la fina punkto post literumado aŭ mallongigo.
ŝanĝo de pritakto de supersignoj
miliardoj kaj duilionoj estas pli bone pritraktitaj
du spacoj inter ciferoj povas esti uzataj por apartigi ciferojn (unu spaco inter ciferoj estas ignorata)
kelkaj hiatoj forigitaj
0.3.0.8
X estas bone literumita kiel "ikso"
Tempo komplete pritraktita (HH:MM:SS ekz. 01:01:01)
hiato inte e-e forigita (eYe)
91-a kaj 91a same pritraktitaj + akcento bone lokita
F12 bone literumita kiel Fo dekdu
0.3.0.9
". ." .) kaj ). pritraktitaj kiel .
longeco de akcentita vokalo estas nun 130
tonalteco de akcentita vokalo altigita ĝis 40 Hz
hazardigo de la tonalteco valoras nun 25 Hz
0.3.0.10
b 0 aldonita inter i-i
Kelkaj aldonaj klarigoj por faciligi la eksperimentojn
0.3.0.11 
EU ne plus prononcita eûropa unio sed simple E.U.
n fonemo ŝanĝita al N
i ŝangita al Ii (forigita en 0.3.0.12)
rilato inter normala kaj akcentita vokalo ŝanĝita (3foje pli granda)
0.3.0.12
provo ; v ŝanĝita al w 5 v (ĝenas - forigita)
trioblaj hiatoj pritraktitaj (krii insultojn)
akcento (+ 35 Hz - estis 40)
longeco de akcentita vokalo : 55ms
fina N ŝanĝita al n por eviti Ng.
0.3.0.13
pritrakto de multe pliaj mallongigoj (pli poste)
0.3.0.14
w estis ignorata. Denove funkcias.
punkto forigita post Ĉ.Ĝ.Ĥ.Ĵ.Ŝ.Ŭ.
pliaj mallongigoj pritraktitaj
0.3.0.15
%-aj (estis legata procentojaj)
literumado iom ŝanĝita
komenca litero plilongigita
komenca v ŝanĝita al m+v 
Pluraj aliaj konsonantoj estis ŝanĝitaj post paŭzo.
0.3.0.16
vortfinaj J N S plilongaj (korekto)
vortinaj AŬ Ŭ plilongigita
Vortfinaj vokaloj plilongigitaj (al 100ms)
Komenca J ŝanĝita de i-j al j-j.
0.3.0.17
vortfina U plibonigita.
akcentita silabo malpli alta.
0.3.0.18
ui ea eo estas nun hiatoj.
0.3.0.19
originala teksto aldonita en la pho-dokumenton
0.3.0.20
TRANS LAŬ AŬ NAŬ ne literumitaj
akcento en vortoj kiel "korupto" bone lokita (UP vibradis)

0.3.1.0 
La vibradoj eble ne plu okazas - mi forigis la kromajn intervokalojn kiuj foje povas ĝeni pli ol helpi
Duoblaj konsonantoj estas pli klare prononcataj- tŝ estas malsama al ĉ; dĵ al ĝ ktp...
Hiato ia io permesita (estis ija ijo).
La prononco estas iom pli rapida.
La tono antaŭ punktoj kaj komoj estas iom malplialta.

farenda :
.$ al .. (punkto fine de linio devus kaŭzi pli longan paŭzon).

kodoj (tiuj kodoj nur povas esti uzataj post kiam ili estis ŝangitaj en la originala teksto)
Y asimilado j (Y iĝos I)
W asimilado w (W iĝos Ŭ)
@ akcentita vokalo aŭ plilongigita lasta konsonanto (j, n, s) (@ iĝos HELIKO)
£ lasta vokalo antaŭ punkto (PUNDOJ)
€ lasta vokalo antaŭ komo (EŬROJ)
° forigi vibradon (GRADOJ)
Q intervokala paŭzo (K)
§ spaco (PARAGRAFO)
< plibonigo de vortfina n j s.
> fino de frazo parto ekz. , : ; . ! ? (PLI GRANDA OL)
Ó elizita O (en poezio)
***/

tono=tonoAntauPunkto;
interpunkcio=".";

function foriguSkribo(teksto){
	
var t=teksto.length,s="";
ix=teksto.indexOf("[-"); if(ix<0) return teksto;
s=teksto.substring(0,ix)+" ";
jx=teksto.indexOf("-]",ix); if(jx>=0) s=s+foriguSkribo(teksto.substring(jx+2));
return s;
}

function vokalo(parto,i){
var tempa;
if("AEIOU".indexOf(parto.charAt(i))>=0){ return parto.charAt(i)+ " \u2CFC "+ (alteco(parto.charAt(i-1))) +"\n";}
else return parto.charAt(i);
}

function alteco(karaktro){
switch(interpunkcio){
case "?" : // tono=tono-tonFalo;break;
case "!" : break;
default: tono=tono+tonFalo;break;
}

switch(karaktro){
case "@" : if(interpunkcio=="?")return limit(tono)-akcentAltigo; // inversigo de la akcento en demandoj
else return limit(tono)+akcentAltigo; break; //20
case "€" : if(interpunkcio=="?")return limit(tono)-faloAntaŭKomo; //10
else return limit(tono)+faloAntaŭKomo; break;//10
case "£" : if(interpunkcio=="?")return limit(tono)-faloAntaŭPunkto;//30
else return limit(tono)+faloAntaŭPunkto; break;//20
default : return limit(tono);
}

return tono;
}

function limit(t){
if(t>supraTono) t=supraTono;
if(t<malsupraTono) t=malsupraTono
t=t+Math.round(laŭHazardaVarioDeLaTonoAlteco*(Math.random()*2-1)); // + - laŭHazardaVarioDeLaTonoAlteco
return t;
}

function prozodi(frazo) {
frazo = frazo.replace(/[ ]+/g,"§"); // spacoj ne estas permesitaj
frazo= frazo.replace(/([:,;]+)/g,",>");
var array = frazo.split(/>/);
var s="";

var i = array.length-1;

while (i>=0) {
interpunkcio=array[i].charAt(array[i].length-1); //++++

switch(interpunkcio){
	case "?": tono=tonoAntauDemando; break;
	case "!": tono=tonoAntauKrio;    break;
	case ".": tono=tonoAntauPunkto;  break;
	default:  tono=tonoAntauKomo;
	}

var parto=array[i];
var l=(parto.length)-1;
for(;l>=0;l--) {
s=vokalo(parto,l)+s;

}
i--;
}
return s;
}

String.prototype.prozodio = function() {

var s= this.replace(/\.[§\s]/g,".>"); // . devas esti sekvata de spaco aŭ novlinio
s= s.replace(/\?+/g,"?>");
s= s.replace(/!+/g,"!>");
var array = s.split(/>/);
s="";

var i = 0;
while (i<array.length) {
var frazo=array[i];

// forigita: interpunkcio=frazo.charAt(frazo.length-1); // (utilis por demandoj)

s+=prozodi(frazo);
i++;
}
return s;
}

function traduku_de_unikodo_al_pho(teksto)
{
	/**
var originalo = teksto.replace(/\n/g,"\n;");
 originalo = originalo.replace(/ĉ/g,"cx");
 originalo = originalo.replace(/ĝ/g,"gx");
 originalo = originalo.replace(/ĥ/g,"hx");
 originalo = originalo.replace(/ĵ/g,"jx");
 originalo = originalo.replace(/ŝ/g,"sx");
 originalo = originalo.replace(/ŭ/g,"vx");
 originalo = originalo.replace(/Ĉ/g,"CX");
 originalo = originalo.replace(/Ĝ/g,"GX");
 originalo = originalo.replace(/Ĥ/g,"HX");
 originalo = originalo.replace(/Ĵ/g,"JX");
 originalo = originalo.replace(/Ŝ/g,"SX");
 originalo = originalo.replace(/Ŭ/g,"VX");

originalo = originalo.replace(/[^A-Z "—'\?!,\.\-<АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдeёжзийклмнопрстуфхцчшщъыьэюяαβγδεζηθικλμνξοπρσςτυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΪΌΎΏάέήίϊόύώ]/g," "); // aliaj signoj ne estas pritraktitaj
**/
 
teksto=foriguSkribo(teksto); // ignoru ĉion inter [- ... -]
teksto = teksto.replace(/(\"\.|\)\.|\.\"|\.\))/g, ".");
teksto = teksto.replace(/[\u2C00-\u2CFF]/g, ""); // tiuj kodoj estas uzataj por specialaj kazoj- ili estos ignorataj en la originalo
teksto = teksto.replace(/\bX\b/g, "\u2C1D"); // tiu x estos literumita IKSO
teksto = teksto.replace(/[x]/gi, "\u2CFE"); // la xoj estos uzataj nr surogate, ĝis fine.

teksto = teksto.replace(/Ĉ/g, "CX"); // necese ĉar en la sekvaj ŝanĝoj la unikodo ne ĉiam estas bone pritraktita
teksto = teksto.replace(/Ĝ/g, "GX"); // krome, tio simpligas la instrukciojn
teksto = teksto.replace(/Ĥ/g, "HX");
teksto = teksto.replace(/Ĵ/g, "JX");
teksto = teksto.replace(/Ŝ/g, "SX");
teksto = teksto.replace(/Ŭ/g, "VX");
teksto = teksto.replace(/ĉ/g, "cx"); 
teksto = teksto.replace(/ĝ/g, "gx");
teksto = teksto.replace(/ĥ/g, "hx");
teksto = teksto.replace(/ĵ/g, "jx");
teksto = teksto.replace(/ŝ/g, "sx");
teksto = teksto.replace(/ŭ/g, "vx");

teksto = teksto.replace(/\b([A-Z])\. ([A-Z])/g, "$1. \u2CFF$2"); // pritrakto de literumado fine de frazo
teksto = teksto.replace(/\b([A-Z])\.$/g, "$1. \u2CFF");          // \u2CFF reiĝos punkto post kiam mallongigoj estos pritraktitaj

/* specialaj kazoj - aparte pritraktitaj tutfine de la programo - eble pliaj poste */

teksto = teksto.replace(/\bUEA\b/g, "\u2C20");
teksto = teksto.replace(/GXis!/g, "\u2C21");
teksto = teksto.replace(/(^cxu\?)|( cxu\?)/gi, "\u2C22");
teksto = teksto.replace(/\b[Hh]a!/g, "\u2C23");
teksto = teksto.replace(/\b[Hh]e!/g, "\u2C24");
teksto = teksto.replace(/\b[Hh]e ho!/g, "\u2C25");
teksto = teksto.replace(/\b[Hh]ej!/g, "\u2C26");
teksto = teksto.replace(/\b[Hh]elp!/g, "\u2C27");
teksto = teksto.replace(/\b[Hh]ihi!/g, "\u2C28");
teksto = teksto.replace(/\b[Hh]ik!/g, "\u2C29");
teksto = teksto.replace(/\b[Hh]m!/g, "\u2C2A");
teksto = teksto.replace(/\b[Hh]o!/g, "\u2C2B");
teksto = teksto.replace(/\b[Hh]oj!/g, "\u2C2C");
teksto = teksto.replace(/\b[Hh]ola!/g, "\u2C2D");
teksto = teksto.replace(/\b[Hh]op!/g, "\u2C2E");
teksto = teksto.replace(/\b[Hh]u!/g, "\u2C2F");
teksto = teksto.replace(/\b[Hh]u ha!/g, "\u2C30");
teksto = teksto.replace(/\b[Hh]u hu!/g, "\u2C31");
teksto = teksto.replace(/\b[Hh]uj!/g, "\u2C32");
teksto = teksto.replace(/\b[Hh]ura!/g, "\u2C33");
teksto = teksto.replace(/\b[Hh]usx!/g, "\u2C34");
teksto = teksto.replace(/\b[Hh]u-u-u!/g, "\u2C35");

/* pritrakti signojn */
teksto = teksto.replace(/%\-([a-z])/g, " procent$1");
teksto = teksto.replace(/%/g, " procentoj ");
teksto = teksto.replace(/&/g, " kaj ");
teksto = teksto.replace(/</g, " malpli granda ol ");
teksto = teksto.replace(/=/g, " egalas ");
teksto = teksto.replace(/>/g, " pli granda ol ");
teksto = teksto.replace(/@/g, " heliko ");
teksto = teksto.replace(/\$/g, " dolaroj ");
teksto = teksto.replace(/\*/g, " asterisko ");
teksto = teksto.replace(/\+/g, " plus ");
teksto = teksto.replace(/\.\.\./g, ".");  //estos ŝanĝita poste......
teksto = teksto.replace(/\//g, " oblikvo ");
teksto = teksto.replace(/\\/g, " malsuprenstreko ");
teksto = teksto.replace(/£/g, " pundoj ");
teksto = teksto.replace(/§/g, " paragrafo ");
teksto = teksto.replace(/°/g, " gradoj ");
teksto = teksto.replace(/°C/g, " celsiaj gradoj ");
teksto = teksto.replace(/€/g, " evxroj ");
teksto = teksto.replace(/©/g, " kopirajto ");
teksto = teksto.replace(/\+/g," plus ");
teksto = teksto.replace(/−(\d)/g," minus $1"); // Minus is \u2212
teksto = teksto.replace(/–(\d)/g," gxis $1"); // ĝis is \u2013
teksto = teksto.replace(/[—]{2,3}/g," — "); // Paŭzo
teksto = teksto.replace(/[`‘’´]/g, "\""); // estas pritraktitaj kiel citiloj. Kelkaj erare uzas tiujn signojn anstataŭ apostrofoj '
// la antaŭaj karaktroj estas ekde nun uzeblaj kiel specialaj karaktroj

/* pritrakti mallongigojn */

teksto = teksto.replace(/\batm(\.|\b)/g, " antavxtagmeze ");
teksto = teksto.replace(/\b[fF]-ino/g, "fravxlino ");
teksto = teksto.replace(/\bi\.a\. (?=[A-Z])/g, " inter aliaj\u2CFF"); // frazo fino
teksto = teksto.replace(/\bi\.a\./g, " inter aliaj"); // frazo fino
teksto = teksto.replace(/\bk\. sekv\. (?=[A-Z])/g, " kaj sekvantaj\u2CFF");// frazo fino
teksto = teksto.replace(/\bk\. sekv\./g, " kaj sekvantaj ");

teksto = teksto.replace(/\bktp\. (?=[A-Z])/g, " kaj tiel plu\u2CFF");// frazo fino
teksto = teksto.replace(/\bktp\./g, " kaj tiel plu ");
teksto = teksto.replace(/\bktp\b/g, " kaj tiel plu ");

teksto = teksto.replace(/\bk\.a\. (?=[A-Z])/g, " kaj aliaj\u2CFF");// frazo fino
teksto = teksto.replace(/\bk\.a\./g, " kaj aliaj ");

teksto = teksto.replace(/\ba\. Kr\. (?=[A-Z])/g, " antavx Kristo\u2CFF");// frazo fino
teksto = teksto.replace(/\ba\. Kr\./g, " antavx Kristo ");

teksto = teksto.replace(/\bk\.c\. (?=[A-Z])/g, " kaj cetere\u2CFF");// frazo fino
teksto = teksto.replace(/\bk\.c\./g, " kaj cetere ");

teksto = teksto.replace(/\bk\.t\.p\. (?=[A-Z])/g, "kaj tiel plu\u2CFF");// frazo fino
teksto = teksto.replace(/\bk\.t\.p\./g, "kaj tiel plu ");

teksto = teksto.replace(/\bcit\b/g, " citajxo: ");
teksto = teksto.replace(/\bmalcit\b/g, " fino de citajxo ");
teksto = teksto.replace(/\bMET\b/g, " mez-Evxropa tempo ");
teksto = teksto.replace(/\bNB\b/g, " notu bone ");
teksto = teksto.replace(/\bNdlr\b/gi, " noto de la redakcio: ");
teksto = teksto.replace(/\bOET\b/g, " orient-evxropa tempo ");
teksto = teksto.replace(/\b[Pp]-ro\b/g, " pastro ");
teksto = teksto.replace(/\b[Pp]rez\./g, " prezidanto ");
teksto = teksto.replace(/\bPS\b/g, " postskribo ");
teksto = teksto.replace(/\bptm(\.|\b)/g, " posttagmeze ");
teksto = teksto.replace(/\bPV\b/g, " plena vortaro ");
teksto = teksto.replace(/\bUniv\./g, " universitato ");
teksto = teksto.replace(/\b[Bb]v\./g, " bonvolu ");
teksto = teksto.replace(/\b[dD]-ino/g, "doktorino");
teksto = teksto.replace(/\b[dD]-ro/g, "doktoro");
teksto = teksto.replace(/\b[eE]kz:/g, " ekzemple, ");
teksto = teksto.replace(/\b[eE]kz\./g, " ekzemple, ");
teksto = teksto.replace(/\b[eE]ld\./g, " eldono ");
teksto = teksto.replace(/\b[iI]nkl\./g, "inkluzive ");
teksto = teksto.replace(/\b[nN]-ro/g, " numero");
teksto = teksto.replace(/\b[rR]im\./g, " rimarko ");
teksto = teksto.replace(/\b[sS]-ino/g, "sinjorino ");
teksto = teksto.replace(/\b[sS]-ro/g, " sinjoro ");
teksto = teksto.replace(/\b[sS]-ta/g, " sankta ");
teksto = teksto.replace(/\b[sS]tr\./g, " strato ");
teksto = teksto.replace(/\b[vV]ol\./g, " volumo ");
teksto = teksto.replace(/\bk\.s\. (?=[A-Z])/g, " kaj simile\u2CFF");// frazo fino
teksto = teksto.replace(/\bk\.s\./g, " kaj simile ");

teksto = teksto.replace(/\bp\.[\s]*(\d)/g, " pagxo $1");
teksto = teksto.replace(/\btn\./g, " tiel nomata ");
teksto = teksto.replace(/\bt\.e\./g, " tio estas ");
teksto = teksto.replace(/\bt\.n\./g, " tiel nomata ");
teksto = teksto.replace(/\b[iI]nt\./g, " internacia ");
teksto = teksto.replace(/\b[pP]rof\./g, " profesoro ");
teksto = teksto.replace(/\b[tT]el\./g, " telefonnumero ");
teksto = teksto.replace(/\b[Vv]d\b/g, " vidu ");
teksto = teksto.replace(/cx\.[\s]*(\d)/g, " cxirkavx $1");
teksto = teksto.replace(/\bk\.[\s]+/g, " kaj ");

teksto = teksto.replace(/\bcm\b/g, " centimetroj ");
teksto = teksto.replace(/\bHz\b/g, " hercoj ");
teksto = teksto.replace(/\bkg\b/g, " kilogramoj ");
teksto = teksto.replace(/\bKB\b/g, " kilobajtoj ");
teksto = teksto.replace(/\bm2\b/g, " kvadratmetroj ");
teksto = teksto.replace(/\bkHz\b/g, " kilohercoj ");
teksto = teksto.replace(/\bkm oblikvo h\b/g, " kilometroj hore ");


teksto = teksto.replace(/\bEo\b/g, " esperanto ");
teksto = teksto.replace(/\bhtlm\b/gi, " Hotolomo ");
teksto = teksto.replace(/\bhttp\b/gi, " hototopo ");
teksto = teksto.replace(/\bmp3\b/gi, " mopotri ");
teksto = teksto.replace(/\bwww\b/gi, " vavovavovavo ");

teksto = teksto.replace(/\bDNA\b/g, " donoa ");
teksto = teksto.replace(/\bEU\b/g, " E.U. ");
teksto = teksto.replace(/\bMBROLA\b/g, " moborola ");
teksto = teksto.replace(/\bMBROLI\b/g, " moboroli ");
teksto = teksto.replace(/\bUN\b/g, " uno ");

teksto = teksto.replace(/\u2CFEP\b/g, " iksopo "); // atenti pri tiaj kazoj kiaj XP en mallongigoj
teksto = teksto.replace(/\bUK\b/g, " Uko ");
teksto = teksto.replace(/\bEEU\b/g, " E.E.U. ");

/* literumado (unu litero*/

teksto = teksto.replace(/\bCX(?=\d|\b)/g, "\u2C03");
teksto = teksto.replace(/\bGX(?=\d|\b)/g, "\u2C08");
teksto = teksto.replace(/\bHX(?=\d|\b)/g, "\u2C0A");
teksto = teksto.replace(/\bJX(?=\d|\b)/g, "\u2C0D");
teksto = teksto.replace(/\bSX(?=\d|\b)/g, "\u2C17");
teksto = teksto.replace(/\bVX(?=\d|\b)/g, "\u2C1A");

teksto = teksto.replace(/\bA(?=\d|\b)/g, "\u2C00"); 
teksto = teksto.replace(/\bB(?=\d|\b)/g, "\u2C01");
teksto = teksto.replace(/\bC(?=\d|\b)/g, "\u2C02");
teksto = teksto.replace(/\bD(?=\d|\b)/g, "\u2C04");
teksto = teksto.replace(/\bE(?=\d|\b)/g, "\u2C05");
teksto = teksto.replace(/\bF(?=\d|\b)/g, "\u2C06");
teksto = teksto.replace(/\bG(?=\d|\b)/g, "\u2C07");
teksto = teksto.replace(/\bH(?=\d|\b)/g, "\u2C09");
teksto = teksto.replace(/\bI(?=\d|\b)/g, "\u2C0B");
teksto = teksto.replace(/\bJ(?=\d|\b)/g, "\u2C0C");
teksto = teksto.replace(/\bK(?=\d|\b)/g, "\u2C0E");
teksto = teksto.replace(/\bL(?=\d|\b)/g, "\u2C0F");
teksto = teksto.replace(/\bM(?=\d|\b)/g, "\u2C10");
teksto = teksto.replace(/\bN(?=\d|\b)/g, "\u2C11");
teksto = teksto.replace(/\bO(?=\d|\b)/g, "\u2C12");
teksto = teksto.replace(/\bP(?=\d|\b)/g, "\u2C13");
teksto = teksto.replace(/\bQ(?=\d|\b)/g, "\u2C14");
teksto = teksto.replace(/\bR(?=\d|\b)/g, "\u2C15");
teksto = teksto.replace(/\bS(?=\d|\b)/g, "\u2C16");
teksto = teksto.replace(/\bT(?=\d|\b)/g, "\u2C18");
teksto = teksto.replace(/\bU(?=\d|\b)/g, "\u2C19");
teksto = teksto.replace(/\bV(?=\d|\b)/g, "\u2C1B");
teksto = teksto.replace(/\bW(?=\d|\b)/g, "\u2C1C");
teksto = teksto.replace(/\bY(?=\d|\b)/g, "\u2C1E");
teksto = teksto.replace(/\bZ(?=\d|\b)/g, "\u2C1F");

teksto = teksto.replace(/([\u2C00-\u2C1F]+)\./g, "$1"); // forigi la punkton post literumado.

function literumu(temp){
	temp = temp.replace(/A/g, "\u2C00");
 	temp = temp.replace(/E/g, "\u2C05");
 	temp = temp.replace(/I/g, "\u2C0B");
 	temp = temp.replace(/O/g, "\u2C12");
 	temp = temp.replace(/U/g, "\u2C19");
 	temp = temp.replace(/CX/g, "\u2C03");
 	temp = temp.replace(/GX/g, "\u2C08");
 	temp = temp.replace(/HX/g, "\u2C0A");
 	temp = temp.replace(/JX/g, "\u2C0D");
 	temp = temp.replace(/SX/g, "\u2C17");
 	temp = temp.replace(/VX/g, "\u2C1A");
 	temp = temp.replace(/B/g, "\u2C01");
 	temp = temp.replace(/C/g, "\u2C02");
 	temp = temp.replace(/D/g, "\u2C04");
 	temp = temp.replace(/F/g, "\u2C06");
 	temp = temp.replace(/G/g, "\u2C07");
 	temp = temp.replace(/H/g, "\u2C09");
 	temp = temp.replace(/J/g, "\u2C0C");
 	temp = temp.replace(/K/g, "\u2C0E");
 	temp = temp.replace(/L/g, "\u2C0F");
 	temp = temp.replace(/M/g, "\u2C10");
 	temp = temp.replace(/N/g, "\u2C11");
 	temp = temp.replace(/P/g, "\u2C13");
 	temp = temp.replace(/Q/g, "\u2C14");
 	temp = temp.replace(/R/g, "\u2C15");
 	temp = temp.replace(/S/g, "\u2C16");
 	temp = temp.replace(/T/g, "\u2C18");
 	temp = temp.replace(/V/g, "\u2C1B");
 	temp = temp.replace(/W/g, "\u2C1C");
 	temp = temp.replace(/X/g, "\u2C1D");
 	temp = temp.replace(/Y/g, "\u2C1E");
 	temp = temp.replace(/Z/g, "\u2C1F");
	return temp;
}

/* Nun, mi nur pritraktas  mallongigojn de 2 ĝis 5 karaktroj*/
teksto = teksto.replace(/\b([A-Z]{2,5})\b/g,
	function($0,$1){
	temp=$0
	var reg0 = new RegExp("TRANS");  // trans estas escepto
	if (reg0.test(temp)) return temp; // ne literumu (aperas en majusklaj titoloj)

	var reg4 = new RegExp("VX$");  // AŬ LAŬ ktp estas esceptoj
	if (reg4.test(temp)) return temp; // ne literumu (aperas en majusklaj titoloj)

	var reg3 = new RegExp("^[^AEIOU][^AEIOU][^AEIOU]"); 
	if (reg3.test(temp)) return literumu(temp); // literumu se komencas per 3 vokaloj	
	
	var reg1 = new RegExp("[AEIOU]$");  
	var reg2 = new RegExp("[AEIOU].$"); 
	if (reg1.test(temp)|reg2.test(temp)) return temp; // ne literumu se lasta aŭ antaŭlasta estas vokalo
	return literumu(temp);
	})

/* ne esperantaj literoj */
teksto = teksto.replace(/\u2CFE/g, "ks"); // ĉiuj x krom ĉĝĥĵŝŭ
teksto = teksto.replace(/q/gi, "k");
teksto = teksto.replace(/w/gi, "vx");
teksto = teksto.replace(/y/gi, "i");
// ekde nun,"XQWY" povas esti uzataj kiel kodoj

/* post tiu linio, W kaj Y estas uzataj kiel intervokaloj por eviti hiaton */

/* nomoj */
teksto = teksto.replace(/\bBush\b/g, " Busx ");
teksto = teksto.replace(/\bBlair\b/g, " Blea ");

/* pritrakti tempo HH:MM:SS */
teksto = teksto.replace(/\b(\d\d):(\d\d):(\d\d)\b/g,"$1-a horo: $2-a minuto: $3-a sekundo:");
teksto = teksto.replace(/00-a (horo:|minuto:|sekundo:)/g,"nula $1");
teksto = teksto.replace(/0(\d-a )(horo:|minuto:|sekundo:)/g,"$1$2");
teksto = teksto.replace(/\b00a/g,"NULA"); // specialaj aliaj kazoj estos poste pritraktitaj

/* pritrakti dato JJJJ-MM-TT */
teksto = teksto.replace(/\b(\d\d\d\d)-(\d\d)-(\d\d)\b/g,
function($0,$1,$2,$3){
	s=$3+"-a de ";
	switch($2){
		case "01": s+="januaro";break;
		case "02": s+="februaro";break;
		case "03": s+="marto";break;
		case "04": s+="aprilo";break;
		case "05": s+="majo";break;	
		case "06": s+="junio";break;
		case "07": s+="julio";break;
		case "08": s+="avxgusto";break;
		case "09": s+="septembro";break;
		case "10": s+="oktobro";break;	
		case "11": s+="novembro";break;
		case "12": s+="decembro";break;	
		default: s+=$2+" monato";
	}
	return s+$1;});

/* pritrakti nombrojn ĝis kelkaj duilionoj (sen komo aŭ punkto, sed eble kun spaco)*/
/* ekz 1 234 567 890 = mil ducent tridek kvar milionoj kvincent sesdek sep mil okcent naŭdek */
teksto = teksto.replace(/(\d),(\d)/g,"$1 KOMO $2");
teksto = teksto.replace(/(\d)\.(\d)/g,"$1 PUNKTO $2");
teksto = teksto.replace(/(\d),(\d)/g,"$1 KOMO $2");
teksto = teksto.replace(/(\d)\.(\d)/g,"$1 PUNKTO $2");
teksto = teksto.replace(/(\d) (?=\d)/g,"$1"); // forigi la spacon inter nombroj
//teksto = teksto.replace(/(\d) (\d)/g,"$1$2"); // forigi la spacon inter nombroj

/* ciferoj post komo */
teksto = teksto.replace(/ KOMO (\d*)/g,
   function($0,$1){ // pritrakti la ciferojn post la komo kiel apartaj ciferoj
      var nombro=$1;
      var s = " KOMO ";
      for (i=0;i<nombro.length;i++) s+=nombro.charAt(i)+" ";
      return s;}) ;

/* telefona numero */
teksto = teksto.replace(/\b0(\d*)/g,
   function($0,$1){ // diri la komencajn nulojn
      var nombro=$1,i;
      var s = " NUL_ "; // jam estas unu, sed poste?
      for (i=0;i<nombro.length;i++)
        {if (nombro.charAt(i)=="0") s+=" NUL_ "; else return s+=nombro.substring(i);}
        return s;}) ;

/* pritrakto de nombroj */
teksto = teksto.replace(/(\d)(\-)?([a-z])/g,"$1 __$3");

teksto = teksto.replace(/\b1(\d\d\d\d\d\d\d\d\d\d\d\d)\b/g,"UNU duiliono $1");	
teksto = teksto.replace(/(\d)(\d\d\d\d\d\d\d\d\d\d\d\d)\b/g,"$1 duilionoj $2");	
teksto = teksto.replace(/\b1(\d\d\d\d\d\d\d\d\d)\b/g,"UNU miliardo $1");	
teksto = teksto.replace(/(\d)(\d\d\d\d\d\d\d\d\d)\b/g,"$1 miliardoj $2");	
teksto = teksto.replace(/(\b|00000)1(\d\d\d\d\d\d)\b/g,"1 miliono $2");	
teksto = teksto.replace(/(\d)(\d\d\d\d\d\d)\b/g,"$1 milionoj $2");	

teksto = teksto.replace(/\b1(\d\d\d)\b/g," mil $1");
teksto = teksto.replace(/(\d)(\d\d\d)\b/g,"$1 mil $2");
teksto = teksto.replace(/\b1(\d\d)\b/g," cent $1");
teksto = teksto.replace(/(\d)(\d\d)\b/g,"$1__cent $2");
teksto = teksto.replace(/\b1(\d)\b/g,"dek $1"); 

teksto = teksto.replace(/(\d)(\d)\b/g,"$1__dek $2");

teksto = teksto.replace(/1/g," unu ");
teksto = teksto.replace(/2/g," du ");
teksto = teksto.replace(/3/g," tri ");
teksto = teksto.replace(/4/g," kvar ");
teksto = teksto.replace(/5/g," kvin ");
teksto = teksto.replace(/6/g," ses ");
teksto = teksto.replace(/7/g," sep ");
teksto = teksto.replace(/8/g," ok ");
teksto = teksto.replace(/9/g," navx ");
teksto = teksto.replace(/0/g," nul ");

teksto = teksto.replace(/nul __cent  nul __dek  nul  (mil|milionoj|miliardoj|biliardoj)? /g,"");
teksto = teksto.replace(/nul __cent  nul __dek  unu  mil/g,"mil");
teksto = teksto.replace(/cent  nul __dek  nul/g,"cent");
teksto = teksto.replace(/dek  nul/g,"dek");
teksto = teksto.replace(/nul __cent/g,"");	
teksto = teksto.replace(/nul __dek/g,"");	
teksto = teksto.replace(/\s+__/g,"");

/* pritrakti ne-esperantajn literojn. Mi antaŭvidas plurajn konflikojn depende de la lingvo. */

teksto = teksto.replace(/[áàâäãå]/ig, "A");
teksto = teksto.replace(/[éèêëęěē]/ig, "E");
teksto = teksto.replace(/[íìîïýÿ]/ig, "I");
teksto = teksto.replace(/[òôöąø]/ig, "O");
teksto = teksto.replace(/[úùûüóů]/ig, "U");
teksto = teksto.replace(/[ćč]/ig, "CX");
teksto = teksto.replace(/[ķ]/ig, "K");
teksto = teksto.replace(/[ł]/ig, "VX");
teksto = teksto.replace(/[ńñ]/ig, "NJ");
teksto = teksto.replace(/[ř]/ig, "RJX");
teksto = teksto.replace(/[śš]/ig, "SX");
teksto = teksto.replace(/[źżž]/ig, "JX"); // ĉiuj tiuj literoj estas ekde nun uzeblaj kiel specialaj karaktroj

/* asimilado : nur se minusklo. Parolu severe regule se majuskloj */
/* Notu ke la unua vokalo estas pli longa */

/*****************************shangho1
teksto = teksto.replace(/([Uu])([\s])*(?=[i])/g,"QQ$1$2WQ"); 
teksto = teksto.replace(/([Uu])([\s])*(?=[aeo])/g,"QQ$1$2W"); // ui nun hiato
teksto = teksto.replace(/([Ee])([\s])*(?=[u])/g,"QQ$1$2W");
teksto = teksto.replace(/([Ee])([\s])*(?=[i])/g,"QQ$1$2Y");  // ea eo estas nun hiatoj
teksto = teksto.replace(/([Oo])([\s])*(?=[i])/g,"QQ$1$2Y");
teksto = teksto.replace(/([Oo])([\s])*(?=[aeu])/g,"QQ$1$2W");
teksto = teksto.replace(/([a])([\s])*(?=[a])/g,"QQ$1$2Q"); 
teksto = teksto.replace(/([e])([\s])*(?=[e])/g,"QQ$1$2Q");
teksto = teksto.replace(/([i])([\s])*(?=[i])/g,"QQ$1$2Q");
teksto = teksto.replace(/([o])([\s])*(?=[o])/g,"QQ$1$2Q");
teksto = teksto.replace(/([u])([\s])*(?=[u])/g,"QQ$1$2Q");
***********************************/
teksto = teksto.replace(/([aeou])([\s])*(?=[aeiou])/gi,"QQ$1$2Q"); // ĉiuj aliaj kazoj estas hiatoj (krom i+x)
teksto = teksto.replace(/([i])([\s])*(?=[aeiou])/gi,"QQ$1$2"); // plilongigo de la unua i

// sinsekvaj majuskloj estas strikte prononcitaj sen asimilado. Tio necesas foje en kurso por klarigi la diferencon inter ija kaj ia
teksto = teksto.replace(/([AEIOU])([AEIOU])/g,"$1Q$2"); // paŭzeto inter la du vokaloj (0.2.28)

// teksto = teksto.replace(/avx/gi,"AXvx"); // aŭ ne estas klara prononcata sen la X. Sajnas ne ĝeni. Mi forigis.
//teksto = teksto.replace(/vx /gi,"vxQ "); // fina ŭ en aŭ, laŭ, naŭ ne devas esti kunligita al la sekva.

teksto = teksto.toUpperCase(); // ŝanĝi la tekston al majuskloj

// ekde nun minuskloj povas esti uzataj kiel kodoj (ne antaŭe)

/* kelkaj interpunkcioj estas tempe pritraktitaj kiel komo */
teksto = teksto.replace(/[:;\(\)\/\]\[}]/g,","); // provizore; kelkaj interpunkcioj estos poste ŝanĝitaj

/* listo de validaj signoj */
teksto = teksto.replace(/[^\u2C00-\u2CFF€£A-Z "—'\?!,\.\-<АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдeёжзийклмнопрстуфхцчшщъыьэюяαβγδεζηθικλμνξοπρσςτυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΪΌΎΏάέήίϊόύώ]/g," "); // aliaj signoj ne estas pritraktitaj

/* signi akcentitan vokalon per @, lastan vokalon antaŭ komo per €, lastan vokalon de frazo per £*/
teksto = teksto.replace(/'/g,"O'"); //  O' anstataŭas la eliziitan o

teksto = teksto.replace(/([^\s])\.([^\s])/g,"$1 PUNKTO $2"); // ekz: lernu.net iĝas lernu PUNKTO net. La punkto ne estas je frazofino.

/* forigi vibradon de paroliloj */
/***************************************shangho1
teksto = teksto.replace(/U(\s)*PA/g,"U$1y°PA"); // forigu vibradon (almenaŭ ĉe mi!). Eble vi spertas aliajn malagrablaĵojn.
teksto = teksto.replace(/U(\s)*P/g,"U$1°P"); // forigu vibradon (almenaŭ ĉe mi!). Eble vi spertas aliajn malagrablaĵojn.
***************************************/



teksto = teksto.replace(/([A-Z]*)([AEIOU][°BCDFGHJKLMNPQRSTVWXYZ]*)([AEIOUy][BCDFGHJKLMNPQRSTVWXYZ]*\b)/g,"$1@$2$3"); // stresita vokalo

teksto = teksto.replace(/O'/g,""); // forigu la aldonitan vokalon  

teksto = teksto.replace(/\u2CFF/g,"\."); // remeti la punkton

teksto = teksto.replace(/([AEIOU]['BCDFGHJKLMNPQRSTVWXYZ]*[\?!\.])/g,"£$1"); // lasta vokalo antau punkto demando signo, aŭ esklamo = £
teksto = teksto.replace(/([AEIOU][BCDFGHJKLMNPQRSTVWXYZ]*[,])/g,"€$1"); // lasta vokalo antau komo = €
teksto = teksto.replace(/([AEIOU][BCDFGHJKLMNPQRSTVWXYZ]*[ ])/g,"©$1"); // lasta vokalo antau spaco = ©

// Jes. Ne! Jes! iĝos jes. Neq! jes!
teksto = teksto.replace(/([?!\.] .{1,4}[AEIOU])(?=[?!\.])/g,"$1q"); // sola silabo inter interpunkcio. Aldono de q se lasta silabo vokala

/* la finaj j, n, s estas plilongigitaj */
teksto = teksto.replace(/([JNS]\s)/g,"<$1"); // fina n, j kaj s
teksto = teksto.replace(/AVX\b/g,"A<VX"); // fina aŭ (la ŭ estos plilonga)

/* faligi la tonon en adverboj */
teksto = teksto.replace(/(@)([AEIOU][BCDFGHJKLMNPQRSTVWXYZ]*E\s)/g,"£$2"); // adverboj £

/* bone distingi duoblajn konsonantojn */
teksto = teksto.replace(/BB/g,"BQB"); // intervokala paŭzo
teksto = teksto.replace(/DD/g,"DQD"); // intervokala paŭzo
teksto = teksto.replace(/FF/g,"FQF"); // intervokala paŭzo
teksto = teksto.replace(/GG/g,"GQG"); // intervokala paŭzo
teksto = teksto.replace(/HH/g,"HQH"); // intervokala paŭzo
teksto = teksto.replace(/JJ/g,"JQJ"); // intervokala paŭzo
teksto = teksto.replace(/KK/g,"KQK"); // intervokala paŭzo
teksto = teksto.replace(/LL/g,"LQL"); // intervokala paŭzo
teksto = teksto.replace(/MM/g,"MQN"); // intervokala paŭzo
teksto = teksto.replace(/NN/g,"NQN"); // intervokala paŭzo
teksto = teksto.replace(/PP/g,"PQP"); // intervokala paŭzo
teksto = teksto.replace(/RR/g,"RQR"); // intervokala paŭzo
teksto = teksto.replace(/SS/g,"SQS"); // intervokala paŭzo
teksto = teksto.replace(/TT/g,"TQT"); // intervokala paŭzo
teksto = teksto.replace(/VV/g,"VQV"); // intervokala paŭzo
teksto = teksto.replace(/ZZ/g,"ZQZ"); // intervokala paŭzo

/*** pritrakto de literumado ***/
 	teksto = teksto.replace(/\u2C01/g, "BO");
 	teksto = teksto.replace(/\u2C02/g, "CO");
 	teksto = teksto.replace(/\u2C03/g, "ĈO");
 	teksto = teksto.replace(/\u2C04/g, "DO");
 	teksto = teksto.replace(/\u2C06/g, "FO");
 	teksto = teksto.replace(/\u2C07/g, "GO");
 	teksto = teksto.replace(/\u2C08/g, "ĜO");
 	teksto = teksto.replace(/\u2C09/g, "HO");
 	teksto = teksto.replace(/\u2C0C/g, "JO");
 	teksto = teksto.replace(/\u2C0D/g, "ĴO");
 	teksto = teksto.replace(/\u2C0E/g, "KO");
 	teksto = teksto.replace(/\u2C0F/g, "LO");
 	teksto = teksto.replace(/\u2C10/g, "MO");
 	teksto = teksto.replace(/\u2C11/g, "NO");
 	teksto = teksto.replace(/\u2C13/g, "PO");
 	teksto = teksto.replace(/\u2C15/g, "RO");
 	teksto = teksto.replace(/\u2C16/g, "SO");
 	teksto = teksto.replace(/\u2C17/g, "ŜO");
 	teksto = teksto.replace(/\u2C18/g, "TO");
 	teksto = teksto.replace(/\u2C1A/g, "ŬO");
 	teksto = teksto.replace(/\u2C1B/g, "VO");
 	teksto = teksto.replace(/\u2C1F/g, "ZO");
	teksto = teksto.replace(/\u2C14/g, "KUWO ");
 	teksto = teksto.replace(/\u2C1C/g, "DUWOBLAVO");
 	teksto = teksto.replace(/\u2C1D/g, "IKSO");
 	teksto = teksto.replace(/\u2C1E/g, "IPSILONO");  // la cetero poste

/* prozodio */
teksto = teksto.prozodio(); // temas tie pri la tonalteco de vokaloj.


/* kelkaj klarigoj */

teksto = teksto.replace(/BB/g,"BQB"); // ***********shangho1 
teksto = teksto.replace(/CS/g,"CQS"); // ***********shangho1 
teksto = teksto.replace(/CXSX/g,"CXQSX"); // ***********shangho1 
teksto = teksto.replace(/DD/g,"DQD"); // ***********shangho1 
teksto = teksto.replace(/DGX/g,"DQGX"); // ***********shangho1 
teksto = teksto.replace(/DJX/g,"DQJX"); // ***********shangho1 tŝ ne estas ĉ
teksto = teksto.replace(/FF/g,"FQF"); // ***********shangho1 
teksto = teksto.replace(/GG/g,"GQG"); // ***********shangho1 
teksto = teksto.replace(/GXQJX/g,""); // ***********shangho1 
teksto = teksto.replace(/HH/g,"HQH"); // ***********shangho1 
teksto = teksto.replace(/HHX/g,"HQHX"); // ***********shangho1 tŝ ne estas ĉ
teksto = teksto.replace(/JJ/g,"JQJ"); // ***********shangho1 
teksto = teksto.replace(/KK/g,"KQK"); // ***********shangho1 
teksto = teksto.replace(/LL/g,"LQL"); // ***********shangho1 
teksto = teksto.replace(/MM/g,"MQM"); // ***********shangho1 
teksto = teksto.replace(/NN/g,"NQN"); // ***********shangho1 
teksto = teksto.replace(/PP/g,"PQP"); // ***********shangho1 
teksto = teksto.replace(/RR/g,"RQR"); // ***********shangho1 
teksto = teksto.replace(/SS/g,"SQS"); // ***********shangho1 
teksto = teksto.replace(/SXSX/g,"SXQSX"); // ***********shangho1 
teksto = teksto.replace(/TCX/g,"TQCX"); // ***********shangho1 tŝ ne estas ĉ
teksto = teksto.replace(/TS/g,"TQS"); // ***********shangho1 tŝ ne estas ĉ
teksto = teksto.replace(/TSX/g,"TQSX"); // ***********shangho1 
teksto = teksto.replace(/TT/g,"TQT"); // ***********shangho1 
teksto = teksto.replace(/VV/g,"VQV"); // ***********shangho1 
teksto = teksto.replace(/ZZ/g,"ZQZ"); // ***********shangho1 





teksto = teksto.replace(/§\-§/g,"_ 300\n@"); // la § estas spaco
teksto = teksto.replace(/§/g,"");  // mi ne hakas la vortojn

teksto = teksto.replace(/,/g,"_ 400\n@");
teksto = teksto.replace(/—/g,"_ 500\n@"); // /u2014 paŭzo
teksto = teksto.replace(/\-/g,"");
teksto = teksto.replace(/[\.\?!]/g,"_ 800\n@");

/***************************** Konverti al PHO kodoj ********************************************************/

/*** specialaj alfabetoj (malfeliĉe Esperanto nur uzas 6 proprajn signojn:-) ***/
/* greka */
teksto = teksto.replace(/α/ig,"a 65 25 170\n");
teksto = teksto.replace(/ά/ig,"a 100 25 200\n");
teksto = teksto.replace(/β/ig,"b 100\n");
teksto = teksto.replace(/γ/ig,"g 100\n");
teksto = teksto.replace(/δ/ig,"d 100\n");
teksto = teksto.replace(/ε/ig,"e 65 25 170\n");
teksto = teksto.replace(/έ/ig,"e 100 25 200\n");
teksto = teksto.replace(/ζ/ig,"d 40\nz 80\n");
teksto = teksto.replace(/η/ig,"e 90 25 170\n");
teksto = teksto.replace(/ή/ig,"e 120 25 200\n");
teksto = teksto.replace(/θ/ig,"t 100\nx 10 \n");
teksto = teksto.replace(/[ιϊ]/ig,"i 65 25 170\n");
teksto = teksto.replace(/ί/ig,"i 100 25 170\n");
teksto = teksto.replace(/κ/ig,"k 80\n");
teksto = teksto.replace(/λ/ig,"l 100\n");
teksto = teksto.replace(/μ/ig,"m 150\n");
teksto = teksto.replace(/ν/ig,"n 150\n");
teksto = teksto.replace(/ξ/ig,"k 80\ns 80\n");
teksto = teksto.replace(/ο/ig,"o 65 25 170\n");
teksto = teksto.replace(/ό/ig,"o 100 25 200\n");
teksto = teksto.replace(/π/ig,"p 80\n");
teksto = teksto.replace(/ρ/ig,"r 100\n");
teksto = teksto.replace(/σ/ig,"s 100\n");
teksto = teksto.replace(/ς/ig,"s 100\n");
teksto = teksto.replace(/τ/ig,"t 80\n");
teksto = teksto.replace(/υ/ig,"u 65 25 170\n");
teksto = teksto.replace(/ύ/ig,"u 100 25 200\n");
teksto = teksto.replace(/φ/ig,"f 80\n");
teksto = teksto.replace(/χ/ig,"x 100\n");
teksto = teksto.replace(/ψ/ig,"p 40\ns 80\n");
teksto = teksto.replace(/ω/ig,"o 90 25 170\n");
teksto = teksto.replace(/ώ/ig,"o 120 25 200\n");

/* cirila (pli-malpli... La rusa ne estas tiom fonetika kiom esperanto- devus sufiĉi por rekoni nomojn) */
teksto=teksto.replace(/а/ig,"A 25 180\n");
teksto=teksto.replace(/б/ig,"B");
teksto=teksto.replace(/в/ig,"V");
teksto=teksto.replace(/г/ig,"G");
teksto=teksto.replace(/д/ig,"D");
teksto=teksto.replace(/э/ig,"E 25 180\n");
teksto=teksto.replace(/е/ig,"JE 25 180\n");
teksto=teksto.replace(/ё/ig,"JO 25 180\n");
teksto=teksto.replace(/ж/ig,"JX");
teksto=teksto.replace(/з/ig,"Z");
teksto=teksto.replace(/и/ig,"I 25 180\n");
teksto=teksto.replace(/й/ig,"J");
teksto=teksto.replace(/к/ig,"K");
teksto=teksto.replace(/л/ig,"VX");
teksto=teksto.replace(/м/ig,"M");
teksto=teksto.replace(/н/ig,"N");
teksto=teksto.replace(/о/ig,"O 25 180\n");
teksto=teksto.replace(/п/ig,"P");
teksto=teksto.replace(/р/ig,"R");
teksto=teksto.replace(/с/ig,"S");
teksto=teksto.replace(/т/ig,"T");
teksto=teksto.replace(/у/ig,"U 25 180\n");
teksto=teksto.replace(/ф/ig,"F");
teksto=teksto.replace(/х/ig,"HX");
teksto=teksto.replace(/ц/ig,"C");
teksto=teksto.replace(/ч/ig,"CX");
teksto=teksto.replace(/ш/ig,"SX");
teksto=teksto.replace(/щ/ig,"SXCX");
teksto=teksto.replace(/ъ/ig,"");
teksto=teksto.replace(/ы/ig,"I 25 180\n");
teksto=teksto.replace(/ь/ig,"");
teksto=teksto.replace(/э/ig,"E 25 180\n");
teksto=teksto.replace(/ю/ig,"JU 25 180\n");
teksto=teksto.replace(/я/ig,"JA 25 180\n");

/* Esperanto */

/***************************shangho1
teksto = teksto.replace(/([£©€]U...\d*)/g,"$1\nw 0"); // plibonigo de vortfina U
*********************************/

teksto = teksto.replace(/QQ[@£©€]*[Aa]/g,"a 150"); // unua duobla vokalo
teksto = teksto.replace(/QQ[@£©€]*[Ee]/g,"e 150"); // unua duobla vokalo
teksto = teksto.replace(/QQ[@£©€]*[Ii]/g,"i 150"); // unua duobla vokalo
teksto = teksto.replace(/QQ[@£©€]*[Oo]/g,"o 150"); // unua duobla vokalo
teksto = teksto.replace(/QQ[@£©€]*[Uu]/g,"u 150"); // unua duobla vokalo


teksto = teksto.replace(/@E/g,"e "+longecoAkcentitaVokalo); // @ : akcentita vokalo aû de unua duobla vokalo
teksto = teksto.replace(/@O/g,"o "+longecoAkcentitaVokalo);
teksto = teksto.replace(/@U/g,"u "+longecoAkcentitaVokalo);
teksto = teksto.replace(/@I/g,"i "+longecoAkcentitaVokalo);
teksto = teksto.replace(/@A/g,"a "+longecoAkcentitaVokalo);

teksto = teksto.replace(/£E/g,"e "+longecoAntauPunkto); // £ signifas: lasta vokalo antaŭ punkto ? ! 
teksto = teksto.replace(/£O/g,"o "+longecoAntauPunkto); // notu ke la tonalteco jam estis kalkulita
teksto = teksto.replace(/£U/g,"u "+longecoAntauPunkto); // Temas ĉi tie nur pri la longeco.
teksto = teksto.replace(/£I/g,"i "+longecoAntauPunkto);
teksto = teksto.replace(/£A/g,"a "+longecoAntauPunkto);

teksto = teksto.replace(/€E/g,"e "+longecoAntauKomo); // lasta vokalo antaŭ komo
teksto = teksto.replace(/€O/g,"o "+longecoAntauKomo);
teksto = teksto.replace(/€U/g,"u "+longecoAntauKomo);
teksto = teksto.replace(/€I/g,"i "+longecoAntauKomo);
teksto = teksto.replace(/€A/g,"a "+longecoAntauKomo);

teksto = teksto.replace(/©E/g,"e "+longecoAntauSpaco); // lasta vokalo antaŭ spaco
teksto = teksto.replace(/©O/g,"o "+longecoAntauSpaco);
teksto = teksto.replace(/©U/g,"u "+longecoAntauSpaco);
teksto = teksto.replace(/©I/g,"i "+longecoAntauSpaco);
teksto = teksto.replace(/©A/g,"a "+longecoAntauSpaco);

//teksto = teksto.replace(/\{E/g,"e "+akcentitaVokaloLongeco); // testo mia
//teksto = teksto.replace(/\{O/g,"o "+akcentitaVokaloLongeco);
//teksto = teksto.replace(/\{U/g,"u "+akcentitaVokaloLongeco);
//teksto = teksto.replace(/\{I/g,"i "+akcentitaVokaloLongeco);
//teksto = teksto.replace(/\{A/g,"a "+akcentitaVokaloLongeco);

teksto = teksto.replace(/U/g,"u "+longecoNormalaVokalo); // normala vokalo
teksto = teksto.replace(/O/g,"o "+longecoNormalaVokalo);
teksto = teksto.replace(/E/g,"e "+longecoNormalaVokalo);
teksto = teksto.replace(/A/g,"a "+longecoNormalaVokalo);
teksto = teksto.replace(/I/g,"i "+longecoNormalaVokalo); 

teksto = teksto.replace(/CX/g,"Ĉ");  // tempa ŝanĝo
teksto = teksto.replace(/GX/g,"Ĝ");
teksto = teksto.replace(/HX/g,"Ĥ");
teksto = teksto.replace(/JX/g,"Ĵ");
teksto = teksto.replace(/SX/g,"Ŝ");
teksto = teksto.replace(/VX/g,"Ŭ");
	
/***** pritrakto de la konsonantoj *********************************/
// atentu pri la ordo 


teksto = "@"+teksto;  // plilongigo de la unua litero
teksto = teksto.replace(/@B/g,"b 1\nb 150\n"); // signifas ke B estos prononcita b dum 100 ms
teksto = teksto.replace(/@C/g,"t 50\ns 78\n");
teksto = teksto.replace(/@D/g,"d 150\n");
teksto = teksto.replace(/@F/g,"f 120\n");
teksto = teksto.replace(/@G/g,"g 150\n");
teksto = teksto.replace(/@H/g,"a 0\nx 120\n");
teksto = teksto.replace(/@J/g,"j 1\nj 160\n");
teksto = teksto.replace(/<J/g,"j 160\n"); // vortfina j
teksto = teksto.replace(/@K/g,"k 120\n");
teksto = teksto.replace(/@L/g,"l 150\nl 1\n");    // aldona l por plibonigi li
teksto = teksto.replace(/@M/g,"m 200\n");
teksto = teksto.replace(/@N/g,"ñ 150\n");  // ankaŭ fine de vorto (@ indikas tion) - tempa uzo de ñ
teksto = teksto.replace(/<N/g,"ñ 150\n");  // vortfina n

teksto = teksto.replace(/@P/g,"p 1\np 120\n");
teksto = teksto.replace(/@R/g,"r 150\n"); // 
teksto = teksto.replace(/@S/g,"s 100\n");
teksto = teksto.replace(/<S/g,"s 100\n"); // vortfina n
teksto = teksto.replace(/@T/g,"t 120\n");
teksto = teksto.replace(/@V/g,"m 5\nv 145\n");
teksto = teksto.replace(/@Z/g,"z 150\n");

teksto = teksto.replace(/B/g,"b 100\n"); // signifas ke B estos prononcita b dum 100 ms
teksto = teksto.replace(/C/g,"ts 128\n");
teksto = teksto.replace(/D/g,"d 100\n");
teksto = teksto.replace(/F/g,"f 80\n");
teksto = teksto.replace(/G/g,"g 100\n");
teksto = teksto.replace(/H/g,"x 60\n");
teksto = teksto.replace(/J/g,"j 125\n");
teksto = teksto.replace(/K/g,"k 80\n");
teksto = teksto.replace(/L/g,"l 100\nl 1\n");    // aldona l por plibonigi li
teksto = teksto.replace(/M/g,"m 150\n");
teksto = teksto.replace(/N_/g,"n 150\n_"); // antaŭ interpunkcio (por eviti Ng)
teksto = teksto.replace(/N/g,"N 100\n");     // meze de vorto (por plibonigi ni)
teksto = teksto.replace(/ñ/g,"N");     // tempa ñ 
teksto = teksto.replace(/P/g,"p 80\n");
teksto = teksto.replace(/R/g,"r 80\n"); //estis 100
teksto = teksto.replace(/S/g,"s 80\n");
teksto = teksto.replace(/T/g,"t 80\n");
teksto = teksto.replace(/V/g,"v 100\n");
teksto = teksto.replace(/Z/g,"z 150\n");  //************shangho1 estis 100

teksto = teksto.replace(/Ĉ/g,"tS 128\n");
teksto = teksto.replace(/Ĝ/g,"dZ 90\nZ 38\n");
teksto = teksto.replace(/Ĥ/g,"g 3\nx 17\ng 3\nx 17\ng 3\nx 17\ng 3\nx 37\n");  // la g por bone distingi ĥ de h.

teksto = teksto.replace(/Ŝ/g,"S 80\n");
teksto = teksto.replace(/<Ŭ/g,"w 200\n");
teksto = teksto.replace(/Ŭ/g,"w 165\n");
teksto = teksto.replace(/@Ĵ/g,"z' 5\nZ 100\n");
teksto = teksto.replace(/Ĵ/g,"Z 100\n");

/* asimilado ktp... */

/*************** tempe forigita *************shangho1
teksto = teksto.replace(/Y/g,"j 1\n"); // ia > iYa
teksto = teksto.replace(/W/g,"w 1\n"); // ua > uWa
teksto = teksto.replace(/y/g,"_ 1\n"); // forigi vibradon upa > uy°pa
teksto = teksto.replace(/°/g,"d 1\n"); // forigi vibradon up > u°p
************************/
teksto = teksto.replace(/Y/g,""); // neniu asimilado
teksto = teksto.replace(/W/g,""); // 
teksto = teksto.replace(/°/g,""); // 
teksto = teksto.replace(/y/g,""); // 


teksto = teksto.replace(/q/g,"k 1\n"); // plibonigo de unusalabaj frazoj
teksto = teksto.replace(/"/g,"_ 200\n"); // mallonga paŭzo

/* forigo de troaj kontrolsignoj */
teksto = teksto.replace(/@/g,""); // la elizio kaŭzas troan @ antaŭ komo aŭ punkto.
teksto = teksto.replace(/€/g,""); // literumado kaj akcento kaŭzas troan €
teksto = teksto.replace(/£/g,""); // elizio kaj frazofino kaŭzas troan £
teksto = teksto.replace(/©/g,""); // Plilongigo de verbaj finaĵoj kaŭzas troan ©

//teksto = teksto.replace(/'/g,"b 0\n"); // por plibonigi la prononcon (ekz. post elizio)

/* LITERUMADO (nur kelkajn literoj estas aparte traktitaj)*/
teksto = teksto.replace(/\u2C00/g,"a 125 0 180\nQ");
teksto = teksto.replace(/\u2C05/g,"e 125 0 180\nQ");
teksto = teksto.replace(/\u2C0B/g,"i 125 0 180\nQ");
teksto = teksto.replace(/\u2C12/g,"o 125 0 180\nQ");
teksto = teksto.replace(/\u2C19/g,"u 150 0 180\nQ");
teksto = teksto.replace(/\u2C0A/g,"g 3\nx 17\ng 3\nx 17\ng 3\nx 17\ng 3\nx 17\ng 3\nx 17\ng 3\nx 47\no 60 0 180\n");
	
 // teksto = teksto.replace(/</g,"b 0\n"); // por plibonigi la prononcon dum literumado; _ 50 ŝajnas sufiĉi. Eble foje bezonata post i
//teksto = teksto.replace(/Q/g,"k 1\n_ 50\n"); // intervokala pauzeto  ****shango1

teksto = teksto.replace(/Q/g,"_ 50\n"); // intervokala pauzeto 

/*** la kodoj \u2C01 - \u2C1F estas rezervitaj por literumado se necesas 
teksto = teksto.replace(/\u2C01/g,"b 200\no 150 0 200 60 140 100 220\nk 1\n_ 100\n"); // ekzemple
***/

/*** finaj sonmodifoj ***/

teksto = teksto.replace(/\u2CFC/g,kiam); //  kiam la tonalteco estas atingita

/* pritrakto de la specialaj kazoj */
teksto = teksto.replace(/\u2C20/g,"u 200 0 160 50 165 100 165\nu 1\ne 200 0 160 50 175 100 160\nl 1\na 200 0 160 50 170 100 160\n_ 200\n"); // UEA
teksto = teksto.replace(/\u2C21/g,"dZ 90\nZ 38\ni 350 0 140 25 260 100 200\ns 80\nx 0\n_ 200\n"); // Ĝis! ĝis.
teksto = teksto.replace(/\u2C22/g,"tS 128\nu 300 0 240 50 120 80 220 100 250\nd 1\n_ 200\n"); // Ĉu?
teksto = teksto.replace(/\u2C23/g,"x 150\na 300 9 140 100 250\nb 1\n_ 200\n"); // ha!
teksto = teksto.replace(/\u2C24/g,"x 150\ne 300 0 160 80 240 100 140\nk 1\n_ 200\n"); // he!
teksto = teksto.replace(/\u2C25/g,"x 150\ne 300 0 240 80 240 100 140\nj 1\nx 150\no 300 0 200 80 200 100 140\nk 1\n_ 200\n"); // he ho!
teksto = teksto.replace(/\u2C26/g,"x 60\ne 300 0 160 80 240 100 140\nj 200 50 160\n_ 200\n"); // hej!
teksto = teksto.replace(/\u2C27/g,"x 60\ne 400 0 160 80 240 100 140\nl 100\np 100\n_ 200\n"); // help!
teksto = teksto.replace(/\u2C28/g,"x 100\ni 100 10 180\nj 1\nx 100\ni 150 0 160 80 180 100 140\nj 1\n_ 200\n"); // hi hi!
teksto = teksto.replace(/\u2C29/g,"x 60\ni 105 0 160 80 240 100 140\nk 300\n_ 200\n"); // hik!
teksto = teksto.replace(/\u2C2A/g,"x 200\ne 1\nm 500\n_ 200\n"); // hm!
teksto = teksto.replace(/\u2C2B/g,"x 60\no 300 0 160 80 240 100 140\nk 0\n_ 200\n"); // ho!
teksto = teksto.replace(/\u2C2C/g,"x 60\no 300 0 160 80 240 100 140\nj 125\nk 0\n_ 200\n"); // hoj!
teksto = teksto.replace(/\u2C2D/g,"x 60\no 105 10 211\nl 100\na 300 0 160 80 240 100 140\nk 0\n_ 200\n"); // ho la!
teksto = teksto.replace(/\u2C2E/g,"x 60\no 105 10 157\np 80\nk 0\n_ 200\n"); // hop!
teksto = teksto.replace(/\u2C2F/g,"x 60\nu 300 0 160 80 240 100 140\nk 0\n_ 200\n"); // hu!
teksto = teksto.replace(/\u2C30/g,"x 60\nu 95 10 197\nx 60\na 300 0 160 80 240 100 140\nk 0\n_ 200\n"); // huha!
teksto = teksto.replace(/\u2C31/g,"x 60\nu 95 10 171\nx 60\nu 300 0 160 80 240 100 140\nk 0\n_ 200\n"); // huhu!
teksto = teksto.replace(/\u2C32/g,"x 60\nu 300 0 240 80 240 100 140\nj 125\nk 1\n_ 200\n"); // huj!
teksto = teksto.replace(/\u2C33/g,"x 60\nu 105 10 200\nr 100\na 300 0 160 80 240 100 140\nk 1\n_ 200\n"); // hura!
teksto = teksto.replace(/\u2C34/g,"x 60\nu 105 10 220\nS 300\nk 1\n_ 200\n"); // huŝ!
teksto = teksto.replace(/\u2C35/g,"x 100\nu 60 10 170\nk 1\n_ 5\nu 300 0 160 80 240 100 140\nk 1\n_ 5\nu 105 10 139\nk 0\n_ 200\n"); // hu-u-u!

return "_ 200 100 180\n"+teksto+"_ 10\n";
}