#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Span {
pub pos: usize,
pub len: usize,
}
impl Span {
pub fn end(&self) -> usize {
self.pos + self.len
}
}
#[derive(Debug, Clone)]
pub enum Node {
Chars(CharsNode),
Comment(CommentNode),
Macro(MacroNode),
Group(GroupNode),
Environment(EnvironmentNode),
Math(MathNode),
Specials(SpecialsNode),
}
impl Node {
pub fn span(&self) -> Span {
match self {
Node::Chars(n) => n.span,
Node::Comment(n) => n.span,
Node::Macro(n) => n.span,
Node::Group(n) => n.span,
Node::Environment(n) => n.span,
Node::Math(n) => n.span,
Node::Specials(n) => n.span,
}
}
}
#[derive(Debug, Clone)]
pub struct CharsNode {
pub span: Span,
pub chars: String,
}
#[derive(Debug, Clone)]
pub struct SpecialsNode {
pub span: Span,
pub chars: String,
}
#[derive(Debug, Clone)]
pub struct CommentNode {
pub span: Span,
pub comment: String,
}
pub type Args = Vec<Option<Node>>;
#[derive(Debug, Clone)]
pub struct MacroNode {
pub span: Span,
pub macroname: String,
pub args: Args,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GroupDelims {
Brace,
Bracket,
}
#[derive(Debug, Clone)]
pub struct GroupNode {
pub span: Span,
pub delims: GroupDelims,
pub nodelist: Vec<Node>,
}
#[derive(Debug, Clone)]
pub struct EnvironmentNode {
pub span: Span,
pub environmentname: String,
pub args: Args,
pub nodelist: Vec<Node>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MathKind {
Inline,
Display,
}
#[derive(Debug, Clone)]
pub struct MathNode {
pub span: Span,
pub kind: MathKind,
pub nodelist: Vec<Node>,
}