4#ifndef _Stroika_Frameworks_Led_SpellCheckEngine_Basic_h_
5#define _Stroika_Frameworks_Led_SpellCheckEngine_Basic_h_ 1
13#include "Stroika/Frameworks/StroikaPreComp.h"
18#include "Stroika/Frameworks/Led/SpellCheckEngine.h"
19#include "Stroika/Frameworks/Led/Support.h"
20#include "Stroika/Frameworks/Led/TextBreaks.h"
22namespace Stroika::Frameworks::Led {
30#ifndef qStroika_Frameworks_Led_IncludeBakedInDictionaries
32#define qStroika_Frameworks_Led_IncludeBakedInDictionaries 0
40 class SpellCheckEngine_Basic :
public SpellCheckEngine {
42 using inherited = SpellCheckEngine;
46 class EditableDictionary;
47 class CompiledDictionary;
50 SpellCheckEngine_Basic (
const Dictionary* mainDictionary = NULL);
51 ~SpellCheckEngine_Basic ();
54 virtual bool ScanForUndefinedWord (
const Led_tChar* startBuf,
const Led_tChar* endBuf,
const Led_tChar** cursor,
55 const Led_tChar** wordStartResult,
const Led_tChar** wordEndResult)
override;
58 virtual bool LookupWord_ (
const Led_tString& checkWord, Led_tString* matchedWordResult)
override;
61 nonvirtual
bool LookupWordHelper_ (
const Led_tString& checkWord, Led_tString* matchedWordResult)
const;
64 virtual bool OtherStringToIgnore (
const Led_tString& checkWord);
65 nonvirtual
bool OtherStringToIgnore_AllPunctuation (
const Led_tString& checkWord);
66 nonvirtual
bool OtherStringToIgnore_Sentinels (
const Led_tString& checkWord);
67 nonvirtual
bool OtherStringToIgnore_Number (
const Led_tString& checkWord);
70 virtual vector<Led_tString> GenerateSuggestions (
const Led_tString& misspelledWord)
override;
73 virtual UDInterface* GetUDInterface ()
override;
76 virtual TextBreaks* PeekAtTextBreaksUsed ()
override;
79 nonvirtual
float Heuristic (
const Led_tString& misspelledWord,
const Led_tString& candidateWord,
float atLeast);
82 nonvirtual
bool ScanForWord (
const Led_tChar* startBuf,
const Led_tChar* endBuf,
const Led_tChar** cursor,
83 const Led_tChar** wordStartResult,
const Led_tChar** wordEndResult);
86 nonvirtual shared_ptr<TextBreaks> GetTextBreaker ()
const;
87 nonvirtual
void SetTextBreaker (
const shared_ptr<TextBreaks>& textBreaker);
90 mutable shared_ptr<TextBreaks> fTextBreaker;
94 unsigned int fIndex : 22;
95 unsigned int fWordLen : 8;
96 unsigned int fXXX : 2;
99#if qStroika_Frameworks_Led_IncludeBakedInDictionaries
101 static const CompiledDictionary kDictionary_US_English;
105 nonvirtual vector<const Dictionary*> GetDictionaries ()
const;
106 nonvirtual
void SetDictionaries (
const vector<const Dictionary*>& dictionaries);
109 vector<const Dictionary*> fDictionaries;
111#if qStroika_Foundation_Debug_AssertionsChecked
113 virtual void Invariant_ ()
const override;
116#if qStroika_Foundation_Debug_AssertionsChecked
122 static void RegressionTest ();
125 static void RegressionTest_1 ();
129 class SpellCheckEngine_Basic::Dictionary {
131 using InfoBlock = SpellCheckEngine_Basic::InfoBlock;
137 virtual ~Dictionary ();
140 virtual const Led_tChar* GetTextBase ()
const = 0;
141 virtual const Led_tChar* GetTextEnd ()
const = 0;
142 virtual void GetInfoBlocks (
const InfoBlock** start,
const InfoBlock** end)
const = 0;
145 class SpellCheckEngine_Basic::EditableDictionary :
public SpellCheckEngine_Basic::Dictionary {
147 using inherited = SpellCheckEngine_Basic::Dictionary;
150 EditableDictionary () =
default;
153 virtual ~EditableDictionary ();
156 nonvirtual
void AddWordToUserDictionary (
const Led_tString& word);
159 virtual const Led_tChar* GetTextBase ()
const override;
160 virtual const Led_tChar* GetTextEnd ()
const override;
161 virtual void GetInfoBlocks (
const InfoBlock** start,
const InfoBlock** end)
const override;
164 nonvirtual
void ReadFromBuffer (
const Led_tChar* readOnlyRAMDictStart,
const Led_tChar* readOnlyRAMDictEnd);
165 nonvirtual vector<Led_tChar> SaveToBuffer ()
const;
168 nonvirtual
void ConstructInfoBlocksEtcFromWordList ();
171 set<Led_tString> fSortedWordList;
172 Led_tChar* fDictBufStart{
nullptr};
173 Led_tChar* fDictBufEnd{
nullptr};
174 vector<InfoBlock> fInfoBlocks;
177 class SpellCheckEngine_Basic::CompiledDictionary :
public SpellCheckEngine_Basic::Dictionary {
179 using inherited = SpellCheckEngine_Basic::Dictionary;
182 struct CompiledDictionaryData {
183 const Led_tChar* fTextDataStart;
184 const Led_tChar* fTextDataEnd;
185 const InfoBlock* fInfoBlocksStart;
186 const InfoBlock* fInfoBlocksEnd;
190 CompiledDictionary (
const CompiledDictionaryData& data);
193 virtual const Led_tChar* GetTextBase ()
const override;
194 virtual const Led_tChar* GetTextEnd ()
const override;
195 virtual void GetInfoBlocks (
const InfoBlock** start,
const InfoBlock** end)
const override;
198 CompiledDictionaryData fData;
207 class TextBreaks_SpellChecker :
public TextBreaks_Basic {
209 using inherited = TextBreaks_Basic;
212 TextBreaks_SpellChecker ();
215 virtual CharacterClasses CharToCharacterClass (
const Led_tChar* startOfText,
size_t lengthOfText,
const Led_tChar* charToExamine)
const override;
217#if qStroika_Foundation_Debug_AssertionsChecked
219 nonvirtual
void RegressionTest ();
230 class SpellCheckEngine_Basic_Simple :
public SpellCheckEngine_Basic,
private SpellCheckEngine::UDInterface {
232 using inherited = SpellCheckEngine_Basic;
235 using SpellCheckEngine::UDInterface;
238 SpellCheckEngine_Basic_Simple ();
239 ~SpellCheckEngine_Basic_Simple ();
242 virtual UDInterface* GetUDInterface ()
override;
246 virtual bool AddWordToUserDictionarySupported ()
const override;
247 virtual void AddWordToUserDictionary (
const Led_tString& word)
override;
250 nonvirtual
const Dictionary* GetMainDictionary ()
const;
251 nonvirtual
void SetMainDictionary (
const Dictionary* mainDictionary);
254 const Dictionary* fMainDictionary;
257 nonvirtual filesystem::path GetUserDictionary ()
const;
258 nonvirtual
void SetUserDictionary (
const filesystem::path& userDictionary);
261 filesystem::path fUDName;
262 EditableDictionary* fUD;
265 nonvirtual
void ReadFromUD ();
266 nonvirtual
void WriteToUD ();
276#include "SpellCheckEngine_Basic.inl"