mathml_core/operators/
display.rs

1use super::*;
2
3impl Display for MathOperator {
4    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
5        write_tag_start(f, self)?;
6        safe_html_str(f, &self.operator)?;
7        write_tag_close(f, self)
8    }
9}
10
11impl Display for MathSpace {
12    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
13        write_tag_self_close(f, self)
14    }
15}
16
17impl Display for MathSqrt {
18    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19        match &self.surd {
20            Some(power) => {
21                write!(f, "<mroot>{}{}</mroot>", self.base, power)
22            }
23            None => {
24                write!(f, "<msqrt>{}</msqrt>", self.base)
25            }
26        }
27    }
28}
29
30impl Display for MathFenced {
31    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
32        let last = self.separators.chars().last().unwrap_or(',');
33        let mut separators = self.separators.chars().chain(repeat(last));
34        f.write_str("<mrow><mo stretchy=\"true\" form=\"prefix\">")?;
35        safe_html_char(f, self.open)?;
36        f.write_str("</mo>")?;
37        for (i, item) in self.base.iter().enumerate() {
38            if i == 0 {
39                write!(f, "{}", item)?;
40            }
41            else {
42                // SAFETY: `separators` is infinite
43                let split = unsafe { separators.next().unwrap_unchecked() };
44                f.write_str("<mo>")?;
45                safe_html_char(f, split)?;
46                f.write_str("</mo>")?;
47                write!(f, "{}", item)?;
48            }
49        }
50        f.write_str("<mo stretchy=\"true\" form=\"postfix\">")?;
51        safe_html_char(f, self.close)?;
52        f.write_str("</mo></mrow>")
53    }
54}
55
56impl Display for MathMultiScript {
57    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
58        write_tag_start(f, self)?;
59        Display::fmt(&self.base, f)?;
60        if self.is_sub_super_script() {
61            // SAFETY: rd, ru has only one element
62            unsafe {
63                Display::fmt(self.rd.get_unchecked(0), f)?;
64                Display::fmt(self.ru.get_unchecked(0), f)?;
65            }
66        }
67        else if self.is_sub_script() {
68            // SAFETY: rd has only one element
69            unsafe {
70                Display::fmt(self.rd.get_unchecked(0), f)?;
71            }
72        }
73        else if self.is_super_script() {
74            // SAFETY: ru has only one element
75            unsafe {
76                Display::fmt(self.ru.get_unchecked(0), f)?;
77            }
78        }
79        else {
80            let r_max = self.ru.len().max(self.rd.len());
81            for i in 0..r_max {
82                match self.rd.get(i) {
83                    Some(s) => write!(f, "{}", s)?,
84                    None => f.write_str("<mrow/>")?,
85                }
86                match self.ru.get(i) {
87                    Some(s) => write!(f, "{}", s)?,
88                    None => f.write_str("<mrow/>")?,
89                }
90            }
91            f.write_str("<mprescripts/>")?;
92            let l_max = self.lu.len().max(self.ld.len());
93            for i in 0..l_max {
94                match self.ld.get(i) {
95                    Some(s) => write!(f, "{}", s)?,
96                    None => f.write_str("<mrow/>")?,
97                }
98                match self.lu.get(i) {
99                    Some(s) => write!(f, "{}", s)?,
100                    None => f.write_str("<mrow/>")?,
101                }
102            }
103        }
104        write_tag_close(f, self)
105    }
106}
107
108impl Display for MathUnderOver {
109    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
110        write_tag_start(f, self)?;
111        write!(f, "{}", self.base)?;
112        if let Some(under) = &self.under {
113            write!(f, "{}", under)?;
114        }
115        if let Some(over) = &self.over {
116            write!(f, "{}", over)?;
117        }
118        write_tag_close(f, self)
119    }
120}