#include "support/lassert.h"
#include "support/debug.h"
+#include "support/lstrings.h"
#include "support/docstring_list.h"
#include "support/filetools.h"
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);
}
+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)
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);
}
}
}
+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;
}
{
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;
// 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;
}
{
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();
}
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))