From ccf6775c848ba798c011654905269e3300e0079a Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Wed, 26 Oct 2022 11:00:57 +0200 Subject: Fix container close after unclosed fenced code, w/ eol Closes GH-16 Co-authored-by: Christian Murphy --- src/construct/document.rs | 26 ++++++++++++++++++++------ tests/fuzz.rs | 12 ++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/construct/document.rs b/src/construct/document.rs index daf7131..a81be8a 100644 --- a/src/construct/document.rs +++ b/src/construct/document.rs @@ -546,19 +546,33 @@ fn resolve(tokenizer: &mut Tokenizer) { let mut line = 0; while child_index < child.events.len() { - let event = &child.events[child_index]; - - if event.kind == Kind::Enter - && (event.name == Name::LineEnding || event.name == Name::BlankLineEnding) + if child.events[child_index].kind == Kind::Exit + && matches!( + child.events[child_index].name, + Name::LineEnding | Name::BlankLineEnding + ) { + // Inject before `Enter:LineEnding`. + let mut inject_index = child_index - 1; + let mut point = &child.events[inject_index].point; + + while child_index + 1 < child.events.len() + && child.events[child_index + 1].kind == Kind::Exit + { + child_index += 1; + point = &child.events[child_index].point; + // Inject after `Exit:*`. + inject_index = child_index + 1; + } + if let Some(mut exits) = tokenizer.tokenize_state.document_exits[line].take() { let mut exit_index = 0; while exit_index < exits.len() { - exits[exit_index].point = event.point.clone(); + exits[exit_index].point = point.clone(); exit_index += 1; } - child.map.add(child_index, 0, exits); + child.map.add(inject_index, 0, exits); } line += 1; diff --git a/tests/fuzz.rs b/tests/fuzz.rs index bb63035..72f365e 100644 --- a/tests/fuzz.rs +++ b/tests/fuzz.rs @@ -56,5 +56,17 @@ fn fuzz() -> Result<(), String> { "5: lists should support high start numbers (GH-17)" ); + assert_eq!( + to_html("> ```\n"), + "
\n
\n
\n
", + "6-a: container close after unclosed fenced code, with eol (block quote, GH-16)" + ); + + assert_eq!( + to_html("- ```\n"), + "", + "6-b: container close after unclosed fenced code, with eol (list, GH-16)" + ); + Ok(()) } -- cgit