changeset 1590:8d1bcc83ae32

Add support for spellchecking with Enchant (caolan) Patch from the issue tracker: http://bitbucket.org/McKael/mcabber-crew/issue/36/patch-to-spell-checking-using-enchant
author Mikael Berthe <mikael@lilotux.net>
date Sun, 04 Oct 2009 19:33:38 +0200
parents 23c08d4f1d1e
children 44fef962f572
files mcabber/configure.ac mcabber/mcabberrc.example mcabber/src/Makefile.am mcabber/src/main.c mcabber/src/screen.c mcabber/src/screen.h
diffstat 6 files changed, 94 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/configure.ac	Sun Oct 04 18:39:08 2009 +0200
+++ b/mcabber/configure.ac	Sun Oct 04 19:33:38 2009 +0200
@@ -204,10 +204,19 @@
     fi
 fi
 
+# Check for Enchant stuff
+AC_ARG_ENABLE(enchant, [  --enable-enchant       enable enchant support],
+              enable_enchant=$enableval, enchant="")
 # Check for Aspell stuff
 AC_ARG_ENABLE(aspell, [  --enable-aspell         enable aspell support],
               enable_aspell=$enableval, aspell="")
-if test "x$enable_aspell" = "xyes"; then
+
+if test "x$enable_enchant" = "xyes"; then
+ PKG_CHECK_MODULES(ENCHANT, [enchant],
+   AC_DEFINE(WITH_ENCHANT, 1, [define if you want enchant support])
+ )
+else
+ if test "x$enable_aspell" = "xyes"; then
     AC_CHECK_HEADERS(aspell.h, [ have_aspell_includes=yes ])
     if test "x$have_aspell_includes" = "xyes"; then
         AC_CHECK_LIB(aspell, new_aspell_config, [ have_aspell_libs=yes ])
@@ -220,6 +229,7 @@
     else
         enable_aspell=no
     fi
+ fi
 fi
 
 AC_DEFINE([BUILD_JABBER], 1, [build with jabber support])
--- a/mcabber/mcabberrc.example	Sun Oct 04 18:39:08 2009 +0200
+++ b/mcabber/mcabberrc.example	Sun Oct 04 19:33:38 2009 +0200
@@ -102,10 +102,10 @@
 # If your mcabber has been built with Aspell support, you can enable spell
 # checking with the following options (you can't change them once mcabber is
 # running).
-#set aspell_enable = 1
-#set aspell_lang = en_EN
-#set aspell_encoding = iso8859-1
-#set aspell_encoding = UTF-8
+#set spell_enable = 1
+#set spell_lang = en_US
+#set spell_encoding = iso8859-1
+#set spell_encoding = UTF-8
 
 # History
 # Number of lines to remember for the command line history
--- a/mcabber/src/Makefile.am	Sun Oct 04 18:39:08 2009 +0200
+++ b/mcabber/src/Makefile.am	Sun Oct 04 19:33:38 2009 +0200
@@ -11,10 +11,10 @@
 mcabber_SOURCES += otr.c otr.h nohtml.c nohtml.h
 endif
 
-LDADD = $(GLIB_LIBS) $(GPGME_LIBS) $(LIBOTR_LIBS) \
+LDADD = $(GLIB_LIBS) $(GPGME_LIBS) $(LIBOTR_LIBS) $(ENCHANT_LIBS) \
 	../libjabber/liblibjabber.a ../connwrap/libconnwrap.a
 
-AM_CPPFLAGS = $(GLIB_CFLAGS) $(GPGME_CFLAGS) $(LIBOTR_CFLAGS)
+AM_CPPFLAGS = $(GLIB_CFLAGS) $(GPGME_CFLAGS) $(LIBOTR_CFLAGS) $(ENCHANT_CFLAGS)
 
 CLEANFILES = hgcset.h
 
--- a/mcabber/src/main.c	Sun Oct 04 18:39:08 2009 +0200
+++ b/mcabber/src/main.c	Sun Oct 04 19:33:38 2009 +0200
@@ -300,6 +300,9 @@
 #ifdef HAVE_LIBOTR
   puts("Compiled with OTR support.");
 #endif
