Dopo aver letto il tuo post ho avuto qualche dubbio, ma poi ci ho
studiato sopra e posso dire che una regexp è sufficiente.
Di seguito il codice in javascript, ho effettuato dei test, ma se fate
qualche test anche voi sarebbe meglio.
Le regole sono esattamente quelle indicate dal post di apertura con i
limiti che quelle regole impongono, con buona volontà si possono
completare.
Attenzione! Valuta una parola per volta, quindi non inserite più di
una parola, dopo le prove preliminari si può sviluppare per testi
interi.
Se avete difficoltà lo inserisco una pagina web specifica nel mio
sito.
Ciao
Oreste
------------------------------------------------------------------------------------------------------------------
file html
------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Sillabe</title>
<meta name="Author" content="Oreste Parlatano www.oreste.parlatano.com"
/>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<script language="JavaScript" src="sillabe.js"></script>
</head>
<body>
<button onClick="JavaScript:sillabe();">Sillabe</button>
Entrata <input type="text" id="entrata" size="30" value="" />
</body>
</html>
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
file js
------------------------------------------------------------------------------------------------------------------
function funz(){
return arguments[0]+'-';
}
function sillabe(){
var pattern =
/[aeiouy](?=(s))|[hlmnr](?=(s))|[bcdfgjpqrstvwz](?=([bcdfgjpqrstvwz]))|[aeiouy](?=([bcdfgjpqrstvwz])([aeiouy]))|[hlmnr](?=([bcdfgjpqrstvwz])([aeiouy]))|[aeiouy](?=([bcdfgjpqrstvwz])([hlmnr]))|[hlmnr](?=([bcdfgjpqrstvwz])([hlmnr]))|[aeiouy](?=([hlmnr])([aeiouy]))|[hlmnr](?=([hlmnr])([aeiouy]))/gi;
var oparola = document.getElementById('entrata');
var parola = oparola.value;
alert(parola.replace(pattern,funz));
}
------------------------------------------------------------------------------------------------------------------
Post by Giovanni ZezzaOreste, nel messaggio
Post by OresteNon ci avevo pensato, una RE potrebbe essere una soluzione molto
pratica, facile poi da inserire in una routine qualsiasi.
Una RE in javascript ed una in Perl così si coprono i due lati (server
e client).
"Una" RE è veramente un po' troppo poco. Con una dozzina comunque è già
possibile ottenere una sillabazione ragionevolmente buona.
Post by OresteBisognerebbe però che qualcuno facesse lo sforzo di stabilire regole
sicure di sillabazione con le istruzioni per le eccezioni, parole che
contengono caratteri non appartenenti alla lingua italiana.
Mi permetto di pubblicare il codice di Lingua::IT:Hyphenate di Aldo
$_V = "[aeiouàèéìòù]";
$_C = "[b-df-hj-np-tv-z]";
sub sillabe {
#DEBUG print "word $word --> ";
$word =~ s/($_V)([bcfgptv][lr])/$1=$2/gi;
$word =~ s/($_V)([cg]h)/$1=$2/gi;
$word =~ s/($_V)(gn)/$1=$2/gi;
$word =~ s/($_C)\1/$1=$1/gi;
$word =~ s/(s$_C)/=$1/gi;
1 while $word =~ s/($_V*$_C+$_V+)($_C$_V)/$1=$2/gi;
1 while $word =~ s/($_V*$_C+$_V+$_C)($_C)/$1=$2/gi;
$word =~ s/^($_V+$_C)($_C)/$1=$2/gi;
$word =~ s/^($_V+)($_C$_V)/$1=$2/gi;
$word =~ s/^=//;
$word =~ s/=$//;
$word =~ s/=+/=/g;
#DEBUG print "$word\n";
}
}
(E' come gli stereogrammi: bisogna fissarlo a lungo, rilassati e senza
pensare a nulla, e pian piano l'immagine di quello che fa si forma da sé.)
L'approccio, come riconosciuto dallo stesso autore, è un po' semplicistico,
ma produce già una sillabazione abbastanza buona, cioè non completa, ma
sostanzialmente corretta.
Non conosco in dettaglio l'algoritmo utilizzato da TeX (adottato anche da
Lout), ma so che si tratta di un algoritmo generico, che utilizza una serie
di pattern (ed eccezioni) differenti per ogni lingua. Il pacchetto per
l'italiano, prodotto da Claudio Beccari, consiste in circa 400 pattern,
senza eccezioni.
Ciao.