Skip to main content

oak_tex/ast/
mod.rs

1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4/// TeX 抽象语法树根节点
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct TexRoot {
7    #[serde(with = "oak_core::serde_range")]
8    pub span: Range<usize>,
9    pub items: Vec<TexItem>,
10}
11
12/// TeX 顶级项目
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub enum TexItem {
15    Command(TexCommand),
16    Environment(TexEnvironment),
17    Group(TexGroup),
18    Math(TexMath),
19    Superscript(TexSuperscript),
20    Subscript(TexSubscript),
21    Text {
22        #[serde(with = "oak_core::serde_range")]
23        span: Range<usize>,
24        content: String,
25    },
26    Comment {
27        #[serde(with = "oak_core::serde_range")]
28        span: Range<usize>,
29        content: String,
30    },
31}
32
33/// TeX 环境 (e.g., \begin{matrix} ... \end{matrix})
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct TexEnvironment {
36    #[serde(with = "oak_core::serde_range")]
37    pub span: Range<usize>,
38    pub name: String,
39    pub arguments: Vec<TexArgument>,
40    pub content: TexRoot,
41}
42
43/// TeX 上标
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct TexSuperscript {
46    #[serde(with = "oak_core::serde_range")]
47    pub span: Range<usize>,
48    pub target: Option<Box<TexItem>>,
49    pub content: Box<TexRoot>,
50}
51
52/// TeX 下标
53#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct TexSubscript {
55    #[serde(with = "oak_core::serde_range")]
56    pub span: Range<usize>,
57    pub target: Option<Box<TexItem>>,
58    pub content: Box<TexRoot>,
59}
60
61/// TeX 数学环境 ($...$ 或 $$...$$)
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct TexMath {
64    #[serde(with = "oak_core::serde_range")]
65    pub span: Range<usize>,
66    pub content: TexRoot,
67    pub is_display: bool,
68}
69
70/// TeX 命令 (e.g., \section, \textbf)
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct TexCommand {
73    #[serde(with = "oak_core::serde_range")]
74    pub span: Range<usize>,
75    pub name: String,
76    pub arguments: Vec<TexArgument>,
77}
78
79/// TeX 参数
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub enum TexArgument {
82    Optional(TexRoot),
83    Required(TexRoot),
84}
85
86/// TeX 组 (e.g., { ... })
87#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct TexGroup {
89    #[serde(with = "oak_core::serde_range")]
90    pub span: Range<usize>,
91    pub content: TexRoot,
92}
93
94impl TexRoot {
95    pub fn new(span: Range<usize>) -> Self {
96        Self { span, items: Vec::new() }
97    }
98}