Função para divisão silábica

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Função para divisão silábica

Mensagem por Pablo César »

É tenho que confessar que concordo com você, eu peguei o caminho mais dificil. Mas com seu fonte+objs foi como esperava, sem erro. Após visto seu código e assimilado, foi extremamente dificil eu tentar fazer algo melhor, sei que você deu um tempo para dar oportunidade a que eu mesmo o fizesse ou até mesmo outro vira a fazer, mas não aconteceu por motivos da fustração, preguiça e incapacidade.

Tenho muito que lhe agradecer, você é realmente um bom colega, de tamanha grandeza porque comparte de forma desinteressada todo seu conhecimento e fico muito feliz saber que podemos contar na nossa comunidade com pessoas do seu gabarito. O título de "Mestre" não é a toa: é bem merecido aqui. Obrigado colega, mais uma vez !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Função para divisão silábica

Mensagem por asimoes »

Olá Maligno,

Você poderia disponibilizar os fontes das funções auxiliares do quebra.prg para testar.

meu email: asimoesluz@gmail.com

[]´s

Alexandre
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Prefiro deixar aqui mesmo, para o caso de mais alguém querer. Só observe que algumas funções podem ser substituídas por equivalentes de outras LIBs. Como foram feitas há muitos anos, época em que eu não tinha essas LIBs, fiz por minha conta e acabei deixando desse jeito mesmo.
Anexos
FCTAUX.ZIP
(4.02 KiB) Baixado 246 vezes
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Função para divisão silábica

Mensagem por asimoes »

Maligno,

Obrigado, vou testar qq coisa, informo neste canal.

[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Função para divisão silábica

Mensagem por asimoes »

Ola Maligno,

A função stranslate é de que lib?, estou testando o quebra com xharbour.

Não achei essa função nos prgs que você disponibilizou.

[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Função para divisão silábica

Mensagem por Maligno »

A função STRanslate() foi feita em C e não será possível utilizá-la diretamente no XHarbour. Você terá de fazer uma equivalente. Mas é fácil. Veja o protótipo da função:

STRanslate(cSource,cTable1,cTable2)

cSource é sua string cujos caracteres serão substituídos.
cTable1 e cTable2 são apenas strings com a tabelas de caracteres a pesquisar e a substituir, respectivamente. Exemplo: STRanslate("Simões","õ","o") vai retirar o acento do seu nome. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Função para divisão silábica

Mensagem por Pablo César »

Uma função equivalente ao STRanslate() é o UPPERS.prg que tenho disponibilizado no viewtopic.php?f=1&t=7299&p=38963#p38963 o conceito é o mesmo que aquele que usei para Converte caracteres padrão DOS/OEM pra WIN/ANSI e vice-versa irá funcionar.

Outro exemplo, você pode encontrar em: http://dicasprog.codigolivre.org.br/clipper/0007.php
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Amanda P.F
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 29 Jan 2009 16:57
Localização: Buritama-SP

Re: Função para divisão silábica

Mensagem por Amanda P.F »

Boa tarde!
Estava pesquisando uma função sobre separação silábica, e a que vc criou me pareceu a mais segura de todas, devido a todos os tipos de regras que foram levadas em conta...
Quero saber se ela teria que sofrer muitas modificações para que eu pudesse usa-la no delphi ...
Se for possível, poderia explicar em comentários no código o que cada trecho faz em específico... porque entendi as regras que foram seguidas, mas não a lógica para implementa-las.

Se puder me ajudar ficarei grata!

obrigado pela atenção!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Função para divisão silábica

Mensagem por Maligno »

Amanda P.F escreveu:Quero saber se ela teria que sofrer muitas modificações para que eu pudesse usa-la no delphi ...
Nem preciso dizer que delphi é uma linguagem bem diferente do Clipper. É possível sim, converter pra delphi. Mas há um porém: se o que você for hifenizar for algum texto com fontes proporcionais, não vai dar certo. Essa função trabalha com programas DOS, onde as fontes são fixas. Até dá pra adaptar. O canvas tem funções de apoio que ajudariam nisso. Mas não é coisa simples (rápida) de fazer. Até pretendo fazer algo parecido numa biblioteca C pra Clipper. Mas nem consegui ânimo ainda. :)))

Portanto, se a fonte for fixa, sem problema. É só converter pra delphi e pronto. Se for fonte proporcional, será um problema um pouco maior. Então, se ainda acha que essa função pode ser útil a você, dê um reply nessa mensagem que dou uma melhorada na documentação.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Amanda P.F
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 29 Jan 2009 16:57
Localização: Buritama-SP

Re: Função para divisão silábica

Mensagem por Amanda P.F »

Bom dia Maligno!
estou tentando entender a lógica da sua função para separação silábica, mas tem algumas funções dela que eu não entendi para que servem, porque não conheço a linguagem de programação clipper...
Se for possível, poderia descrever em comentário no código o que cada bloco de código faz em expecífico, para eu possa entender melhor a lógica e assim conseguiu passar a função para ser executada em delphi...
Não entendo, por exemplo, qual a diferença do AllTrim(cWord) e do Len(cWord) para a função Length(cword) do delphi, que retorna o total de caracteres da string...
Esse "SubStr(cWord,i,1)" tem a mesma função que o copy?

