Go to the documentation of this file.
11 #include <unordered_map>
29 Target(
const std::string& url_,
const std::string& title_) :
url(url_),
title(title_)
34 std::optional<Target>
find(
const std::string&
id)
const;
35 void add(
const std::string&
id,
const std::string& url,
const std::string& title);
38 using Table = std::unordered_map<std::string, Target>;
40 static std::string _scrubKey(std::string
str);
60 virtual void writeToken(std::ostream& out)
const = 0;
65 out << std::string(indent * 2,
' ');
69 virtual std::optional<TokenGroup>
75 virtual std::optional<std::string>
145 size_t isValidTag(
const std::string& tag,
bool nonBlockFirst =
false);
163 void writeAsHtml(std::ostream& out)
const override;
168 out <<
"TextHolder: " << mText <<
'\n';
171 std::optional<std::string>
180 return mCanContainMarkup;
184 const std::string mText;
185 const bool mCanContainMarkup;
186 const int mEncodingFlags;
200 out <<
"RawText: " << *
text() <<
'\n';
206 using ReplacementTable = std::vector<TokenPtr>;
208 static std::string _processHtmlTagAttributes(std::string src,
209 ReplacementTable& replacements);
210 static std::string _processCodeSpans(std::string src, ReplacementTable& replacements);
211 static std::string _processEscapedCharacters(
const std::string& src);
212 static std::string _processLinksImagesAndTags(
const std::string& src,
213 ReplacementTable& replacements,
215 static std::string _processSpaceBracketedGroupings(
const std::string& src,
216 ReplacementTable& replacements);
217 static TokenGroup _processBoldAndItalicSpans(
const std::string& src,
218 ReplacementTable& replacements);
220 static TokenGroup _encodeProcessedItems(
const std::string& src,
221 ReplacementTable& replacements);
222 static std::string _restoreProcessedItems(
const std::string& src,
223 ReplacementTable& replacements);
236 out <<
"HtmlTag: " << *
text() <<
'\n';
253 class HtmlAnchorTag : public TextHolder
256 HtmlAnchorTag(const std::string& url, const std::string& title = std::string());
259 writeToken(std::ostream& out) const override
261 out << "HtmlAnchorTag: " << *text() << '\n
';
265 class InlineHtmlContents : public TextHolder
268 InlineHtmlContents(const std::string& contents) :
269 TextHolder(contents, false, cAmps | cAngles)
274 writeToken(std::ostream& out) const override
276 out << "InlineHtmlContents: " << *text() << '\n
';
280 class InlineHtmlComment : public TextHolder
283 InlineHtmlComment(const std::string& contents) : TextHolder(contents, false, 0)
288 writeToken(std::ostream& out) const override
290 out << "InlineHtmlComment: " << *text() << '\n
';
294 class CodeBlock : public TextHolder
297 CodeBlock(const std::string& actualContents) :
298 TextHolder(actualContents, false, cDoubleAmps | cAngles | cQuotes)
302 void writeAsHtml(std::ostream& out) const override;
305 writeToken(std::ostream& out) const override
307 out << "CodeBlock: " << *text() << '\n
';
311 class CodeSpan : public TextHolder
314 CodeSpan(const std::string& actualContents) :
315 TextHolder(actualContents, false, cDoubleAmps | cAngles | cQuotes)
319 void writeAsHtml(std::ostream& out) const override;
320 void writeAsOriginal(std::ostream& out) const override;
323 writeToken(std::ostream& out) const override
325 out << "CodeSpan: " << *text() << '\n
';
329 class Header : public TextHolder
332 Header(size_t level, const std::string& text) :
333 TextHolder(text, true, cAmps | cAngles | cQuotes), mLevel(level)
338 writeToken(std::ostream& out) const override
340 out << "Header " << mLevel << ": " << *text() << '\n
';
344 inhibitParagraphs() const override
351 preWrite(std::ostream& out) const override
353 out << "<h" << mLevel << ">";
357 postWrite(std::ostream& out) const override
359 out << "</h" << mLevel << ">\n";
366 class BlankLine : public TextHolder
369 BlankLine(const std::string& actualContents = std::string()) :
370 TextHolder(actualContents, false, 0)
375 writeToken(std::ostream& out) const override
377 out << "BlankLine: " << *text() << '\n
';
381 isBlankLine() const override
387 class EscapedCharacter : public Token
390 EscapedCharacter(char c) : mChar(c)
395 writeAsHtml(std::ostream& out) const override
401 writeAsOriginal(std::ostream& out) const override
403 out << '\\
' << mChar;
407 writeToken(std::ostream& out) const override
409 out << "EscapedCharacter: " << mChar << '\n
';
416 class Container : public Token
419 Container(const TokenGroup& contents = TokenGroup()) :
420 mSubTokens(contents), mParagraphMode(false)
431 appendSubtokens(TokenGroup& tokens)
433 mSubTokens.splice(mSubTokens.end(), tokens);
437 swapSubtokens(TokenGroup& tokens)
439 mSubTokens.swap(tokens);
443 isContainer() const override
448 void writeAsHtml(std::ostream& out) const override;
451 writeToken(std::ostream& out) const override
453 out << "Container: error!" << '\n
';
456 void writeToken(size_t indent, std::ostream& out) const override;
458 std::optional<TokenGroup> processSpanElements(const LinkIds& idTable) override;
461 clone(const TokenGroup& newContents) const
463 return TokenPtr(new Container(newContents));
467 containerName() const
473 TokenGroup mSubTokens;
477 class InlineHtmlBlock : public Container
480 InlineHtmlBlock(const TokenGroup& contents, bool isBlockTag = false) :
481 Container(contents), mIsBlockTag(isBlockTag)
485 InlineHtmlBlock(const std::string& contents) : mIsBlockTag(false)
487 mSubTokens.push_back(TokenPtr(new InlineHtmlContents(contents)));
491 inhibitParagraphs() const override
497 clone(const TokenGroup& newContents) const override
499 return TokenPtr(new InlineHtmlBlock(newContents));
503 containerName() const override
505 return "InlineHtmlBlock";
508 // Inline HTML blocks always end with a blank line, so report it as one for
511 isBlankLine() const override
520 class ListItem : public Container
523 ListItem(const TokenGroup& contents) : Container(contents), mInhibitParagraphs(true)
528 inhibitParagraphs(bool set)
530 mInhibitParagraphs = set;
534 inhibitParagraphs() const override
536 return mInhibitParagraphs;
540 clone(const TokenGroup& newContents) const override
542 return TokenPtr(new ListItem(newContents));
546 containerName() const override
553 preWrite(std::ostream& out) const override
559 postWrite(std::ostream& out) const override
565 bool mInhibitParagraphs;
568 class UnorderedList : public Container
571 UnorderedList(const TokenGroup& contents, bool paragraphMode = false);
574 clone(const TokenGroup& newContents) const override
576 return TokenPtr(new UnorderedList(newContents));
580 containerName() const override
582 return "UnorderedList";
587 preWrite(std::ostream& out) const override
593 postWrite(std::ostream& out) const override
599 class OrderedList : public UnorderedList
602 OrderedList(const TokenGroup& contents, bool paragraphMode = false) :
603 UnorderedList(contents, paragraphMode)
608 clone(const TokenGroup& newContents) const override
610 return TokenPtr(new OrderedList(newContents));
614 containerName() const override
616 return "OrderedList";
621 preWrite(std::ostream& out) const override
627 postWrite(std::ostream& out) const override
633 class BlockQuote : public Container
636 BlockQuote(const TokenGroup& contents) : Container(contents)
641 clone(const TokenGroup& newContents) const override
643 return TokenPtr(new BlockQuote(newContents));
647 containerName() const override
654 preWrite(std::ostream& out) const override
656 out << "<blockquote>\n";
660 postWrite(std::ostream& out) const override
662 out << "\n</blockquote>\n";
666 class Paragraph : public Container
673 Paragraph(const TokenGroup& contents) : Container(contents)
678 clone(const TokenGroup& newContents) const override
680 return TokenPtr(new Paragraph(newContents));
684 containerName() const override
691 preWrite(std::ostream& out) const override
697 postWrite(std::ostream& out) const override
703 class BoldOrItalicMarker : public Token
706 BoldOrItalicMarker(bool open, char c, size_t size) :
718 isUnmatchedOpenMarker() const override
720 return (mOpenMarker && mMatch == 0 && !mCannotMatch);
724 isUnmatchedCloseMarker() const override
726 return (!mOpenMarker && mMatch == 0 && !mCannotMatch);
730 isMatchedOpenMarker() const override
732 return (mOpenMarker && mMatch != 0);
736 isMatchedCloseMarker() const override
738 return (!mOpenMarker && mMatch != 0);
741 void writeAsHtml(std::ostream& out) const override;
742 void writeToken(std::ostream& out) const override;
751 tokenCharacter() const
753 return mTokenCharacter;
765 return (mMatch != 0);
781 matched(BoldOrItalicMarker* match, int id = -1)
788 cannotMatch(bool set)
796 mCannotMatch = mDisabled = true;
800 bool mOpenMarker; // Otherwise it's a close-marker
801 char mTokenCharacter;
812 Image(
const std::string& altText,
const std::string& url,
const std::string& title) :
813 mAltText(altText), mUrl(url), mTitle(title)
817 void writeAsHtml(std::ostream& out)
const override;
822 out <<
"Image: " << mUrl <<
'\n';
826 const std::string mAltText, mUrl, mTitle;
std::optional< std::string > text() const override
virtual bool isUnmatchedOpenMarker() const
void writeToken(std::ostream &out) const override
virtual bool isMatchedOpenMarker() const
Target(const std::string &url_, const std::string &title_)
RawText(const std::string &text, bool canContainMarkup=true)
HtmlTag(const std::string &contents)
virtual std::optional< std::string > text() const
TextHolder(const std::string &text, bool canContainMarkup, unsigned int encodingFlags)
virtual bool inhibitParagraphs() const
virtual bool isBlankLine() const
virtual bool isContainer() const
size_t isValidTag(const std::string &tag, bool nonBlockFirst)
void postWrite(std::ostream &out) const override
bool canContainMarkup() const override
void add(const std::string &id, const std::string &url, const std::string &title)
void preWrite(std::ostream &out) const override
double a(double t, double a0, double j)
virtual void writeToken(size_t indent, std::ostream &out) const
virtual std::optional< TokenGroup > processSpanElements(const LinkIds &idTable)
TokenGroup::iterator TokenGroupIter
virtual void writeToken(std::ostream &out) const =0
virtual bool canContainMarkup() const
virtual void writeAsHtml(std::ostream &) const =0
virtual void preWrite(std::ostream &out) const
virtual void writeAsOriginal(std::ostream &out) const
TokenGroup::const_iterator CTokenGroupIter
virtual void postWrite(std::ostream &out) const
virtual bool isMatchedCloseMarker() const
void writeToken(std::ostream &out) const override
void writeAsHtml(std::ostream &out) const override
void writeToken(std::ostream &out) const override
std::list< TokenPtr > TokenGroup
std::optional< TokenGroup > processSpanElements(const LinkIds &idTable) override
void writeToken(std::ostream &out) const override
std::optional< Target > find(const std::string &id) const
double s(double t, double s0, double v0, double a0, double j)
virtual bool isUnmatchedCloseMarker() const
Image(const std::string &altText, const std::string &url, const std::string &title)