#include "support/lassert.h"
#include "support/debug.h"
+#include "support/lstrings.h"
#include "support/docstring_list.h"
#include "support/filetools.h"
struct Speller {
AspellConfig * config;
AspellCanHaveError * e_speller;
+ bool accept_compound;
docstring_list ignored_words_;
};
bool isValidDictionary(AspellConfig * config,
string const & lang, string const & variety);
+ int numDictionaries() const;
bool checkAspellData(AspellConfig * config,
string const & basepath, string const & datapath, string const & dictpath,
string const & lang, string const & variety);
// 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.
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);
}
-
+
+int AspellChecker::Private::numDictionaries() const
+{
+ int result = 0;
+ Spellers::const_iterator it = spellers_.begin();
+ Spellers::const_iterator et = spellers_.end();
+
+ for (; it != et; ++it) {
+ Speller aspell = it->second;
+ result += aspell.e_speller != 0;
+ }
+ return result;
+}
+
+
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, /**/);
AspellSpeller * m = d->speller(word.lang());
if (!m)
- return WORD_OK;
+ return NO_DICTIONARY;
if (word.word().empty())
// MSVC compiled Aspell doesn't like it.
}
+int AspellChecker::numDictionaries() const
+{
+ return d->numDictionaries();
+}
+
+
docstring const AspellChecker::error()
{
Spellers::iterator it = d->spellers_.begin();