🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
MarkdownInlineParser.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include <string>
25
26AST_NAMESPACE_BEGIN
27
33class MarkdownSax;
34
36class AST_UTIL_API MarkdownInlineParser
37{
38public:
40 : sax_(sax)
41 {}
42 void feed(StringView chunk);
43 void feed(char c, std::string& result);
44 void finish();
45 std::string& result() { return result_; }
46
48 void flushPending(std::string& result);
49
51 void flushCell();
52
53public:
55 enum class EStateFlags: int
56 {
57 ePlain = 0x00,
58 eEscape = 0x02,
59 eEmphasis = 0x04,
60 eStrong = 0x08,
61 eStrongEmphasis = eEmphasis | eStrong,
62 eDelete = 0x10,
63 };
64
66 enum class EParseMode
67 {
68 eNormal,
69 eCodeSpan,
70 eLinkText,
71 eLinkTextEnd,
72 eLinkURL,
73 eImageAlt,
74 eImageAltEnd,
75 eImageURL,
76 };
77private:
78 void toggleState(EStateFlags state);
79 EStateFlags state() const { return state_; }
80
82 void closeAllFormats(std::string& result);
83
85 void replayBufferedText(const std::string& text, std::string& result);
86
87 // ---- 定界符游程解析 ----
90 void resolveDelimRun(char next, std::string& result);
91
93 static bool isWhitespace(char c);
95 static bool isWordChar(char c);
97 static bool isPunctuation(char c);
98
99 // ---- 格式栈操作(封装深度计数器与 state_ 同步) ----
100 void openEmph(char delim);
101 void closeEmph();
102 void openStrong();
103 void closeStrong();
105 void triggerPendingDelete(std::string& result);
106
108 void flushText(std::string& result);
109
111 static std::string stripCodeSpan(const std::string& raw);
112private:
113 MarkdownSax& sax_;
114
115 EStateFlags state_ = EStateFlags::ePlain;
116 int emphDepth_ = 0;
117 int strongDepth_ = 0;
118 char emphDelim_ = 0;
119 EStateFlags pendingState_ = EStateFlags::ePlain;
120 EParseMode mode_ = EParseMode::eNormal;
121 std::string result_;
122 std::string linkText_;
123 std::string linkUrl_;
124 std::string codeBuf_;
125 char delimRunChar_ = 0;
126 int delimRunLen_ = 0;
127 char runPrevChar_ = 0;
128 bool tildePending_ = false;
129 bool textEmitted_ = false;
130 bool emphasisOpenedFirst_ = false;
131 bool pendingBang_ = false;
132 int codeSpanBackticks_ = 0;
133 int codeSpanTickRun_ = 0;
134};
135
136A_ENUM_CLASS_FLAGS(MarkdownInlineParser::EStateFlags);
137
138
141AST_NAMESPACE_END
Markdown内联文本状态机(流式输入输出SAX事件驱动)
定义 MarkdownInlineParser.hpp:37
EStateFlags
内联格式状态标志位
定义 MarkdownInlineParser.hpp:56
EParseMode
解析模式 —— 控制当前在解析哪种高层结构
定义 MarkdownInlineParser.hpp:67
定义 MarkdownSax.hpp:45