Fix elements being enclosed when not needed

pull/9/head
trivernis 4 years ago
parent 7d4c906a12
commit 980cb61503

@ -2,7 +2,7 @@
name = "asciimath-rs"
description = "AsciiMath parser"
repository = "https://github.com/trivernis/asciimath-rs"
version = "0.4.5"
version = "0.4.6"
authors = ["trivernis <trivernis@protonmail.com>"]
edition = "2018"
readme = "README.md"

@ -14,6 +14,7 @@ pub enum Group {
Norm(Norm),
Matrix(Matrix),
Vector(Vector),
NonEnclosed(NonEnclosed),
}
#[derive(Debug, Clone, PartialOrd, PartialEq)]
@ -70,3 +71,24 @@ pub struct Matrix {
pub struct Vector {
pub inner: Vec<Vec<Expression>>,
}
#[derive(Debug, Clone, PartialOrd, PartialEq)]
pub struct NonEnclosed {
pub inner: Box<Expression>,
}
impl Group {
pub(crate) fn to_non_enclosed(&self) -> Option<Self> {
let inner = match self {
Group::Parentheses(p) => Some(p.inner.clone()),
Group::Braces(b) => Some(b.inner.clone()),
Group::Brackets(b) => Some(b.inner.clone()),
_ => None,
};
if let Some(inner) = inner {
Some(Group::NonEnclosed(NonEnclosed { inner }))
} else {
None
}
}
}

@ -1,6 +1,7 @@
use crate::elements::accent::{Color, ExpressionAccent, GenericAccent, OverSet, UnderSet};
use crate::elements::group::{
Abs, Angles, Braces, Brackets, Ceil, Floor, Group, Matrix, Norm, Parentheses, Vector, XGroup,
Abs, Angles, Braces, Brackets, Ceil, Floor, Group, Matrix, NonEnclosed, Norm, Parentheses,
Vector, XGroup,
};
use crate::elements::literal::{Literal, Number, PlainText, Symbol};
use crate::elements::special::{
@ -382,6 +383,7 @@ impl ToMathML for Group {
Group::Ceil(c) => c.to_mathml(),
Group::Norm(n) => n.to_mathml(),
Group::Matrix(m) => m.to_mathml(),
Group::NonEnclosed(ne) => ne.to_mathml(),
}
}
}
@ -501,6 +503,12 @@ impl ToMathML for Vector {
}
}
impl ToMathML for NonEnclosed {
fn to_mathml(&self) -> String {
format!("<mrow>{}</mrow>", self.inner.to_mathml())
}
}
impl ToMathML for Special {
fn to_mathml(&self) -> String {
match self {

@ -400,6 +400,11 @@ impl TreeParser {
self.step();
self.step();
if let Some(element) = self.parse_element() {
if let Element::Group(g) = &element {
if let Some(ne) = g.to_non_enclosed() {
return Some(Element::Group(ne).boxed());
}
}
Some(element.boxed())
} else {
None
@ -414,6 +419,11 @@ impl TreeParser {
self.step();
self.step();
if let Some(element) = self.parse_element() {
if let Element::Group(g) = &element {
if let Some(ne) = g.to_non_enclosed() {
return Some(Element::Group(ne).boxed());
}
}
Some(element.boxed())
} else {
None

Loading…
Cancel
Save