]> git.lyx.org Git - lyx.git/blobdiff - src/AspellChecker.cpp
Add a preference option to specify the default length unit (cm or in).
[lyx.git] / src / AspellChecker.cpp
index 7772bb70d6d49c33ef395d4808d36db7ea825c76..c549980e0378b42a3b33ad65a260eb793a0d5440 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "support/lassert.h"
 #include "support/debug.h"
+#include "support/lstrings.h"
 #include "support/docstring_list.h"
 
 #include "support/filetools.h"
@@ -41,6 +42,7 @@ namespace {
 struct Speller {
        AspellConfig * config;
        AspellCanHaveError * e_speller;
+       bool accept_compound;
        docstring_list ignored_words_;
 };
 
@@ -264,6 +266,7 @@ AspellSpeller * AspellChecker::Private::addSpeller(Language const * lang)
                // Report run-together words as errors
                aspell_config_replace(m.config, "run-together", "false");
 
+       m.accept_compound = lyxrc.spellchecker_accept_compound;
        m.e_speller = new_aspell_speller(m.config);
        if (aspell_error_number(m.e_speller) != 0) {
                // FIXME: We should indicate somehow that this language is not supported.
@@ -287,23 +290,58 @@ AspellSpeller * AspellChecker::Private::addSpeller(Language const * lang)
 AspellSpeller * AspellChecker::Private::speller(Language const * lang)
 {
        Spellers::iterator it = spellers_.find(lang->lang());
-       if (it != spellers_.end())
-               return to_aspell_speller(it->second.e_speller);
-       
+       if (it != spellers_.end()) {
+               Speller aspell = it->second;
+               if (lyxrc.spellchecker_accept_compound != aspell.accept_compound) {
+                       // spell checker setting changed... adjust run-together
+                       aspell.accept_compound = lyxrc.spellchecker_accept_compound;
+                       if (aspell.accept_compound)
+                               // Consider run-together words as legal compounds
+                               aspell_config_replace(aspell.config, "run-together", "true");
+                       else
+                               // Report run-together words as errors
+                               aspell_config_replace(aspell.config, "run-together", "false");
+                       AspellCanHaveError * e_speller = aspell.e_speller;
+                       aspell.e_speller = new_aspell_speller(aspell.config);
+                       delete_aspell_speller(to_aspell_speller(e_speller));
+                       spellers_[lang->lang()] = aspell;
+               }
+               return to_aspell_speller(aspell.e_speller);
+       }
+
        return addSpeller(lang);
 }
 
+
 string AspellChecker::Private::toAspellWord(docstring const & word) const
 {
-       return to_utf8(word);
+       size_t mpos;
+       string word_str = to_utf8(word);
+       while ((mpos = word_str.find('-')) != word_str.npos) {
+               word_str.erase(mpos, 1);
+       }
+       return word_str;
 }
 
+
 SpellChecker::Result AspellChecker::Private::check(
        AspellSpeller * m, WordLangTuple const & word) 
        const
 {
+       SpellChecker::Result result = WORD_OK;
+       docstring w1;
+       docstring rest = split(word.word(), w1, '-');
+       for (; result == WORD_OK;) {
+               string const word_str = toAspellWord(w1);
+               int const word_ok = aspell_speller_check(m, word_str.c_str(), -1);
+               LASSERT(word_ok != -1, /**/);
+               result = (word_ok) ? WORD_OK : UNKNOWN_WORD;
+               if (rest.empty())
+                       break;
+               rest = split(rest,w1,'-');
+       }
+       if (result == WORD_OK)
+               return result;
        string const word_str = toAspellWord(word.word());
        int const word_ok = aspell_speller_check(m, word_str.c_str(), -1);
        LASSERT(word_ok != -1, /**/);