X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FAppleSpellChecker.cpp;h=702f49baccce52f62236c4f2b7d510543ebad643;hb=13739f37d5208e87e97c44ef2eeba35807ddb9c5;hp=2beadb2eae723aa0be8569fe36f7068403f477a4;hpb=79346452c783f1634d001c4f6721bba3205633fa;p=lyx.git diff --git a/src/AppleSpellChecker.cpp b/src/AppleSpellChecker.cpp index 2beadb2eae..702f49bacc 100644 --- a/src/AppleSpellChecker.cpp +++ b/src/AppleSpellChecker.cpp @@ -29,8 +29,15 @@ struct AppleSpellChecker::Private ~Private(); + SpellChecker::Result toResult(SpellCheckResult status); + string toString(SpellCheckResult status); + /// the speller AppleSpeller speller; + + /// language map + map languageMap; + }; @@ -58,11 +65,40 @@ AppleSpellChecker::~AppleSpellChecker() } +SpellChecker::Result AppleSpellChecker::Private::toResult(SpellCheckResult status) +{ + return status == SPELL_CHECK_FAILED ? UNKNOWN_WORD : + status == SPELL_CHECK_LEARNED ? LEARNED_WORD : WORD_OK ; +} + + +string AppleSpellChecker::Private::toString(SpellCheckResult status) +{ + return status == SPELL_CHECK_FAILED ? "FAILED" : + status == SPELL_CHECK_LEARNED ? "LEARNED" : "OK"; +} + + SpellChecker::Result AppleSpellChecker::check(WordLangTuple const & word) { + if (!hasDictionary(word.lang())) + return WORD_OK; + string const word_str = to_utf8(word.word()); - int const word_ok = checkAppleSpeller(d->speller, word_str.c_str(), word.lang()->code().c_str()); - return (word_ok) ? OK : UNKNOWN_WORD; + string const lang = d->languageMap[word.lang()->code()]; + SpellCheckResult result = + AppleSpeller_check(d->speller, + word_str.c_str(), lang.c_str()); + LYXERR(Debug::GUI, "spellCheck: \"" << + word.word() << "\" = " << d->toString(result) << + ", lang = " << lang) ; + return d->toResult(result); +} + + +void AppleSpellChecker::advanceChangeNumber() +{ + nextChangeNumber(); } @@ -70,7 +106,19 @@ SpellChecker::Result AppleSpellChecker::check(WordLangTuple const & word) void AppleSpellChecker::insert(WordLangTuple const & word) { string const word_str = to_utf8(word.word()); - learnAppleSpeller(d->speller, word_str.c_str()); + AppleSpeller_learn(d->speller, word_str.c_str()); + LYXERR(Debug::GUI, "learn word: \"" << word.word() << "\"") ; + advanceChangeNumber(); +} + + +// remove from personal dictionary +void AppleSpellChecker::remove(WordLangTuple const & word) +{ + string const word_str = to_utf8(word.word()); + AppleSpeller_unlearn(d->speller, word_str.c_str()); + LYXERR(Debug::GUI, "unlearn word: \"" << word.word() << "\"") ; + advanceChangeNumber(); } @@ -78,7 +126,9 @@ void AppleSpellChecker::insert(WordLangTuple const & word) void AppleSpellChecker::accept(WordLangTuple const & word) { string const word_str = to_utf8(word.word()); - ignoreAppleSpeller(d->speller, word_str.c_str()); + AppleSpeller_ignore(d->speller, word_str.c_str()); + LYXERR(Debug::GUI, "ignore word: \"" << word.word() << "\"") ; + advanceChangeNumber(); } @@ -87,9 +137,9 @@ void AppleSpellChecker::suggest(WordLangTuple const & wl, { suggestions.clear(); string const word_str = to_utf8(wl.word()); - size_t num = makeSuggestionAppleSpeller(d->speller, word_str.c_str(), wl.lang()->code().c_str()); + size_t num = AppleSpeller_makeSuggestion(d->speller, word_str.c_str(), wl.lang()->code().c_str()); for (size_t i = 0; i < num; i++) { - char const * next = getSuggestionAppleSpeller(d->speller, i); + char const * next = AppleSpeller_getSuggestion(d->speller, i); if (!next) break; suggestions.push_back(from_utf8(next)); } @@ -98,7 +148,33 @@ void AppleSpellChecker::suggest(WordLangTuple const & wl, bool AppleSpellChecker::hasDictionary(Language const * lang) const { - return hasLanguageAppleSpeller(d->speller,lang->code().c_str()); + string const langmap = d->languageMap[lang->code()]; + bool result = !langmap.empty(); + + if (result) + return result; + + result = AppleSpeller_hasLanguage(d->speller,lang->code().c_str()); + if (result) { + d->languageMap[lang->code()] = lang->code(); + } else { + result = AppleSpeller_hasLanguage(d->speller,lang->lang().c_str()); + if (result) + d->languageMap[lang->code()] = lang->lang(); + } + return result; +} + + +int AppleSpellChecker::numMisspelledWords() const +{ + return AppleSpeller_numMisspelledWords(d->speller); +} + + +void AppleSpellChecker::misspelledWord(int index, int & start, int & length) const +{ + AppleSpeller_misspelledWord(d->speller, index, &start, &length); }