From 2961d29cd35ec89c14d8e7bcff7bf322fbec5110 Mon Sep 17 00:00:00 2001 From: Stephan Witt Date: Fri, 12 Aug 2011 07:19:03 +0000 Subject: [PATCH] Backport of r39362 and r39395: - 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 | 62 +++++++++++++++++++++++++++++++++---------- status.20x | 3 +++ 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/AspellChecker.cpp b/src/AspellChecker.cpp index 62eb29f6d7..c549980e03 100644 --- a/src/AspellChecker.cpp +++ b/src/AspellChecker.cpp @@ -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)) diff --git a/status.20x b/status.20x index b077f79572..100e330c6b 100644 --- a/status.20x +++ b/status.20x @@ -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