diff options
Diffstat (limited to 'src/plugins/aspell')
-rw-r--r-- | src/plugins/aspell/CMakeLists.txt | 14 | ||||
-rw-r--r-- | src/plugins/aspell/Makefile.am | 4 | ||||
-rw-r--r-- | src/plugins/aspell/weechat-aspell-command.c | 110 | ||||
-rw-r--r-- | src/plugins/aspell/weechat-aspell-completion.c | 30 | ||||
-rw-r--r-- | src/plugins/aspell/weechat-aspell-speller.c | 54 | ||||
-rw-r--r-- | src/plugins/aspell/weechat-aspell-speller.h | 10 | ||||
-rw-r--r-- | src/plugins/aspell/weechat-aspell.c | 57 | ||||
-rw-r--r-- | src/plugins/aspell/weechat-aspell.h | 8 |
8 files changed, 266 insertions, 21 deletions
diff --git a/src/plugins/aspell/CMakeLists.txt b/src/plugins/aspell/CMakeLists.txt index eadb701e1..d81163de7 100644 --- a/src/plugins/aspell/CMakeLists.txt +++ b/src/plugins/aspell/CMakeLists.txt @@ -28,9 +28,15 @@ weechat-aspell-info.c weechat-aspell-info.h weechat-aspell-speller.c weechat-aspell-speller.h) SET_TARGET_PROPERTIES(aspell PROPERTIES PREFIX "") -IF(ASPELL_FOUND) - INCLUDE_DIRECTORIES(${ASPELL_INCLUDE_PATH}) - TARGET_LINK_LIBRARIES(aspell ${ASPELL_LIBRARY}) -ENDIF(ASPELL_FOUND) +IF(ENCHANT_FOUND) + INCLUDE_DIRECTORIES(${ENCHANT_INCLUDE_DIR}) + TARGET_LINK_LIBRARIES(aspell ${ENCHANT_LIBRARIES}) + ADD_DEFINITIONS(-DUSE_ENCHANT) +ELSE(ENCHANT_FOUND) + IF(ASPELL_FOUND) + INCLUDE_DIRECTORIES(${ASPELL_INCLUDE_PATH}) + TARGET_LINK_LIBRARIES(aspell ${ASPELL_LIBRARY}) + ENDIF(ASPELL_FOUND) +ENDIF(ENCHANT_FOUND) INSTALL(TARGETS aspell LIBRARY DESTINATION ${LIBDIR}/plugins) diff --git a/src/plugins/aspell/Makefile.am b/src/plugins/aspell/Makefile.am index c101d05a0..218856c5a 100644 --- a/src/plugins/aspell/Makefile.am +++ b/src/plugins/aspell/Makefile.am @@ -18,7 +18,7 @@ # along with WeeChat. If not, see <http://www.gnu.org/licenses/>. # -INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\" $(ASPELL_CFLAGS) +INCLUDES = -DLOCALEDIR=\"$(datadir)/locale\" $(ASPELL_CFLAGS) $(ENCHANT_CFLAGS) libdir = ${weechat_libdir}/plugins @@ -39,6 +39,6 @@ aspell_la_SOURCES = weechat-aspell.c \ weechat-aspell-speller.c \ weechat-aspell-speller.h aspell_la_LDFLAGS = -module -aspell_la_LIBADD = $(ASPELL_LFLAGS) +aspell_la_LIBADD = $(ASPELL_LFLAGS) $(ENCHANT_LIBS) EXTRA_DIST = CMakeLists.txt diff --git a/src/plugins/aspell/weechat-aspell-command.c b/src/plugins/aspell/weechat-aspell-command.c index 9ef908776..ef35d9fa4 100644 --- a/src/plugins/aspell/weechat-aspell-command.c +++ b/src/plugins/aspell/weechat-aspell-command.c @@ -72,22 +72,81 @@ weechat_aspell_command_iso_to_country (const char *code) } /* + * Displays one dictionary when using enchant. + */ + +#ifdef USE_ENCHANT +void +weechat_aspell_enchant_dict_describe_cb (const char *lang_tag, + const char *provider_name, + const char *provider_desc, + const char *provider_file, + void *user_data) +{ + char *country, *lang, *pos, *iso; + char str_dict[256]; + + /* make C compiler happy */ + (void) provider_name; + (void) provider_desc; + (void) provider_file; + (void) user_data; + + lang = NULL; + country = NULL; + + pos = strchr (lang_tag, '_'); + + if (pos) + { + iso = weechat_strndup (lang_tag, pos - lang_tag); + if (iso) + { + lang = weechat_aspell_command_iso_to_lang (iso); + country = weechat_aspell_command_iso_to_country (pos + 1); + free (iso); + } + } + else + lang = weechat_aspell_command_iso_to_lang ((char *)lang_tag); + + if (lang) + { + if (country) + { + snprintf (str_dict, sizeof (str_dict), "%-22s %s (%s)", + lang_tag, lang, country); + } + else + { + snprintf (str_dict, sizeof (str_dict), "%-22s %s", + lang_tag, lang); + } + weechat_printf (NULL, " %s", str_dict); + } + + if (lang) + free (lang); + if (country) + free (country); +} +#endif + +/* * Displays list of aspell dictionaries installed on system. */ void weechat_aspell_command_speller_list_dicts () { - char *country, *lang, *pos; +#ifndef USE_ENCHANT + char *country, *lang, *pos, *iso; char str_dict[256], str_country[128]; struct AspellConfig *config; AspellDictInfoList *list; AspellDictInfoEnumeration *elements; const AspellDictInfo *dict; - - config = new_aspell_config(); - list = get_aspell_dict_info_list (config); - elements = aspell_dict_info_list_elements (list); +#endif weechat_printf (NULL, ""); weechat_printf (NULL, @@ -95,6 +154,14 @@ weechat_aspell_command_speller_list_dicts () _( "%s dictionaries list:"), ASPELL_PLUGIN_NAME); +#ifdef USE_ENCHANT + enchant_broker_list_dicts (broker, weechat_aspell_enchant_dict_describe_cb, + NULL); +#else + config = new_aspell_config(); + list = get_aspell_dict_info_list (config); + elements = aspell_dict_info_list_elements (list); + while ((dict = aspell_dict_info_enumeration_next (elements)) != NULL) { country = NULL; @@ -102,10 +169,13 @@ weechat_aspell_command_speller_list_dicts () if (pos) { - pos[0] = '\0'; - lang = weechat_aspell_command_iso_to_lang ((char*)dict->code); - pos[0] = '_'; - country = weechat_aspell_command_iso_to_country (pos + 1); + iso = weechat_strndup (dict->code, pos - dict->code); + if (iso) + { + lang = weechat_aspell_command_iso_to_lang (iso); + country = weechat_aspell_command_iso_to_country (pos + 1); + free (iso); + } } else lang = weechat_aspell_command_iso_to_lang ((char*)dict->code); @@ -132,6 +202,7 @@ weechat_aspell_command_speller_list_dicts () delete_aspell_dict_info_enumeration (elements); delete_aspell_config (config); +#endif } /* @@ -169,7 +240,11 @@ weechat_aspell_command_add_word (struct t_gui_buffer *buffer, const char *dict, const char *word) { struct t_aspell_speller_buffer *ptr_speller_buffer; +#ifdef USE_ENCHANT + EnchantDict *new_speller, *ptr_speller; +#else AspellSpeller *new_speller, *ptr_speller; +#endif new_speller = NULL; @@ -221,6 +296,9 @@ weechat_aspell_command_add_word (struct t_gui_buffer *buffer, const char *dict, ptr_speller = ptr_speller_buffer->spellers[0]; } +#ifdef USE_ENCHANT + enchant_dict_add (ptr_speller, word, strlen (word)); +#else if (aspell_speller_add_to_personal (ptr_speller, word, strlen (word)) == 1) @@ -231,6 +309,7 @@ weechat_aspell_command_add_word (struct t_gui_buffer *buffer, const char *dict, } else goto error; +#endif goto end; @@ -265,9 +344,16 @@ weechat_aspell_command_cb (void *data, struct t_gui_buffer *buffer, { /* display aspell status */ weechat_printf (NULL, ""); - weechat_printf (NULL, "%s", - (aspell_enabled) ? - _("Aspell is enabled") : _("Aspell is disabled")); + weechat_printf (NULL, + /* TRANSLATORS: second "%s" is "aspell" or "enchant" */ + _("%s (using %s)"), + (aspell_enabled) ? _("Spell checking is enabled") : _("Spell checking is disabled"), +#ifdef USE_ENCHANT + "enchant" +#else + "aspell" +#endif + ); default_dict = weechat_config_string (weechat_aspell_config_check_default_dict); weechat_printf (NULL, _("Default dictionary: %s"), diff --git a/src/plugins/aspell/weechat-aspell-completion.c b/src/plugins/aspell/weechat-aspell-completion.c index 36ccf24f6..8de810667 100644 --- a/src/plugins/aspell/weechat-aspell-completion.c +++ b/src/plugins/aspell/weechat-aspell-completion.c @@ -55,6 +55,28 @@ weechat_aspell_completion_langs_cb (void *data, const char *completion_item, } /* + * Adds a dictionary to completion when using enchant. + */ + +#ifdef USE_ENCHANT +void +weechat_aspell_completion_enchant_add_dict_cb (const char *lang_tag, + const char *provider_name, + const char *provider_desc, + const char *provider_file, + void *user_data) +{ + /* make C compiler happy */ + (void) provider_name; + (void) provider_desc; + (void) provider_file; + + weechat_hook_completion_list_add ((struct t_gui_completion *)user_data, + lang_tag, 0, WEECHAT_LIST_POS_SORT); +} +#endif + +/* * Adds aspell dictionaries (only installed dictionaries) to completion list. */ @@ -64,16 +86,23 @@ weechat_aspell_completion_dicts_cb (void *data, struct t_gui_buffer *buffer, struct t_gui_completion *completion) { +#ifndef USE_ENCHANT struct AspellConfig *config; AspellDictInfoList *list; AspellDictInfoEnumeration *elements; const AspellDictInfo *dict; +#endif /* make C compiler happy */ (void) data; (void) completion_item; (void) buffer; +#ifdef USE_ENCHANT + enchant_broker_list_dicts (broker, + weechat_aspell_completion_enchant_add_dict_cb, + completion); +#else config = new_aspell_config (); list = get_aspell_dict_info_list (config); elements = aspell_dict_info_list_elements (list); @@ -86,6 +115,7 @@ weechat_aspell_completion_dicts_cb (void *data, delete_aspell_dict_info_enumeration (elements); delete_aspell_config (config); +#endif return WEECHAT_RC_OK; } diff --git a/src/plugins/aspell/weechat-aspell-speller.c b/src/plugins/aspell/weechat-aspell-speller.c index 0b674b4b8..5578e49c9 100644 --- a/src/plugins/aspell/weechat-aspell-speller.c +++ b/src/plugins/aspell/weechat-aspell-speller.c @@ -53,6 +53,9 @@ struct t_hashtable *weechat_aspell_speller_buffer = NULL; int weechat_aspell_speller_dict_supported (const char *lang) { +#ifdef USE_ENCHANT + return enchant_broker_dict_exists (broker, lang); +#else struct AspellConfig *config; AspellDictInfoList *list; AspellDictInfoEnumeration *elements; @@ -78,6 +81,7 @@ weechat_aspell_speller_dict_supported (const char *lang) delete_aspell_config (config); return rc; +#endif } /* @@ -119,12 +123,20 @@ weechat_aspell_speller_check_dictionaries (const char *dict_list) * Returns pointer to new aspell speller, NULL if error. */ +#ifdef USE_ENCHANT +EnchantDict * +#else AspellSpeller * +#endif weechat_aspell_speller_new (const char *lang) { +#ifdef USE_ENCHANT + EnchantDict *new_speller; +#else AspellConfig *config; AspellCanHaveError *ret; AspellSpeller *new_speller; +#endif struct t_infolist *infolist; if (!lang) @@ -137,23 +149,40 @@ weechat_aspell_speller_new (const char *lang) ASPELL_PLUGIN_NAME, lang); } +#ifdef USE_ENCHANT + new_speller = enchant_broker_request_dict (broker, lang); + if (!new_speller) + { + weechat_printf (NULL, + _("%s%s: error: unable to create speller for lang \"%s\""), + weechat_prefix ("error"), ASPELL_PLUGIN_NAME, + lang); + return NULL; + } +#else /* create a speller instance for the newly created cell */ config = new_aspell_config(); aspell_config_replace (config, "lang", lang); +#endif - /* apply all options on speller */ + /* apply all options */ infolist = weechat_infolist_get ("option", NULL, "aspell.option.*"); if (infolist) { while (weechat_infolist_next (infolist)) { +#ifdef USE_ENCHANT + /* TODO: set option with enchant */ +#else aspell_config_replace (config, weechat_infolist_string (infolist, "option_name"), weechat_infolist_string (infolist, "value")); +#endif } weechat_infolist_free (infolist); } +#ifndef USE_ENCHANT ret = new_aspell_speller (config); if (aspell_error (ret) != 0) @@ -168,10 +197,14 @@ weechat_aspell_speller_new (const char *lang) } new_speller = to_aspell_speller (ret); +#endif + weechat_hashtable_set (weechat_aspell_spellers, lang, new_speller); +#ifndef USE_ENCHANT /* free configuration */ delete_aspell_config (config); +#endif return new_speller; } @@ -277,7 +310,11 @@ void weechat_aspell_speller_free_value_cb (struct t_hashtable *hashtable, const void *key, void *value) { +#ifdef USE_ENCHANT + EnchantDict *ptr_speller; +#else AspellSpeller *ptr_speller; +#endif /* make C compiler happy */ (void) hashtable; @@ -289,10 +326,15 @@ weechat_aspell_speller_free_value_cb (struct t_hashtable *hashtable, ASPELL_PLUGIN_NAME, (const char *)key); } - /* free aspell data */ + /* free speller */ +#ifdef USE_ENCHANT + ptr_speller = (EnchantDict *)value; + enchant_broker_free_dict (broker, ptr_speller); +#else ptr_speller = (AspellSpeller *)value; aspell_speller_save_all_word_lists (ptr_speller); delete_aspell_speller (ptr_speller); +#endif } /* @@ -307,7 +349,11 @@ weechat_aspell_speller_buffer_new (struct t_gui_buffer *buffer) char **dicts; int num_dicts, i; struct t_aspell_speller_buffer *new_speller_buffer; +#ifdef USE_ENCHANT + EnchantDict *ptr_speller; +#else AspellSpeller *ptr_speller; +#endif if (!buffer) return NULL; @@ -330,7 +376,11 @@ weechat_aspell_speller_buffer_new (struct t_gui_buffer *buffer) if (dicts && (num_dicts > 0)) { new_speller_buffer->spellers = +#ifdef USE_ENCHANT + malloc ((num_dicts + 1) * sizeof (EnchantDict *)); +#else malloc ((num_dicts + 1) * sizeof (AspellSpeller *)); +#endif if (new_speller_buffer->spellers) { for (i = 0; i < num_dicts; i++) diff --git a/src/plugins/aspell/weechat-aspell-speller.h b/src/plugins/aspell/weechat-aspell-speller.h index 15c67564a..6eb57e88e 100644 --- a/src/plugins/aspell/weechat-aspell-speller.h +++ b/src/plugins/aspell/weechat-aspell-speller.h @@ -23,7 +23,11 @@ struct t_aspell_speller_buffer { - AspellSpeller **spellers; /* pointer to spellers for buf. */ +#ifdef USE_ENCHANT + EnchantDict **spellers; /* enchant spellers for buffer */ +#else + AspellSpeller **spellers; /* aspell spellers for buffer */ +#endif char *modifier_string; /* last modifier string */ int input_pos; /* position of cursor in input */ char *modifier_result; /* last modifier result */ @@ -34,7 +38,11 @@ extern struct t_hashtable *weechat_aspell_speller_buffer; extern int weechat_aspell_speller_dict_supported (const char *lang); extern void weechat_aspell_speller_check_dictionaries (const char *dict_list); +#ifdef USE_ENCHANT +extern EnchantDict *weechat_aspell_speller_new (const char *lang); +#else extern AspellSpeller *weechat_aspell_speller_new (const char *lang); +#endif extern void weechat_aspell_speller_remove_unused (); extern struct t_aspell_speller_buffer *weechat_aspell_speller_buffer_new (struct t_gui_buffer *buffer); extern int weechat_aspell_speller_init (); diff --git a/src/plugins/aspell/weechat-aspell.c b/src/plugins/aspell/weechat-aspell.c index b2f6ca839..5e8d2fa62 100644 --- a/src/plugins/aspell/weechat-aspell.c +++ b/src/plugins/aspell/weechat-aspell.c @@ -47,6 +47,10 @@ struct t_weechat_plugin *weechat_aspell_plugin = NULL; int aspell_enabled = 0; +#ifdef USE_ENCHANT +EnchantBroker *broker = NULL; +#endif + /* * aspell supported languages, updated on 2012-07-05 * URL: ftp://ftp.gnu.org/gnu/aspell/dict/0index.html @@ -410,7 +414,11 @@ weechat_aspell_check_word (struct t_gui_buffer *buffer, { for (i = 0; speller_buffer->spellers[i]; i++) { +#ifdef USE_ENCHANT + if (enchant_dict_check (speller_buffer->spellers[i], word, strlen (word)) == 0) +#else if (aspell_speller_check (speller_buffer->spellers[i], word, -1) == 1) +#endif return 1; } } @@ -434,8 +442,13 @@ weechat_aspell_get_suggestions (struct t_aspell_speller_buffer *speller_buffer, int i, size, max_suggestions, num_suggestions; char *suggestions, *suggestions2; const char *ptr_word; +#ifdef USE_ENCHANT + char **elements; + size_t num_elements; +#else const AspellWordList *list; AspellStringEnumeration *elements; +#endif max_suggestions = weechat_config_integer (weechat_aspell_config_check_suggestions); if (max_suggestions < 0) @@ -451,6 +464,37 @@ weechat_aspell_get_suggestions (struct t_aspell_speller_buffer *speller_buffer, { for (i = 0; speller_buffer->spellers[i]; i++) { +#ifdef USE_ENCHANT + elements = enchant_dict_suggest (speller_buffer->spellers[i], word, + -1, &num_elements); + if (elements) + { + if (num_elements > 0) + { + num_suggestions = 0; + while ((ptr_word = elements[num_suggestions]) != NULL) + { + size += strlen (ptr_word) + ((suggestions[0]) ? 1 : 0); + suggestions2 = realloc (suggestions, size); + if (!suggestions2) + { + free (suggestions); + enchant_dict_free_string_list (speller_buffer->spellers[i], + elements); + return NULL; + } + suggestions = suggestions2; + if (suggestions[0]) + strcat (suggestions, (num_suggestions == 0) ? "/" : ","); + strcat (suggestions, ptr_word); + num_suggestions++; + if ((max_suggestions >= 0) && (num_suggestions == max_suggestions)) + break; + } + } + enchant_dict_free_string_list (speller_buffer->spellers[i], elements); + } +#else list = aspell_speller_suggest (speller_buffer->spellers[i], word, -1); if (list) { @@ -476,6 +520,7 @@ weechat_aspell_get_suggestions (struct t_aspell_speller_buffer *speller_buffer, } delete_aspell_string_enumeration (elements); } +#endif } } @@ -876,6 +921,13 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) weechat_plugin = plugin; +#ifdef USE_ENCHANT + /* acquire enchant broker */ + broker = enchant_broker_init (); + if (!broker) + return WEECHAT_RC_ERROR; +#endif + if (!weechat_aspell_speller_init ()) return WEECHAT_RC_ERROR; @@ -926,5 +978,10 @@ weechat_plugin_end (struct t_weechat_plugin *plugin) weechat_aspell_speller_end (); +#ifdef USE_ENCHANT + /* release enchant broker */ + enchant_broker_free (broker); +#endif + return WEECHAT_RC_OK; } diff --git a/src/plugins/aspell/weechat-aspell.h b/src/plugins/aspell/weechat-aspell.h index 7f26608fd..8d0935b28 100644 --- a/src/plugins/aspell/weechat-aspell.h +++ b/src/plugins/aspell/weechat-aspell.h @@ -21,7 +21,11 @@ #ifndef __WEECHAT_ASPELL_H #define __WEECHAT_ASPELL_H 1 +#ifdef USE_ENCHANT +#include <enchant.h> +#else #include <aspell.h> +#endif #define weechat_plugin weechat_aspell_plugin #define ASPELL_PLUGIN_NAME "aspell" @@ -32,6 +36,10 @@ struct t_aspell_code char *name; }; +#ifdef USE_ENCHANT +extern EnchantBroker *broker; +#endif + extern struct t_weechat_plugin *weechat_aspell_plugin; extern int aspell_enabled; extern struct t_aspell_code aspell_langs[]; |