+#ifdef WITH_ENCHANT
+  puts("Compiled with Enchant support.");
+#endif
 #ifdef WITH_ASPELL
   puts("Compiled with Aspell support.");
 #endif
@@ -470,9 +473,9 @@
   if (optval || optval2)
     hlog_enable(optval, settings_opt_get("logging_dir"), optval2);
 
-#ifdef HAVE_ASPELL_H
-  /* Initialize aspell */
-  if (settings_opt_get_int("aspell_enable")) {
+#if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
+  /* Initialize spelling */
+  if (settings_opt_get_int("spell_enable")) {
     spellcheck_init();
   }
 #endif
@@ -544,9 +547,9 @@
 #ifdef HAVE_GPGME
   gpg_terminate();
 #endif
-#ifdef HAVE_ASPELL_H
-  /* Deinitialize aspell */
-  if (settings_opt_get_int("aspell_enable"))
+#if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
+  /* Deinitialize spelling */
+  if (settings_opt_get_int("spell_enable"))
     spellcheck_deinit();
 #endif
   /* Save pending message state */
--- a/mcabber/src/screen.c	Sun Oct 04 18:39:08 2009 +0200
+++ b/mcabber/src/screen.c	Sun Oct 04 19:33:38 2009 +0200
@@ -41,7 +41,11 @@
 # include <langinfo.h>
 #endif
 
-#ifdef HAVE_ASPELL_H
+#ifdef WITH_ENCHANT
+# include <enchant.h>
+#endif
+
+#ifdef WITH_ASPELL
 # include <aspell.h>
 #endif
 
@@ -73,7 +77,7 @@
 static void scr_insert_text(const char*);
 static void scr_handle_tab(void);
 
-#ifdef HAVE_ASPELL_H
+#if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
 static void spellcheck(char *, char *);
 #endif
 
@@ -120,7 +124,7 @@
 static time_t LastActivity;
 
 static char       inputLine[INPUTLINE_LENGTH+1];
-#ifdef HAVE_ASPELL_H
+#if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
 static char       maskLine[INPUTLINE_LENGTH+1];
 #endif
 static char      *ptr_inputline;
@@ -161,8 +165,14 @@
 inline void scr_UpdateBuddyWindow(void);
 inline void scr_set_chatmode(int enable);
 
-#ifdef HAVE_ASPELL_H
-#define ASPELLBADCHAR 5
+#define SPELLBADCHAR 5
+
+#ifdef WITH_ENCHANT
+EnchantBroker *spell_broker;
+EnchantDict *spell_checker;
+#endif
+
+#ifdef WITH_ASPELL
 AspellConfig *spell_config;
 AspellSpeller *spell_checker;
 #endif
@@ -3580,7 +3590,7 @@
   inputline_offset = c - inputLine;
 }
 
