summaryrefslogtreecommitdiff
path: root/src/ast.rs
blob: 3f8882daf7d1811d84ec719b4ad889df56149e57 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
use std::collections::HashMap;

pub mod parser;
pub mod renderer;

/// 语法树
pub struct MarkdownAST {
    /// 块列表
    pub blocks: Vec<Block>,
}

/// 层级
pub type Level = u8;

/// 语言(用于代码块)
pub type Lang = String;

/// 标题(用于 Headings)
pub type Title = String;

/// 链接(用于 Link)
pub type Url = String;

/// 块
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 data: TokenData,
}

/// 词数据
pub enum TokenData {
    /// 普通 - 记录片段
    Normal(Fragment),

    // 强调 - 记录词列表(嵌套)和强调样式
    Emphasis(Vec<Token>, EmphasisFormat),

    // 链接 - 记录词列表(嵌套)、链接、标题、链接类型
    Link(Vec<Token>, Url, Option<Title>, LinkType),

    // 内联代码 - 记录词列表(嵌套)
    InlineCode(Vec<Token>),
}

/// 片段
#[derive(Debug, Default)]
pub struct Fragment {
    /// 片段文本
    pub str: String,
}

/// 强调格式
pub struct EmphasisFormat {
    /// 强调样式
    pub style: EmphasisStyle,

    /// 是否为粗体
    pub bold: bool,

    /// 是否为斜体
    pub italic: bool,
}

/// 强调样式
pub enum EmphasisStyle {
    /// 星号 "*"
    Star,

    /// 下划线 "_"
    Underline,
}

/// 链接类型
pub enum LinkType {
    /// 是否为图像链接
    Image,

    /// 是否为网页链接
    Url,

    /// 是否为段落链接
    Section,
}

/// 表格
pub struct Table {
    /// 位置 映射 词列表
    pub contents: HashMap<(u32, u32), Vec<Token>>,
}