empathy r1030 - in trunk: . libempathy-gtk



Author: xclaesse
Date: Tue Apr 22 10:18:04 2008
New Revision: 1030
URL: http://svn.gnome.org/viewvc/empathy?rev=1030&view=rev

Log:
Use enchant instead of aspell. Fixes bug #460624 (Frederic Peters).


Modified:
   trunk/configure.ac
   trunk/libempathy-gtk/empathy-spell.c

Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac	(original)
+++ trunk/configure.ac	Tue Apr 22 10:18:04 2008
@@ -111,52 +111,62 @@
 
 AM_GLIB_GNU_GETTEXT
 
-# -----------------------------------------------------------
-# ISO codes, used for aspell support
-# -----------------------------------------------------------
-AC_MSG_CHECKING([whether iso-codes exists and has iso-639 domain])
-if $PKG_CONFIG --variable=domains iso-codes | grep -q 639 ; then
-   AC_MSG_RESULT([yes])
-   iso_codes_prefix=`$PKG_CONFIG --variable=prefix iso-codes`
-   iso_codes_pkgconfig=iso-codes
-   have_iso_codes=yes
-else
-   AC_MSG_RESULT([no])
-   iso_codes_prefix=
-   iso_codes_pkgconfig=
-   have_iso_codes=no
-fi
-
-AC_DEFINE_UNQUOTED([ISO_CODES_PREFIX],["$iso_codes_prefix"],[ISO codes prefix])
-
-# -----------------------------------------------------------
-# ASpell
-# -----------------------------------------------------------
-AC_ARG_ENABLE(aspell,
-              AS_HELP_STRING([--enable-aspell=@<:@no/yes/auto@:>@],
-                             [compile with aspell support]), ,
-                             enable_aspell=auto)
-
-if test "x$enable_aspell" = "xyes" -a "x$have_iso_codes" != "xyes"; then
-   AC_MSG_ERROR([You must have iso-codes with the iso-639 domain to use aspell.])
-fi
-
-if test "x$enable_aspell" != "xno" -a "x$have_iso_codes" = "xyes"; then
-   AC_CHECK_LIB(aspell, aspell_speller_check,have_aspell=yes,have_aspell=no,)
-
-   if test "x$have_aspell" = "xyes"; then
-      AC_DEFINE(HAVE_ASPELL, 1, [Define if we have aspell])
-      EMPATHY_LIBS="$EMPATHY_LIBS -laspell"
-   else
-      have_aspell=no
-   fi
-else
-   have_aspell=no
+dnl ================================================================
+dnl spellchecking checks: enchant and iso-codes
+dnl ================================================================
+
+ENCHANT_REQUIRED=1.2.0
+ISO_CODES_REQUIRED=0.35
+
+AC_ARG_ENABLE([spell],
+	AS_HELP_STRING([--disable-spell],[Disable spell checking (default: enabled)]),
+	[enable_enchant=$enableval],
+	[enable_enchant=yes])
+
+if test "x$enable_enchant" = "xyes" ; then
+
+	PKG_CHECK_MODULES(ENCHANT, enchant >= $ENCHANT_REQUIRED, \
+			  have_enchant=yes, have_enchant=no)
+
+	if test "x$have_enchant" = "xyes"; then
+
+		PKG_CHECK_EXISTS([iso-codes >= $ISO_CODES_REQUIRED],
+				 [have_iso_codes=yes],[have_iso_codes=no])
+
+		if test "x$have_iso_codes" = "xyes"; then
+			AC_MSG_CHECKING([whether iso-codes has iso-639 and iso-3166 domains])
+			if $PKG_CONFIG --variable=domains iso-codes | grep 639 > /dev/null && \
+			   $PKG_CONFIG --variable=domains iso-codes | grep 3166 > /dev/null ; then
+				result=yes
+			else
+				result=no
+				have_iso_codes=no
+			fi
+			AC_MSG_RESULT([$result])
+		fi
+
+		if test "x$have_iso_codes" = "xyes"; then
+			AC_DEFINE_UNQUOTED([ISO_CODES_PREFIX],["`$PKG_CONFIG --variable=prefix iso-codes`"],[ISO codes prefix])
+			AC_DEFINE([HAVE_ISO_CODES],[1],[Define if you have the iso-codes package])
+		else
+			AC_MSG_ERROR([iso-codes is required for spellchecking. Use --disable-spell to build without spellchecking support.])
+		fi
+
+		enable_enchant=yes
+		ENCHANT_CFLAGS="${ENCHANT_CFLAGS}"
+		ENCHANT_LIBS="${ENCHANT_LIBS}"
+		AC_DEFINE([HAVE_ENCHANT],[1],[Define if you have libenchant])
+	else
+		AC_MSG_ERROR([Enchant library not found or too old. Use --disable-spell to build without spellchecking support.])
+	fi
+else
+	enable_enchant=no
+	ENCHANT_CFLAGS=
+	ENCHANT_LIBS=
 fi
 
