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 "SpellCheckEngine.h"
20#include "TextBreaks.h"
22namespace Stroika::Frameworks::Led {
24#if qFailToCompileLargeDataInitializedArraysBug
25#define qIncludeBakedInDictionaries 0
34#ifndef qIncludeBakedInDictionaries
36#define qIncludeBakedInDictionaries 0
44 class SpellCheckEngine_Basic :
public SpellCheckEngine {
46 using inherited = SpellCheckEngine;
50 class EditableDictionary;
51 class CompiledDictionary;
54 SpellCheckEngine_Basic (
const Dictionary* mainDictionary = NULL);
55 ~SpellCheckEngine_Basic ();
58 virtual bool ScanForUndefinedWord (
const Led_tChar* startBuf,
const Led_tChar* endBuf,
const Led_tChar** cursor,
59 const Led_tChar** wordStartResult,
const Led_tChar** wordEndResult)
override;
62 virtual bool LookupWord_ (
const Led_tString& checkWord, Led_tString* matchedWordResult)
override;
65 nonvirtual
bool LookupWordHelper_ (
const Led_tString& checkWord, Led_tString* matchedWordResult)
const;
68 virtual bool OtherStringToIgnore (
const Led_tString& checkWord);
69 nonvirtual
bool OtherStringToIgnore_AllPunctuation (
const Led_tString& checkWord);
70 nonvirtual
bool OtherStringToIgnore_Sentinels (
const Led_tString& checkWord);
71 nonvirtual
bool OtherStringToIgnore_Number (
const Led_tString& checkWord);
74 virtual vector<Led_tString> GenerateSuggestions (
const Led_tString& misspelledWord)
override;
77 virtual UDInterface* GetUDInterface ()
override;
80 virtual TextBreaks* PeekAtTextBreaksUsed ()
override;
83 nonvirtual
float Heuristic (
const Led_tString& misspelledWord,
const Led_tString& candidateWord,
float atLeast);
86 nonvirtual
bool ScanForWord (
const Led_tChar* startBuf,
const Led_tChar* endBuf,
const Led_tChar** cursor,
87 const Led_tChar** wordStartResult,
const Led_tChar** wordEndResult);
90 nonvirtual shared_ptr<TextBreaks> GetTextBreaker ()
const;
91 nonvirtual
void SetTextBreaker (
const shared_ptr<TextBreaks>& textBreaker);
94 mutable shared_ptr<TextBreaks> fTextBreaker;
98 unsigned int fIndex : 22;
99 unsigned int fWordLen : 8;
100 unsigned int fXXX : 2;
103#if qIncludeBakedInDictionaries
105 static const CompiledDictionary kDictionary_US_English;
109 nonvirtual vector<const Dictionary*> GetDictionaries ()
const;
110 nonvirtual
void SetDictionaries (
const vector<const Dictionary*>& dictionaries);
113 vector<const Dictionary*> fDictionaries;
115#if qStroika_Foundation_Debug_AssertionsChecked
117 virtual void Invariant_ ()
const override;
120#if qStroika_Foundation_Debug_AssertionsChecked
126 static void RegressionTest ();
129 static void RegressionTest_1 ();
133 class SpellCheckEngine_Basic::Dictionary {
135 using InfoBlock = SpellCheckEngine_Basic::InfoBlock;
141 virtual ~Dictionary ();
144 virtual const Led_tChar* GetTextBase ()
const = 0;
145 virtual const Led_tChar* GetTextEnd ()
const = 0;
146 virtual void GetInfoBlocks (
const InfoBlock** start,
const InfoBlock** end)
const = 0;
149 class SpellCheckEngine_Basic::EditableDictionary :
public SpellCheckEngine_Basic::Dictionary {
151 using inherited = SpellCheckEngine_Basic::Dictionary;
154 EditableDictionary () =
default;
157 virtual ~EditableDictionary ();
160 nonvirtual
void AddWordToUserDictionary (
const Led_tString& word);
163 virtual const Led_tChar* GetTextBase ()
const override;
164 virtual const Led_tChar* GetTextEnd ()
const override;
165 virtual void GetInfoBlocks (
const InfoBlock** start,
const InfoBlock** end)
const override;
168 nonvirtual
void ReadFromBuffer (
const Led_tChar* readOnlyRAMDictStart,
const Led_tChar* readOnlyRAMDictEnd);
169 nonvirtual vector<Led_tChar> SaveToBuffer ()
const;
172 nonvirtual
void ConstructInfoBlocksEtcFromWordList ();
175 set<Led_tString> fSortedWordList;
176 Led_tChar* fDictBufStart{
nullptr};
177 Led_tChar* fDictBufEnd{
nullptr};
178 vector<InfoBlock> fInfoBlocks;
181 class SpellCheckEngine_Basic::CompiledDictionary :
public SpellCheckEngine_Basic::Dictionary {
183 using inherited = SpellCheckEngine_Basic::Dictionary;
186 struct CompiledDictionaryData {
187 const Led_tChar* fTextDataStart;
188 const Led_tChar* fTextDataEnd;
189 const InfoBlock* fInfoBlocksStart;
190 const InfoBlock* fInfoBlocksEnd;
194 CompiledDictionary (
const CompiledDictionaryData& data);
197 virtual const Led_tChar* GetTextBase ()
const override;
198 virtual const Led_tChar* GetTextEnd ()
const override;
199 virtual void GetInfoBlocks (
const InfoBlock** start,
const InfoBlock** end)
const override;
202 CompiledDictionaryData fData;
211 class TextBreaks_SpellChecker :
public TextBreaks_Basic {
213 using inherited = TextBreaks_Basic;
216 TextBreaks_SpellChecker ();
219 virtual CharacterClasses CharToCharacterClass (
const Led_tChar* startOfText,
size_t lengthOfText,
const Led_tChar* charToExamine)
const override;
221#if qStroika_Foundation_Debug_AssertionsChecked
223 nonvirtual
void RegressionTest ();
234 class SpellCheckEngine_Basic_Simple :
public SpellCheckEngine_Basic,
private SpellCheckEngine::UDInterface {
236 using inherited = SpellCheckEngine_Basic;
239 using SpellCheckEngine::UDInterface;
242 SpellCheckEngine_Basic_Simple ();
243 ~SpellCheckEngine_Basic_Simple ();
246 virtual UDInterface* GetUDInterface ()
override;
250 virtual bool AddWordToUserDictionarySupported ()
const override;
251 virtual void AddWordToUserDictionary (
const Led_tString& word)
override;
254 nonvirtual
const Dictionary* GetMainDictionary ()
const;
255 nonvirtual
void SetMainDictionary (
const Dictionary* mainDictionary);
258 const Dictionary* fMainDictionary;
261 nonvirtual filesystem::path GetUserDictionary ()
const;
262 nonvirtual
void SetUserDictionary (
const filesystem::path& userDictionary);
265 filesystem::path fUDName;
266 EditableDictionary* fUD;
269 nonvirtual
void ReadFromUD ();
270 nonvirtual
void WriteToUD ();
280#include "SpellCheckEngine_Basic.inl"