4#ifndef _Stroika_Frameworks_Led_StyledTextIO_HTML_h_
5#define _Stroika_Frameworks_Led_StyledTextIO_HTML_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
9#include "Stroika/Frameworks/Led/StyledTextIO/StyledTextIO.h"
19namespace Stroika::Frameworks::Led::StyledTextIO {
27#ifndef qThrowAwayMostUnknownHTMLTags
28#define qThrowAwayMostUnknownHTMLTags 1
36#ifndef qWriteOutMostHTMLEntitiesByName
37#define qWriteOutMostHTMLEntitiesByName 0
46 HTMLInfo () =
default;
49 struct EntityRefMapEntry {
50 EntityRefMapEntry (
const string& entityRefName,
wchar_t charValue);
52 string fEntityRefName;
56 static EntityRefMapEntry sDefaultEntityRefMapTable[];
57 static const size_t kDefaultEntityRefMapTable_Count;
62 static FontSpecification::FontSize HTMLFontSizeToRealFontSize (
int size);
63 static int RealFontSizeToHTMLFontSize (FontSpecification::FontSize size);
70 vector<string> fUnknownHeaderTags;
79 class StyledTextIOReader_HTML :
public StyledTextIOReader {
81 StyledTextIOReader_HTML (SrcStream* srcStream, SinkStream* sinkStream, HTMLInfo* saveHTMLInfoInto =
nullptr);
84 virtual void Read ()
override;
85 virtual bool QuickLookAppearsToBeRightFormat ()
override;
88 using EntityRefMapEntry = HTMLInfo::EntityRefMapEntry;
91 virtual const vector<EntityRefMapEntry>& GetEntityRefMapTable ()
const;
100 nonvirtual ThingyType ScanTilNextHTMLThingy ();
101 nonvirtual
void ScanTilAfterHTMLThingy (ThingyType thingy);
104 nonvirtual
bool LookingAt (
const char* text)
const;
107 nonvirtual Led_tString MapInputTextToTString (
const string& text);
110 nonvirtual
void EmitText (
const Led_tString& text,
bool skipNLCheck =
false);
111 virtual void EmitText (
const Led_tChar* text,
size_t nBytes,
bool skipNLCheck =
false);
112 nonvirtual
void HandleHTMLThingy (ThingyType thingy,
const string& text);
113 virtual void HandleHTMLThingy (ThingyType thingy,
const char* text,
size_t nBytes);
116 virtual void HandleHTMLThingy_EntityReference (
const char* text,
size_t nBytes);
117 virtual void HandleHTMLThingy_Tag (
const char* text,
size_t nBytes);
120 nonvirtual
void ExtractHTMLTagIntoTagNameBuf (
const char* text,
size_t nBytes,
char* tagBuf,
size_t tagBufSize,
bool* isStartTag);
123 nonvirtual IncrementalFontSpecification ExtractFontSpecFromCSSStyleAttribute (
const char* text,
size_t nBytes);
124 nonvirtual
void ApplyCSSStyleAttributeToCurrentFontStack (
const char* text,
size_t nBytes);
125 nonvirtual
void GrabAndApplyCSSStyleFromTagText (
const char* text,
size_t nBytes);
128 virtual void HandleHTMLThingyTag_BANG_doctype (
bool start,
const char* text,
size_t nBytes);
129 virtual void HandleHTMLThingyTag_a (
bool start,
const char* text,
size_t nBytes);
130 virtual void HandleHTMLThingyTag_b (
bool start,
const char* text,
size_t nBytes);
131 virtual void HandleHTMLThingyTag_basefont (
bool start,
const char* text,
size_t nBytes);
132 virtual void HandleHTMLThingyTag_big (
bool start,
const char* text,
size_t nBytes);
133 virtual void HandleHTMLThingyTag_blockquote (
bool start,
const char* text,
size_t nBytes);
134 virtual void HandleHTMLThingyTag_br (
bool start,
const char* text,
size_t nBytes);
135 virtual void HandleHTMLThingyTag_body (
bool start,
const char* text,
size_t nBytes);
136 virtual void HandleHTMLThingyTag_code (
bool start,
const char* text,
size_t nBytes);
137 virtual void HandleHTMLThingyTag_comment (
bool start,
const char* text,
size_t nBytes);
138 virtual void HandleHTMLThingyTag_dir (
bool start,
const char* text,
size_t nBytes);
139 virtual void HandleHTMLThingyTag_div (
bool start,
const char* text,
size_t nBytes);
140 virtual void HandleHTMLThingyTag_em (
bool start,
const char* text,
size_t nBytes);
141 virtual void HandleHTMLThingyTag_font (
bool start,
const char* text,
size_t nBytes);
142 virtual void HandleHTMLThingyTag_head (
bool start,
const char* text,
size_t nBytes);
143 virtual void HandleHTMLThingyTag_html (
bool start,
const char* text,
size_t nBytes);
144 virtual void HandleHTMLThingyTag_hr (
bool start,
const char* text,
size_t nBytes);
145 virtual void HandleHTMLThingyTag_hN (
bool start,
const char* text,
size_t nBytes);
146 virtual void HandleHTMLThingyTag_i (
bool start,
const char* text,
size_t nBytes);
147 virtual void HandleHTMLThingyTag_img (
bool start,
const char* text,
size_t nBytes);
148 virtual void HandleHTMLThingyTag_li (
bool start,
const char* text,
size_t nBytes);
149 virtual void HandleHTMLThingyTag_listing (
bool start,
const char* text,
size_t nBytes);
150 virtual void HandleHTMLThingyTag_ol (
bool start,
const char* text,
size_t nBytes);
151 virtual void HandleHTMLThingyTag_p (
bool start,
const char* text,
size_t nBytes);
152 virtual void HandleHTMLThingyTag_plaintext (
bool start,
const char* text,
size_t nBytes);
153 virtual void HandleHTMLThingyTag_pre (
bool start,
const char* text,
size_t nBytes);
154 virtual void HandleHTMLThingyTag_s (
bool start,
const char* text,
size_t nBytes);
155 virtual void HandleHTMLThingyTag_samp (
bool start,
const char* text,
size_t nBytes);
156 virtual void HandleHTMLThingyTag_small (
bool start,
const char* text,
size_t nBytes);
157 virtual void HandleHTMLThingyTag_span (
bool start,
const char* text,
size_t nBytes);
158 virtual void HandleHTMLThingyTag_strike (
bool start,
const char* text,
size_t nBytes);
159 virtual void HandleHTMLThingyTag_strong (
bool start,
const char* text,
size_t nBytes);
160 virtual void HandleHTMLThingyTag_sub (
bool start,
const char* text,
size_t nBytes);
161 virtual void HandleHTMLThingyTag_sup (
bool start,
const char* text,
size_t nBytes);
162 virtual void HandleHTMLThingyTag_table (
bool start,
const char* text,
size_t nBytes);
163 virtual void HandleHTMLThingyTag_td (
bool start,
const char* text,
size_t nBytes);
164 virtual void HandleHTMLThingyTag_th (
bool start,
const char* text,
size_t nBytes);
165 virtual void HandleHTMLThingyTag_title (
bool start,
const char* text,
size_t nBytes);
166 virtual void HandleHTMLThingyTag_tr (
bool start,
const char* text,
size_t nBytes);
167 virtual void HandleHTMLThingyTag_tt (
bool start,
const char* text,
size_t nBytes);
168 virtual void HandleHTMLThingyTag_u (
bool start,
const char* text,
size_t nBytes);
169 virtual void HandleHTMLThingyTag_ul (
bool start,
const char* text,
size_t nBytes);
170 virtual void HandleHTMLThingyTag_var (
bool start,
const char* text,
size_t nBytes);
171 virtual void HandleHTMLThingyTag_xmp (
bool start,
const char* text,
size_t nBytes);
173 virtual void HandleHTMLThingyTagUnknown (
bool start,
const char* text,
size_t nBytes);
176 nonvirtual
void BasicFontStackOperation (
bool start);
177 nonvirtual
void EmitForcedLineBreak ();
180 nonvirtual
bool ParseHTMLTagArgOut (
const string& tagText,
const string& attrName,
string* attrValue);
181 nonvirtual
bool ParseCSSTagArgOut (
const string& text,
const string& attrName,
string* attrValue);
184 nonvirtual
void StartPara ();
185 nonvirtual
void EndParaIfOpen ();
188 bool fInAPara{
false};
192 virtual void SetHTMLFontSize (
int to);
195 int fHTMLBaseFontSize{3};
196 int fHTMLFontSize{3};
199 HTMLInfo* fSaveHTMLInfoInto{
nullptr};
200 bool fReadingBody{
false};
201 vector<FontSpecification> fFontStack;
202 bool fComingTextIsTitle{
false};
203 bool fNormalizeInputWhitespace{
true};
204 bool fLastCharSpace{
true};
205 bool fHiddenTextMode{
false};
206 Led_tString fHiddenTextAccumulation;
207 size_t fCurAHRefStart{size_t (-1)};
208 string fCurAHRefText;
209 unsigned int fULNestingCount{0};
211 unsigned int fTableOpenCount{0};
212 bool fTableRowOpen{
false};
213 bool fTableCellOpen{
false};
221 class StyledTextIOWriter_HTML :
public StyledTextIOWriter {
223 StyledTextIOWriter_HTML (SrcStream* srcStream, SinkStream* sinkStream,
const HTMLInfo* getHTMLInfoFrom =
nullptr);
224 ~StyledTextIOWriter_HTML ();
227 virtual void Write ()
override;
230 using EntityRefMapEntry = HTMLInfo::EntityRefMapEntry;
233 virtual const vector<EntityRefMapEntry>& GetEntityRefMapTable ()
const;
236 using Table = StyledTextIOWriter::SrcStream::Table;
242 nonvirtual
void WriteHeader (WriterContext& );
243 nonvirtual
void WriteBody (WriterContext& writerContext);
244 nonvirtual
void WriteInnerBody (WriterContext& writerContext);
245 nonvirtual
void WriteBodyCharacter (WriterContext& writerContext, Led_tChar c);
246 nonvirtual
void WriteTable (WriterContext& writerContext, Table* table);
247 nonvirtual
void WriteOpenTag (WriterContext& writerContext,
const string& tagName,
const string& tagExtras =
string{});
248 nonvirtual
void WriteOpenTagSpecial (WriterContext& writerContext,
const string& tagName,
const string& tagFullText);
249 nonvirtual
void WriteCloseTag (WriterContext& writerContext,
const string& tagName);
250 nonvirtual
void WriteOpenCloseTag (WriterContext& writerContext,
const string& tagName,
const string& tagExtras =
string{});
251 nonvirtual
bool IsTagOnStack (WriterContext& writerContext,
const string& tagName);
252 nonvirtual
void EmitBodyFontInfoChange (WriterContext& writerContext,
const FontSpecification& newOne,
bool skipDoingOpenTags);
253 nonvirtual
void AssureStyleRunSummaryBuilt (WriterContext& writerContext);
254 nonvirtual
string MapOutputTextFromWString (
const wstring& text);
255 nonvirtual
string MapOutputTextFromTString (
const Led_tString& text);
258 const HTMLInfo* fGetHTMLInfoFrom;
259 vector<StyledInfoSummaryRecord> fStyleRunSummary;
260 Led_tChar fSoftLineBreakChar;
263 class StyledTextIOWriter_HTML::WriterContext {
265 WriterContext (StyledTextIOWriter_HTML& writer);
266 WriterContext (WriterContext& parentContext, SrcStream& srcStream);
269 nonvirtual StyledTextIOWriter_HTML& GetWriter ()
const;
272 StyledTextIOWriter_HTML& fWriter;
275 nonvirtual SrcStream& GetSrcStream ()
const;
276 nonvirtual SinkStream& GetSinkStream ()
const;
279 StyledTextIOWriter::SrcStream& fSrcStream;
282 StyledInfoSummaryRecord fLastEmittedISR;
283 size_t fLastStyleChangeAt;
285 size_t fLastForcedNLAt;
286 bool fEmittedStartOfPara;
288 bool fEmittingListItem;
289 vector<string> fTagStack;
293 nonvirtual
size_t GetCurSrcOffset ()
const;
294#if qStroika_Frameworks_Led_SupportGDI
295 nonvirtual SimpleEmbeddedObjectStyleMarker* GetCurSimpleEmbeddedObjectStyleMarker ()
const;
310 inline HTMLInfo::EntityRefMapEntry::EntityRefMapEntry (
const string& entityRefName,
wchar_t charValue)
311 : fEntityRefName (entityRefName)
312 , fCharValue (charValue)
321 inline void StyledTextIOReader_HTML::EmitText (
const Led_tString& text,
bool skipNLCheck)
323 EmitText (text.c_str (), text.length (), skipNLCheck);
325 inline void StyledTextIOReader_HTML::HandleHTMLThingy (StyledTextIOReader_HTML::ThingyType thingy,
const string& text)
327 HandleHTMLThingy (thingy, text.c_str (), text.length ());
335 inline StyledTextIOWriter_HTML::WriterContext::WriterContext (StyledTextIOWriter_HTML& writer)
337 , fSrcStream (fWriter.GetSrcStream ())
338 , fLastEmittedISR (IncrementalFontSpecification (), 0)
339 , fLastStyleChangeAt (0)
341 , fLastForcedNLAt (0)
342 , fEmittedStartOfPara (false)
343 , fEmittingList (false)
344 , fEmittingListItem (false)
346 , fInTableCell (false)
349 inline StyledTextIOWriter_HTML::WriterContext::WriterContext (WriterContext& parentContext, SrcStream& srcStream)
350 : fWriter (parentContext.fWriter)
351 , fSrcStream (srcStream)
352 , fLastEmittedISR (IncrementalFontSpecification (), 0)
353 , fLastStyleChangeAt (0)
355 , fLastForcedNLAt (0)
356 , fEmittedStartOfPara (false)
357 , fEmittingList (false)
358 , fEmittingListItem (false)
360 , fInTableCell (true)
363 inline StyledTextIOWriter_HTML& StyledTextIOWriter_HTML::WriterContext::GetWriter ()
const
367 inline StyledTextIOWriter::SrcStream& StyledTextIOWriter_HTML::WriterContext::GetSrcStream ()
const
371 inline StyledTextIOWriter::SinkStream& StyledTextIOWriter_HTML::WriterContext::GetSinkStream ()
const
373 return fWriter.GetSinkStream ();