summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-10-05 17:25:58 +0200
committerLaurenz <laurmaedje@gmail.com>2021-10-05 17:25:58 +0200
commit00be5d36c4f5bdc39a5f94ae1eb200499ffb8871 (patch)
treeb13100e253d5106b0ff39cc060ed0071a0709af9
parent4b2c6334d02d1574aaaef09ddf2c1501075b11fb (diff)
Change indent requirements to allow alignment
Previously the following wouldn't work correctly because "Fourth" would have been a child of "Third". ``` 3. Third ⎵. Fourth ```
-rw-r--r--src/parse/mod.rs10
-rw-r--r--tests/ref/markup/enums.pngbin2923 -> 4123 bytes
-rw-r--r--tests/typ/markup/enums.typ5
3 files changed, 10 insertions, 5 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs
index 19d810ea..cc710201 100644
--- a/src/parse/mod.rs
+++ b/src/parse/mod.rs
@@ -34,7 +34,7 @@ fn markup(p: &mut Parser) -> Markup {
markup_while(p, true, &mut |_| true)
}
-/// Parse markup that stays right of the given column.
+/// Parse markup that stays equal or right of the given column.
fn markup_indented(p: &mut Parser, column: usize) -> Markup {
p.eat_while(|t| match t {
Token::Space(n) => n == 0,
@@ -43,7 +43,7 @@ fn markup_indented(p: &mut Parser, column: usize) -> Markup {
});
markup_while(p, false, &mut |p| match p.peek() {
- Some(Token::Space(n)) if n >= 1 => p.column(p.next_end()) > column,
+ Some(Token::Space(n)) if n >= 1 => p.column(p.next_end()) >= column,
_ => true,
})
}
@@ -175,7 +175,6 @@ fn raw(p: &mut Parser, token: RawToken) -> MarkupNode {
/// Parse a heading.
fn heading(p: &mut Parser) -> MarkupNode {
let start = p.next_start();
- let column = p.column(start);
p.eat_assert(Token::Eq);
// Count depth.
@@ -188,6 +187,7 @@ fn heading(p: &mut Parser) -> MarkupNode {
return MarkupNode::Text(p.get(start .. p.prev_end()).into());
}
+ let column = p.column(p.prev_end());
let body = markup_indented(p, column);
MarkupNode::Heading(Box::new(HeadingNode {
span: p.span_from(start),
@@ -199,8 +199,8 @@ fn heading(p: &mut Parser) -> MarkupNode {
/// Parse a single list item.
fn list_node(p: &mut Parser) -> MarkupNode {
let start = p.next_start();
- let column = p.column(start);
p.eat_assert(Token::Hyph);
+ let column = p.column(p.prev_end());
let body = markup_indented(p, column);
MarkupNode::List(Box::new(ListNode { span: p.span_from(start), body }))
}
@@ -208,8 +208,8 @@ fn list_node(p: &mut Parser) -> MarkupNode {
/// Parse a single enum item.
fn enum_node(p: &mut Parser, number: Option<usize>) -> MarkupNode {
let start = p.next_start();
- let column = p.column(start);
p.eat_assert(Token::Numbering(number));
+ let column = p.column(p.prev_end());
let body = markup_indented(p, column);
MarkupNode::Enum(Box::new(EnumNode {
span: p.span_from(start),
diff --git a/tests/ref/markup/enums.png b/tests/ref/markup/enums.png
index c1eee45d..f1d3855b 100644
--- a/tests/ref/markup/enums.png
+++ b/tests/ref/markup/enums.png
Binary files differ
diff --git a/tests/typ/markup/enums.typ b/tests/typ/markup/enums.typ
index ecf08a36..c976deee 100644
--- a/tests/typ/markup/enums.typ
+++ b/tests/typ/markup/enums.typ
@@ -9,3 +9,8 @@
1. First.
2. Second.
1. Back to first.
+
+---
+2. Second
+ . First
+ . Indented