Função para divisão silábica
Enviado: 29 Mar 2008 16:21
Estou liberando a função que desenvolvi para separação silábica. Tenho um sistema de help que achei que precisava ser mais flexível e que pudesse ser visualmente reconfigurável conforme a posição da janela e o tamanho do texto a exibir. Meu sistema de help faz esses ajustes automaticamente, levando em conta, principalmente o tamanho do texto. Mas pra isso, tive que dar a ele condições de dividir não só o texto, mas as palavras. Daí criei essa função, que segue estritamente as regras da língua portuguesa. Segue então,...
ALGUMAS CONSIDERAÇÕES SOBRE O NÍVEL DE QUALIDADE DA FUNÇÃO
Pelos testes feitos, esta função tem um grau de acerto de 100% nas divisões silábicas que faz, já que nenhum erro foi detectado. Mas algumas palavras, especialmente as que contém hiatos e outras, que contém ditongos e/ou tritongos, não são totalmente separadas. Foi de propósito. Mas convém repetir: não há erros de divisão, mas algumas palavras, e nos casos especiais citados, não são divididas em partes que até aceitariam divisão. Essa limitação existe apenas com a intenção de facilitar o desenvolvimento da codificação. Como a finalidade desta função é apenas auxiliar na estética de alguns textos, o que foi obtido aqui é mais do que suficiente para ter assegurada a boa qualidade do trabalho.
AS REGRAS APLICADAS NA DIVISÃO SILÁBICA
1) A consoante inicial, não seguida de vogal, permanece na sílaba que a precede.
Ex: gno-mo, mne-mô-ni-co, pneu-má-ti-co, etc.
2) No interior do vocábulo, sempre se conserva na sílaba que a precede a consoante seguida por outra consoante.
Ex: ab-di-car, ét-ni-co, nup-ci-al, op-ção, etc.
3) Não se separam os elementos dos digramas ch, lh e nh.
Ex: fi-lho, ma-nhã, fi-chá-rio, etc.
4) O sc no interior do vocábulo, biparte-se, ficando o s na sílaba que o procede e o c na sílaba seguinte.
Ex: a-do-les-cen-te, pres-cin-dir, res-ci-são, etc.
E mais: forma sílaba com a sílaba que o precede, o s que precede outra consoante.
Ex: pers-pi-caz, ins-tá-vel, ins-pe-tor, etc.
5) O s dos elementos bis, cis, des, dis, trans e o x do prefixo ex não se separam quando a sílaba seguinte começa com uma consoante; mas se principia com vogal, a ela se juntam, separando-se da sílaba precedente.
Ex: bis-neto, bi-sa-vó, des-li-gar, de-ses-pe-ro, ex-tra-ção, e-xér-ci-to, etc.
6) As vogais idênticas e as letras cc, cç, rr e ss separam-se, ficando uma na sílaba que a
precede e a outra na seguinte.
Ex: co-or-de-nar, ca-a-tin-ga, pror-ro-gar, res-sur-gir, etc.
E mais: as vogais de hiatos, ainda que diferentes umas das outras, também se separam.
Ex: ca-ir, do-er, flu-ir, po-ei-ra, ra-i-nha, etc.
7) Não se separam as vogais dos ditongos e nem dos tritongos.
Ex: ai-ro-so, cai-ais, i-guais, au-ro-ra, etc.
DEFINIÇÕES ADICIONAIS
Ditongos: Grupo de duas vogais que se pronunciam com uma só entonação de voz, numa articulação.
Ex: sá-bio (io), ja-mais (ai), etc...
Tritongos: Idem, para os grupos de três vogais.
Ex: vaias (aia), i-guais (uai), Pa-ra-guai (uai), etc.
Essa função, apenas lembrando, separa apenas as palavras individualmente. O texto precisa passar por uma outra função que meça o tamanho da linha e a corte no ponto em que ela contém o último espaço antes do texto "extrapolar" o limite do tamanho da linha. Exemplo: o texto deve ter no máximo 60 caracteres de comprimento. Deve-se contar as palavras para encontrar o último espaço, mais à direita, tal que a palavra seguinte à ele, agregada à linha, ultrapasse o limite de 60. Essa linha parcial, até o espaço, é separada e a última palavra passa pela divisão silábica. Então agrega-se à frase parcial tantas sílabas quanto for possível, até o limite de 60. Deve-se considerar aí, claro, o hífen do final da linha. As sílabas restantes são a parte inicial da linha seguinte.
ALGUMAS CONSIDERAÇÕES SOBRE O NÍVEL DE QUALIDADE DA FUNÇÃO
Pelos testes feitos, esta função tem um grau de acerto de 100% nas divisões silábicas que faz, já que nenhum erro foi detectado. Mas algumas palavras, especialmente as que contém hiatos e outras, que contém ditongos e/ou tritongos, não são totalmente separadas. Foi de propósito. Mas convém repetir: não há erros de divisão, mas algumas palavras, e nos casos especiais citados, não são divididas em partes que até aceitariam divisão. Essa limitação existe apenas com a intenção de facilitar o desenvolvimento da codificação. Como a finalidade desta função é apenas auxiliar na estética de alguns textos, o que foi obtido aqui é mais do que suficiente para ter assegurada a boa qualidade do trabalho.
AS REGRAS APLICADAS NA DIVISÃO SILÁBICA
1) A consoante inicial, não seguida de vogal, permanece na sílaba que a precede.
Ex: gno-mo, mne-mô-ni-co, pneu-má-ti-co, etc.
2) No interior do vocábulo, sempre se conserva na sílaba que a precede a consoante seguida por outra consoante.
Ex: ab-di-car, ét-ni-co, nup-ci-al, op-ção, etc.
3) Não se separam os elementos dos digramas ch, lh e nh.
Ex: fi-lho, ma-nhã, fi-chá-rio, etc.
4) O sc no interior do vocábulo, biparte-se, ficando o s na sílaba que o procede e o c na sílaba seguinte.
Ex: a-do-les-cen-te, pres-cin-dir, res-ci-são, etc.
E mais: forma sílaba com a sílaba que o precede, o s que precede outra consoante.
Ex: pers-pi-caz, ins-tá-vel, ins-pe-tor, etc.
5) O s dos elementos bis, cis, des, dis, trans e o x do prefixo ex não se separam quando a sílaba seguinte começa com uma consoante; mas se principia com vogal, a ela se juntam, separando-se da sílaba precedente.
Ex: bis-neto, bi-sa-vó, des-li-gar, de-ses-pe-ro, ex-tra-ção, e-xér-ci-to, etc.
6) As vogais idênticas e as letras cc, cç, rr e ss separam-se, ficando uma na sílaba que a
precede e a outra na seguinte.
Ex: co-or-de-nar, ca-a-tin-ga, pror-ro-gar, res-sur-gir, etc.
E mais: as vogais de hiatos, ainda que diferentes umas das outras, também se separam.
Ex: ca-ir, do-er, flu-ir, po-ei-ra, ra-i-nha, etc.
7) Não se separam as vogais dos ditongos e nem dos tritongos.
Ex: ai-ro-so, cai-ais, i-guais, au-ro-ra, etc.
DEFINIÇÕES ADICIONAIS
Ditongos: Grupo de duas vogais que se pronunciam com uma só entonação de voz, numa articulação.
Ex: sá-bio (io), ja-mais (ai), etc...
Tritongos: Idem, para os grupos de três vogais.
Ex: vaias (aia), i-guais (uai), Pa-ra-guai (uai), etc.
Código: Selecionar todos
/* Constantes globais do meu sistema. Coloque-as onde achar melhor.
_g_SignSet = "!"+Chr(34)+"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
_g_VogsSet = "AEIOU"
_g_ConsSet = "BCDFGHJKLMNPQRSTVWXYZ"
*/
//**********************************************************
function SyllabDiv(cOrign)
local aSylls := {}
local cDitong := "AI.AO.AU.UA.EI.EU.IO.OE"
local cTriton := "AIA.UAI"
local cIndiv := "CH.LH.NH.PN"
local lDiv := .F.
local cTail
local i
local c
priva cSyll // sílaba já separada
priva cWord := cOrign // a palavra original
if Len(cWord := AllTrim(cWord)) <= 3
return {cWord}
end
// Padronizar a palavra, convertendo-a para maiúsculas,
// removendo acentos e caracteres especiais
cTail := ""
for i := 1 to Len(cWord)
if SubStr(cWord,i,1) $ StrTran(_g_SignSet,"-")+" "
cTail := SubStr(cWord,i)
cWord := Left(cWord,i-1)
exit
end
next
cWord := AllTrim(Upper(DelAccents(cWord)))
cSyll := ""
while Len(cWord) > 0
Attach()
*
if Len(cWord) = 0
lDiv := .T.
*
elseif Right(cSyll,1) $ _g_VogsSet
if Left(cWord,1) $ _g_ConsSet
lDiv := .T.
if Len(cWord)=1
Attach()
else
if At(SubStr(cWord,1,2),cIndiv) = 0
if !(Left(cWord,1) $ "BCDFGPTV" .and. SubStr(cWord,2,1) $ "LR" ) .and.;
((Left(cWord,1) $ "LMNRS" .and. SubStr(cWord,2,1) $ _g_ConsSet ) .or.;
SubStr(cWord,2,1) $ _g_ConsSet)
Attach()
end
end
end
if Left(cWord,1) = "S" .and. SubStr(cWord,2,1) $ _g_ConsSet
Attach()
end
else
if At(Right(cSyll,1)+Left(cWord,1),cDitong)=0 .and. At(Right(cSyll,1)+Left(cWord,2),cTriton)=0 .and.;
Right(cSyll,1) == Left(cWord,1)
lDiv := .T.
end
end
*
elseif Right(cSyll,1) $ _g_ConsSet
if Len(aSylls)=0 .and. Len(cSyll)=1 .and. Left(cWord,1) $ _g_ConsSet
Attach()
end
end
// Formação definitiva da sílaba
if lDiv
lDiv := .F.
AAdd(aSylls,cSyll)
cSyll := ""
end
end
// Recomposição da string, para recuperar a caixa, a
// acentuação original e os sinais suprimidos
if Len(aSylls) > 0
aSylls[Len(aSylls)] += cTail
*
c := 0
for i := 1 to Len(aSylls)
for k := 1 to Len(aSylls[i])
c ++
aSylls[i] := Stuff(aSylls[i],k,1,SubStr(cOrign,c,1))
next
next
else
AAdd(aSylls,cTail)
end
return aSylls
//**********************************************************
static function Attach()
cSyll += Left(cWord,1) // a sílaba já formada
cWord := SubStr(cWord,2) // o resto da palavra
return nilEssa função, apenas lembrando, separa apenas as palavras individualmente. O texto precisa passar por uma outra função que meça o tamanho da linha e a corte no ponto em que ela contém o último espaço antes do texto "extrapolar" o limite do tamanho da linha. Exemplo: o texto deve ter no máximo 60 caracteres de comprimento. Deve-se contar as palavras para encontrar o último espaço, mais à direita, tal que a palavra seguinte à ele, agregada à linha, ultrapasse o limite de 60. Essa linha parcial, até o espaço, é separada e a última palavra passa pela divisão silábica. Então agrega-se à frase parcial tantas sílabas quanto for possível, até o limite de 60. Deve-se considerar aí, claro, o hífen do final da linha. As sílabas restantes são a parte inicial da linha seguinte.