use ratex_layout::engine::layout;
use ratex_layout::layout_options::LayoutOptions;
use ratex_layout::to_display::to_display_list;
use ratex_parser::parse;
use ratex_svg::{SvgOptions, render_to_svg};
use ratex_types::math_style::MathStyle;
use rpic_core::MathSpan;
pub fn render_math(tex: &str, font_pt: f64) -> Result<MathSpan, String> {
let nodes = parse(tex).map_err(|e| {
let msg = format!("{e}");
match msg.split_once(": ") {
Some((head, tail)) if head.starts_with("ParseError") => tail.to_string(),
_ => msg,
}
})?;
let opts = LayoutOptions {
style: MathStyle::Text,
..Default::default()
};
let lb = layout(&nodes, &opts);
let dl = to_display_list(&lb);
let px_per_em = font_pt * 96.0 / 72.0;
let svg = render_to_svg(
&dl,
&SvgOptions {
font_size: px_per_em,
padding: 0.0,
embed_glyphs: true,
..Default::default()
},
);
let svg = match svg.find('>') {
Some(end) => format!("{}{}", svg[..end].replace("pt\"", "\""), &svg[end..]),
None => svg,
};
let em_in = font_pt / 72.0;
Ok(MathSpan {
svg,
width: dl.width * em_in,
height: dl.height * em_in,
depth: dl.depth * em_in,
})
}