aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Titus Wormer <tituswormer@gmail.com>2022-10-26 11:00:57 +0200
committerLibravatar Titus Wormer <tituswormer@gmail.com>2022-10-26 11:00:57 +0200
commitccf6775c848ba798c011654905269e3300e0079a (patch)
treea58f1fb2b060c14364328f981f50b1ab9ed3abf2
parentbfe2f86e99b5528c636cc4002ce10e9af06de0c0 (diff)
downloadmarkdown-rs-ccf6775c848ba798c011654905269e3300e0079a.tar.gz
markdown-rs-ccf6775c848ba798c011654905269e3300e0079a.tar.bz2
markdown-rs-ccf6775c848ba798c011654905269e3300e0079a.zip
Fix container close after unclosed fenced code, w/ eol
Closes GH-16 Co-authored-by: Christian Murphy <christian.murphy.42@gmail.com>
-rw-r--r--src/construct/document.rs26
-rw-r--r--tests/fuzz.rs12
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"),
+ "<blockquote>\n<pre><code>\n</code></pre>\n</blockquote>",
+ "6-a: container close after unclosed fenced code, with eol (block quote, GH-16)"
+ );
+
+ assert_eq!(
+ to_html("- ```\n"),
+ "<ul>\n<li>\n<pre><code>\n</code></pre>\n</li>\n</ul>",
+ "6-b: container close after unclosed fenced code, with eol (list, GH-16)"
+ );
+
Ok(())
}