CAPÍTULO 9
Programação visual com Software Livre
EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo.  Prólogo de Benoit Minisini
<< Anterior Próximo >>


9.3 Um exemplo com libaspell



Aspell proporciona uma API para correção de texto, permite analisar palavras, indicar se são válidas segundo o dicionário empregado, e oferece palavras alternativas as consideradas incorretas, entre outras capacidades.
 

Dispomos de mais informações sobre o libaspell em sua página oficial:
http://aspell.sourceforge.net/
 

Para poder utilizar esse código, teremos que instalar Aspell no sistema, assim como o dicionário de nosso idioma.

Por exemplo, em um sistema gnuLinex 2004 em casteliano ( baseado no Debian ), os pacotes instalados no sistema são:

aspell

aspell-es

aspell-bin

libaspell15

libaspell-dev
 
Criaremos um novo projeto gráfico chamado Aspell, com u único formulário Fmain no qual conterá um botão chamado BtnCheck, um TextBox chamado TxtIn, um ListBox chamado Lista e ProgressBar chamado Pbar.

No início do código do formulário definimos as funções do libaspell.
Figura 1
Figura 1. Formulário do projeto Aspell.
 

' Gambas class file

LIBRARY "libaspell"

EXTERN new_aspell_config () AS Pointer

EXTERN aspell_config_replace ( Cfg AS Pointer,  Var AS String,  Value AS String )

EXTERN new_aspell_speller ( Cfg AS Pointer ) AS Pointer

EXTERN aspell_error_number ( Err AS Pointer ) AS Integer

EXTERN aspell_error_message ( Err AS Pointer ) AS Pointer

EXTERN to_aspell_speller ( Err AS Pointer ) AS Pointer

EXTERN aspell_speller_check ( V1 AS Pointer, V2 AS String, V3 AS Integer ) AS Integer

EXTERN aspell_speller_suggest (V1 AS Pointer, V2 AS String, V3 AS Integer) AS Pointer

EXTERN aspell_word_list_elements ( V1 AS Pointer ) AS Pointer

EXTERN aspell_string_enumeration_next ( Ptr AS Pointer ) AS Pointer

EXTERN delete_aspell_string_enumeration ( Ptr AS Pointer )

EXTERN delete_aspell_config ( Cfg AS Pointer )
 

Ao ao pressionarmos o botão BtnCheck, realizaremos o processo de análise do texto introduzido no quadro TxtIn, para ir mostrando o resultado na lista.
 

PUBLIC SUB BtnCheck_Click ()

DIM spell_config AS Pointer

DIM possible_err AS Pointer

DIM spell_checker AS Pointer

DIM suggestions AS Pointer

DIM elements AS Pointer

DIM MyStr AS String[]

DIM Bucle AS Integer

DIM BuffErr AS String

DIM sum AS Float

DIM hPtr AS Pointer

DIM sPtr AS String
 

Em primeiro lugar, dividimos o texto introduzido pelo usuário em palavras, separadas por espaços.
 

Pbar.Value = 0

Lista.Clear ()

MyStr = Split ( TxtIn.Text, " " )

Sum = 1 / MyStr.Count
 

Realizamos as primeiras chamadas a biblioteca libaspell. Para isso tomamos uma configuração por padrão e aplicamos dois atributos: o texto estará codificado como UTF-8 e usaremos o dicionário que corresponde com a linguagem do sistema.

Aplicamos a configuração e, se ocorrer um erro (por exemplo, que o dicionário não se encontra disponível), indicamos a mensagem correspondente:
 

spell_config = new_aspell_config ()

aspell_config_replace ( spell_config, "lang", Application.Env [ "LANG" ] )

aspell_config_replace ( spell_config, "encoding", "utf-8" )

possible_err = new_aspell_speller ( spell_config )

IF aspell_error_number ( possible_err ) <> 0 THEN

Message.Error ( StrPtr ( aspell_error_message ( possible_err ) ) )

RETURN

ELSE

spell_checker = to_aspell_speller ( possible_err )

END IF
 

Depois entramos em um loop no qual analisaremos, palavra por palavra, o texto introduzido. Em caso de erro, se dará uma lista de sugestões. Porem se estiver tudo correto, se indicará com um OK.
 

FOR Bucle = 0 TO MyStr.Count - 1

Pbar.Value = Pbar.Value + Sum

MyStr [ Bucle ] = Trim ( MyStr [ Bucle ] )

IF Len ( MyStr [ Bucle ] )  >  0  THEN
 
IF aspell_speller_check ( spell_checker, MyStr [ Bucle ],  - 1 ) THEN

Lista.Add ( "OK      ->" & MyStr [ Bucle ] )

ELSE

BuffErr =  " ( "

suggestions = aspell_speller_suggest ( spell_checker, MyStr [ Bucle ],  - 1 )

elements = aspell_word_list_elements ( suggestions )

DO WHILE TRUE

hPtr = aspell_string_enumeration_next ( elements )

IF hPtr = 0 THEN

BREAK

ELSE

sPtr = ""

INPUT #hPtrsPtr

BuffErr = BuffErr & sPtr & " "

END IF

LOOP

delete_aspell_string_enumeration ( elements )

BuffErr = BuffErr & ")"

Lista.Add ( "ERROR -> "  &  MyStr [ Bucle ]  &  BuffErr )

END IF

END IF

WAIT 0.001

NEXT
 

Finalmente liberamos os elementos necessários empregados na correção do texto

delete_aspell_config ( spell_config )

Pbar.Value = 1

END
 






 
<< Anterior Próximo >>

HOME


Cópia literal

Extraído do livro “GAMBAS, programação visual com software Livre”, da editora EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo. Prólogo de Benoit Minisini

LICENSA DESTE DOCUMENTO


É permitido a cópia e distribuição da totalidade ou parte desta obra sem fins lucrativo. Toda cópia total ou parcial devera expressar o nome do autor e da editora e incluir esta mesma licença, adicionando se é uma cópia literal “Cópia literal”. Se é autorizada a modificação e tradução da obra  sem fins lucrativo sempre se deve constar na obra resultante  a modificação o nome da obra original o autor da obra original e o nome da editora e a obra resultante também deverá ser livremente reproduzida, distribuída, ao publico e transformada em termos similares ao exposto nesta licença.

Tradução

Cientista
 (Antonio Sousa)