summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-09-06 12:07:37 +0200
committerLaurenz <laurmaedje@gmail.com>2023-09-06 12:07:37 +0200
commitfe402759c03eb93cefc2879e751b8e732891bd3e (patch)
tree8e98256cf4f839e72e53836d00a0ecdc7ad4854b
parentb76e8d5db9bea8fb63e65fe7a54db6bbae1cf842 (diff)
Don't automatically match fences
Fixes #306
-rw-r--r--crates/typst-syntax/src/parser.rs27
-rw-r--r--tests/ref/math/delimited.pngbin23332 -> 25691 bytes
-rw-r--r--tests/typ/math/attach-p2.typ2
-rw-r--r--tests/typ/math/delimited.typ6
-rw-r--r--tests/typ/math/spacing.typ2
5 files changed, 14 insertions, 23 deletions
diff --git a/crates/typst-syntax/src/parser.rs b/crates/typst-syntax/src/parser.rs
index 306ac798..313d5ea3 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 2788058f..c83764ec 100644
--- a/tests/ref/math/delimited.png
+++ b/tests/ref/math/delimited.png
Binary files differ
diff --git a/tests/typ/math/attach-p2.typ b/tests/typ/math/attach-p2.typ
index f618f21a..8f97f74f 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 24374b8c..e5b93cd6 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 9b64d92d..e62d2eb3 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$ \