-#ifdef HAVE_ASPELL_H
+#if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
 // prints inputLine with underlined words when misspelled
 static inline void print_checked_line(void)
 {
@@ -3610,8 +3620,8 @@
 
 static inline void refresh_inputline(void)
 {
-#ifdef HAVE_ASPELL_H
-  if (settings_opt_get_int("aspell_enable")) {
+#if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
+  if (settings_opt_get_int("spell_enable")) {
     memset(maskLine, 0, INPUTLINE_LENGTH+1);
     spellcheck(inputLine, maskLine);
   }
@@ -3977,18 +3987,32 @@
   return;
 }
 
-#ifdef HAVE_ASPELL_H
-// Aspell initialization
+#if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
+// initialization
 void spellcheck_init(void)
 {
-  int aspell_enable           = settings_opt_get_int("aspell_enable");
-  const char *aspell_lang     = settings_opt_get("aspell_lang");
-  const char *aspell_encoding = settings_opt_get("aspell_encoding");
+  int spell_enable            = settings_opt_get_int("spell_enable");
+  const char *spell_lang     = settings_opt_get("spell_lang");
+#ifdef WITH_ASPELL
+  const char *spell_encoding = settings_opt_get("spell_encoding");
   AspellCanHaveError *possible_err;
-
-  if (!aspell_enable)
+#endif
+
+  if (!spell_enable)
     return;
 
+#ifdef WITH_ENCHANT
+  if (spell_checker) {
+     enchant_broker_free_dict(spell_broker, spell_checker);
+     enchant_broker_free(spell_broker);
+     spell_checker = NULL;
+     spell_broker = NULL;
+  }
+
+  spell_broker = enchant_broker_init();
+  spell_checker = enchant_broker_request_dict(spell_broker, spell_lang);
+#endif
+#ifdef WITH_ASPELL
   if (spell_checker) {
     delete_aspell_speller(spell_checker);
     delete_aspell_config(spell_config);
@@ -3997,8 +4021,8 @@
   }
 
   spell_config = new_aspell_config();
-  aspell_config_replace(spell_config, "encoding", aspell_encoding);
-  aspell_config_replace(spell_config, "lang", aspell_lang);
+  aspell_config_replace(spell_config, "encoding", spell_encoding);
+  aspell_config_replace(spell_config, "lang", spell_lang);
   possible_err = new_aspell_speller(spell_config);
 
   if (aspell_error_number(possible_err) != 0) {
@@ -4008,23 +4032,37 @@
   } else {
     spell_checker = to_aspell_speller(possible_err);
   }
+#endif
 }
 
-// Deinitialization of Aspell spellchecker
+// Deinitialization of spellchecker
 void spellcheck_deinit(void)
 {
   if (spell_checker) {
+#ifdef WITH_ENCHANT
+    enchant_broker_free_dict(spell_broker, spell_checker);
+#endif
+#ifdef WITH_ASPELL
     delete_aspell_speller(spell_checker);
+#endif
     spell_checker = NULL;
   }
 
+#ifdef WITH_ENCHANT
+  if (spell_broker) {
+    enchant_broker_free(spell_broker);
+    spell_broker = NULL;
+  }
+#endif
+#ifdef WITH_ASPELL
   if (spell_config) {
     delete_aspell_config(spell_config);
     spell_config = NULL;
   }
+#endif
 }
 
-#define aspell_isalpha(c) (utf8_mode ? iswalpha(get_char(c)) : isalpha(*c))
+#define spell_isalpha(c) (utf8_mode ? iswalpha(get_char(c)) : isalpha(*c))
 
 // Spell checking function
 static void spellcheck(char *line, char *checked)
@@ -4038,7 +4076,7 @@
 
   while (*line) {
 
-    if (!aspell_isalpha(line)) {
+    if (!spell_isalpha(line)) {
       line = next_char(line);
       continue;
     }
@@ -4063,12 +4101,18 @@
 
     start = line;
 
-    while (aspell_isalpha(line))
+    while (spell_isalpha(line))
       line = next_char(line);
 
     if (spell_checker &&
-        aspell_speller_check(spell_checker, start, line - start) == 0)
-      memset(&checked[start - line_start], ASPELLBADCHAR, line - start);
+#ifdef WITH_ENCHANT
+        enchant_dict_check(spell_checker, start, line - start) != 0
+#endif
+#ifdef WITH_ASPELL
+        aspell_speller_check(spell_checker, start, line - start) == 0
+#endif
+    )
+      memset(&checked[start - line_start], SPELLBADCHAR, line - start);
   }
 }
 #endif
--- a/mcabber/src/screen.h	Sun Oct 04 18:39:08 2009 +0200
+++ b/mcabber/src/screen.h	Sun Oct 04 19:33:38 2009 +0200
@@ -14,7 +14,7 @@
 # include <panel.h>
 #endif
 
-#ifdef WITH_ASPELL
+#if defined(WITH_ENCHANT) || defined(WITH_ASPELL)
 void spellcheck_init(void);
 void spellcheck_deinit(void);
 //static void spellcheck(char*, char*);