Dear Stephen,
Sorry for the delay, I had other pressing work to do.
Thank you so much for looking at my patch!

What exactly was the problem on MacOSX? Where you getting compilation errors?

I just noticed the following line in src/AppleSpellChecker.cpp:
status == SPELL_CHECK_LEARNED ? LEARNED_WORD : WORD_OK ;
Which I should've changed to:
          WORD_OK ;

If you can try and compile it and test it for me that would be great!
Although I'll try getting myself a Mac VM so I can do so myself.

The way the text is passed in chunks should hopefully not be a problem,
the main problem I see is what happens when you call this method 
https://developer.apple.com/documentation/appkit/nsspellchecker/1525147-unlearnword
  when you haven't previously called 
https://developer.apple.com/documentation/appkit/nsspellchecker/1534837-learnword

The documentation dosen't explain sadly.
If my code doesn't work, I could always write a post-processing loop to check 
for unlearned words, (which will be slower).
In fact that's pretty much what I made the Hunspell/Aspell backends do.

I should probably do some performance testing, but I've been using this patch 
for a while now and haven't noticed any extra lag in spell checking.



— Isaac Oscar Gariano​
________________________________
From: Stephan Witt <st.w...@gmx.net>
Sent: Monday, 16 May 2022 2:07 AM
To: Isaac Oscar Gariano <isaacos...@live.com.au>
Cc: lyx-devel@lists.lyx.org <lyx-devel@lists.lyx.org>
Subject: Re: [PATCH] Allow removing words from the personal dictionary, that 
weren't previously added

Am 26.04.2022 um 09:27 schrieb Isaac Oscar Gariano <isaacos...@live.com.au>:
>
> I've made the "Remove from personal dictionary" function/context menu item 
> work for words that haven't been previously added, but instead are in the 
> system-wide dictionary.
> I've modified the behaviour so that it will cause the word to be marked as 
> incorrectly spelt, regardless of whether it is in the user's personal 
> dictionary, or the system-wide dictionary.
> I've attached two patches, one that can be applied on the latest release 
> branch 2.3.6.1​, and the other works on the master​ branch)
>
> Previously, this only worked for words not in the system-wide dictionary, 
> e.g.:
>        • write "ello", it will be red squiggly underlined
>        • right click and go "Add to personal dictionary"
>        • now the underline will disappear
>        • right click it and go "Remove from personal dictionary"
>        • it will now be red underlined again
> Now you can also do:
>        • write "hello"
>        • right click on it, and click "Remove from personal dictionary"
>        • there should now be a red squiggly underline under "hello", i.e. it 
> is no longer considered a word
> (The above also works with the corresponding lyx-functions spelling-add​ and 
> spelling-remove​)
> It might be better to change the text of the context menu button, e.g., "Add 
> to personal bad words list" or something, but then it'd need to be translated
>
>
> The main use cases I have for this feature are:
>        • removing rare words that are common misspellings, e.g., if you often 
> write "whet" instead of "wet", you can mark the former as invalid.
>        • ensure you consistently use the same variant of a word , e.g., make 
> "spelled" an error if you prefer "spelt" (the latter being a word in the 
> en_GB dictionary)
> This change is backwards compatible: any words you had previously added to 
> the personal dictionary will still be recognised.
>
> I have fully tested this on Linux (specifically OpenSUSE Tumbleweed, with 
> Aspell v0.60.8, Enchant v2.2.15, and, Hunspell 1.7.0), and Windows 11 (using 
> the included Hunspell v1.6.2), I don't have a Mac so I can't test the 
> AppleSpeller/Native backend.
>
> How it works:
>
>        • Enchant already supports this feature out of the box, so I didn't 
> need to change the backend at all, all I needed to do was to make the "Remove 
> from personal dictionary" context menu button show up for all correctly spelt 
> words (and not just those in the personal dictionary).
> Specifically, enchant uses two files ~/.config./enchant/<lang>.dic​ and 
> ~/.config/enchant/<lang>.exc​ to store the personal dictionary. The former 
> contains all words that you have clicked "Add to personal dictionary", and 
> the latter uses all that you have clicked "Remove from personal dictionary" 
> for.
> Note that words are added to .dic​ and .exc​ even if unnecessary (because the 
> word is in the system-wide dictionary, or not in it, respectively).
> The ".exc" file appears to take precedence over .dic​, so if a word is in 
> both, it is considered misspelt.
>        • Aspell and Hunspell currently uses a file 
> $LYX_USERDIR/pwl_<lang>.dict​ to store words you have clicked "Add to 
> personal dictionary" for. LyX now also uses the$LYX_USERDIR/pwl_<lang>.excl​ 
> file for words you have "Remove from personal dictionary". For consistency, 
> my code treats these files like the enchant .dic​ and .exc​ files above, 
> specifically the .excl​ file takes precedence of the .dict​ file, and words 
> may be added to these files even if redundant/unnecessary.
> The Hunspell backend already natively supports removing words from the 
> dictionary at runtime, however Aspell does not, so after spell checking a 
> word, my code manually checks for it's presence in the .excl​ list, which I 
> have not optimised at all, and so it is an O(n) operation, where n is the 
> number of words in the .excl​ file.
> AppleSpeller/Native: this may work out of the box like Enchant, or not. I 
> have no idea, as I can't test it and the documentation is unhelpful (e.g. 
> https://developer.apple.com/documentation/appkit/nsspellchecker/1525147-unlearnword)
> Note: I have deleted LEARNED_WORD​ from the SpellChecker::Result​ enum, as 
> the code no longer distinguishes between words in the personal dictionary and 
> the base dictionary. I also removed the ROOT_FOUND​, COMPOUND_WORD​, and 
> IGNORED_WORD​ variants as they were never used.
>
> For the master branch, I haven't modified the "Remove from document 
> dictionary" option to also work with words not in said dictionary; I'd have 
> to modify the LyX file format to support a \spellchecker_reject​ or something 
> like, but I can probably work out how to do that if you're happy with the 
> idea.

Hi Isaac,

thank you for your work on LyX.

I’ve tried your patch and unfortunately it doesn’t work on Mac.

Despite the fact that it relies on the existence of the LEARNED_WORD in the 
SpellChecker::Result enum there is IMO a problem with the general idea of the 
solution with the Apple speller. Here the whole paragraph is passed as a big 
chunk to the speller engine to get a reasonable performance.

Best regards,
Stephan
-- 
lyx-devel mailing list
lyx-devel@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-devel

Reply via email to