panache_parser/syntax/kind.rs
1//! Syntax kinds and language definition for the Quarto/Pandoc CST.
2
3use rowan::Language;
4
5#[allow(non_camel_case_types)]
6#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[repr(u16)]
8pub enum SyntaxKind {
9 // Tokens
10 WHITESPACE = 0,
11 NEWLINE,
12 TEXT,
13 BACKSLASH, // \ (for escaping)
14 ESCAPED_CHAR, // Any escaped character
15 NONBREAKING_SPACE, // \<space>
16 HARD_LINE_BREAK, // \<newline>
17 DIV_MARKER, // :::
18
19 // YAML tokens (metadata and shadow YAML CST parser)
20 YAML_METADATA_DELIM, // --- or ... (for YAML blocks)
21 YAML_KEY, // YAML mapping key token
22 YAML_COLON, // YAML mapping key-value separator
23 YAML_TAG, // YAML explicit tag token (e.g. !!str)
24 YAML_SCALAR, // YAML scalar value token
25 YAML_COMMENT, // YAML inline comment token
26
27 BLOCK_QUOTE_MARKER, // >
28 ALERT_MARKER, // [!NOTE], [!TIP], etc.
29 IMAGE_LINK_START, // ![
30 LIST_MARKER, // - + *
31 TASK_CHECKBOX, // [ ] or [x] or [X]
32 COMMENT_START, // <!--
33 COMMENT_END, // -->
34 ATTRIBUTE, // {#label} for headings, math, etc.
35 HORIZONTAL_RULE, // --- or *** or ___
36 BLANK_LINE,
37
38 // Links and images
39 LINK_START, // [
40 LINK, // [text](url)
41 LINK_TEXT, // text part of link
42 LINK_TEXT_END, // ] closing link text
43 LINK_DEST_START, // ( opening link destination
44 LINK_DEST, // (url) or (url "title")
45 LINK_DEST_END, // ) closing link destination
46 LINK_REF, // [ref] in reference links
47 IMAGE_LINK, // 
48 IMAGE_ALT, // alt text in image
49 IMAGE_ALT_END, // ] closing image alt
50 IMAGE_DEST_START, // ( opening image destination
51 IMAGE_DEST_END, // ) closing image destination
52 AUTO_LINK, // <http://example.com>
53 AUTO_LINK_MARKER, // < and >
54 REFERENCE_DEFINITION, // [label]: url "title"
55 FOOTNOTE_DEFINITION, // [^id]: content
56 FOOTNOTE_REFERENCE, // [^id]
57 FOOTNOTE_LABEL_START, // [^
58 FOOTNOTE_LABEL_ID, // id in [^id] or [^id]:
59 FOOTNOTE_LABEL_END, // ]
60 FOOTNOTE_LABEL_COLON, // :
61 REFERENCE_LABEL, // [label] part
62 REFERENCE_URL, // url part
63 REFERENCE_TITLE, // "title" part
64
65 // Math
66 INLINE_MATH_MARKER, // $
67 DISPLAY_MATH_MARKER, // $$
68 INLINE_MATH,
69 DISPLAY_MATH,
70 MATH_CONTENT,
71
72 // Footnotes
73 INLINE_FOOTNOTE_START, // ^[
74 INLINE_FOOTNOTE_END, // ]
75 INLINE_FOOTNOTE, // ^[text]
76
77 // Citations
78 CITATION, // [@key] or @key
79 CITATION_MARKER, // @ or -@
80 CITATION_KEY, // The citation key identifier
81 CITATION_BRACE_OPEN, // { for complex keys
82 CITATION_BRACE_CLOSE, // } for complex keys
83 CITATION_CONTENT, // Text content in bracketed citations
84 CITATION_SEPARATOR, // ; between multiple citations
85 CROSSREF, // Quarto cross-reference: @fig-*, @eq-*, etc.
86 CROSSREF_MARKER, // @ or -@ for cross-references
87 CROSSREF_KEY, // Cross-reference key identifier
88 CROSSREF_BRACE_OPEN, // { for braced cross-reference keys
89 CROSSREF_BRACE_CLOSE, // } for braced cross-reference keys
90 CROSSREF_BOOKDOWN_OPEN, // \@ref(
91 CROSSREF_BOOKDOWN_CLOSE, // )
92
93 // Spans
94 BRACKETED_SPAN, // [text]{.class}
95 SPAN_CONTENT, // text inside span
96 SPAN_ATTRIBUTES, // {.class key="val"}
97 SPAN_BRACKET_OPEN, // [
98 SPAN_BRACKET_CLOSE, // ]
99
100 // Shortcodes (Quarto)
101 SHORTCODE, // {{< name args >}} or {{{< name args >}}}
102 SHORTCODE_MARKER_OPEN, // {{< or {{{<
103 SHORTCODE_MARKER_CLOSE, // >}} or >}}}
104 SHORTCODE_CONTENT, // content between markers
105
106 // Code
107 INLINE_CODE,
108 INLINE_CODE_MARKER, // ` or `` or ```
109 INLINE_CODE_CONTENT, // Literal inline code content
110 INLINE_EXEC, // Inline executable code span variants
111 INLINE_EXEC_MARKER, // Backtick markers delimiting inline executable code
112 INLINE_EXEC_LANG, // Runtime marker (`r` or `{r}`)
113 INLINE_EXEC_CONTENT, // Executable inline code expression
114 CODE_FENCE_MARKER, // ``` or ~~~
115 CODE_BLOCK,
116
117 // Raw inline spans
118 RAW_INLINE, // `content`{=format}
119 RAW_INLINE_MARKER, // ` markers
120 RAW_INLINE_FORMAT, // format name (html, latex, etc.)
121 RAW_INLINE_CONTENT, // raw content
122
123 // Inline emphasis and formatting
124 EMPHASIS, // *text* or _text_
125 STRONG, // **text** or __text__
126 STRIKEOUT, // ~~text~~
127 MARK, // ==text==
128 SUPERSCRIPT, // ^text^
129 SUBSCRIPT, // ~text~
130 EMPHASIS_MARKER, // * or _ (for emphasis)
131 STRONG_MARKER, // ** or __ (for strong)
132 STRIKEOUT_MARKER, // ~~ (for strikeout)
133 MARK_MARKER, // == (for mark/highlight)
134 SUPERSCRIPT_MARKER, // ^ (for superscript)
135 SUBSCRIPT_MARKER, // ~ (for subscript)
136
137 // Composite nodes
138 DOCUMENT,
139
140 // YAML nodes
141 YAML_METADATA,
142 YAML_METADATA_CONTENT, // Content lines inside YAML metadata block
143 YAML_BLOCK_MAP, // YAML block mapping container (prototype shadow parser)
144 YAML_BLOCK_MAP_ENTRY, // YAML block mapping entry (key: value)
145 YAML_BLOCK_MAP_KEY, // YAML block mapping key wrapper
146 YAML_BLOCK_MAP_VALUE, // YAML block mapping value wrapper
147
148 PANDOC_TITLE_BLOCK,
149 MMD_TITLE_BLOCK,
150 FENCED_DIV,
151 PARAGRAPH,
152 PLAIN, // Inline content without paragraph break (tight lists, definition lists, table cells)
153 BLOCK_QUOTE,
154 ALERT,
155 LIST,
156 LIST_ITEM,
157 DEFINITION_LIST,
158 DEFINITION_ITEM,
159 TERM,
160 DEFINITION,
161 DEFINITION_MARKER, // : or ~
162 LINE_BLOCK,
163 LINE_BLOCK_LINE,
164 LINE_BLOCK_MARKER, // |
165 COMMENT,
166 FIGURE, // Standalone image (Pandoc figure)
167
168 // HTML blocks
169 HTML_BLOCK, // Generic HTML block
170 HTML_BLOCK_TAG, // Opening/closing tags
171 HTML_BLOCK_CONTENT, // Content between tags
172
173 // TeX blocks
174 TEX_BLOCK, // Raw tex block (e.g., LaTeX commands)
175
176 // Headings
177 HEADING,
178 HEADING_CONTENT,
179 ATX_HEADING_MARKER, // leading #####
180 SETEXT_HEADING_UNDERLINE, // ===== or -----
181
182 // LaTeX inline commands
183 LATEX_COMMAND, // \command{...}
184
185 // Tables
186 SIMPLE_TABLE,
187 MULTILINE_TABLE,
188 PIPE_TABLE,
189 GRID_TABLE,
190 TABLE_HEADER,
191 TABLE_FOOTER,
192 TABLE_SEPARATOR,
193 TABLE_ROW,
194 TABLE_CELL,
195 TABLE_CAPTION,
196 TABLE_CAPTION_PREFIX, // "Table: ", "table: ", or ": "
197
198 // Code block parts
199 CODE_FENCE_OPEN,
200 CODE_FENCE_CLOSE,
201 CODE_INFO, // Raw info string (preserved for lossless formatting)
202 CODE_LANGUAGE, // Parsed language identifier (r, python, etc.)
203
204 // Chunk options (for executable chunks like {r, echo=TRUE})
205 CHUNK_OPTIONS, // Container for all chunk options
206 CHUNK_OPTION, // Single option (key=value pair)
207 CHUNK_OPTION_KEY, // Option name (e.g., echo, fig.cap)
208 CHUNK_OPTION_VALUE, // Option value (e.g., TRUE, "text")
209 CHUNK_OPTION_QUOTE, // Quote character (" or ') if present
210 CHUNK_LABEL, // Special case: unlabeled first option in {r mylabel}
211 HASHPIPE_YAML_PREAMBLE, // Hashpipe YAML option preamble region inside CODE_CONTENT
212 HASHPIPE_YAML_CONTENT, // Content lines belonging to hashpipe YAML preamble
213 HASHPIPE_PREFIX, // Hashpipe option marker prefix (e.g., #|, //|, --|)
214
215 CODE_CONTENT,
216
217 // Div parts
218 DIV_FENCE_OPEN,
219 DIV_FENCE_CLOSE,
220 DIV_INFO,
221 DIV_CONTENT,
222 EMOJI, // :alias:
223}
224
225impl From<SyntaxKind> for rowan::SyntaxKind {
226 fn from(kind: SyntaxKind) -> Self {
227 Self(kind as u16)
228 }
229}
230
231#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
232pub enum PanacheLanguage {}
233
234impl Language for PanacheLanguage {
235 type Kind = SyntaxKind;
236
237 fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
238 unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
239 }
240
241 fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
242 kind.into()
243 }
244}