commit c8feef2e2316978b60d6cef0a5513f80966990b7
Author: Juergen Spitzmueller <[email protected]>
Date:   Sun Mar 7 18:23:07 2021 +0100

    Add way to remove items from document dictionary
---
 lib/RELEASE-NOTES          |    3 +++
 src/AppleSpellChecker.cpp  |    2 +-
 src/AspellChecker.cpp      |    2 +-
 src/EnchantChecker.cpp     |    2 +-
 src/FuncCode.h             |    1 +
 src/HunspellChecker.cpp    |   23 +++++++++++------------
 src/LyXAction.cpp          |   13 +++++++++++++
 src/Paragraph.cpp          |    4 ++--
 src/SpellChecker.h         |    5 ++++-
 src/Text3.cpp              |   43 +++++++++++++++++++++++++++++++++++++++++--
 src/frontends/qt/Menus.cpp |    7 +++++++
 11 files changed, 85 insertions(+), 20 deletions(-)

diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES
index 638d5a9..11c3503 100644
--- a/lib/RELEASE-NOTES
+++ b/lib/RELEASE-NOTES
@@ -119,6 +119,9 @@
 * spelling-add-local adds words for a given language to the document's local 
spelling
   dictionary.
 
+* spelling-remove-local removes words for a given language from the document's 
local
+  spelling dictionary.
+
 * inset-split is a new convenience function that splits an inset into two at 
the given
   cursor position. This is only implemented for text insets currently.
 
diff --git a/src/AppleSpellChecker.cpp b/src/AppleSpellChecker.cpp
index 763b809..0a82d38 100644
--- a/src/AppleSpellChecker.cpp
+++ b/src/AppleSpellChecker.cpp
@@ -92,7 +92,7 @@ SpellChecker::Result AppleSpellChecker::check(WordLangTuple 
const & word,
                if (it->lang()->code() != word.lang()->code())
                        continue;
                if (it->word() == word.word())
-                       return LEARNED_WORD;
+                       return DOCUMENT_LEARNED_WORD;
        }
 
        SpellCheckResult result =
diff --git a/src/AspellChecker.cpp b/src/AspellChecker.cpp
index d7392d2..a5c54d8 100644
--- a/src/AspellChecker.cpp
+++ b/src/AspellChecker.cpp
@@ -445,7 +445,7 @@ SpellChecker::Result AspellChecker::check(WordLangTuple 
const & word,
                if (it->lang()->code() != word.lang()->code())
                        continue;
                if (it->word() == word.word())
-                       return LEARNED_WORD;
+                       return DOCUMENT_LEARNED_WORD;
        }
        SpellChecker::Result rc = d->check(m, word);
        return (rc == WORD_OK && d->learned(word)) ? LEARNED_WORD : rc;
diff --git a/src/EnchantChecker.cpp b/src/EnchantChecker.cpp
index 8eaea83..5b42f33 100644
--- a/src/EnchantChecker.cpp
+++ b/src/EnchantChecker.cpp
@@ -139,7 +139,7 @@ SpellChecker::Result EnchantChecker::check(WordLangTuple 
const & word,
                if (it->lang()->code() != word.lang()->code())
                        continue;
                if (it->word() == word.word())
-                       return LEARNED_WORD;
+                       return DOCUMENT_LEARNED_WORD;
        }
 
        return UNKNOWN_WORD;
diff --git a/src/FuncCode.h b/src/FuncCode.h
index 4fceed8..391232b 100644
--- a/src/FuncCode.h
+++ b/src/FuncCode.h
@@ -499,6 +499,7 @@ enum FuncCode
        LFUN_FONT_NO_SPELLCHECK,        // jspitzm 20210305
        LFUN_SPELLING_ADD_LOCAL,        // jspitzm 20210306
        // 390
+       LFUN_SPELLING_REMOVE_LOCAL,     // jspitzm 20210307
        LFUN_LASTACTION                 // end of the table
 };
 
diff --git a/src/HunspellChecker.cpp b/src/HunspellChecker.cpp
index 06349c6..1cac9ad 100644
--- a/src/HunspellChecker.cpp
+++ b/src/HunspellChecker.cpp
@@ -70,8 +70,7 @@ struct HunspellChecker::Private
        Hunspell * speller(Language const * lang);
        Hunspell * lookup(Language const * lang);
        /// ignored words
