From c38d55614af0226be8eb3f3e1500da8b7be2fec8 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 9 Dec 2022 21:22:23 +0100 Subject: [PATCH] A few math fixes --- library/src/math/mod.rs | 3 ++- library/src/math/tex.rs | 12 +++++++----- src/syntax/kind.rs | 10 +++++++++- src/syntax/parser.rs | 10 +++++++--- tests/typ/math/syntax.typ | 4 ++++ 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/library/src/math/mod.rs b/library/src/math/mod.rs index 62432b128..317bc1d4e 100644 --- a/library/src/math/mod.rs +++ b/library/src/math/mod.rs @@ -61,7 +61,8 @@ impl Layout for MathNode { ) -> SourceResult { let mut t = Texifier::new(styles); self.texify(&mut t)?; - layout_tex(vt, &t.finish(), self.display, styles) + Ok(layout_tex(vt, &t.finish(), self.display, styles) + .unwrap_or(Fragment::frame(Frame::new(Size::zero())))) } } diff --git a/library/src/math/tex.rs b/library/src/math/tex.rs index f17134b79..60f002498 100644 --- a/library/src/math/tex.rs +++ b/library/src/math/tex.rs @@ -14,7 +14,7 @@ pub fn layout_tex( tex: &str, display: bool, styles: StyleChain, -) -> SourceResult { +) -> Result { // Load the font. let variant = variant(styles); let world = vt.world(); @@ -27,11 +27,13 @@ pub fn layout_tex( } // Prepare the font context. - let font = font.expect("failed to find suitable math font"); - let ctx = font + let Some(font) = font else { return Err("failed to find suitable math font") }; + let Some(ctx) = font .math() .map(|math| FontContext::new(font.ttf(), math)) - .expect("failed to create font context"); + else { + return Err("failed to create math font context"); + }; // Layout the formula. let em = styles.get(TextNode::SIZE); @@ -45,7 +47,7 @@ pub fn layout_tex( Error::Layout(LayoutError::Font(err)) => err.to_string(), }) else { - panic!("failed to layout with rex: {tex}"); + return Err("failed to layout math"); }; // Determine the metrics. diff --git a/src/syntax/kind.rs b/src/syntax/kind.rs index d5fda7f8a..d29808d3e 100644 --- a/src/syntax/kind.rs +++ b/src/syntax/kind.rs @@ -405,7 +405,15 @@ impl SyntaxKind { Self::EnumNumbering(_) => "enumeration item numbering", Self::DescItem => "description list item", Self::Math => "math formula", - Self::Atom(_) => "math atom", + Self::Atom(s) => match s.as_str() { + "(" => "opening paren", + ")" => "closing paren", + "{" => "opening brace", + "}" => "closing brace", + "[" => "opening bracket", + "]" => "closing bracket", + _ => "math atom", + }, Self::Script => "script", Self::Frac => "fraction", Self::AlignPoint => "alignment point", diff --git a/src/syntax/parser.rs b/src/syntax/parser.rs index 3e133fe12..a0b1e7d1e 100644 --- a/src/syntax/parser.rs +++ b/src/syntax/parser.rs @@ -338,9 +338,13 @@ impl<'s> Parser<'s> { Some(SyntaxKind::RightParen) => self.inside(Group::Paren), Some(SyntaxKind::Star) => self.inside(Group::Strong), Some(SyntaxKind::Underscore) => self.inside(Group::Emph), - Some(SyntaxKind::Dollar) => { - self.groups.last().map(|group| group.kind) == Some(Group::Math) - } + Some(SyntaxKind::Dollar) => self + .groups + .iter() + .rev() + .skip_while(|group| matches!(group.kind, Group::MathRow(..))) + .next() + .map_or(false, |group| group.kind == Group::Math), Some(SyntaxKind::Semicolon) => self.inside(Group::Expr), Some(SyntaxKind::From) => self.inside(Group::Imports), Some(SyntaxKind::Atom(s)) => match s.as_str() { diff --git a/tests/typ/math/syntax.typ b/tests/typ/math/syntax.typ index 79c306a25..4500d91ed 100644 --- a/tests/typ/math/syntax.typ +++ b/tests/typ/math/syntax.typ @@ -22,3 +22,7 @@ $ 1 + 2 = #{1 + 2} $ $ A sub:eq:not B $ ``` + +--- +// Error: 8 expected closing paren +$ sum_( $