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
\n

bar

", - // "should support paragraphs directly after indented code" - // ); + assert_eq!( + micromark(" foo\nbar"), + "
foo\n
\n

bar

", + "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("