summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDom Lachowicz <domlachowicz@gmail.com>2005-02-10 02:14:24 +0000
committerDom Lachowicz <domlachowicz@gmail.com>2005-02-10 02:14:24 +0000
commit1e81045500f7be961ff5452bd1c19e75f2c3ad51 (patch)
treef4ea577eec30c1385f4495587b7e53e013b5040b
parentd9849af5729c8a75c14e2fa8802acc4fd873df01 (diff)
downloadenchant-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--TODO4
-rw-r--r--src/myspell/myspell_checker.cpp65
2 files changed, 66 insertions, 3 deletions
diff --git a/TODO b/TODO
index 81095d2..f95ffcc 100644
--- a/TODO
+++ b/TODO
@@ -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;
}