]> git.lyx.org Git - lyx.git/blobdiff - src/EnchantChecker.cpp
* Document prefs: rename Format -> Output
[lyx.git] / src / EnchantChecker.cpp
index dc8ea4d864af9e9ff5a589a0a840583ac4f803b5..5b42f33fde7e5f575a418d32e18c9ff476f63ffa 100644 (file)
@@ -30,13 +30,24 @@ namespace lyx {
 
 namespace {
 
+enchant::Broker & broker()
+{
+#ifdef HAVE_ENCHANT2
+       static enchant::Broker thebroker;
+       return thebroker;
+#else
+       return *enchant::Broker::instance();
+#endif
+}
+
+
 struct Speller {
        enchant::Dict * speller;
 };
 
 typedef map<string, Speller> Spellers;
-  
-} // anon namespace
+
+} // namespace
 
 struct EnchantChecker::Private
 {
@@ -68,19 +79,18 @@ EnchantChecker::Private::~Private()
 
 enchant::Dict * EnchantChecker::Private::addSpeller(string const & lang)
 {
-       enchant::Broker * instance = enchant::Broker::instance();
        Speller m;
 
        try {
                LYXERR(Debug::FILES, "request enchant speller for language " << lang);
-               m.speller = instance->request_dict(lang);
+               m.speller = broker().request_dict(lang);
        }
        catch (enchant::Exception & e) {
                // FIXME error handling?
                const char * what = e.what();
                LYXERR(Debug::FILES, "cannot add enchant speller: " <<
                           ((what && *what) ? what : "unspecified enchant exception in request_dict()"));
-               m.speller = 0;
+               m.speller = nullptr;
        }
        spellers_[lang] = m;
        return m.speller;
@@ -92,7 +102,7 @@ enchant::Dict * EnchantChecker::Private::speller(string const & lang)
        Spellers::iterator it = spellers_.find(lang);
        if (it != spellers_.end())
                return it->second.speller;
-       
+
        return addSpeller(lang);
 }
 
@@ -108,7 +118,8 @@ EnchantChecker::~EnchantChecker()
 }
 
 
-SpellChecker::Result EnchantChecker::check(WordLangTuple const & word)
+SpellChecker::Result EnchantChecker::check(WordLangTuple const & word,
+        std::vector<WordLangTuple> const & docdict)
 {
        enchant::Dict * m = d->speller(word.lang()->code());
 
@@ -123,6 +134,14 @@ SpellChecker::Result EnchantChecker::check(WordLangTuple const & word)
        if (m->check(utf8word))
                return WORD_OK;
 
+       vector<WordLangTuple>::const_iterator it = docdict.begin();
+       for (; it != docdict.end(); ++it) {
+               if (it->lang()->code() != word.lang()->code())
+                       continue;
+               if (it->word() == word.word())
+                       return DOCUMENT_LEARNED_WORD;
+       }
+
        return UNKNOWN_WORD;
 }
 
@@ -141,8 +160,8 @@ void EnchantChecker::insert(WordLangTuple const & word)
                advanceChangeNumber();
        }
 }
-       
-       
+
+
 void EnchantChecker::remove(WordLangTuple const & word)
 {
        enchant::Dict * m = d->speller(word.lang()->code());
@@ -176,7 +195,7 @@ void EnchantChecker::suggest(WordLangTuple const & wl,
 
        vector<string> suggs = m->suggest(utf8word);
        vector<string>::const_iterator it = suggs.begin();
-       
+
        for (; it != suggs.end(); ++it)
                suggestions.push_back(from_utf8(*it));
 }
@@ -186,8 +205,7 @@ bool EnchantChecker::hasDictionary(Language const * lang) const
 {
        if (!lang)
                return false;
-       enchant::Broker * instance = enchant::Broker::instance();
-       return (instance->dict_exists(lang->code()));
+       return broker().dict_exists(lang->code());
 }
 
 
@@ -195,7 +213,7 @@ int EnchantChecker::numDictionaries() const
 {
        return d->spellers_.size();
 }
-       
+
 
 docstring const EnchantChecker::error()
 {