pub mod ast;
mod omml;
pub mod latex;
mod mtef;
pub use ast::{
Formula, FormulaBuilder, MathNode, Operator, Symbol, Fence, LargeOperator,
MatrixFence, AccentType, SpaceType, StyleType,
};
pub use omml::{OmmlParser, OmmlError};
pub use latex::{LatexConverter, LatexError};
pub use mtef::{MtefParser, MtefError};
#[derive(Debug)]
pub enum FormulaError {
Omml(OmmlError),
Latex(LatexError),
Mtef(MtefError),
}
impl std::fmt::Display for FormulaError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
FormulaError::Omml(e) => write!(f, "OMML error: {}", e),
FormulaError::Latex(e) => write!(f, "LaTeX error: {}", e),
FormulaError::Mtef(e) => write!(f, "MTEF error: {}", e),
}
}
}
impl std::error::Error for FormulaError {}
impl From<OmmlError> for FormulaError {
fn from(e: OmmlError) -> Self {
FormulaError::Omml(e)
}
}
impl From<LatexError> for FormulaError {
fn from(e: LatexError) -> Self {
FormulaError::Latex(e)
}
}
impl From<MtefError> for FormulaError {
fn from(e: MtefError) -> Self {
FormulaError::Mtef(e)
}
}
pub fn omml_to_latex(omml: &str) -> Result<String, FormulaError> {
let formula = Formula::new();
let parser = OmmlParser::new(formula.arena());
let nodes = parser.parse(omml)?;
let mut formula = Formula::new();
formula.set_root(nodes);
let mut converter = LatexConverter::new();
Ok(converter.convert(&formula)?.to_string())
}
pub fn mtef_to_latex(mtef_data: &[u8]) -> Result<String, FormulaError> {
let formula = Formula::new();
let mut parser = MtefParser::new(formula.arena(), mtef_data);
let nodes = parser.parse()?;
let mut formula = Formula::new();
formula.set_root(nodes);
let mut converter = LatexConverter::new();
Ok(converter.convert(&formula)?.to_string())
}
pub fn omml_to_mtef(_omml: &str) -> Result<Vec<u8>, FormulaError> {
unimplemented!("OMML to MTEF conversion is not yet implemented")
}
pub fn mtef_to_omml(_mtef_data: &[u8]) -> Result<String, FormulaError> {
unimplemented!("MTEF to OMML conversion is not yet implemented")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_omml_to_latex() {
let omml = r#"<m:oMath><m:r><m:t>x</m:t></m:r></m:oMath>"#;
let result = omml_to_latex(omml);
assert!(result.is_ok());
}
#[test]
fn test_formula_creation() {
let formula = Formula::new();
assert!(formula.root().is_empty());
assert!(formula.display_style());
}
}