-       bool isIgnored(WordLangTuple const & wl,
-                      std::vector<WordLangTuple> const & docdict) const;
+       bool isIgnored(WordLangTuple const & wl) const;
        /// personal word list interface
        void remove(WordLangTuple const & wl);
        void insert(WordLangTuple const & wl);
@@ -282,8 +281,7 @@ int HunspellChecker::Private::numDictionaries() const
 }
 
 
-bool HunspellChecker::Private::isIgnored(WordLangTuple const & wl,
-                                        vector<WordLangTuple> const & docdict) 
const
+bool HunspellChecker::Private::isIgnored(WordLangTuple const & wl) const
 {
        IgnoreList::const_iterator it = ignored_.begin();
        for (; it != ignored_.end(); ++it) {
@@ -292,13 +290,6 @@ bool HunspellChecker::Private::isIgnored(WordLangTuple 
const & wl,
                if (it->word() == wl.word())
                        return true;
        }
-       it = docdict.begin();
-       for (; it != docdict.end(); ++it) {
-               if (it->lang()->code() != wl.lang()->code())
-                       continue;
-               if (it->word() == wl.word())
-                       return true;
-       }
        return false;
 }
 
@@ -356,9 +347,17 @@ HunspellChecker::~HunspellChecker()
 SpellChecker::Result HunspellChecker::check(WordLangTuple const & wl,
                                            vector<WordLangTuple> const & 
docdict)
 {
-       if (d->isIgnored(wl, docdict))
+       if (d->isIgnored(wl))
                return WORD_OK;
 
+       IgnoreList::const_iterator it = docdict.begin();
+       for (; it != docdict.end(); ++it) {
+               if (it->lang()->code() != wl.lang()->code())
+                       continue;
+               if (it->word() == wl.word())
+                       return DOCUMENT_LEARNED_WORD;
+       }
+
        Hunspell * h = d->speller(wl.lang());
        if (!h)
                return NO_DICTIONARY;
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index 5badfc9..8933e3d 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -3807,6 +3807,19 @@ void LyXAction::init()
                { LFUN_SPELLING_ADD_LOCAL, "spelling-add-local", Noop, Edit },
 
 /*!
+ * \var lyx::FuncCode lyx::LFUN_SPELLING_REMOVE_LOCAL
+ * \li Action: Remove the word under the cursor from the document's local
+ *             spell checker dictionary.
+ *             The default for the language is retrieved from the cursor 
position.
+ * \li Syntax: spelling-remove-local [<STRING>] [<LANG>]
+ * \li Params: <WORD>: word to remove
+              <LANG>: language name (see file languages)
+ * \li Origin: spitz, 7 Mar 2021
+ * \endvar
+ */
+               { LFUN_SPELLING_REMOVE_LOCAL, "spelling-remove-local", Noop, 
Edit },
+
+/*!
  * \var lyx::FuncCode lyx::LFUN_SPELLING_CONTINUOUSLY
  * \li Action: Toggle continuous spell checking.
  * \li Syntax: spelling-continuously
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index e4ebf8b..9bfa3b8 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -4961,11 +4961,11 @@ void Paragraph::Private::markMisspelledWords(
                WordLangTuple const candidate(word.substr(wstart, wlen), lang);
                SpellChecker::Result actresult = result;
                if (inset_owner_->buffer().params().spellignored(candidate))
-                       actresult = SpellChecker::WORD_OK;
+                       actresult = SpellChecker::DOCUMENT_LEARNED_WORD;
                numskipped += countSkips(it, et, snext);
                /// mark the range of misspelling
                setMisspelled(wstart, snext, actresult);
-               if (actresult == SpellChecker::WORD_OK)
+               if (actresult == SpellChecker::DOCUMENT_LEARNED_WORD)
                        LYXERR(Debug::GUI, "local dictionary word: \"" <<
                                   candidate.word() << "\" [" <<
                                   wstart << ".." << (snext-1) << "]");
diff --git a/src/SpellChecker.h b/src/SpellChecker.h
index 7a5dbac..58e5de6 100644
--- a/src/SpellChecker.h
+++ b/src/SpellChecker.h
@@ -44,6 +44,8 @@ public:
                IGNORED_WORD,
                /// number of personal dictionary "word"
                LEARNED_WORD,
+               /// number of document dictionary "word"
+               DOCUMENT_LEARNED_WORD,
                /// missing dictionary for language
                NO_DICTIONARY
        };
@@ -57,7 +59,8 @@ public:
                return res != WORD_OK
                        && res != IGNORED_WORD
                        && res != NO_DICTIONARY
-                       && res != LEARNED_WORD; }
+                       && res != LEARNED_WORD
+                       && res != DOCUMENT_LEARNED_WORD; }
 
        /// check the given word of the given lang code and return the result
        virtual enum Result check(WordLangTuple const &,
diff --git a/src/Text3.cpp b/src/Text3.cpp
index 9ff7150..26d6d71 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -2745,8 +2745,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        }
                }
                WordLangTuple wl(word, language);
-               bool const has_item = bv->buffer().params().spellignored(wl);
-               if (!has_item) {
+               if (!bv->buffer().params().spellignored(wl)) {
                        cur.recordUndoBufferParams();
                        bv->buffer().params().spellignore().push_back(wl);
                        cur.recordUndo();
@@ -2761,6 +2760,45 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
+       case LFUN_SPELLING_REMOVE_LOCAL: {
+               Language const * language = getLanguage(cur, cmd.getArg(1));
+               docstring word = from_utf8(cmd.getArg(0));
+               if (word.empty()) {
+                       word = cur.selectionAsString(false);
+                       if (word.size() > 100)
+                               break;
+                       if (word.empty()) {
+                               // Get word or selection
+                               selectWordWhenUnderCursor(cur, WHOLE_WORD);
+                               word = cur.selectionAsString(false);
+                       }
+               }
+               WordLangTuple wl(word, language);
+               bool has_item = false;
+               vector<WordLangTuple>::const_iterator it = 
bv->buffer().params().spellignore().begin();
+               for (; it != bv->buffer().params().spellignore().end(); ++it) {
+                       if (it->lang()->code() != wl.lang()->code())
+                               continue;
+                       if (it->word() == wl.word()) {
+                               has_item = true;
+                               break;
+                       }
+               }
+               if (has_item) {
+                       cur.recordUndoBufferParams();
+                       bv->buffer().params().spellignore().erase(it);
+                       cur.recordUndo();
+                       // trigger re-check
+                       WordLangTuple wl;
+                       docstring_list suggestions;
+                       Paragraph const & par = cur.paragraph();
+                       pos_type from = cur.pos();
+                       pos_type to = from;
+                       par.spellCheck(from, to, wl, suggestions, true, true);
+               }
+               break;
+       }
+
 
        case LFUN_SPELLING_IGNORE: {
                Language const * language = getLanguage(cur, cmd.getArg(1));
@@ -3492,6 +3530,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & 
cmd,
 
        case LFUN_SPELLING_ADD:
        case LFUN_SPELLING_ADD_LOCAL:
+       case LFUN_SPELLING_REMOVE_LOCAL:
        case LFUN_SPELLING_IGNORE:
        case LFUN_SPELLING_REMOVE:
                enable = theSpellChecker() != nullptr;
diff --git a/src/frontends/qt/Menus.cpp b/src/frontends/qt/Menus.cpp
index df5586e..3b7bde0 100644
--- a/src/frontends/qt/Menus.cpp
+++ b/src/frontends/qt/Menus.cpp
@@ -878,6 +878,13 @@ void MenuDefinition::expandSpellingSuggestions(BufferView 
const * bv)
                                        FuncRequest(LFUN_SPELLING_REMOVE, 
arg)));
                }
                break;
+       case SpellChecker::DOCUMENT_LEARNED_WORD: {
+                       LYXERR(Debug::GUI, "Document-Learned Word.");
+                       docstring const arg = wl.word() + " " + 
from_ascii(wl.lang()->lang());
+                       add(MenuItem(MenuItem::Command, qt_("Remove from 
document dictionary|r"),
+                                       FuncRequest(LFUN_SPELLING_REMOVE_LOCAL, 
arg)));
+               }
+               break;
        case SpellChecker::NO_DICTIONARY:
                LYXERR(Debug::GUI, "No dictionary for language " + 
from_ascii(wl.lang()->lang()));
                // FALLTHROUGH
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to