X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FHunspellChecker.cpp;h=ec5466f300d794644bdc2b6d7d45b9e62f01044d;hb=f9835d054d7aac5830ec6bb5a3537c2b4fa2d269;hp=31b629671e653350e1b00a857fc022d0e5e756ba;hpb=6b2232a29c682d8e62d1d2b963bb1a70bee4330b;p=lyx.git diff --git a/src/HunspellChecker.cpp b/src/HunspellChecker.cpp index 31b629671e..ec5466f300 100644 --- a/src/HunspellChecker.cpp +++ b/src/HunspellChecker.cpp @@ -65,6 +65,7 @@ struct HunspellChecker::Private Hunspell * addSpeller(Language const * lang, string & hpath); Hunspell * addSpeller(Language const * lang); Hunspell * speller(Language const * lang); + Hunspell * lookup(Language const * lang); /// ignored words bool isIgnored(WordLangTuple const & wl) const; /// personal word list interface @@ -83,15 +84,18 @@ struct HunspellChecker::Private /// the location below system/user directory /// there the aff+dic files lookup will happen const string dictDirectory(void) const { return "dicts"; } - int maxLookupSelector(void) const { return 4; } + int maxLookupSelector(void) const { return 5; } const string HunspellDictionaryName(Language const * lang) { return lang->variety().empty() ? lang->code() : lang->code() + "-" + lang->variety(); } - const string osPackageDictDirectory(void) { + const string myspellPackageDictDirectory(void) { return "/usr/share/myspell"; } + const string hunspellPackageDictDirectory(void) { + return "/usr/share/hunspell"; + } }; @@ -150,15 +154,14 @@ bool HunspellChecker::Private::haveLanguageFiles(string const & hpath) const string HunspellChecker::Private::dictPath(int selector) { switch (selector) { + case 4: + return hunspellPackageDictDirectory(); case 3: - return addName(osPackageDictDirectory(),dictDirectory()); - break; + return myspellPackageDictDirectory(); case 2: return addName(package().system_support().absFileName(),dictDirectory()); - break; case 1: return addName(package().user_support().absFileName(),dictDirectory()); - break; default: return user_path_; } @@ -167,13 +170,17 @@ const string HunspellChecker::Private::dictPath(int selector) bool HunspellChecker::Private::haveDictionary(Language const * lang, string & hpath) { - if (hpath.empty()) + if (hpath.empty() || !lang) return false; + if (lookup(lang)) return true; + + string d_name = HunspellDictionaryName(lang); + LYXERR(Debug::FILES, "check hunspell path: " << hpath - << " for language " << (lang ? lang->lang() : "NULL" )); + << " for language " << lang->lang() << " with name " << d_name); - string h_path = addName(hpath, HunspellDictionaryName(lang)); + string h_path = addName(hpath, d_name); // first we try lang code+variety if (haveLanguageFiles(h_path)) { LYXERR(Debug::FILES, " found " << h_path); @@ -199,24 +206,27 @@ bool HunspellChecker::Private::haveDictionary(Language const * lang) string lpath = dictPath(p); result = haveDictionary(lang, lpath); } - // FIXME: if result is false... - // 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 result; } Hunspell * HunspellChecker::Private::speller(Language const * lang) { + Hunspell * h = lookup(lang); + if (h) return h; + setUserPath(lyxrc.hunspelldir_path); - Spellers::iterator it = spellers_.find(lang->lang()); - if (it != spellers_.end()) - return it->second; return addSpeller(lang); } +Hunspell * HunspellChecker::Private::lookup(Language const * lang) +{ + Spellers::iterator it = spellers_.find(lang->lang()); + return it != spellers_.end() ? it->second : 0; +} + + Hunspell * HunspellChecker::Private::addSpeller(Language const * lang,string & path) { if (!haveDictionary(lang, path)) { @@ -227,7 +237,7 @@ Hunspell * HunspellChecker::Private::addSpeller(Language const * lang,string & p FileName const affix(path + ".aff"); FileName const dict(path + ".dic"); Hunspell * h = new Hunspell(affix.absFileName().c_str(), dict.absFileName().c_str()); - LYXERR(Debug::FILES, "Hunspell speller for langage " << lang << " at " << dict << " found"); + LYXERR(Debug::FILES, "Hunspell speller for langage " << lang << " at " << dict << " added."); spellers_[lang->lang()] = h; return h; } @@ -344,16 +354,18 @@ SpellChecker::Result HunspellChecker::check(WordLangTuple const & wl) string const encoding = h->get_dic_encoding(); string const word_to_check = to_iconv_encoding(wl.word(), encoding); + LYXERR(Debug::GUI, "spellCheck: \"" << + wl.word() << "\", lang = " << wl.lang()->lang()) ; if (h->spell(word_to_check.c_str(), &info)) return d->learned(wl) ? LEARNED_WORD : WORD_OK; if (info & SPELL_COMPOUND) { // FIXME: What to do with that? - LYXERR(Debug::FILES, "Hunspell compound word found " << word_to_check); + LYXERR(Debug::GUI, "Hunspell compound word found " << word_to_check); } if (info & SPELL_FORBIDDEN) { // This was removed from personal dictionary - LYXERR(Debug::FILES, "Hunspell explicit forbidden word found " << word_to_check); + LYXERR(Debug::GUI, "Hunspell explicit forbidden word found " << word_to_check); } return UNKNOWN_WORD;