From 99d403b2a0c61f5bbe468e2d70de38fac5077dda Mon Sep 17 00:00:00 2001 From: xclaesse Date: Tue, 22 Apr 2008 10:18:04 +0000 Subject: Use enchant instead of aspell. Fixes bug #460624 (Frederic Peters). git-svn-id: svn+ssh://svn.gnome.org/svn/empathy/trunk@1030 4ee84921-47dd-4033-b63a-18d7a039a3e4 --- libempathy-gtk/empathy-spell.c | 138 ++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 72 deletions(-) (limited to 'libempathy-gtk') diff --git a/libempathy-gtk/empathy-spell.c b/libempathy-gtk/empathy-spell.c index db3233294..345dd79ee 100644 --- a/libempathy-gtk/empathy-spell.c +++ b/libempathy-gtk/empathy-spell.c @@ -28,8 +28,8 @@ #include -#ifdef HAVE_ASPELL -#include +#ifdef HAVE_ENCHANT +#include #endif #include @@ -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 @@ spell_notify_languages_cb (EmpathyConf *conf, 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 @@ spell_setup_languages (void) 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->config = enchant_broker_init (); + lang->speller = enchant_broker_request_dict (lang->config, strv[i]); - lang->spell_possible_err = new_aspell_speller (lang->spell_config); - - 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 @@ empathy_spell_get_language_name (const char *code) return dgettext ("iso_639", name); } -GList * -empathy_spell_get_language_codes (void) +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) { - 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; - } + GList **list = user_data; + char *lang = g_strdup(lang_tag); - codes = g_list_append (codes, g_strdup (entry->code)); + if (strchr (lang, '_')) { + /* cut country part out of language */ + strchr (lang, '_')[0] = '\0'; } - delete_aspell_dict_info_enumeration (dels); - delete_aspell_config (config); + 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)); +} + - return codes; +GList * +empathy_spell_get_language_codes (void) +{ + EnchantBroker *broker; + GList *list_langs = NULL; + + broker = enchant_broker_init (); + enchant_broker_list_dicts (broker, enumerate_dicts, &list_langs); + enchant_broker_free (broker); + + return list_langs; } void @@ -302,13 +299,12 @@ empathy_spell_free_language_codes (GList *codes) 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 @@ empathy_spell_check (const gchar *word) } 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 @@ empathy_spell_get_suggestions (const gchar *word) 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 @@ empathy_spell_supported (void) return TRUE; } -#else /* not HAVE_ASPELL */ +#else /* not HAVE_ENCHANT */ gboolean empathy_spell_supported (void) @@ -439,7 +433,7 @@ empathy_spell_free_language_codes (GList *codes) { } -#endif /* HAVE_ASPELL */ +#endif /* HAVE_ENCHANT */ void -- cgit v1.2.3