Fix heading and list markers
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 17 KiB |
@ -55,9 +55,10 @@
|
||||
+ B
|
||||
|
||||
---
|
||||
// Lone plus is not an enum.
|
||||
// Edge cases.
|
||||
+
|
||||
No enum
|
||||
Empty
|
||||
+Nope
|
||||
|
||||
---
|
||||
// Error: 22-24 invalid numbering pattern
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|