Skip to main content

oak_typst/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use oak_core::Range;
3
4/// Typst AST root node
5#[derive(Debug, Clone)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct TypstRoot {
8    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
9    pub span: Range<usize>,
10    pub items: Vec<TypstItem>,
11}
12
13impl TypstRoot {
14    pub fn new(span: Range<usize>) -> Self {
15        Self { span, items: Vec::new() }
16    }
17}
18
19#[derive(Debug, Clone)]
20#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21pub enum TypstItem {
22    Text(String),
23    Space,
24    Parbreak,
25    Heading(TypstHeading),
26    Strong(TypstRoot),
27    Emphasis(TypstRoot),
28    Math(TypstRoot),
29    Quote(TypstRoot),
30    ListItem(TypstRoot),
31    EnumItem(TypstRoot),
32    Link(TypstLink),
33    Raw(String),
34    Block(TypstRoot),
35}
36
37#[derive(Debug, Clone)]
38#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
39pub struct TypstHeading {
40    pub level: usize,
41    pub content: TypstRoot,
42}
43
44#[derive(Debug, Clone)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct TypstLink {
47    pub url: String,
48    pub content: Option<TypstRoot>,
49}