block: specify list marker in event

instead of using span
This commit is contained in:
Noah Hellman 2023-04-29 19:14:44 +02:00
parent dbedeeb5ee
commit 6200b07287
2 changed files with 283 additions and 164 deletions

View file

@ -17,7 +17,7 @@ pub type TreeBuilder<'s> = tree::Builder<Node<'s>, Atom>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Node<'s> { pub enum Node<'s> {
Container(Container), Container(Container<'s>),
Leaf(Leaf<'s>), Leaf(Leaf<'s>),
} }
@ -35,7 +35,7 @@ enum Block<'s> {
Leaf(Leaf<'s>), Leaf(Leaf<'s>),
/// A container block, containing children blocks. /// A container block, containing children blocks.
Container(Container), Container(Container<'s>),
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
@ -80,7 +80,7 @@ pub enum Leaf<'s> {
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Container { pub enum Container<'s> {
/// Span is `>`. /// Span is `>`.
Blockquote, Blockquote,
@ -88,7 +88,7 @@ pub enum Container {
Div, Div,
/// Span is the list marker of the first list item in the list. /// Span is the list marker of the first list item in the list.
List(ListKind), List { kind: ListKind, marker: &'s str },
/// Span is the list marker. /// Span is the list marker.
ListItem(ListType), ListItem(ListType),
@ -345,7 +345,7 @@ impl<'s> TreeParser<'s> {
fn parse_container( fn parse_container(
&mut self, &mut self,
c: Container, c: Container<'s>,
k: &Kind, k: &Kind,
span: Span, span: Span,
outer: Span, outer: Span,
@ -388,7 +388,10 @@ impl<'s> TreeParser<'s> {
if same_depth { if same_depth {
let tight = true; let tight = true;
let node = self.tree.enter( let node = self.tree.enter(
Node::Container(Container::List(ListKind { ty, tight })), Node::Container(Container::List {
kind: ListKind { ty, tight },
marker: span.of(self.src),
}),
span, span,
); );
self.open_lists.push(OpenList { self.open_lists.push(OpenList {
@ -594,8 +597,8 @@ impl<'s> TreeParser<'s> {
impl<'t, 's> tree::Element<'t, Node<'s>, Atom> { impl<'t, 's> tree::Element<'t, Node<'s>, Atom> {
fn list_mut(&mut self) -> Option<&mut ListKind> { fn list_mut(&mut self) -> Option<&mut ListKind> {
if let tree::Element::Container(Node::Container(Container::List(l))) = self { if let tree::Element::Container(Node::Container(Container::List { kind, .. })) = self {
Some(l) Some(kind)
} else { } else {
None None
} }
@ -1563,10 +1566,13 @@ mod test {
test_parse!( test_parse!(
"- abc", "- abc",
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true ty: Unordered(b'-'),
}))), tight: true
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1575,10 +1581,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true ty: Unordered(b'-'),
}))), tight: true
},
marker: "-",
})),
"-" "-"
), ),
); );
@ -1592,10 +1601,13 @@ mod test {
"- b\n", // "- b\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1609,10 +1621,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
); );
@ -1628,10 +1643,13 @@ mod test {
"- c\n", // "- c\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: false, ty: Unordered(b'-'),
}))), tight: false,
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1651,10 +1669,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: false, ty: Unordered(b'-'),
}))), tight: false,
},
marker: "-",
})),
"-" "-"
), ),
); );
@ -1672,10 +1693,13 @@ mod test {
" d\n", // " d\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1689,10 +1713,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: false, ty: Unordered(b'-'),
}))), tight: false,
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1705,18 +1732,24 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: false, ty: Unordered(b'-'),
}))), tight: false,
},
marker: "-",
})),
"-" "-"
), ),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
); );
@ -1734,10 +1767,13 @@ mod test {
"- b\n", // "- b\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1746,10 +1782,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'+'), kind: ListKind {
tight: true, ty: Unordered(b'+'),
}))), tight: true,
},
marker: "+",
})),
"+", "+",
), ),
(Enter(Container(ListItem(Unordered(b'+')))), "+"), (Enter(Container(ListItem(Unordered(b'+')))), "+"),
@ -1764,10 +1803,13 @@ mod test {
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
(Exit(Container(ListItem(Unordered(b'+')))), "+"), (Exit(Container(ListItem(Unordered(b'+')))), "+"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'+'), kind: ListKind {
tight: true, ty: Unordered(b'+'),
}))), tight: true,
},
marker: "+",
})),
"+", "+",
), ),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
@ -1777,10 +1819,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
); );
@ -1793,10 +1838,13 @@ mod test {
" c\n", // " c\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Ordered(Decimal, Period), kind: ListKind {
tight: true, ty: Ordered(Decimal, Period),
}))), tight: true,
},
marker: "1.",
})),
"1.", "1.",
), ),
(Enter(Container(ListItem(Ordered(Decimal, Period)))), "1."), (Enter(Container(ListItem(Ordered(Decimal, Period)))), "1."),
@ -1805,10 +1853,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-", "-",
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1818,10 +1869,13 @@ mod test {
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-", "-",
), ),
(Enter(Leaf(Paragraph)), ""), (Enter(Leaf(Paragraph)), ""),
@ -1829,10 +1883,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Ordered(Decimal, Period)))), "1."), (Exit(Container(ListItem(Ordered(Decimal, Period)))), "1."),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Ordered(Decimal, Period), kind: ListKind {
tight: true, ty: Ordered(Decimal, Period),
}))), tight: true,
},
marker: "1.",
})),
"1.", "1.",
), ),
); );
@ -1849,10 +1906,13 @@ mod test {
" * c\n", // " * c\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1861,10 +1921,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'+'), kind: ListKind {
tight: true, ty: Unordered(b'+'),
}))), tight: true,
},
marker: "+",
})),
"+", "+",
), ),
(Enter(Container(ListItem(Unordered(b'+')))), "+"), (Enter(Container(ListItem(Unordered(b'+')))), "+"),
@ -1873,10 +1936,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'*'), kind: ListKind {
tight: true, ty: Unordered(b'*'),
}))), tight: true,
},
marker: "*",
})),
"*", "*",
), ),
(Enter(Container(ListItem(Unordered(b'*')))), "*"), (Enter(Container(ListItem(Unordered(b'*')))), "*"),
@ -1885,26 +1951,35 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'*')))), "*"), (Exit(Container(ListItem(Unordered(b'*')))), "*"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'*'), kind: ListKind {
tight: true, ty: Unordered(b'*'),
}))), tight: true,
},
marker: "*",
})),
"*", "*",
), ),
(Exit(Container(ListItem(Unordered(b'+')))), "+"), (Exit(Container(ListItem(Unordered(b'+')))), "+"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'+'), kind: ListKind {
tight: true, ty: Unordered(b'+'),
}))), tight: true,
},
marker: "+",
})),
"+", "+",
), ),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
); );
@ -1921,10 +1996,13 @@ mod test {
"cd\n", // "cd\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true ty: Unordered(b'-'),
}))), tight: true
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1933,10 +2011,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'*'), kind: ListKind {
tight: true ty: Unordered(b'*'),
}))), tight: true
},
marker: "*",
})),
"*" "*"
), ),
(Enter(Container(ListItem(Unordered(b'*')))), "*"), (Enter(Container(ListItem(Unordered(b'*')))), "*"),
@ -1946,18 +2027,24 @@ mod test {
(Atom(Blankline), "\n"), (Atom(Blankline), "\n"),
(Exit(Container(ListItem(Unordered(b'*')))), "*"), (Exit(Container(ListItem(Unordered(b'*')))), "*"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'*'), kind: ListKind {
tight: true ty: Unordered(b'*'),
}))), tight: true
},
marker: "*",
})),
"*" "*"
), ),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true ty: Unordered(b'-'),
}))), tight: true
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Leaf(Paragraph)), ""), (Enter(Leaf(Paragraph)), ""),
@ -1975,10 +2062,13 @@ mod test {
"+ c\n", // "+ c\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true ty: Unordered(b'-'),
}))), tight: true
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -1987,17 +2077,23 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true ty: Unordered(b'-'),
}))), tight: true
},
marker: "-",
})),
"-" "-"
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'+'), kind: ListKind {
tight: true ty: Unordered(b'+'),
}))), tight: true
},
marker: "+",
})),
"+" "+"
), ),
(Enter(Container(ListItem(Unordered(b'+')))), "+"), (Enter(Container(ListItem(Unordered(b'+')))), "+"),
@ -2011,10 +2107,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'+')))), "+"), (Exit(Container(ListItem(Unordered(b'+')))), "+"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'+'), kind: ListKind {
tight: true ty: Unordered(b'+'),
}))), tight: true
},
marker: "+",
})),
"+" "+"
), ),
); );
@ -2029,10 +2128,13 @@ mod test {
" description\n", // " description\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Description, kind: ListKind {
tight: true, ty: Description,
}))), tight: true,
},
marker: ":",
})),
":" ":"
), ),
(Enter(Leaf(DescriptionTerm)), ""), (Enter(Leaf(DescriptionTerm)), ""),
@ -2045,10 +2147,13 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Description))), ":"), (Exit(Container(ListItem(Description))), ":"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Description, kind: ListKind {
tight: true, ty: Description,
}))), tight: true,
},
marker: ":",
})),
":" ":"
), ),
); );
@ -2243,18 +2348,24 @@ mod test {
" - b\n", // " - b\n", //
), ),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
( (
Enter(Container(List(ListKind { Enter(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
(Enter(Container(ListItem(Unordered(b'-')))), "-"), (Enter(Container(ListItem(Unordered(b'-')))), "-"),
@ -2268,18 +2379,24 @@ mod test {
(Exit(Leaf(Paragraph)), ""), (Exit(Leaf(Paragraph)), ""),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
(Exit(Container(ListItem(Unordered(b'-')))), "-"), (Exit(Container(ListItem(Unordered(b'-')))), "-"),
( (
Exit(Container(List(ListKind { Exit(Container(List {
ty: Unordered(b'-'), kind: ListKind {
tight: true, ty: Unordered(b'-'),
}))), tight: true,
},
marker: "-",
})),
"-" "-"
), ),
); );

View file

@ -919,7 +919,10 @@ impl<'s> Parser<'s> {
block::Container::Blockquote => Container::Blockquote, block::Container::Blockquote => Container::Blockquote,
block::Container::Div => Container::Div { class: content }, block::Container::Div => Container::Div { class: content },
block::Container::Footnote => Container::Footnote { label: content }, block::Container::Footnote => Container::Footnote { label: content },
block::Container::List(block::ListKind { ty, tight }) => { block::Container::List {
kind: block::ListKind { ty, tight },
marker,
} => {
if matches!(ty, block::ListType::Description) { if matches!(ty, block::ListType::Description) {
Container::DescriptionList Container::DescriptionList
} else { } else {
@ -927,9 +930,8 @@ impl<'s> Parser<'s> {
block::ListType::Unordered(..) => ListKind::Unordered, block::ListType::Unordered(..) => ListKind::Unordered,
block::ListType::Task => ListKind::Task, block::ListType::Task => ListKind::Task,
block::ListType::Ordered(numbering, style) => { block::ListType::Ordered(numbering, style) => {
let start = numbering let start =
.parse_number(style.number(content)) numbering.parse_number(style.number(marker)).max(1);
.max(1);
ListKind::Ordered { ListKind::Ordered {
numbering, numbering,
style, style,