From 10355a403f57c93a074716c785d588c76de5634c Mon Sep 17 00:00:00 2001
From: Titus Wormer
Date: Thu, 9 Jun 2022 13:01:36 +0200
Subject: Add support for indented lines in paragraphs
---
src/content/flow.rs | 43 +++++++++++++---------------
tests/code_indented.rs | 13 ++++-----
tests/heading_atx.rs | 2 +-
tests/html_flow.rs | 74 ++++++++++++++++++++++++-------------------------
tests/thematic_break.rs | 2 +-
5 files changed, 64 insertions(+), 70 deletions(-)
diff --git a/src/content/flow.rs b/src/content/flow.rs
index 6c47a10..ac987e1 100644
--- a/src/content/flow.rs
+++ b/src/content/flow.rs
@@ -19,6 +19,7 @@
//!
//!
+use crate::constant::TAB_SIZE;
use crate::construct::{
blank_line::start as blank_line, code_fenced::start as code_fenced,
code_indented::start as code_indented, heading_atx::start as heading_atx,
@@ -26,6 +27,7 @@ use crate::construct::{
thematic_break::start as thematic_break,
};
use crate::tokenizer::{Code, Event, State, StateFnResult, TokenType, Tokenizer};
+use crate::util::get_span;
/// Turn `codes` as the flow content type into events.
// To do: remove this `allow` when all the content types are glued together.
@@ -237,34 +239,29 @@ fn continuation_construct_initial_before(tokenizer: &mut Tokenizer, code: Code)
}
fn continuation_construct_after_prefix(tokenizer: &mut Tokenizer, code: Code) -> StateFnResult {
- // let tail = tokenizer.events.last();
- // let mut prefix = 0;
+ let tail = tokenizer.events.last();
+ let mut prefix = 0;
- // if let Some(event) = tail {
- // if event.token_type == TokenType::Whitespace {
- // let span = get_span(&tokenizer.events, tokenizer.events.len() - 1);
- // prefix = span.end_index - span.start_index;
- // }
- // }
+ if let Some(event) = tail {
+ if event.token_type == TokenType::Whitespace {
+ let span = get_span(&tokenizer.events, tokenizer.events.len() - 1);
+ prefix = span.end_index - span.start_index;
+ }
+ }
match code {
// Blank lines are not allowed in content.
Code::None | Code::CarriageReturnLineFeed | Code::Char('\n' | '\r') => (State::Nok, None),
- // If code is disabled, indented lines are part of the content.
- // _ if prefix >= TAB_SIZE => {
- // (State::Ok, None)
- // }
- _ => {
- println!("to do: check if flow interrupts, assuming it can’t");
- tokenizer.attempt_2(heading_atx, thematic_break, |ok| {
- let result = if ok {
- (State::Nok, None)
- } else {
- (State::Ok, None)
- };
- Box::new(|_t, _c| result)
- })(tokenizer, code)
- }
+ // To do: If code is disabled, indented lines are part of the content.
+ _ if prefix >= TAB_SIZE => (State::Ok, None),
+ _ => tokenizer.attempt_2(heading_atx, thematic_break, |ok| {
+ let result = if ok {
+ (State::Nok, None)
+ } else {
+ (State::Ok, None)
+ };
+ Box::new(|_t, _c| result)
+ })(tokenizer, code),
}
}
diff --git a/tests/code_indented.rs b/tests/code_indented.rs
index f5926c0..80dae4b 100644
--- a/tests/code_indented.rs
+++ b/tests/code_indented.rs
@@ -40,19 +40,18 @@ fn code_indented() {
"should support blank lines in indented code (3)"
);
- // To do: paragraphs.
+ // To do: strip whitespace.
// assert_eq!(
// micromark("Foo\n bar"),
// "Foo\nbar
",
// "should not support interrupting paragraphs"
// );
- // To do: paragraphs.
- // assert_eq!(
- // micromark(" foo\nbar"),
- // "foo\n
\nbar
",
- // "should support paragraphs directly after indented code"
- // );
+ assert_eq!(
+ micromark(" foo\nbar"),
+ "foo\n
\nbar
",
+ "should support paragraphs directly after indented code"
+ );
// To do: setext.
// assert_eq!(
diff --git a/tests/heading_atx.rs b/tests/heading_atx.rs
index b75d058..7a830fe 100644
--- a/tests/heading_atx.rs
+++ b/tests/heading_atx.rs
@@ -99,7 +99,7 @@ fn heading_atx() {
"should not support four initial spaces"
);
- // To do: lazy.
+ // To do: strip whitespace.
// assert_eq!(
// micromark("foo\n # bar"),
// "foo\n# bar
",
diff --git a/tests/html_flow.rs b/tests/html_flow.rs
index 51d1a2a..18eff2d 100644
--- a/tests/html_flow.rs
+++ b/tests/html_flow.rs
@@ -115,12 +115,11 @@ p {color:blue;}
"should support an eof directly after a raw tag name"
);
- // To do: paragraphs.
- // assert_eq!(
- // micromark_with_options("</script\nmore
",
- // "should not support a raw closing tag"
- // );
+ assert_eq!(
+ micromark_with_options("</script\nmore",
+ "should not support a raw closing tag"
+ );
assert_eq!(
micromark_with_options("