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 Text,
8 Whitespace,
9 Newline,
10
11 Heading1,
13 Heading2,
14 Heading3,
15 Heading4,
16 Heading5,
17 Heading6,
18 HeadingText,
19
20 Emphasis, Strong, Strikethrough, InlineCode, CodeBlock, CodeFence, CodeLanguage, Link,
33 LinkText,
34 LinkUrl,
35 LinkTitle,
36 Image,
37 ImageAlt,
38 ImageUrl,
39 ImageTitle,
40
41 UnorderedList,
43 OrderedList,
44 ListItem,
45 ListMarker, TaskList,
47 TaskMarker, Blockquote,
51 BlockquoteMarker, HorizontalRule, Table,
58 TableRow,
59 TableCell,
60 TableHeader,
61 TableSeparator, TableAlignment, HtmlTag,
66 HtmlComment,
67
68 Escape, LeftBracket, RightBracket, LeftParen, RightParen, LeftAngle, RightAngle, Asterisk, Underscore, Backtick, Tilde, Hash, Pipe, Dash, Plus, Dot, Colon, Exclamation, Error,
92
93 Root,
95 Document,
96 Paragraph,
97
98 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 Self::UnorderedList | Self::OrderedList | Self::TaskList | Self::Blockquote | Self::Table | Self::TableRow => Container,
154
155 Self::Paragraph | Self::ListItem | Self::TableCell | Self::HorizontalRule => Statement,
157
158 Self::Heading1 | Self::Heading2 | Self::Heading3 | Self::Heading4 | Self::Heading5 | Self::Heading6 => Definition,
160
161 Self::Link | Self::Image => Reference,
162
163 Self::Emphasis | Self::Strong | Self::Strikethrough | Self::InlineCode => Value,
165
166 Self::HtmlTag => Metadata,
168
169 Self::CodeBlock => Embedded,
171
172 Self::Error => Error,
173 _ => None,
174 }
175 }
176}