-if test "x$enable_aspell" = "xyes" -a "x$have_aspell" != "xyes"; then
-   AC_MSG_ERROR([Couldn't find aspell.])
-fi
+AC_SUBST(ENCHANT_CFLAGS)
+AC_SUBST(ENCHANT_LIBS)
 
 
 # -----------------------------------------------------------

Modified: trunk/libempathy-gtk/empathy-spell.c
==============================================================================
--- trunk/libempathy-gtk/empathy-spell.c	(original)
+++ trunk/libempathy-gtk/empathy-spell.c	Tue Apr 22 10:18:04 2008
@@ -28,8 +28,8 @@
 
 #include <glib/gi18n.h>
 
-#ifdef HAVE_ASPELL
-#include <aspell.h>
+#ifdef HAVE_ENCHANT
+#include <enchant.h>
 #endif
 
 #include <libempathy/empathy-debug.h>
@@ -39,16 +39,11 @@
 
 #define DEBUG_DOMAIN "Spell"
 
-#ifdef HAVE_ASPELL
-
-/* Note: We could use aspell_reset_cache (NULL); periodically if we wanted
- * to...
- */
+#ifdef HAVE_ENCHANT
 
 typedef struct {
-	AspellConfig       *spell_config;
-	AspellCanHaveError *spell_possible_err;
-	AspellSpeller      *spell_checker;
+	EnchantBroker *config;
+	EnchantDict   *speller;
 } SpellLanguage;
 
 #define ISO_CODES_DATADIR    ISO_CODES_PREFIX "/share/xml/iso-codes"
@@ -179,9 +174,9 @@
 
 		lang = l->data;
 
-		delete_aspell_config (lang->spell_config);
-		delete_aspell_speller (lang->spell_checker);
-
+		enchant_broker_free_dict (lang->config, lang->speller);
+		enchant_broker_free (lang->config);
+		
 		g_slice_free (SpellLanguage, lang);
 	}
 
@@ -222,20 +217,11 @@
 
 			lang = g_slice_new0 (SpellLanguage);
 
-			lang->spell_config = new_aspell_config();
-
-			aspell_config_replace (lang->spell_config, "encoding", "utf-8");
-			aspell_config_replace (lang->spell_config, "lang", strv[i++]);
-
-			lang->spell_possible_err = new_aspell_speller (lang->spell_config);
+			lang->config = enchant_broker_init ();
+			lang->speller = enchant_broker_request_dict (lang->config, strv[i]);
 
-			if (aspell_error_number (lang->spell_possible_err) == 0) {
-				lang->spell_checker = to_aspell_speller (lang->spell_possible_err);
-				languages = g_list_append (languages, lang);
-			} else {
-				delete_aspell_config (lang->spell_config);
-				g_slice_free (SpellLanguage, lang);
-			}
+			languages = g_list_append (languages, lang);
+			i++;
 		}
 
 		if (strv) {
@@ -265,31 +251,42 @@
 	return dgettext ("iso_639", name);
 }
 
