X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FAspellChecker.cpp;h=a5c54d8c74b6ae727e10526d29ef15f3d2cfddea;hb=9e645a5cfc9d6c3e66d627002e68384c92c4d0b8;hp=a03dc65759defa19989f3df214ba54fca73ead42;hpb=c91e2c59f47431247b44563bed2d0f0eae96f9d6;p=lyx.git diff --git a/src/AspellChecker.cpp b/src/AspellChecker.cpp index a03dc65759..a5c54d8c74 100644 --- a/src/AspellChecker.cpp +++ b/src/AspellChecker.cpp @@ -25,7 +25,7 @@ #include "support/filetools.h" #include "support/Package.h" #include "support/FileName.h" -#include "support/Path.h" +#include "support/PathChanger.h" #include @@ -49,11 +49,12 @@ struct Speller { typedef std::map Spellers; typedef map LangPersonalWordList; -} // anon namespace +} // namespace struct AspellChecker::Private { - Private() {} + Private() + {} ~Private(); @@ -91,28 +92,38 @@ struct AspellChecker::Private /// the location below system/user directory /// there the rws files lookup will happen - const string dictDirectory(void) { return "dicts"; } + const string dictDirectory(void) + { + return "dicts"; + } /// there the dat+cmap files lookup will happen - const string dataDirectory(void) { return "data"; } + const string dataDirectory(void) + { + return "data"; + } /// os package directory constants /// macports on Mac OS X or /// aspell rpms on Linux - const string osPackageBase(void) { + const string osPackageBase(void) + { #ifdef USE_MACOSX_PACKAGING return "/opt/local"; #else return "/usr"; #endif } - const string osPackageDictDirectory(void) { + const string osPackageDictDirectory(void) + { #ifdef USE_MACOSX_PACKAGING return "/share/aspell"; #else return "/lib/aspell-0.60"; #endif } - const string osPackageDataDirectory(void) { return "/lib/aspell-0.60"; } - + const string osPackageDataDirectory(void) + { + return "/lib/aspell-0.60"; + } }; @@ -132,9 +143,9 @@ AspellChecker::Private::~Private() LangPersonalWordList::const_iterator pdit = personal_.begin(); LangPersonalWordList::const_iterator pdet = personal_.end(); - + for (; pdit != pdet; ++pdit) { - if ( 0 == pdit->second) + if (0 == pdit->second) continue; PersonalWordList * pd = pdit->second; pd->save(); @@ -174,7 +185,7 @@ bool AspellChecker::Private::checkAspellData(AspellConfig * config, string const & lang, string const & variety) { FileName base(basepath); - bool have_dict = base.isDirectory() ; + bool have_dict = base.isDirectory(); if (have_dict) { FileName data(addPath(base.absFileName(), datapath)); @@ -188,7 +199,7 @@ bool AspellChecker::Private::checkAspellData(AspellConfig * config, have_dict = isValidDictionary(config, lang, variety); } } - return have_dict ; + return have_dict; } @@ -196,8 +207,8 @@ AspellConfig * AspellChecker::Private::getConfig(string const & lang, string con { AspellConfig * config = new_aspell_config(); bool have_dict = false; - string const sysdir = lyx::support::package().system_support().absFileName() ; - string const userdir = lyx::support::package().user_support().absFileName() ; + string const sysdir = lyx::support::package().system_support().absFileName(); + string const userdir = lyx::support::package().user_support().absFileName(); LYXERR(Debug::FILES, "aspell user dir: " << userdir); have_dict = checkAspellData(config, userdir, dataDirectory(), dictDirectory(), lang, variety); @@ -207,16 +218,16 @@ AspellConfig * AspellChecker::Private::getConfig(string const & lang, string con } if (!have_dict) { // check for package data of OS installation - have_dict = checkAspellData(config, osPackageBase(), osPackageDataDirectory(), osPackageDictDirectory(), lang, variety); + checkAspellData(config, osPackageBase(), osPackageDataDirectory(), osPackageDictDirectory(), lang, variety); } - return config ; + return config; } 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)) + 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)); } @@ -282,7 +293,7 @@ AspellSpeller * AspellChecker::Private::addSpeller(Language const * lang) personal_[lang->lang()] = pd; initSessionDictionary(m, pd); } - + spellers_[lang->lang()] = m; return m.e_speller ? to_aspell_speller(m.e_speller) : 0; } @@ -340,26 +351,28 @@ string AspellChecker::Private::toAspellWord(docstring const & word) const SpellChecker::Result AspellChecker::Private::check( - AspellSpeller * m, WordLangTuple const & word) + AspellSpeller * m, WordLangTuple const & word) const { SpellChecker::Result result = WORD_OK; docstring w1; + LYXERR(Debug::GUI, "spellCheck: \"" << + word.word() << "\", lang = " << word.lang()->lang()) ; 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, /**/); + LASSERT(word_ok != -1, return UNKNOWN_WORD); result = (word_ok) ? WORD_OK : UNKNOWN_WORD; if (rest.empty()) break; - rest = split(rest,w1,'-'); + 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, /**/); + LASSERT(word_ok != -1, return UNKNOWN_WORD); return (word_ok) ? WORD_OK : UNKNOWN_WORD; } @@ -382,7 +395,7 @@ void AspellChecker::Private::remove(WordLangTuple const & word) } } - + void AspellChecker::Private::insert(WordLangTuple const & word) { Spellers::iterator it = spellers_.find(word.lang()->lang()); @@ -404,9 +417,9 @@ bool AspellChecker::Private::learned(WordLangTuple const & word) } -AspellChecker::AspellChecker(): d(new Private) -{ -} +AspellChecker::AspellChecker() + : d(new Private) +{} AspellChecker::~AspellChecker() @@ -415,9 +428,9 @@ AspellChecker::~AspellChecker() } -SpellChecker::Result AspellChecker::check(WordLangTuple const & word) +SpellChecker::Result AspellChecker::check(WordLangTuple const & word, + vector const & docdict) { - AspellSpeller * m = d->speller(word.lang()); if (!m) @@ -427,6 +440,13 @@ SpellChecker::Result AspellChecker::check(WordLangTuple const & word) // MSVC compiled Aspell doesn't like it. return WORD_OK; + vector::const_iterator it = docdict.begin(); + for (; it != docdict.end(); ++it) { + if (it->lang()->code() != word.lang()->code()) + continue; + if (it->word() == word.word()) + return DOCUMENT_LEARNED_WORD; + } SpellChecker::Result rc = d->check(m, word); return (rc == WORD_OK && d->learned(word)) ? LEARNED_WORD : rc; } @@ -468,7 +488,7 @@ void AspellChecker::suggest(WordLangTuple const & wl, string const word = d->toAspellWord(wl.word()); AspellWordList const * sugs = aspell_speller_suggest(m, word.c_str(), -1); - LASSERT(sugs != 0, /**/); + LASSERT(sugs != 0, return); AspellStringEnumeration * els = aspell_word_list_elements(sugs); if (!els || aspell_word_list_empty(sugs)) return; @@ -483,12 +503,14 @@ void AspellChecker::suggest(WordLangTuple const & wl, delete_aspell_string_enumeration(els); } + void AspellChecker::remove(WordLangTuple const & word) { d->remove(word); advanceChangeNumber(); } + bool AspellChecker::hasDictionary(Language const * lang) const { bool have = false; @@ -513,8 +535,8 @@ int AspellChecker::numDictionaries() const { return d->numDictionaries(); } - - + + docstring const AspellChecker::error() { Spellers::iterator it = d->spellers_.begin();