🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
MarkdownBlockParser.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
26#include <vector>
27#include <memory>
28
29AST_NAMESPACE_BEGIN
30
36class MarkdownSax;
37
41class AST_UTIL_API MarkdownBlockParser
42{
43public:
46
48 void feed(StringView data);
49
51 void finish();
52
54 void reset();
55
56private:
57 // ---- 块级状态 ----
58 enum class EState
59 {
60 eLineStart,
61 eHeadingHashes,
62 eHeadingContent,
63 eCodeFenceOpen,
64 eCodeBlockContent,
65 eBlockquoteContent,
66 eListMarker,
67 eListItemContent,
68 eParagraph,
69 eTable,
70 };
71
72 // ---- 块栈帧 ----
73 enum class EBlockType
74 {
75 Paragraph,
76 Heading,
77 CodeBlock,
78 List,
79 ListItem,
80 Blockquote,
81 };
82 struct BlockFrame
83 {
84 EBlockType type;
85 int level;
86 bool ordered;
87 };
88
89 // ---- 核心方法 ----
90 void feedChar(char c);
91
93 void flushInlineContent();
95 void flushInlineContent(bool force);
96
97 // ---- 行首分类 ----
98 void classifyFirstChar(char c);
99
100 // ---- 各状态字符处理 ----
101 void handleHeadingHashes(char c);
102 void handleHeadingChar(char c);
103 void handleCodeFenceOpen(char c);
104 void handleCodeBlockChar(char c);
105 void handleBlockquoteChar(char c);
106 void handleListMarker(char c);
107 void handleParagraphChar(char c);
108 void handleTableChar(char c);
109
110 // ---- 块栈管理 ----
111 void openBlock(EBlockType type, int level = 0, bool ordered = false);
112 void closeTop();
113 void closeToType(EBlockType type);
114 void closeAllBlocks();
115 bool hasBlock(EBlockType type) const;
116
117 // ---- 段落辅助 ----
118 void ensureParagraph();
119 void endParagraph();
120 void closeParagraph();
121 void ensureListBlock(bool ordered, int indent = 0);
122
123 // ---- 文档辅助 ----
124 void ensureDocStarted();
125
126 // ============================================================
127 // 状态成员
128 // ============================================================
129 MarkdownSax& sax_;
130 MarkdownInlineParser inlineSM_;
131 std::unique_ptr<MarkdownTableParser> tableSM_;
132
133 EState state_ = EState::eLineStart;
134 std::vector<BlockFrame> blockStack_;
135
136 // 分类缓冲(行首判定用,最多缓冲几个字符)
137 std::string classBuf_;
138 // 行内内容缓冲(分类确认后,累积待喂入 inlineSM 的内容)
139 std::string contentBuf_;
140 // 代码块行缓冲(仅代码块内逐行检测关界围栏)
141 std::string codeLineBuf_;
142
143 // ---- 标题状态 ----
144 int headingLevel_ = 0;
145
146 // ---- 代码围栏状态 ----
147 char codeFenceChar_ = 0;
148 int codeFenceCount_ = 0;
149 std::string codeFenceLang_;
150
151 // ---- 列表状态 ----
152 bool inList_ = false;
153 bool listOrdered_ = false;
154 int currentLineIndent_ = 0;
155 bool listItemAfterNL_ = false;
156 bool lineFresh_ = true;
157
159 int currentListIndent() const;
161 void closePendingListItem();
162
163 // ---- 段落跨行追踪 ----
164 bool paraAfterNL_ = false;
165 bool paraHadContent_ = false;
166
167 // ---- 文档状态 ----
168 bool docStarted_ = false;
169};
170
171
172
175AST_NAMESPACE_END
Markdown 表格流式解析状态机 — SAX 事件驱动
Markdown 块级解析器(字符级流式解析,SAX 事件驱动)
定义 MarkdownBlockParser.hpp:42
Markdown内联文本状态机(流式输入输出SAX事件驱动)
定义 MarkdownInlineParser.hpp:37
定义 MarkdownSax.hpp:45