use ttf_parser::GlyphId;
#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq)]
pub enum Node {
Atom {
class: AtomClass,
glyph: GlyphId,
font_size: f32,
},
Frac {
num: Box<Node>,
den: Box<Node>,
bar: bool,
},
Subsup {
base: Box<Node>,
sub: Option<Box<Node>>,
sup: Option<Box<Node>>,
},
Radical {
degree: Option<Box<Node>>,
body: Box<Node>,
},
Row(Vec<Node>),
Fenced {
open: GlyphId,
close: GlyphId,
body: Box<Node>,
},
Op {
glyph: GlyphId,
limits: bool,
big: bool,
font_size: f32,
},
OpName {
body: Box<Node>,
limits: bool,
},
Accent {
accent: GlyphId,
body: Box<Node>,
},
Matrix {
rows: Vec<Vec<Node>>,
col_aligns: Vec<ColAlign>,
},
Space(SpaceKind),
Error(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ColAlign {
Left,
Center,
Right,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AtomClass {
Ord,
Op,
Bin,
Rel,
Open,
Close,
Punct,
Inner,
}
#[allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SpaceKind {
Thin,
Med,
Thick,
NegThin,
Mu(f32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Style {
Display,
Text,
Script,
ScriptScript,
}
impl Style {
pub fn is_display(self) -> bool {
matches!(self, Style::Display)
}
pub fn sub(self) -> Self {
match self {
Style::Display | Style::Text => Style::Script,
Style::Script | Style::ScriptScript => Style::ScriptScript,
}
}
pub fn font_size(self, base: f32) -> f32 {
match self {
Style::Display | Style::Text => base,
Style::Script => base * 0.7,
Style::ScriptScript => base * 0.5,
}
}
}