1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[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#[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#[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#[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#[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#[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#[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#[derive(Debug, Clone)]
90#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
91pub enum TexArgument {
92 Optional(TexRoot),
93 Required(TexRoot),
94}
95
96#[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}