diff --git a/src/syntax/lexer.rs b/src/syntax/lexer.rs index 0bf7966fd..b79b4c7f4 100644 --- a/src/syntax/lexer.rs +++ b/src/syntax/lexer.rs @@ -191,15 +191,15 @@ impl Lexer<'_> { ':' => SyntaxKind::Colon, '=' => { self.s.eat_while('='); - if self.space_and_more() { + if self.space_or_end() { SyntaxKind::HeadingMarker } else { self.text() } } - '-' if self.space_and_more() => SyntaxKind::ListMarker, - '+' if self.space_and_more() => SyntaxKind::EnumMarker, - '/' if self.space_and_more() => SyntaxKind::TermMarker, + '-' if self.space_or_end() => SyntaxKind::ListMarker, + '+' if self.space_or_end() => SyntaxKind::EnumMarker, + '/' if self.space_or_end() => SyntaxKind::TermMarker, _ => self.text(), } @@ -363,13 +363,8 @@ impl Lexer<'_> { alphanum(prev) && alphanum(next) } - fn space_and_more(&self) -> bool { - let mut s = self.s; - if !s.at(char::is_whitespace) { - return false; - } - s.eat_while(|c: char| c.is_whitespace() && !is_newline(c)); - !s.done() && !s.at(is_newline) + fn space_or_end(&self) -> bool { + self.s.done() || self.s.at(char::is_whitespace) } } diff --git a/src/syntax/parser.rs b/src/syntax/parser.rs index afb207b68..5933d481b 100644 --- a/src/syntax/parser.rs +++ b/src/syntax/parser.rs @@ -157,7 +157,7 @@ fn emph(p: &mut Parser) { fn heading(p: &mut Parser) { let m = p.marker(); p.assert(SyntaxKind::HeadingMarker); - whitespace(p); + whitespace_line(p); markup(p, false, usize::MAX, |kind| { kind == SyntaxKind::Label || kind == SyntaxKind::RightBracket }); @@ -168,7 +168,7 @@ fn list_item(p: &mut Parser) { let m = p.marker(); p.assert(SyntaxKind::ListMarker); let min_indent = p.column(p.prev_end()); - whitespace(p); + whitespace_line(p); markup(p, false, min_indent, |kind| kind == SyntaxKind::RightBracket); p.wrap(m, SyntaxKind::ListItem); } @@ -177,7 +177,7 @@ fn enum_item(p: &mut Parser) { let m = p.marker(); p.assert(SyntaxKind::EnumMarker); let min_indent = p.column(p.prev_end()); - whitespace(p); + whitespace_line(p); markup(p, false, min_indent, |kind| kind == SyntaxKind::RightBracket); p.wrap(m, SyntaxKind::EnumItem); } @@ -186,18 +186,18 @@ fn term_item(p: &mut Parser) { let m = p.marker(); p.assert(SyntaxKind::TermMarker); let min_indent = p.column(p.prev_end()); - whitespace(p); + whitespace_line(p); markup(p, false, usize::MAX, |kind| { kind == SyntaxKind::Colon || kind == SyntaxKind::RightBracket }); p.expect(SyntaxKind::Colon); - whitespace(p); + whitespace_line(p); markup(p, false, min_indent, |kind| kind == SyntaxKind::RightBracket); p.wrap(m, SyntaxKind::TermItem); } -fn whitespace(p: &mut Parser) { - while p.current().is_trivia() { +fn whitespace_line(p: &mut Parser) { + while !p.newline() && p.current().is_trivia() { p.eat(); } } diff --git a/tests/ref/basics/enum.png b/tests/ref/basics/enum.png index 5ccdb1ad0..8e48076b8 100644 Binary files a/tests/ref/basics/enum.png and b/tests/ref/basics/enum.png differ diff --git a/tests/ref/basics/heading.png b/tests/ref/basics/heading.png index 9cb4d0985..b4f996659 100644 Binary files a/tests/ref/basics/heading.png and b/tests/ref/basics/heading.png differ diff --git a/tests/ref/basics/list.png b/tests/ref/basics/list.png index b6b8ed3e6..6db5fb711 100644 Binary files a/tests/ref/basics/list.png and b/tests/ref/basics/list.png differ diff --git a/tests/ref/basics/terms.png b/tests/ref/basics/terms.png index e186ec8c8..5c6957954 100644 Binary files a/tests/ref/basics/terms.png and b/tests/ref/basics/terms.png differ diff --git a/tests/typ/basics/enum.typ b/tests/typ/basics/enum.typ index 02eb03c25..fd845c2b0 100644 --- a/tests/typ/basics/enum.typ +++ b/tests/typ/basics/enum.typ @@ -55,9 +55,10 @@ + B --- -// Lone plus is not an enum. +// Edge cases. + -No enum +Empty ++Nope --- // Error: 22-24 invalid numbering pattern diff --git a/tests/typ/basics/heading.typ b/tests/typ/basics/heading.typ index d843a2e82..3d6370366 100644 --- a/tests/typ/basics/heading.typ +++ b/tests/typ/basics/heading.typ @@ -1,11 +1,5 @@ // Test headings. ---- -#show heading: it => text(blue, it.title) - -= -No heading - --- // Different number of equals signs. @@ -50,3 +44,10 @@ multiline. = Heading ===== Heading 🌍 #heading(level: 5)[Heading] + +--- +// Edge cases. +#set heading(numbering: "1.") += +Not in heading +=Nope diff --git a/tests/typ/basics/list.typ b/tests/typ/basics/list.typ index 1c111dcb8..3fd9ddb1d 100644 --- a/tests/typ/basics/list.typ +++ b/tests/typ/basics/list.typ @@ -1,9 +1,5 @@ // Test bullet lists. ---- -- -No list - --- _Shopping list_ #list[Apples][Potatoes][Juice] @@ -52,3 +48,9 @@ _Shopping list_ #set list(marker: [-]) - Bare hyphen - is not a list + +--- +// Edge cases. +- +Not in list +-Nope diff --git a/tests/typ/basics/terms.typ b/tests/typ/basics/terms.typ index 204defbff..578644233 100644 --- a/tests/typ/basics/terms.typ +++ b/tests/typ/basics/terms.typ @@ -1,10 +1,5 @@ // Test term list. ---- -/ -No: list \ -/No: list - --- // Test with constructor. #terms( @@ -46,3 +41,12 @@ No: list \ / A: One letter / BB: Two letters / CCC: Three letters + +--- +/ Term: +Not in list +/Nope + +--- +// Error: 8 expected colon +/ Hello