Skip to main content

oak_tex/ast/
mod.rs

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