From a134bc49a4136452f0d0bb2898ae8111a3146776 Mon Sep 17 00:00:00 2001 From: trivernis Date: Wed, 5 Aug 2020 21:00:00 +0200 Subject: [PATCH] Add ToMathML for all Accents --- src/format/mathml.rs | 94 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 7 deletions(-) diff --git a/src/format/mathml.rs b/src/format/mathml.rs index 2371d51..ee4d9cd 100644 --- a/src/format/mathml.rs +++ b/src/format/mathml.rs @@ -1,6 +1,10 @@ +use crate::elements::accent::{Color, ExpressionAccent, GenericAccent, OverSet, UnderSet}; use crate::elements::literal::{Literal, Number, PlainText, Symbol}; -use crate::tokens::{Arrow, FontCommand, Function, Greek, Logical, Misc, Operation, Relation}; -use htmlescape::encode_minimal; +use crate::elements::Element; +use crate::tokens::{ + Accent, Arrow, FontCommand, Function, Greek, Logical, Misc, Operation, Relation, +}; +use htmlescape::{encode_attribute, encode_minimal}; pub trait ToMathML { fn to_mathml(&self) -> String; @@ -87,11 +91,11 @@ impl ToMathML for FontCommand { fn to_mathml(&self) -> String { match self { FontCommand::Big => "bold".to_string(), - FontCommand::BigOutline => "double-struck", - FontCommand::Cursive => "italic", - FontCommand::TText => "script", - FontCommand::Fr => "bold-fraktur", - FontCommand::SansSerif => "sans-serif", + FontCommand::BigOutline => "double-struck".to_string(), + FontCommand::Cursive => "italic".to_string(), + FontCommand::TText => "script".to_string(), + FontCommand::Fr => "bold-fraktur".to_string(), + FontCommand::SansSerif => "sans-serif".to_string(), } } } @@ -285,3 +289,79 @@ impl ToMathML for Operation { format!("{}", inner) } } + +impl ToMathML for Accent { + fn to_mathml(&self) -> String { + match self { + Accent::Hat => "ˆ".to_string(), + Accent::Overline => "¯".to_string(), + Accent::Underline => "–".to_string(), + Accent::Vec => "→".to_string(), + Accent::Dot => ".".to_string(), + Accent::DDot => "..".to_string(), + Accent::UnderBrace => "⏟".to_string(), + Accent::OverBrace => "⏞".to_string(), + Accent::Cancel => "⟋".to_string(), + _ => "".to_string(), + } + } +} + +impl ToMathML for OverSet { + fn to_mathml(&self) -> String { + format!( + "{}{}", + self.bottom.to_mathml(), + self.top.to_mathml() + ) + } +} + +impl ToMathML for UnderSet { + fn to_mathml(&self) -> String { + format!( + "{}{}", + self.top.to_mathml(), + self.bottom.to_mathml(), + ) + } +} + +impl ToMathML for Color { + fn to_mathml(&self) -> String { + format!( + "{}", + encode_attribute(self.color.as_str()), + self.inner.to_mathml() + ) + } +} + +impl ToMathML for GenericAccent { + fn to_mathml(&self) -> String { + match self.accent { + Accent::Hat + | Accent::Overline + | Accent::Vec + | Accent::Dot + | Accent::DDot + | Accent::OverBrace => format!( + "{}{}", + self.inner.to_mathml(), + self.accent.to_mathml() + ), + Accent::Underline | Accent::UnderBrace => format!( + "{}{}", + self.inner.to_mathml(), + self.accent.to_mathml() + ), + _ => self.inner.to_mathml(), + } + } +} + +impl ToMathML for Element { + fn to_mathml(&self) -> String { + unimplemented!() + } +}