Obrigado pela atenção!
Amanda P.F
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 29 Jan 2009 16:57
Localização: Buritama-SP

Re: Função para divisão silábica

Mensagem por Amanda P.F »

Boa tarde!
Então, vou tentar te explicar onde eu quero utilizar a função...estou trabalhando em uma unit de impressão de uma venda razão para ser impressa em impressoras matriciais. Uso o componente RDPrint, e estou precisando quando no caso de uma string possuir mais de 48 caracteres (q é o que cabe em cada linha da minha impressão), a impressão pule e continue na linha seguinte, já consegui fazer essa verificação para pular para proxima linha, mas não consigo separar as silabas, ou mesmo se não for possivel separa-las, queria que caso a palavra não caiba na linha, ela pule para ser impressa na próxima...

Até o momento tenho esse trecho de código, onde faço a verificação do tamanho da string:

Código: Selecionar todos

 //posição para começar a imprimir a string
            posicao_inicial := 1;
            // variável descrição recebe a string 
            descricao   := Q_ItemVendaServico.FieldByName('descricao_servico').AsString;
           //verifico quantas linhas serão utilizadas
            qtde_linhas := (Round(((Length(descricao)) / 48)));
            //verifica o tamanho da string
            if((Length(descricao)) > 48) then
            begin
              for x := 1 to qtde_linhas do
              begin
//tentei chamar a função aqui:
//                hifenar(descricao);
                RDprint.ImpF  (Linha,13,(Copy(descricao, posicao_inicial, 48)),[Comp17]);
                linha := (linha + 1);
                posicao_inicial := (posicao_inicial + 48) ;
              end;
            end
            else
              RDprint.ImpF  (Linha,13,(Copy(Q_ItemVendaServico.FieldByName('descricao_servico').AsString, 1, 48)),[Comp17]);
Estive pesquisando, e encontrei uma função em delphi que faz isso, mas disseram que não funciona 100%, estou tentando utilizada, mas tb não entendi a lógica dela... (vou colocar aqui, caso queira observá-la)

Código: Selecionar todos

function hifenar(PPalavras: string): string;
var
  ss: string;
  p: Integer;
  Letra, c1, c2: string;
begin
  PPalavras := TRIM(PPalavras);
  ss := '';

  for p := 1 to 48 do
  begin
    LETRA := UPPERcase(Copy(PPalavras, p, 48));
    if Pos(Letra, 'AÀÄÃÁÂEÈËÉÊIÌÏÍÎOÕÖÕÓÔUÙÜÚÛYŸÝ') > 0 then
      ss := ss + 'V'
    else
      if Pos(LETRA, 'BCDFGHJLMNPQRSTVXZKYW' + 'Çç') > 0 then
        ss := ss + 'C'
      else
        ss := ss + '?';
  end;

  p := Pos('VCV', ss);
  while (p <> 0) do
  begin
    PPalavras := Copy(PPalavras, 1, p) + '-' + rightstr(PPalavras, Length(PPalavras) - p);
    ss := Copy(ss, 1, p) + '-' + rightstr(ss, Length(ss) - p);
    p := Pos('VCV', ss);
  end;

  p := Pos('VCCV', ss);
  while p <> 0 do
  begin
    C1 := UPPERcase(Copy(PPalavras, p + 1, 1));
    C2 := UPPERcase(Copy(PPalavras, p + 2, 1));
    if ((not ansicontainstext(C1, 'JLHMNQRSXZ')) and ansicontainstext(C2, 'LR')) or ((Pos(C1, 'CLNPST') > 0) and (Pos(C2, 'H') > 0)) then
    begin
        // V-CCV
        PPalavras := Copy(PPalavras, 1, p) + '-' + rightstr(PPalavras, Length(PPalavras) - p);
        ss := Copy(ss, 1, p) + '-' + rightstr(ss, Length(ss) - p);
    end
    else
    begin
        // VC-CV
        PPalavras := Copy(PPalavras, 1, p + 1) + '-' + rightstr(PPalavras, Length(PPalavras) - (p + 1));
        ss := Copy(ss, 1, p + 1) + '-' + rightstr(ss, Length(ss) - (p + 1));
    end;
    p := Pos('VCCV', ss);
  end;

  p := Pos('VCCCV', ss);
  while p <> 0 do
  begin
    C1 := UPPERcase(Copy(PPalavras, p + 2, 1));
    C2 := UPPERcase(Copy(PPalavras, p + 3, 1));
    if ((not ansicontainstext(C1, 'JLHMNQRSXZ')) and ansicontainstext(C2, 'LR')) or (ansicontainstext(C1, 'CLNPST') and (C2 = 'H')) then
    begin
        PPalavras := Copy(PPalavras, 1, p + 1) + '-' + rightstr(PPalavras, Length(PPalavras) - (p + 1));
        ss := Copy(ss, 1, p + 1) + '-' + rightstr(ss, Length(ss) - (p + 1));
    end
    else
    begin
        PPalavras := Copy(PPalavras, 1, p + 2) + '-' + rightstr(PPalavras, Length(PPalavras) - (p + 2));
        ss := Copy(ss, 1, p + 2) + '-' + rightstr(ss, Length(ss) - (p + 2));
    end;
    p := Pos('VCCCV', ss);
  end;

  p := Pos('VCCCCV', ss);
  while p <> 0 do
  begin
    PPalavras := Copy(PPalavras, 1, p + 2) + '-' + rightstr(PPalavras, Length(PPalavras) - (p + 2));
    ss := Copy(ss, 1, p + 2) + '-' + rightstr(ss, Length(ss) - (p + 2));
    p := Pos('VCCCCV', ss);
  end;

  p := Pos('VV', ss);
  while p <> 0 do
  begin
    if not Pos('!' + UPPERcase(Copy(PPalavras, p, 2)) + '!', '!AI!AO!ÃO!ãO!AU!EI!EU!OE!ÕE!õE!OI!OO!OU!' + ifthen(p <> 1, ifthen(Pos(UPPERcase(Copy(PPalavras, p - 1, 1)), 'GQ') > 0, 'UA!ÜA!üA!UE!ÜE!üE!UI!ÜI!üI!UO!ÜO!üO!UU!ÜU!üU!', ''), '')) > 0 then
    begin
        PPalavras := Copy(PPalavras, 1, p) + '-' + rightstr(PPalavras, Length(PPalavras) - p);
        ss := Copy(ss, 1, p) + '-' + rightstr(ss, Length(ss) - p);
    end;
    if Pos('VV', rightstr(ss, Length(ss) - p)) <> 0 then
        p := p + Pos('VV', rightstr(ss, Length(ss) - p))
    else
        p := 0;
  end;
  result := (PPalavras);

