diff options
author | Dom Lachowicz <domlachowicz@gmail.com> | 2005-02-10 02:14:24 +0000 |
---|---|---|
committer | Dom Lachowicz <domlachowicz@gmail.com> | 2005-02-10 02:14:24 +0000 |
commit | 1e81045500f7be961ff5452bd1c19e75f2c3ad51 (patch) | |
tree | f4ea577eec30c1385f4495587b7e53e013b5040b | |
parent | d9849af5729c8a75c14e2fa8802acc4fd873df01 (diff) | |
download | enchant-1e81045500f7be961ff5452bd1c19e75f2c3ad51.tar.gz |
myspell dictionary listing
git-svn-id: svn+ssh://svn.abisource.com/svnroot/enchant/trunk@21015 bcba8976-2d24-0410-9c9c-aab3bd5fdfd6
-rw-r--r-- | TODO | 4 | ||||
-rw-r--r-- | src/myspell/myspell_checker.cpp | 65 |
2 files changed, 66 insertions, 3 deletions
@@ -1,3 +1 @@ -myspell dictionary enumaration: use GDir for this -incoming language_LOCALE normalization: strip off .UTF-8 or @euro, etc... -change LGPL exception from "link" to "combine/incorporate" or something. clean up the language. +High-level language tag intelligence: "en_US failed, try en" diff --git a/src/myspell/myspell_checker.cpp b/src/myspell/myspell_checker.cpp index 65bda13..7a01179 100644 --- a/src/myspell/myspell_checker.cpp +++ b/src/myspell/myspell_checker.cpp @@ -286,6 +286,70 @@ myspell_dict_check (EnchantDict * me, const char *const word, size_t len) } static void +myspell_provider_enum_dicts (const char * const directory, + std::vector<std::string> & out_dicts) +{ + GDir * dir = g_dir_open (directory, 0, NULL); + if (dir) { + const char * entry; + + while ((entry = g_dir_read_name (dir)) != NULL) { + char * utf8_entry = g_filename_to_utf8 (entry, -1, NULL, NULL, NULL); + if (utf8_entry) { + std::string dir_entry (utf8_entry); + g_free (utf8_entry); + + int hit = dir_entry.rfind (".dic"); + if (hit != -1) { + out_dicts.push_back (dir_entry.substr (0, hit)); + } + } + } + + g_dir_close (dir); + } +} + +static char ** +myspell_provider_list_dicts (EnchantProvider * me, + size_t * out_n_dicts) +{ + char ** dictionary_list = NULL; + *out_n_dicts = 0; + + std::vector<std::string> dicts; + + char * home_dir = enchant_get_user_home_dir (); + if (home_dir) { + char * private_dir = g_build_filename (home_dir, ".enchant", + "myspell", NULL); + + myspell_provider_enum_dicts (private_dir, dicts); + + g_free (private_dir); + g_free (home_dir); + } + + char * myspell_prefix = myspell_checker_get_prefix (); + if (myspell_prefix) { + myspell_provider_enum_dicts (myspell_prefix, dicts); + g_free (myspell_prefix); + } + + if (dicts.size () > 0) { + dictionary_list = g_new0 (char *, dicts.size() + 1); + + for (int i = 0; i < dicts.size(); i++) { + dictionary_list[i] = g_strdup (dicts[i].c_str()); + } + + *out_n_dicts = dicts.size (); + } + + return dictionary_list; +} + +static void myspell_provider_free_string_list (EnchantProvider * me, char **str_list) { g_strfreev (str_list); @@ -388,6 +452,7 @@ init_enchant_provider (void) provider->identify = myspell_provider_identify; provider->describe = myspell_provider_describe; provider->free_string_list = myspell_provider_free_string_list; + provider->list_dicts = myspell_provider_list_dicts; return provider; } |