23 de junio de 2012

Implementación de Aspell desde Visual FoxPro (corrector ortográfico)

Que es Aspell

GNU Aspell, generalmente llamado simplemente Aspell es un corrector ortográfico de software libre diseñado para reemplazar Ispell. Es el corrector ortográfico estándar para el sistema de software GNU. También compila para otros sistemas operativos tipo Unix y Windows. El programa principal está licenciado bajo la GNU Lesser General Public License (GNU LGPL), la documentación bajo la GNU Free Documentation License (GNU FDL). Diccionarios para que estén disponibles para alrededor de 70 idiomas. El mantenedor principal es Kevin Atkinson. (Fuente Wikipedia)

Donde puedo descargar Aspell para windows

En los siguientes links se puede descargar el paquete para Windows con sus respectivos diccionarios en varios idiomas

Implementacion de Aspell en Visual FoxPro

Después de mucho navegar e investigar por toda la web fue imposible encontrar una implementación de Aspell en Visual FoxPro, así que realice la tarea de implementarlo, para esto fue necesario el análisis de distintas implementaciones es lenguajes como C++, Pascal, Delphi entre otros. Debemos tener claro que estamos usando una librería dinámica externa propia de Aspell compilada para Windows, así que como prerrequisitos tenemos:
Con estos elementos instalados aclaremos, la librería dinámica a usar es ASPELL-15.DLL la cual se encuentra en C:\PROGRAM FILES\ASPELL\BIN\, la ruta puede variar dependiendo el sistema operativo como por ejemplo en equipos con SO de 64Bits seria C:\PROGRAM FILES (X86)\ASPELL\BIN\.

Ejemplo basico de Aspell desde Visual FoxPro

*!* Ubicación de la DLL
#DEFINE ASPELL_DLL "C:\PROGRAM FILES\ASPELL\BIN\ASPELL-15.DLL"
#DEFINE ASPELL_LANG "es"

*!* Funciones de la DLL
IF FILE(ASPELL_DLL)==.t.
 DECLARE INTEGER new_aspell_config IN (ASPELL_DLL)
 DECLARE INTEGER aspell_config_replace IN (ASPELL_DLL) INTEGER, STRING, STRING
 DECLARE INTEGER new_aspell_speller IN (ASPELL_DLL) INTEGER
 DECLARE INTEGER aspell_error_number IN (ASPELL_DLL) INTEGER
 DECLARE INTEGER to_aspell_speller IN (ASPELL_DLL) INTEGER
 DECLARE INTEGER aspell_speller_check IN (ASPELL_DLL) INTEGER, STRING, INTEGER
 DECLARE INTEGER aspell_speller_suggest IN (ASPELL_DLL) INTEGER, STRING, INTEGER
 DECLARE INTEGER aspell_word_list_elements IN (ASPELL_DLL) INTEGER
 DECLARE INTEGER delete_aspell_string_manag IN (ASPELL_DLL) INTEGER
 DECLARE STRING aspell_string_enumeration_next IN (ASPELL_DLL) INTEGER
 DECLARE STRING aspell_error_message IN (ASPELL_DLL) INTEGER
ELSE
 =MESSAGEBOX("La libreria de Aspell no fue encontrada, descarguela e instalela desde:"+CHR(13)+;
    "http://aspell.net"+CHR(13)+;
    "http://aspell.net/win32/dicts",0+64+256,"Libreria no instalada")
 RETURN .f.
ENDIF 

*!* Variables
LOCAL lnSpellConfig, ;
   lnPossibleErr, ;
   lnSpellChecker, ;
   lcPalabra, ;
   lnPalabra, ;
   lcSuggestions, ;
   lnElements, ;
   lcSugerencias, ;
   llSalir

*!* Iniciando instancia
lnSpellConfig = new_aspell_config()

*!* Cargando diccionario ESPAÑOL (es)
IF aspell_config_replace(lnSpellConfig, "lang", ASPELL_LANG)==1
 
 lnPossibleErr = new_aspell_speller(lnSpellConfig)
 lnSpellChecker = 0

 *!* Comprobando Inicio
 IF aspell_error_number(lnPossibleErr) != 0
  =MESSAGEBOX(aspell_error_message(lnPossibleErr),0+16+256+4096,"Error Aspell")
  RETURN .f.
 ELSE 
  lnSpellChecker = to_aspell_speller(lnPossibleErr)
 ENDIF

 *!* Palabra a comprobar
 lcFrase=INPUTBOX("Ingrese la frase a comprobrar","Frase","",0,"","")
 
 *!* Recorriendo palabras
 FOR lnItem=1 TO GETWORDCOUNT(lcFrase,' ')
  lcPalabra=GETWORDNUM(lcFrase,lnItem,' ')
  lnPalabra=LEN(lcPalabra)


  IF aspell_speller_check(lnSpellChecker,lcPalabra,lnPalabra)==0
   lcSuggestions =aspell_speller_suggest(lnSpellChecker,lcPalabra,lnPalabra)
   lnElements = aspell_word_list_elements(lcSuggestions)
   lcSugerencias=''
   llSalir=.f.

   DO WHILE llSalir==.f.
    TRY 
     lcSugerencias=lcSugerencias+aspell_string_enumeration_next(lnElements)+CHR(13)
    CATCH TO loError
     llSalir=.t.
    ENDTRY 
   ENDDO 
   =MESSAGEBOX("Incorrecta, sugerencias para "+lcPalabra+CHR(13)+lcSugerencias,0+512+4096,"Incorrectar")
  ELSE
   =MESSAGEBOX("Correcta, "+lcPalabra,0+512+4096,"Correctar")
  ENDIF 
 ENDFOR 
ELSE
 =MESSAGEBOX("Imposible iniciar la configuracion de Aspell",0+16+256+4096,"Fallo configuración")
ENDIF 

Jose Guillermo Ortiz Hernandez

No hay comentarios. :

Publicar un comentario