end;
Aparentemente a sua me parece mais segura, por isso queria entender a lógica dela, para tentar adaptar uma com a msm lógica, mas em delphi...

obrigado!!!
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Re: Função para divisão silábica

Mensagem por Luciano Bonfim »

Caro Malígno e Pablo Cesar,

Muito Obrigado pela ajuda de vcs... caiu como uma luva, era o que eu estava precisando.
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Função para divisão silábica

Mensagem por cjp »

Caro Maligno e demais colegas,

Pesquisando no fórum, encontrei este post que vem bem ao encontro das minhas necessidades.

Estou precisando fazer um alinhamento na margem direita na impressão de uns relatórios. Nem precisaria propriamente de divisão silábica. Seria suficiente que ele não separasse as palavras aleatoriamente; poderia não fazer separação alguma. Mas fazendo divisão silábica fica ainda melhor.

Peguei o exemplo do Maligno neste post, que me pareceu excelente. Mas não estou conseguindo usá-la.

Em princípio, deu problema pela falta da função stranslate. Tentei substitui-la por outra que tenho aqui que parece fazer a mesma coisa, mas não funcionou.

Daí eu baixei o arquivo quebra.zip. Só que não estou conseguindo compilar a stransla.obj junto ao meu sistema.

Coloquei o arquivo de compilação assim:

Código: Selecionar todos

# coloque aqui suas libs, precedidas pela letra "l" (minúscula):
-lxhb
-lhbwin
-lhbtip
-lhbct
-lhbHPdf
-lhbZebra
-lhbmisc
-llibmysql
rddsql.hbc 
sddodbc.hbc
hbwin.hbc
stransla.obj

# coloque aqui os parâmetros de compilação:
-quiet
-jobs=4
-oTAGENDA

# coloque aqui seus arquivos PRGs:
\prg\TAGENDA.PRG
\prg\AGTEL.PRG
\prg\COMUNS.PRG
\prg\CONTAG.PRG
\prg\BANCO.PRG
\prg\AGCOM.PRG
\prg\ERRORS2.PRG
\prg\GETSYS.PRG
\prg\MANUTENCAO.PRG
O arquivo está na pasta, mas está dando "No such file or directory" na compilação.

Já tentei também colocar o stransla.obj junto com os prgs, dá no mesmo.

Alguém poderia me ajudar com isto?
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Função para divisão silábica

Mensagem por alxsts »

Olá!

A mensagem que você informa estar recebendo é auto explicativa. O arquivo não foi encontrado no local em que foi procurado.

Mesmo que você consiga adicionar este arquivo .obj à sua compilação, ela não funcionará. Este arquivo certamente foi gerado pelo Clipper.Exe, e está em formato 16 bits. Para incluir no teu projeto Harbour, o mesmo teria que estar em formato 32 ou 64 bits. Será preciso reconstruir esta função ou encontrar seu fonte original.
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Função para divisão silábica

Mensagem por cjp »

Pois é. O estranho é que o arquivo está sim no local.

Mas se não adianta compilar esse obj, o jeito é esperar o Maligno disponibilizar a função, correto?
Inacio de Carvalho Neto
Responder