oak_markdown/kind/
mod.rs

1use oak_core::{TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
5pub enum MarkdownSyntaxKind {
6    // 基础文本
7    Text,
8    Whitespace,
9    Newline,
10
11    // 标题
12    Heading1,
13    Heading2,
14    Heading3,
15    Heading4,
16    Heading5,
17    Heading6,
18    HeadingText,
19
20    // 强调和加
21    Emphasis,      // *text* or _text_
22    Strong,        // **text** or __text__
23    Strikethrough, // ~~text~~
24
25    // 代码
26    InlineCode,   // `code`
27    CodeBlock,    // ```code```
28    CodeFence,    // ``` or ~~~
29    CodeLanguage, // language identifier in code block
30
31    // 链接和图
32    Link,
33    LinkText,
34    LinkUrl,
35    LinkTitle,
36    Image,
37    ImageAlt,
38    ImageUrl,
39    ImageTitle,
40
41    // 列表
42    UnorderedList,
43    OrderedList,
44    ListItem,
45    ListMarker, // -, *, +, 1., 2., etc.
46    TaskList,
47    TaskMarker, // [x] or [ ]
48
49    // 引用
50    Blockquote,
51    BlockquoteMarker, // >
52
53    // 分隔
54    HorizontalRule, // --- or *** or ___
55
56    // 表格
57    Table,
58    TableRow,
59    TableCell,
60    TableHeader,
61    TableSeparator, // |
62    TableAlignment, // :---, :---:, ---:
63
64    // HTML
65    HtmlTag,
66    HtmlComment,
67
68    // 转义字符
69    Escape, // \
70
71    // 特殊字符
72    LeftBracket,  // [
73    RightBracket, // ]
74    LeftParen,    // (
75    RightParen,   // )
76    LeftAngle,    // <
77    RightAngle,   // >
78    Asterisk,     // *
79    Underscore,   // _
80    Backtick,     // `
81    Tilde,        // ~
82    Hash,         // #
83    Pipe,         // |
84    Dash,         // -
85    Plus,         // +
86    Dot,          // .
87    Colon,        // :
88    Exclamation,  // !
89
90    // 错误处理
91    Error,
92
93    // 文档结构
94    Root,
95    Document,
96    Paragraph,
97
98    // EOF
99    EndOfStream,
100}
101
102impl TokenType for MarkdownSyntaxKind {
103    type Role = UniversalTokenRole;
104    const END_OF_STREAM: Self = Self::EndOfStream;
105
106    fn role(&self) -> Self::Role {
107        use UniversalTokenRole::*;
108        match self {
109            Self::LeftBracket
110            | Self::RightBracket
111            | Self::LeftParen
112            | Self::RightParen
113            | Self::LeftAngle
114            | Self::RightAngle
115            | Self::Asterisk
116            | Self::Underscore
117            | Self::Backtick
118            | Self::Tilde
119            | Self::Hash
120            | Self::Pipe
121            | Self::Dash
122            | Self::Plus
123            | Self::Dot
124            | Self::Colon
125            | Self::Exclamation
126            | Self::CodeFence
127            | Self::BlockquoteMarker
128            | Self::ListMarker
129            | Self::TableSeparator => Punctuation,
130
131            Self::Text | Self::HeadingText | Self::LinkText | Self::ImageAlt | Self::CodeLanguage => Name,
132
133            Self::LinkUrl | Self::LinkTitle | Self::ImageUrl | Self::ImageTitle => Literal,
134
135            Self::Escape => Escape,
136            Self::Whitespace | Self::Newline => Whitespace,
137            Self::HtmlComment => Comment,
138            Self::Error => Error,
139            _ => None,
140        }
141    }
142}
143
144impl oak_core::ElementType for MarkdownSyntaxKind {
145    type Role = UniversalElementRole;
146
147    fn role(&self) -> Self::Role {
148        use UniversalElementRole::*;
149        match self {
150            Self::Root | Self::Document => Root,
151
152            // Hierarchy & Scoping
153            Self::UnorderedList | Self::OrderedList | Self::TaskList | Self::Blockquote | Self::Table | Self::TableRow => Container,
154
155            // Flow Control & Logic (Markup units)
156            Self::Paragraph | Self::ListItem | Self::TableCell | Self::HorizontalRule => Statement,
157
158            // Symbol Management
159            Self::Heading1 | Self::Heading2 | Self::Heading3 | Self::Heading4 | Self::Heading5 | Self::Heading6 => Definition,
160
161            Self::Link | Self::Image => Reference,
162
163            // Atomic Values
164            Self::Emphasis | Self::Strong | Self::Strikethrough | Self::InlineCode => Value,
165
166            // Metadata
167            Self::HtmlTag => Metadata,
168
169            // Embedded
170            Self::CodeBlock => Embedded,
171
172            Self::Error => Error,
173            _ => None,
174        }
175    }
176}