diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-04-23 18:58:41 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-04-23 18:58:41 +0800 |
| commit | 7d9f9be43469748148da5cdf516cd8b32238e1f5 (patch) | |
| tree | e3904be9901294e0193419cb30e8f6fa1d33fae3 /src/ast.rs | |
| parent | 7525fe0834e47bef425135e8cda1d576c44060a5 (diff) | |
重构AST抽象rewrite
Diffstat (limited to 'src/ast.rs')
| -rw-r--r-- | src/ast.rs | 155 |
1 files changed, 113 insertions, 42 deletions
@@ -3,93 +3,164 @@ use std::collections::HashMap; pub mod parser; pub mod renderer; +/// 语法树 pub struct MarkdownAST { - pub root: Layer, + /// 块列表 + pub blocks: Vec<Block>, } +/// 层级 pub type Level = u8; + +/// 语言(用于代码块) pub type Lang = String; + +/// 标题(用于 Headings) pub type Title = String; + +/// 链接(用于 Link) pub type Url = String; -pub struct Layer { - pub range_row_begin: u32, - pub range_row_end: u32, - pub lines: Vec<Line>, +/// 块 +pub struct Block { + /// 块开始行 + pub begin_row: u32, + + /// 块结束行 + pub end_row: u32, + + /// 块数据 + pub data: BlockData, +} + +/// 块数据 +pub enum BlockData { + // 头 + Heading(Level, Line), + + // 列表 + UnorderedList(Vec<Line>, UnorderedListPrefix), + OrderedList(Vec<Line>, u32), + + /// 普通行 + Lines(Vec<Line>), + + /// 表格 + Table(Table), + + /// 代码块 + Code(Fragment, Lang), + + // 引用 + Blockquotes(Vec<Line>), + + // 分割线 + HorizontalRule(HorizontalRuleStyle), } +/// 下划线风格 +pub enum HorizontalRuleStyle { + Stars, + Dashes, + Underscores, +} + +/// 无序列表前缀 +pub enum UnorderedListPrefix { + /// 星号 "*" + Star, + + /// 减号 "-" + Dash, + + /// 加号 "+" + Plus, +} + +/// 行 pub struct Line { + /// 行所在位置 pub row: u32, + + /// 行内记录的词 pub tokens: Vec<Token>, } +/// 词 pub struct Token { + /// 开始行 pub begin_row: u32, + + /// 开始列 pub begin_col: u16, + + /// 结束行 pub end_row: u32, + + /// 结束列 pub end_col: u16, - pub token: TokenData, + + /// 词数据 + pub data: TokenData, } +/// 词数据 pub enum TokenData { + /// 普通 - 记录片段 Normal(Fragment), - Newline, - Newlayer(Layer), - - // Headings - Heading(Level, Line, Layer), - - // Emphasis - Emphasis(Vec<TokenData>, EmphasisStyle), - - // Lists - UnorderedList(Line, UnorderedListPrefix), - OrderedList(Line, u32), - - // Links - Link(Vec<Fragment>, Url, Option<Title>, LinkType), - - // Code - InlineCode(Vec<Fragment>), - CodeBlock(Vec<Line>, Option<Lang>), - // Blockquotes - Blockquotes(Layer), + // 强调 - 记录词列表(嵌套)和强调样式 + Emphasis(Vec<Token>, EmphasisFormat), - // HorizontalRule - HorizontalRule(HorizontalRuleType), + // 链接 - 记录词列表(嵌套)、链接、标题、链接类型 + Link(Vec<Token>, Url, Option<Title>, LinkType), - // Table - Table(Table), + // 内联代码 - 记录词列表(嵌套) + InlineCode(Vec<Token>), } +/// 片段 +#[derive(Debug, Default)] pub struct Fragment { + /// 片段文本 pub str: String, } -pub struct EmphasisStyle { +/// 强调格式 +pub struct EmphasisFormat { + /// 强调样式 + pub style: EmphasisStyle, + + /// 是否为粗体 pub bold: bool, + + /// 是否为斜体 pub italic: bool, - pub strikethrough: bool, } -pub enum UnorderedListPrefix { +/// 强调样式 +pub enum EmphasisStyle { + /// 星号 "*" Star, - Dash, - Plus, + + /// 下划线 "_" + Underline, } +/// 链接类型 pub enum LinkType { + /// 是否为图像链接 Image, + + /// 是否为网页链接 Url, -} -pub enum HorizontalRuleType { - Stars, - Dashes, - Underscores, + /// 是否为段落链接 + Section, } +/// 表格 pub struct Table { - pub contents: HashMap<(u32, u32), Vec<Fragment>>, + /// 位置 映射 词列表 + pub contents: HashMap<(u32, u32), Vec<Token>>, } |
