#[derive(Debug, Clone, PartialEq)]
pub enum MathNode {
Symbol { glyph: char, class: AtomClass },
Row(Vec<MathNode>),
Text(String),
Frac {
num: Box<MathNode>,
den: Box<MathNode>,
},
Script {
base: Box<MathNode>,
sup: Option<Box<MathNode>>,
sub: Option<Box<MathNode>>,
},
Sqrt(Box<MathNode>),
Delimited {
open: Option<DelimiterKind>,
body: Box<MathNode>,
close: Option<DelimiterKind>,
},
BigOp {
kind: BigOpKind,
lower: Option<Box<MathNode>>,
upper: Option<Box<MathNode>>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AtomClass {
Ord,
Op,
Bin,
Rel,
Open,
Close,
Punct,
Inner,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DelimiterKind {
Paren,
Bracket,
Brace,
Floor,
Ceil,
Bar,
DoubleBar,
AngleLeft,
AngleRight,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BigOpKind {
Sum,
Prod,
Int,
Oint,
BigCup,
BigCap,
Lim,
Max,
Min,
}
impl BigOpKind {
pub fn glyph(self) -> &'static str {
match self {
Self::Sum => "\u{2211}",
Self::Prod => "\u{220F}",
Self::Int => "\u{222B}",
Self::Oint => "\u{222E}",
Self::BigCup => "\u{22C3}",
Self::BigCap => "\u{22C2}",
Self::Lim => "lim",
Self::Max => "max",
Self::Min => "min",
}
}
pub fn display_limits(self) -> bool {
!matches!(self, Self::Int | Self::Oint)
}
}