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);
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';
256 HtmlAnchorTag(
const std::string& url,
const std::string& title = std::string());
261 out <<
"HtmlAnchorTag: " << *
text() <<
'\n';
276 out <<
"InlineHtmlContents: " << *
text() <<
'\n';
290 out <<
"InlineHtmlComment: " << *
text() <<
'\n';
302 void writeAsHtml(std::ostream& out)
const override;
307 out <<
"CodeBlock: " << *
text() <<
'\n';
319 void writeAsHtml(std::ostream& out)
const override;
325 out <<
"CodeSpan: " << *
text() <<
'\n';
340 out <<
"Header " << mLevel <<
": " << *
text() <<
'\n';
353 out <<
"<h" << mLevel <<
">";
359 out <<
"</h" << mLevel <<
">\n";
369 BlankLine(
const std::string& actualContents = std::string()) :
377 out <<
"BlankLine: " << *
text() <<
'\n';
403 out <<
'\\' << mChar;
409 out <<
"EscapedCharacter: " << mChar <<
'\n';
448 void writeAsHtml(std::ostream& out)
const override;
453 out <<
"Container: error!" <<
'\n';
456 void writeToken(
size_t indent, std::ostream& out)
const override;
481 Container(contents), mIsBlockTag(isBlockTag)
505 return "InlineHtmlBlock";
530 mInhibitParagraphs = set;
536 return mInhibitParagraphs;
565 bool mInhibitParagraphs;
582 return "UnorderedList";
616 return "OrderedList";
656 out <<
"<blockquote>\n";
662 out <<
"\n</blockquote>\n";
720 return (mOpenMarker && mMatch == 0 && !mCannotMatch);
726 return (!mOpenMarker && mMatch == 0 && !mCannotMatch);
732 return (mOpenMarker && mMatch != 0);
738 return (!mOpenMarker && mMatch != 0);
741 void writeAsHtml(std::ostream& out)
const override;
742 void writeToken(std::ostream& out)
const override;
753 return mTokenCharacter;
765 return (mMatch != 0);
796 mCannotMatch = mDisabled =
true;
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< Target > find(const std::string &id) const
void add(const std::string &id, const std::string &url, const std::string &title)
virtual bool inhibitParagraphs() const
virtual bool isUnmatchedOpenMarker() const
virtual std::optional< TokenGroup > processSpanElements(const LinkIds &idTable)
virtual void writeToken(size_t indent, std::ostream &out) const
virtual void writeToken(std::ostream &out) const =0
virtual bool isBlankLine() const
virtual void postWrite(std::ostream &out) const
virtual bool isMatchedOpenMarker() const
virtual bool isContainer() const
virtual bool canContainMarkup() const
virtual bool isUnmatchedCloseMarker() const
virtual bool isMatchedCloseMarker() const
virtual void preWrite(std::ostream &out) const
virtual void writeAsOriginal(std::ostream &out) const
virtual std::optional< std::string > text() const
virtual void writeAsHtml(std::ostream &) const =0
void writeToken(std::ostream &out) const override
bool isBlankLine() const override
BlankLine(const std::string &actualContents=std::string())
void preWrite(std::ostream &out) const override
void postWrite(std::ostream &out) const override
TokenPtr clone(const TokenGroup &newContents) const override
std::string containerName() const override
BlockQuote(const TokenGroup &contents)
void writeAsHtml(std::ostream &out) const override
bool isMatchedCloseMarker() const override
void cannotMatch(bool set)
bool isUnmatchedOpenMarker() const override
BoldOrItalicMarker(bool open, char c, size_t size)
bool isUnmatchedCloseMarker() const override
bool isMatchedOpenMarker() const override
void writeToken(std::ostream &out) const override
BoldOrItalicMarker * matchedTo() const
bool isOpenMarker() const
char tokenCharacter() const
void matched(BoldOrItalicMarker *match, int id=-1)
void writeAsHtml(std::ostream &out) const override
void writeToken(std::ostream &out) const override
CodeBlock(const std::string &actualContents)
void writeAsHtml(std::ostream &out) const override
void writeAsOriginal(std::ostream &out) const override
void writeToken(std::ostream &out) const override
CodeSpan(const std::string &actualContents)
void writeAsHtml(std::ostream &out) const override
bool isContainer() const override
void swapSubtokens(TokenGroup &tokens)
void appendSubtokens(TokenGroup &tokens)
const TokenGroup & subTokens() const
std::optional< TokenGroup > processSpanElements(const LinkIds &idTable) override
void writeToken(std::ostream &out) const override
Container(const TokenGroup &contents=TokenGroup())
virtual TokenPtr clone(const TokenGroup &newContents) const
virtual std::string containerName() const
void writeAsHtml(std::ostream &out) const override
void writeAsOriginal(std::ostream &out) const override
void writeToken(std::ostream &out) const override
void writeToken(std::ostream &out) const override
HtmlAnchorTag(const std::string &url, const std::string &title=std::string())
void preWrite(std::ostream &out) const override
void postWrite(std::ostream &out) const override
HtmlTag(const std::string &contents)
void writeToken(std::ostream &out) const override
void writeAsHtml(std::ostream &out) const override
void writeToken(std::ostream &out) const override
Image(const std::string &altText, const std::string &url, const std::string &title)
InlineHtmlBlock(const TokenGroup &contents, bool isBlockTag=false)
TokenPtr clone(const TokenGroup &newContents) const override
bool inhibitParagraphs() const override
InlineHtmlBlock(const std::string &contents)
bool isBlankLine() const override
std::string containerName() const override
InlineHtmlContents(const std::string &contents)
void writeToken(std::ostream &out) const override
void preWrite(std::ostream &out) const override
void postWrite(std::ostream &out) const override
TokenPtr clone(const TokenGroup &newContents) const override
bool inhibitParagraphs() const override
void inhibitParagraphs(bool set)
ListItem(const TokenGroup &contents)
std::string containerName() const override
void preWrite(std::ostream &out) const override
void postWrite(std::ostream &out) const override
TokenPtr clone(const TokenGroup &newContents) const override
OrderedList(const TokenGroup &contents, bool paragraphMode=false)
std::string containerName() const override
void preWrite(std::ostream &out) const override
void postWrite(std::ostream &out) const override
TokenPtr clone(const TokenGroup &newContents) const override
Paragraph(const TokenGroup &contents)
std::string containerName() const override
RawText(const std::string &text, bool canContainMarkup=true)
std::optional< TokenGroup > processSpanElements(const LinkIds &idTable) override
void writeToken(std::ostream &out) const override
void writeAsHtml(std::ostream &out) const override
TextHolder(const std::string &text, bool canContainMarkup, unsigned int encodingFlags)
void writeToken(std::ostream &out) const override
bool canContainMarkup() const override
std::optional< std::string > text() const override
void preWrite(std::ostream &out) const override
void postWrite(std::ostream &out) const override
TokenPtr clone(const TokenGroup &newContents) const override
UnorderedList(const TokenGroup &contents, bool paragraphMode=false)
std::string containerName() const override
size_t isValidTag(const std::string &tag, bool nonBlockFirst)
std::shared_ptr< Token > TokenPtr
TokenGroup::iterator TokenGroupIter
std::list< TokenPtr > TokenGroup
TokenGroup::const_iterator CTokenGroupIter
Target(const std::string &url_, const std::string &title_)