]> git.lyx.org Git - features.git/commitdiff
Backport of r39362 and r39395:
authorStephan Witt <switt@lyx.org>
Fri, 12 Aug 2011 07:19:03 +0000 (07:19 +0000)
committerStephan Witt <switt@lyx.org>
Fri, 12 Aug 2011 07:19:03 +0000 (07:19 +0000)
- report failures on add-to-session with LYXERR (aspell)
- with aspell backend split words on hard hyphens to check parts separately
  because hyphen is not allowed to be part of a word - neither in regular
  nor in personal dictionary

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@39477 a592a061-630c-0410-9148-cb99ea01b6c8

src/AspellChecker.cpp
status.20x

index 62eb29f6d7bb4fea5d9122d755ae3fd5f27df53f..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"
@@ -69,10 +70,13 @@ struct AspellChecker::Private
                string const & lang, string const & variety);
        AspellConfig * getConfig(string const & lang, string const & variety);
 
+       string toAspellWord(docstring const & word) const;
+
        SpellChecker::Result check(AspellSpeller * m,
-               string const & word) const;
+               WordLangTuple const & word) const;
 
        void initSessionDictionary(Speller const & speller, PersonalWordList * pd);
+       void addToSession(AspellCanHaveError * speller, docstring const & word);
        void insert(WordLangTuple const & word);
        void remove(WordLangTuple const & word);
        bool learned(WordLangTuple const & word);
@@ -208,6 +212,14 @@ AspellConfig * AspellChecker::Private::getConfig(string const & lang, string con
 }
 
 
+void AspellChecker::Private::addToSession(AspellCanHaveError * speller, docstring const & word)
+{
+       string const word_to_add = toAspellWord(word);
+       if(1 != aspell_speller_add_to_session(to_aspell_speller(speller), word_to_add.c_str(), -1))
+               LYXERR(Debug::GUI, "aspell add to session: " << aspell_error_message(speller));
+}
+
+
 void AspellChecker::Private::initSessionDictionary(
        Speller const & speller,
        PersonalWordList * pd)
@@ -217,14 +229,12 @@ void AspellChecker::Private::initSessionDictionary(
        docstring_list::const_iterator it = pd->begin();
        docstring_list::const_iterator et = pd->end();
        for (; it != et; ++it) {
-               string const word_to_add = to_utf8(*it);
-               aspell_speller_add_to_session(aspell, word_to_add.c_str(), -1);
+               addToSession(speller.e_speller, *it);
        }
        it = speller.ignored_words_.begin();
        et = speller.ignored_words_.end();
        for (; it != et; ++it) {
-               string const word_to_add = to_utf8(*it);
-               aspell_speller_add_to_session(aspell, word_to_add.c_str(), -1);
+               addToSession(speller.e_speller, *it);
        }
 }
 
@@ -303,11 +313,37 @@ AspellSpeller * AspellChecker::Private::speller(Language const * lang)
 }
 
 
+string AspellChecker::Private::toAspellWord(docstring const & word) const
+{
+       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, string const & word) 
+       AspellSpeller * m, WordLangTuple const & word) 
        const
 {
-       int const word_ok = aspell_speller_check(m, word.c_str(), -1);
+       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, /**/);
        return (word_ok) ? WORD_OK : UNKNOWN_WORD;
 }
@@ -336,8 +372,7 @@ void AspellChecker::Private::insert(WordLangTuple const & word)
 {
        Spellers::iterator it = spellers_.find(word.lang()->lang());
        if (it != spellers_.end()) {
-               AspellSpeller * speller = to_aspell_speller(it->second.e_speller);
-               aspell_speller_add_to_session(speller, to_utf8(word.word()).c_str(), -1);
+               addToSession(it->second.e_speller, word.word());
                PersonalWordList * pd = personal_[word.lang()->lang()];
                if (!pd)
                        return;
@@ -377,8 +412,7 @@ SpellChecker::Result AspellChecker::check(WordLangTuple const & word)
                // MSVC compiled Aspell doesn't like it.
                return WORD_OK;
 
-       string const word_str = to_utf8(word.word());
-       SpellChecker::Result rc = d->check(m, word_str);
+       SpellChecker::Result rc = d->check(m, word);
        return (rc == WORD_OK && d->learned(word)) ? LEARNED_WORD : rc;
 }
 
@@ -400,8 +434,7 @@ void AspellChecker::accept(WordLangTuple const & word)
 {
        Spellers::iterator it = d->spellers_.find(word.lang()->lang());
        if (it != d->spellers_.end()) {
-               AspellSpeller * speller = to_aspell_speller(it->second.e_speller);
-               aspell_speller_add_to_session(speller, to_utf8(word.word()).c_str(), -1);
+               d->addToSession(it->second.e_speller, word.word());
                d->accept(it->second, word);
                advanceChangeNumber();
        }
@@ -417,8 +450,9 @@ void AspellChecker::suggest(WordLangTuple const & wl,
        if (!m)
                return;
 
+       string const word = d->toAspellWord(wl.word());
        AspellWordList const * sugs =
-               aspell_speller_suggest(m, to_utf8(wl.word()).c_str(), -1);
+               aspell_speller_suggest(m, word.c_str(), -1);
        LASSERT(sugs != 0, /**/);
        AspellStringEnumeration * els = aspell_word_list_elements(sugs);
        if (!els || aspell_word_list_empty(sugs))
index b077f79572bdb4956bbca55804282c0b5b685974..100e330c6bd37ba3baa6be4b5f8815289ee37017 100644 (file)
@@ -247,6 +247,9 @@ What's new
 - Fixed crash involving tables that have rows whose cells are all multirow
   (bug 7535).
 
+- With aspell backend split words on hard hyphens to check parts separately
+  because hyphen is not allowed to be part of a word (bug 7660).
+
 
 * ADVANCED FIND AND REPLACE