X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FHunspellChecker.cpp;h=30d799a7f2243ad9d6a26b5cd01f358202d87d6d;hb=acc5af9912533261c37795971af269f77317f14f;hp=f024f2ec0268d15382a6d098714ef96044739e81;hpb=21daab357bcff2bf26d63cb59df69f6afa2acf3f;p=lyx.git diff --git a/src/HunspellChecker.cpp b/src/HunspellChecker.cpp index f024f2ec02..30d799a7f2 100644 --- a/src/HunspellChecker.cpp +++ b/src/HunspellChecker.cpp @@ -15,11 +15,15 @@ #include "LyXRC.h" #include "WordLangTuple.h" +#include "frontends/alert.h" + #include "support/debug.h" #include "support/docstring_list.h" +#include "support/filetools.h" #include "support/FileName.h" #include "support/gettext.h" #include "support/lassert.h" +#include "support/lstrings.h" #include "support/os.h" #include @@ -64,28 +68,59 @@ HunspellChecker::Private::~Private() } -Hunspell * HunspellChecker::Private::addSpeller(string const & lang) +namespace { +bool haveLanguageFiles(string const & hpath) { - string hunspell_path = external_path(lyxrc.hunspelldir_path); - LYXERR(Debug::FILES, "hunspell path: " << hunspell_path); - if (hunspell_path.empty()) - return false; - - hunspell_path += "/" + lang; - // replace '_' with '-' as this is the convention used by hunspell. - hunspell_path[hunspell_path.size() - 3] = '-'; - FileName const affix(hunspell_path + ".aff"); - FileName const dict(hunspell_path + ".dic"); + FileName const affix(hpath + ".aff"); + FileName const dict(hpath + ".dic"); if (!affix.isReadableFile()) { // FIXME: We should indicate somehow that this language is not // supported. LYXERR(Debug::FILES, "Hunspell affix file " << affix << " does not exist"); - return 0; + return false; } if (!dict.isReadableFile()) { LYXERR(Debug::FILES, "Hunspell dictionary file " << dict << " does not exist"); + return false; + } + return true; +} +} + + +Hunspell * HunspellChecker::Private::addSpeller(string const & lang) +{ + string hunspell_path = lyxrc.hunspelldir_path; + LYXERR(Debug::FILES, "hunspell path: " << external_path(hunspell_path)); + if (hunspell_path.empty()) { + // FIXME We'd like to issue a better error message here, but there seems + // to be a problem about thread safety, or something of the sort. If + // we issue the message using frontend::Alert, then the code comes + // back through here while the box is waiting, and causes some kind + // of crash. + static bool warned = false; + if (!warned) { + warned = true; + LYXERR0("Hunspell path not set."); + //frontend::Alert::error(_("Hunspell Path Not Found"), + // _("You must set the Hunspell dictionary path in Tools>Preferences>Paths.")); + } return 0; } + + hunspell_path = external_path(addName(hunspell_path, lang)); + if (!haveLanguageFiles(hunspell_path)) { + // try with '_' replaced by '-' + hunspell_path = subst(hunspell_path, '_', '-'); + if (!haveLanguageFiles(hunspell_path)) { + // FIXME: We should indicate somehow that this language is not + // supported, probably by popping a warning. But we'll need to + // remember which warnings we've issued. + return 0; + } + } + FileName const affix(hunspell_path + ".aff"); + FileName const dict(hunspell_path + ".dic"); Hunspell * h = new Hunspell(affix.absFilename().c_str(), dict.absFilename().c_str()); spellers_[lang] = h; return h; @@ -146,7 +181,7 @@ void HunspellChecker::insert(WordLangTuple const & wl) } -void HunspellChecker::accept(WordLangTuple const & word) +void HunspellChecker::accept(WordLangTuple const &) { // FIXME: not implemented! } @@ -160,15 +195,13 @@ void HunspellChecker::suggest(WordLangTuple const & wl, Hunspell * h = d->speller(wl.lang_code()); if (!h) return; - char *** suggestion_list = 0; - - // FIXME: Hunspell::suggest() crashes on Win/MSVC9 - return; - - int const suggestion_number = h->suggest(suggestion_list, word_to_check.c_str()); - if (suggestion_number == 0) + char ** suggestion_list; + int const suggestion_number = h->suggest(&suggestion_list, word_to_check.c_str()); + if (suggestion_number <= 0) return; - h->free_list(suggestion_list, suggestion_number); + for (int i = 0; i != suggestion_number; ++i) + suggestions.push_back(from_utf8(suggestion_list[i])); + h->free_list(&suggestion_list, suggestion_number); }