aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Titus Wormer <tituswormer@gmail.com>2022-06-09 13:01:36 +0200
committerLibravatar Titus Wormer <tituswormer@gmail.com>2022-06-09 13:01:36 +0200
commit10355a403f57c93a074716c785d588c76de5634c (patch)
tree46408a8a1198c1bb632f22964a347c01023867bc
parent433680ae0914da8921c4ee762fdc93e7b70cf9f1 (diff)
downloadmarkdown-rs-10355a403f57c93a074716c785d588c76de5634c.tar.gz
markdown-rs-10355a403f57c93a074716c785d588c76de5634c.tar.bz2
markdown-rs-10355a403f57c93a074716c785d588c76de5634c.zip
Add support for indented lines in paragraphs
-rw-r--r--src/content/flow.rs43
-rw-r--r--tests/code_indented.rs13
-rw-r--r--tests/heading_atx.rs2
-rw-r--r--tests/html_flow.rs74
-rw-r--r--tests/thematic_break.rs2
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 @@
//!
//! <!-- To do: `setext` in content? Link to content. -->
+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"),
// "<p>Foo\nbar</p>",
// "should not support interrupting paragraphs"
// );
- // To do: paragraphs.
- // assert_eq!(
- // micromark(" foo\nbar"),
- // "<pre><code>foo\n</code></pre>\n<p>bar</p>",
- // "should support paragraphs directly after indented code"
- // );
+ assert_eq!(
+ micromark(" foo\nbar"),
+ "<pre><code>foo\n</code></pre>\n<p>bar</p>",
+ "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"),
// "<p>foo\n# bar</p>",
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", DANGER),
- // "<p>&lt;/script\nmore</p>",
- // "should not support a raw closing tag"
- // );
+ assert_eq!(
+ micromark_with_options("</script\nmore", DANGER),
+ "<p>&lt;/script\nmore</p>",
+ "should not support a raw closing tag"
+ );
assert_eq!(
micromark_with_options("<script/", DANGER),
@@ -466,29 +465,29 @@ fn html_flow_6_basic() {
// );
// To do: paragraphs.
- // assert_eq!(
- // micromark_with_options(
- // "<table>
- // <tr>
- // <td>
- // hi
- // </td>
- // </tr>
- // </table>
-
- // okay.",
- // DANGER
- // ),
- // "<table>
- // <tr>
- // <td>
- // hi
- // </td>
- // </tr>
- // </table>
- // <p>okay.</p>",
- // "should support html of type 6 (1)"
- // );
+ assert_eq!(
+ micromark_with_options(
+ "<table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+</table>
+
+okay.",
+ DANGER
+ ),
+ "<table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+</table>
+<p>okay.</p>",
+ "should support html of type 6 (1)"
+ );
assert_eq!(
micromark_with_options(" <div>\n *hello*\n <foo><a>", DANGER),
@@ -502,7 +501,7 @@ fn html_flow_6_basic() {
"should support html starting w/ a closing tag"
);
- // To do: phrasing
+ // To do: phrasing.
// assert_eq!(
// micromark_with_options("<DIV CLASS=\"foo\">\n\n*Markdown*\n\n</DIV>", DANGER),
// "<DIV CLASS=\"foo\">\n<p><em>Markdown</em></p>\n</DIV>",
@@ -740,12 +739,11 @@ fn html_flow_6_basic() {
#[test]
fn html_flow_7_complete() {
- // To do: phrasing.
- // assert_eq!(
- // micromark_with_options("<a href=\"foo\">\n*bar*\n</a>", DANGER),
- // "<a href=\"foo\">\n*bar*\n</a>",
- // "should support complete tags (type 7)"
- // );
+ assert_eq!(
+ micromark_with_options("<a href=\"foo\">\n*bar*\n</a>", DANGER),
+ "<a href=\"foo\">\n*bar*\n</a>",
+ "should support complete tags (type 7)"
+ );
assert_eq!(
micromark_with_options("<Warning>\n*bar*\n</Warning>", DANGER),
@@ -791,7 +789,7 @@ fn html_flow_7_complete() {
"should support interleaving w/ whitespace-only blank lines"
);
- // To do: interrupting.
+ // To do: disallow html (complete) from interrupting.
// assert_eq!(
// micromark_with_options("Foo\n<a href=\"bar\">\nbaz", DANGER),
// "<p>Foo\n<a href=\"bar\">\nbaz</p>",
@@ -816,7 +814,7 @@ fn html_flow_7_complete() {
"should not support a line ending directly after a tag name"
);
- // To do: paragraphs (trailing whitespace).
+ // To do: trim trailing whitespace.
// assert_eq!(
// micromark_with_options("<x ", DANGER),
// "<p>&lt;x</p>",
diff --git a/tests/thematic_break.rs b/tests/thematic_break.rs
index 833fa6f..1e3fb1e 100644
--- a/tests/thematic_break.rs
+++ b/tests/thematic_break.rs
@@ -63,7 +63,7 @@ fn thematic_break() {
"should not support thematic breaks w/ 4 spaces"
);
- // To do: paragraphs.
+ // To do: trim initial whitespace.
// assert_eq!(
// micromark("Foo\n ***"),
// "<p>Foo\n***</p>",