use crate::formula::ast::*;
use crate::formula::omml::elements::ElementContext;
use crate::formula::omml::attributes::{get_attribute_value, parse_accent_type, parse_position_type};
use crate::formula::omml::properties::parse_accent_properties;
use quick_xml::events::BytesStart;
pub struct AccentHandler;
impl AccentHandler {
pub fn handle_start<'arena>(
elem: &BytesStart,
context: &mut ElementContext<'arena>,
_arena: &'arena bumpalo::Bump,
) {
let attrs: Vec<_> = elem.attributes().filter_map(|a| a.ok()).collect();
let pos_val = get_attribute_value(&attrs, "pos");
if let Some(pos_str) = pos_val {
context.properties.accent_position = Some(pos_str);
}
context.properties = parse_accent_properties(&attrs);
}
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
let accent_type = context.accent_type.or_else(|| {
context.properties.chr.as_deref()
.and_then(|s| parse_accent_type(Some(s)))
});
if let Some(accent_type) = accent_type {
let base = context.base.clone().unwrap_or_else(|| context.children.clone());
let position = context.properties.accent_position
.as_ref()
.and_then(|s| parse_position_type(Some(s)));
let node = MathNode::Accent {
base: Box::new(base),
accent: accent_type,
position,
};
if let Some(parent) = parent_context {
parent.children.push(node);
}
}
}
}