X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FHunspellChecker.cpp;h=01ec19498b70e28075db5e5b8a9c6bb8c4c77e49;hb=5be391b274f2cbf4a1da03bc5ee2136cb6c4e660;hp=6dc6647b5cf4829687bc1418ef89dd9b707a09c4;hpb=e30f3d76d2bee0011ceaeb5f0cc221156458cbad;p=lyx.git diff --git a/src/HunspellChecker.cpp b/src/HunspellChecker.cpp index 6dc6647b5c..01ec19498b 100644 --- a/src/HunspellChecker.cpp +++ b/src/HunspellChecker.cpp @@ -16,17 +16,13 @@ #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/Package.h" #include "support/FileName.h" -#include "support/gettext.h" #include "support/lassert.h" #include "support/lstrings.h" -#include "support/os.h" #include @@ -45,7 +41,12 @@ namespace { typedef map Spellers; typedef map LangPersonalWordList; -typedef vector IgnoreList; +docstring remap_result(docstring const & s) +{ + // substitute RIGHT SINGLE QUOTATION MARK + // by APOSTROPHE + return subst(s, 0x2019, 0x0027); +} } // namespace @@ -75,7 +76,7 @@ struct HunspellChecker::Private /// the spellers Spellers spellers_; /// - IgnoreList ignored_; + WordLangTable ignored_; /// LangPersonalWordList personal_; /// @@ -127,14 +128,14 @@ void HunspellChecker::Private::cleanCache() for (; it != end; ++it) { delete it->second; - it->second = 0; + it->second = nullptr; } LangPersonalWordList::const_iterator pdit = personal_.begin(); LangPersonalWordList::const_iterator pdet = personal_.end(); for (; pdit != pdet; ++pdit) { - if ( 0 == pdit->second) + if (pdit->second == nullptr) continue; PersonalWordList * pd = pdit->second; pd->save(); @@ -223,15 +224,15 @@ Hunspell * HunspellChecker::Private::speller(Language const * lang) Hunspell * HunspellChecker::Private::lookup(Language const * lang) { Spellers::iterator it = spellers_.find(lang->lang()); - return it != spellers_.end() ? it->second : 0; + return it != spellers_.end() ? it->second : nullptr; } -Hunspell * HunspellChecker::Private::addSpeller(Language const * lang,string & path) +Hunspell * HunspellChecker::Private::addSpeller(Language const * lang, string & path) { if (!haveDictionary(lang, path)) { - spellers_[lang->lang()] = 0; - return 0; + spellers_[lang->lang()] = nullptr; + return nullptr; } FileName const affix(path + ".aff"); @@ -245,8 +246,8 @@ Hunspell * HunspellChecker::Private::addSpeller(Language const * lang,string & p Hunspell * HunspellChecker::Private::addSpeller(Language const * lang) { - Hunspell * h = 0; - for (int p = 0; p < maxLookupSelector() && 0 == h; ++p) { + Hunspell * h = nullptr; + for (int p = 0; p < maxLookupSelector() && nullptr == h; ++p) { string lpath = dictPath(p); h = addSpeller(lang, lpath); } @@ -273,14 +274,14 @@ int HunspellChecker::Private::numDictionaries() const Spellers::const_iterator et = spellers_.end(); for (; it != et; ++it) - result += it->second != 0; + result += it->second != nullptr; return result; } bool HunspellChecker::Private::isIgnored(WordLangTuple const & wl) const { - IgnoreList::const_iterator it = ignored_.begin(); + WordLangTable::const_iterator it = ignored_.begin(); for (; it != ignored_.end(); ++it) { if (it->lang()->code() != wl.lang()->code()) continue; @@ -341,11 +342,20 @@ HunspellChecker::~HunspellChecker() } -SpellChecker::Result HunspellChecker::check(WordLangTuple const & wl) +SpellChecker::Result HunspellChecker::check(WordLangTuple const & wl, + vector const & docdict) { if (d->isIgnored(wl)) return WORD_OK; + WordLangTable::const_iterator it = docdict.begin(); + for (; it != docdict.end(); ++it) { + if (it->lang()->code() != wl.lang()->code()) + continue; + if (it->word() == wl.word()) + return DOCUMENT_LEARNED_WORD; + } + Hunspell * h = d->speller(wl.lang()); if (!h) return NO_DICTIONARY; @@ -356,7 +366,11 @@ SpellChecker::Result HunspellChecker::check(WordLangTuple const & wl) LYXERR(Debug::GUI, "spellCheck: \"" << wl.word() << "\", lang = " << wl.lang()->lang()) ; +#ifdef HAVE_HUNSPELL_CXXABI + if (h->spell(word_to_check, &info)) +#else if (h->spell(word_to_check.c_str(), &info)) +#endif return d->learned(wl) ? LEARNED_WORD : WORD_OK; if (info & SPELL_COMPOUND) { @@ -411,13 +425,19 @@ void HunspellChecker::suggest(WordLangTuple const & wl, return; string const encoding = h->get_dic_encoding(); string const word_to_check = to_iconv_encoding(wl.word(), encoding); +#ifdef HAVE_HUNSPELL_CXXABI + vector wlst = h->suggest(word_to_check); + for (auto const & s : wlst) + suggestions.push_back(remap_result(from_iconv_encoding(s, encoding))); +#else char ** suggestion_list; int const suggestion_number = h->suggest(&suggestion_list, word_to_check.c_str()); if (suggestion_number <= 0) return; for (int i = 0; i != suggestion_number; ++i) - suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding)); + suggestions.push_back(remap_result(from_iconv_encoding(suggestion_list[i], encoding))); h->free_list(&suggestion_list, suggestion_number); +#endif } @@ -430,6 +450,11 @@ void HunspellChecker::stem(WordLangTuple const & wl, return; string const encoding = h->get_dic_encoding(); string const word_to_check = to_iconv_encoding(wl.word(), encoding); +#ifdef HAVE_HUNSPELL_CXXABI + vector wlst = h->stem(word_to_check); + for (auto const & s : wlst) + suggestions.push_back(from_iconv_encoding(s, encoding)); +#else char ** suggestion_list; int const suggestion_number = h->stem(&suggestion_list, word_to_check.c_str()); if (suggestion_number <= 0) @@ -437,6 +462,7 @@ void HunspellChecker::stem(WordLangTuple const & wl, for (int i = 0; i != suggestion_number; ++i) suggestions.push_back(from_iconv_encoding(suggestion_list[i], encoding)); h->free_list(&suggestion_list, suggestion_number); +#endif }