Skip to main content

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,           // ![alt](url)
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}