]> git.lyx.org Git - lyx.git/blobdiff - src/HunspellChecker.cpp
Make the fake sequence for braces highly unlikely (addressing #6478).
[lyx.git] / src / HunspellChecker.cpp
index 9e9ea15990f795074cf8777b8f950e4c88397115..a611a1ff473b850f8e1087b8f498b10ec56fce1d 100644 (file)
@@ -19,6 +19,7 @@
 
 #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"
@@ -29,6 +30,7 @@
 
 #include <map>
 #include <string>
+#include <vector>
 
 using namespace std;
 using namespace lyx::support;
@@ -39,6 +41,7 @@ namespace lyx {
 namespace {
 
 typedef map<std::string, Hunspell *> Spellers;
+typedef vector<WordLangTuple> IgnoreList;
 
 } // anon namespace
 
@@ -50,9 +53,13 @@ struct HunspellChecker::Private
 
        Hunspell * addSpeller(string const & lang);
        Hunspell * speller(string const & lang);
+       /// ignored words
+       bool isIgnored(WordLangTuple const & wl) const;
 
        /// the spellers
        Spellers spellers_;
+       ///
+       IgnoreList ignored_;
 };
 
 
@@ -89,8 +96,8 @@ bool haveLanguageFiles(string const & hpath)
 
 Hunspell * HunspellChecker::Private::addSpeller(string const & lang)
 {
-       string hunspell_path = external_path(lyxrc.hunspelldir_path);
-       LYXERR(Debug::FILES, "hunspell path: " << hunspell_path);
+       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
@@ -107,7 +114,7 @@ Hunspell * HunspellChecker::Private::addSpeller(string const & lang)
                return 0;
        }
 
-       addName(hunspell_path, lang);
+       hunspell_path = external_path(addName(hunspell_path, lang));
        if (!haveLanguageFiles(hunspell_path)) {
                // try with '_' replaced by '-'
                hunspell_path = subst(hunspell_path, '_', '-');
@@ -136,6 +143,19 @@ Hunspell * HunspellChecker::Private::speller(string const & lang)
 }
 
 
+bool HunspellChecker::Private::isIgnored(WordLangTuple const & wl) const
+{
+       IgnoreList::const_iterator it = ignored_.begin();
+       for (; it != ignored_.end(); ++it) {
+               if ((*it).lang_code() != wl.lang_code())
+                       continue;
+               if ((*it).word() == wl.word())
+                       return true;
+       }
+       return false;
+}
+
+
 HunspellChecker::HunspellChecker(): d(new Private)
 {
 }
@@ -149,6 +169,9 @@ HunspellChecker::~HunspellChecker()
 
 SpellChecker::Result HunspellChecker::check(WordLangTuple const & wl)
 {
+       if (d->isIgnored(wl))
+               return OK;
+
        string const word_to_check = to_utf8(wl.word());
        Hunspell * h = d->speller(wl.lang_code());
        if (!h)
@@ -180,9 +203,9 @@ void HunspellChecker::insert(WordLangTuple const & wl)
 }
 
 
-void HunspellChecker::accept(WordLangTuple const &)
+void HunspellChecker::accept(WordLangTuple const & wl)
 {
-       // FIXME: not implemented!
+       d->ignored_.push_back(wl);
 }