use crate::formula::ast::*;
use crate::formula::omml::elements::ElementContext;
use std::borrow::Cow;
pub struct FunctionHandler;
impl FunctionHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
arena: &'arena bumpalo::Bump,
) {
let argument = if context.children.is_empty() {
Vec::new()
} else {
context.children.clone()
};
let name = context.function_name.take()
.unwrap_or_else(|| "f".to_string());
let name = arena.alloc_str(&name);
let node = MathNode::Function {
name: Cow::Borrowed(name),
argument,
};
if let Some(parent) = parent_context {
parent.children.push(node);
}
}
}
pub struct FunctionNameHandler;
impl FunctionNameHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
let mut name = String::new();
for child in &context.children {
if let MathNode::Text(text) = child {
name.push_str(text.as_ref());
}
}
if !name.is_empty()
&& let Some(parent) = parent_context {
parent.function_name = Some(name);
}
}
}