use crate::build_common::make_span;
use crate::build_html::build_html;
use crate::build_mathml::build_mathml;
use crate::context::KatexContext;
use crate::dom_tree::DomSpan;
use crate::options::{FontShape, FontWeight, Options};
use crate::parser::parse_node::AnyParseNode;
use crate::style;
use crate::types::{OutputFormat, ParseError, Settings};
use alloc::borrow::Cow;
fn options_from_settings(settings: &Settings) -> Options {
let style = if settings.display_mode {
style::DISPLAY
} else {
style::TEXT
};
Options {
style,
color: settings.color.clone(),
size: Options::BASESIZE,
text_size: Options::BASESIZE,
phantom: false,
font: String::new(),
font_family: String::new(),
font_weight: FontWeight::Empty,
font_shape: FontShape::Empty,
size_multiplier: settings.size_multiplier,
max_size: settings.max_size,
min_rule_thickness: settings.min_rule_thickness,
}
}
fn display_wrap(node: DomSpan, settings: &Settings) -> DomSpan {
if settings.display_mode {
let mut classes = vec![Cow::Borrowed("katex-display")];
if settings.leqno {
classes.push(Cow::Borrowed("leqno"));
}
if settings.fleqn {
classes.push(Cow::Borrowed("fleqn"));
}
make_span(classes, vec![node.into()], None, None)
} else {
node
}
}
pub fn build_tree(
ctx: &KatexContext,
tree: &[AnyParseNode],
expression: &str,
settings: &Settings,
) -> Result<DomSpan, ParseError> {
let options = options_from_settings(settings);
let katex_node = match settings.output {
OutputFormat::Mathml => {
build_mathml(ctx, tree, expression, &options, settings.display_mode, true)?
}
OutputFormat::Html => {
let html_node = build_html(ctx, tree, &options)?;
make_span("katex", vec![html_node], None, None)
}
OutputFormat::HtmlAndMathml => {
let mathml_node = build_mathml(
ctx,
tree,
expression,
&options,
settings.display_mode,
false,
)?;
let html_node = build_html(ctx, tree, &options)?;
make_span("katex", vec![mathml_node.into(), html_node], None, None)
}
};
Ok(display_wrap(katex_node, settings))
}
pub fn build_html_tree(
ctx: &KatexContext,
tree: &[AnyParseNode],
_expression: &str,
settings: &Settings,
) -> Result<DomSpan, ParseError> {
let options = options_from_settings(settings);
let html_node = build_html(ctx, tree, &options)?;
let katex_node = make_span("katex", vec![html_node], None, None);
Ok(display_wrap(katex_node, settings))
}