diff --git a/crates/typst-syntax/src/parser.rs b/crates/typst-syntax/src/parser.rs index 306ac798d..313d5ea3e 100644 --- a/crates/typst-syntax/src/parser.rs +++ b/crates/typst-syntax/src/parser.rs @@ -282,7 +282,7 @@ fn math_expr_prec(p: &mut Parser, min_prec: usize, stop: SyntaxKind) { math_class(p.current_text()), None | Some(MathClass::Alphabetic) ); - if !maybe_delimited(p, true) { + if !maybe_delimited(p) { p.eat(); } } @@ -321,7 +321,7 @@ fn math_expr_prec(p: &mut Parser, min_prec: usize, stop: SyntaxKind) { if continuable && min_prec < 3 && p.prev_end() == p.current_start() - && maybe_delimited(p, false) + && maybe_delimited(p) { p.wrap(m, SyntaxKind::Math); } @@ -397,29 +397,20 @@ fn math_expr_prec(p: &mut Parser, min_prec: usize, stop: SyntaxKind) { } } -fn maybe_delimited(p: &mut Parser, allow_fence: bool) -> bool { - if allow_fence && math_class(p.current_text()) == Some(MathClass::Fence) { - math_delimited(p, MathClass::Fence); - true - } else if math_class(p.current_text()) == Some(MathClass::Opening) { - math_delimited(p, MathClass::Closing); - true - } else { - false +fn maybe_delimited(p: &mut Parser) -> bool { + let open = math_class(p.current_text()) == Some(MathClass::Opening); + if open { + math_delimited(p); } + open } -fn math_delimited(p: &mut Parser, stop: MathClass) { +fn math_delimited(p: &mut Parser) { let m = p.marker(); p.eat(); let m2 = p.marker(); while !p.eof() && !p.at(SyntaxKind::Dollar) { - let class = math_class(p.current_text()); - if stop == MathClass::Fence && class == Some(MathClass::Closing) { - break; - } - - if class == Some(stop) { + if math_class(p.current_text()) == Some(MathClass::Closing) { p.wrap(m2, SyntaxKind::Math); p.eat(); p.wrap(m, SyntaxKind::MathDelimited); diff --git a/tests/ref/math/delimited.png b/tests/ref/math/delimited.png index 2788058fd..c83764ec2 100644 Binary files a/tests/ref/math/delimited.png and b/tests/ref/math/delimited.png differ diff --git a/tests/typ/math/attach-p2.typ b/tests/typ/math/attach-p2.typ index f618f21a4..8f97f74fc 100644 --- a/tests/typ/math/attach-p2.typ +++ b/tests/typ/math/attach-p2.typ @@ -23,5 +23,5 @@ $ (-1)^n + (1/2 + 3)^(-1/2) $ $ x_1 p_1 frak(p)_1 2_1 dot_1 lg_1 !_1 \\_1 ]_1 "ip"_1 op("iq")_1 \ x^1 b^1 frak(b)^1 2^1 dot^1 lg^1 !^1 \\^1 ]^1 "ib"^1 op("id")^1 \ x_1 y_1 "_"_1 x^1 l^1 "`"^1 attach(I,tl:1,bl:1,tr:1,br:1) - scripts(sum)_1^1 integral_1^1 |1/2|_1^1 \ + scripts(sum)_1^1 integral_1^1 abs(1/2)_1^1 \ x^1_1, "("b y")"^1_1 != (b y)^1_1, "[∫]"_1 [integral]_1 $ diff --git a/tests/typ/math/delimited.typ b/tests/typ/math/delimited.typ index 24374b8c2..e5b93cd6a 100644 --- a/tests/typ/math/delimited.typ +++ b/tests/typ/math/delimited.typ @@ -2,8 +2,8 @@ --- // Test automatic matching. -$ (a) + {b/2} + |a|/2 + (b) $ -$f(x/2) < zeta(c^2 + |a + b/2|)$ +$ (a) + {b/2} + abs(a)/2 + (b) $ +$f(x/2) < zeta(c^2 + abs(a + b/2))$ --- // Test unmatched. @@ -17,7 +17,7 @@ $ lr(| ]1,2\[ + 1/2|) $ --- // Test fence confusion. $ |x + |y| + z/a| \ - |x + lr(|y|) + z/a| $ + lr(|x + |y| + z/a|) $ --- // Test that symbols aren't matched automatically. diff --git a/tests/typ/math/spacing.typ b/tests/typ/math/spacing.typ index 9b64d92d2..e62d2eb3a 100644 --- a/tests/typ/math/spacing.typ +++ b/tests/typ/math/spacing.typ @@ -4,7 +4,7 @@ // Test spacing cases. $ä, +, c, (, )$ \ $=), (+), {times}$ -$⟧<⟦, |-|, [=$ \ +$⟧<⟦, abs(-), [=$ \ $a=b, a==b$ \ $-a, +a$ \ $a not b$ \