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