+static void
+enumerate_dicts (const char * const lang_tag,
+                 const char * const provider_name,
+                 const char * const provider_desc,
+                 const char * const provider_file,
+		 void * user_data)
+{
+	GList **list = user_data;
+	char *lang = g_strdup(lang_tag);
+
+	if (strchr (lang, '_')) {
+		/* cut country part out of language */
+		strchr (lang, '_')[0] = '\0';
+	}
+
+	if (g_list_find_custom (*list, lang, (GCompareFunc) strcmp)) {
+		/* this language is already part of the list */
+		g_free (lang);
+		return;
+	}
+
+	*list = g_list_append (*list, g_strdup(lang));
+}
+
+
 GList *
 empathy_spell_get_language_codes (void)
 {
-	AspellConfig              *config;
-	AspellDictInfoList        *dlist;
-	AspellDictInfoEnumeration *dels;
-	const AspellDictInfo      *entry;
-	GList                     *codes = NULL;
-
-	config = new_aspell_config ();
-	dlist = get_aspell_dict_info_list (config);
-	dels = aspell_dict_info_list_elements (dlist);
-
-	while ((entry = aspell_dict_info_enumeration_next (dels)) != 0) {
-		if (g_list_find_custom (codes, entry->code, (GCompareFunc) strcmp)) {
-			continue;
-		}
+	EnchantBroker *broker;
+	GList         *list_langs = NULL;
 
-		codes = g_list_append (codes, g_strdup (entry->code));
-	}
-
-	delete_aspell_dict_info_enumeration (dels);
-	delete_aspell_config (config);
+	broker = enchant_broker_init ();
+	enchant_broker_list_dicts (broker, enumerate_dicts, &list_langs);
+	enchant_broker_free (broker);
 
-	return codes;
+	return list_langs;
 }
 
 void
@@ -302,13 +299,12 @@
 gboolean
 empathy_spell_check (const gchar *word)
 {
-	GList       *l;
-	gint         n_langs;
-	gboolean     correct = FALSE;
-	gint         len;
+	int          enchant_result = 1;
 	const gchar *p;
-	gunichar     c;
 	gboolean     digit;
+	gunichar     c;
+	gint         len;
+	GList       *l;
 
 	g_return_val_if_fail (word != NULL, FALSE);
 
@@ -332,30 +328,27 @@
 	}
 
 	len = strlen (word);
-	n_langs = g_list_length (languages);
 	for (l = languages; l; l = l->next) {
-		SpellLanguage *lang;
+		SpellLanguage  *lang;
 
 		lang = l->data;
 
-		correct = aspell_speller_check (lang->spell_checker, word, len);
-		if (n_langs > 1 && correct) {
+		enchant_result = enchant_dict_check (lang->speller, word, len);
+
+		if (enchant_result == 0) {
 			break;
 		}
 	}
 
-	return correct;
+	return (enchant_result == 0);
 }
 
 GList *
 empathy_spell_get_suggestions (const gchar *word)
 {
-	GList                   *l1;
-	GList                   *l2 = NULL;
-	const AspellWordList    *suggestions;
-	AspellStringEnumeration *elements;
-	const char              *next;
 	gint                     len;
+	GList *l1;
+	GList *suggestion_list = NULL;
 
 	g_return_val_if_fail (word != NULL, NULL);
 
@@ -365,22 +358,23 @@
 
 	for (l1 = languages; l1; l1 = l1->next) {
 		SpellLanguage *lang;
+		char    **suggestions;
+		size_t    i, number_of_suggestions;
 
 		lang = l1->data;
 
-		suggestions = aspell_speller_suggest (lang->spell_checker,
-						      word, len);
-
-		elements = aspell_word_list_elements (suggestions);
-
-		while ((next = aspell_string_enumeration_next (elements))) {
-			l2 = g_list_append (l2, g_strdup (next));
+		suggestions = enchant_dict_suggest (lang->speller, word, len,
+				&number_of_suggestions);
+		
+		for (i = 0; i < number_of_suggestions; i++) {
+			suggestion_list = g_list_append (suggestion_list,
+							 g_strdup(suggestions[i]));
 		}
 
-		delete_aspell_string_enumeration (elements);
+		enchant_dict_free_string_list (lang->speller, suggestions);
 	}
 
-	return l2;
+	return suggestion_list;
 }
 
 gboolean
@@ -394,7 +388,7 @@
 	return TRUE;
 }
 
-#else /* not HAVE_ASPELL */
+#else /* not HAVE_ENCHANT */
 
 gboolean
 empathy_spell_supported (void)
@@ -439,7 +433,7 @@
 {
 }
 
-#endif /* HAVE_ASPELL */
+#endif /* HAVE_ENCHANT */
 
 
 void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]