From 7350acc692a79d9d4cf56afbc53ac3c9f2a6237c Mon Sep 17 00:00:00 2001
From: Titus Wormer 
Date: Thu, 16 Jun 2022 12:55:50 +0200
Subject: Add support for hard break (trailing)
---
 readme.md                            |   8 +--
 src/compiler.rs                      |   5 +-
 src/constant.rs                      |   6 ++
 src/construct/character_escape.rs    |   2 +-
 src/construct/hard_break_escape.rs   |  19 +++--
 src/construct/hard_break_trailing.rs |  83 ++++++++++++++++++++++
 src/construct/mod.rs                 |   4 +-
 src/content/text.rs                  |  15 ++--
 src/tokenizer.rs                     |  13 +++-
 src/util/span.rs                     |   2 +-
 tests/hard_break_escape.rs           | 121 +------------------------------
 tests/hard_break_trailing.rs         | 133 +++++++++++++++++++++++++++++++++++
 12 files changed, 271 insertions(+), 140 deletions(-)
 create mode 100644 src/construct/hard_break_trailing.rs
 create mode 100644 tests/hard_break_trailing.rs
diff --git a/readme.md b/readme.md
index 0e58750..0cbff1e 100644
--- a/readme.md
+++ b/readme.md
@@ -111,7 +111,8 @@ cargo doc --document-private-items
 - [x] (1) code (text)
 - [ ] (3) content
 - [ ] (3) definition
-- [x] (1) hard break escape
+- [x] hard break (escape)
+- [x] hard break (trailing)
 - [x] heading (atx)
 - [ ] (1) heading (setext)
 - [x] html (flow)
@@ -122,7 +123,6 @@ cargo doc --document-private-items
 - [ ] (8) list
 - [ ] (1) paragraph
 - [x] thematic break
-- [ ] (1) trailing break escape
 
 ### Content types
 
@@ -147,12 +147,12 @@ cargo doc --document-private-items
   - [x] character escape
   - [x] character reference
   - [x] code (text)
-  - [x] hard break escape
+  - [x] hard break (escape)
+  - [x] hard break (trailing)
   - [x] html (text)
   - [ ] label end
   - [ ] label start (image)
   - [ ] label start (link)
-  - [ ] trailing break escape
 - [x] string
   - [x] character escape
   - [x] character reference
diff --git a/src/compiler.rs b/src/compiler.rs
index 3aacca0..9f84a38 100644
--- a/src/compiler.rs
+++ b/src/compiler.rs
@@ -152,6 +152,8 @@ pub fn compile(events: &[Event], codes: &[Code], options: &CompileOptions) -> St
                 | TokenType::Whitespace
                 | TokenType::HardBreakEscape
                 | TokenType::HardBreakEscapeMarker
+                | TokenType::HardBreakTrailing
+                | TokenType::HardBreakTrailingSpace
                 | TokenType::HtmlFlowData
                 | TokenType::HtmlTextData
                 | TokenType::CodeFencedFence
@@ -195,6 +197,7 @@ pub fn compile(events: &[Event], codes: &[Code], options: &CompileOptions) -> St
                 | TokenType::CharacterReference
                 | TokenType::CharacterReferenceMarkerSemi
                 | TokenType::HardBreakEscapeMarker
+                | TokenType::HardBreakTrailingSpace
                 | TokenType::Autolink
                 | TokenType::AutolinkMarker => {}
                 TokenType::HtmlFlow | TokenType::HtmlText => {
@@ -211,7 +214,7 @@ pub fn compile(events: &[Event], codes: &[Code], options: &CompileOptions) -> St
                 TokenType::Paragraph => {
                     buf_tail_mut(buffers).push("
".to_string());
                 }
-                TokenType::HardBreakEscape => {
+                TokenType::HardBreakEscape | TokenType::HardBreakTrailing => {
                     buf_tail_mut(buffers).push("
".to_string());
                 }
                 TokenType::CodeIndented | TokenType::CodeFenced => {
diff --git a/src/constant.rs b/src/constant.rs
index d2fb238..ff9e62e 100644
--- a/src/constant.rs
+++ b/src/constant.rs
@@ -44,6 +44,12 @@ pub const AUTOLINK_SCHEME_SIZE_MAX: usize = 32;
 /// [autolink]: crate::construct::autolink
 pub const AUTOLINK_DOMAIN_SIZE_MAX: usize = 63;
 
+/// The number of spaces needed, before a line ending, for a [hard break
+/// (trailing)][hard_break_trailing] to form.
+///
+/// [hard_break_trailing]: crate::construct::hard_break_trailing
+pub const HARD_BREAK_PREFIX_SIZE_MIN: usize = 2;
+
 /// The number of markers needed for a [thematic break][thematic_break] to form.
 ///
 /// Like many things in markdown, the number is `3`.
diff --git a/src/construct/character_escape.rs b/src/construct/character_escape.rs
index baedd4b..743cbf8 100644
--- a/src/construct/character_escape.rs
+++ b/src/construct/character_escape.rs
@@ -14,7 +14,7 @@
 //! [character reference][character_reference] instead
 //! (as in, `&`, `{`, or say `	`).
 //! It is also possible to escape a line ending in text with a similar
-//! construct: a [hard break escape][hard_break_escape] is a backslash followed
+//! construct: a [hard break (escape)][hard_break_escape] is a backslash followed
 //! by a line ending (that is part of the construct instead of ending it).
 //!
 //! ## References
diff --git a/src/construct/hard_break_escape.rs b/src/construct/hard_break_escape.rs
index a7712d6..51da953 100644
--- a/src/construct/hard_break_escape.rs
+++ b/src/construct/hard_break_escape.rs
@@ -1,4 +1,4 @@
-//! Hard break escapes are a construct that occurs in the  [text][] content
+//! Hard break (escape) is a construct that occurs in the  [text][] content
 //! type.
 //!
 //! They’re formed with the following BNF:
@@ -8,6 +8,15 @@
 //! ; instead of ending it).
 //! hard_break_escape ::= '\\'
 //! ```
+//!
+//! Hard breaks in markdown relate to the HTML element `
`.
+//! See [*§ 4.5.27 The `br` element* in the HTML spec][html] for more info.
+//!
+//! It is also possible to create a hard break with a
+//! [hard break (trailing)][hard_break_trailing].
+//! That construct is not recommended because trailing spaces are typically
+//! invisible in editors, or even automatically removed, making them to use.
+//!
 //! It is also possible to escape punctuation characters with a similar
 //! construct: a [character escape][character_escape] is a backslash followed
 //! by an ASCII punctuation character.
@@ -22,12 +31,12 @@
 //! [text]: crate::content::text
 //! [character_escape]: crate::construct::character_escape
 //! [character_reference]: crate::construct::character_reference
-//!
-//! 
+//! [hard_break_trailing]: crate::construct::hard_break_trailing
+//! [html]: https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-br-element
 
 use crate::tokenizer::{Code, State, StateFnResult, TokenType, Tokenizer};
 
-/// Start of a hard break escape.
+/// Start of a hard break (escape).
 ///
 /// ```markdown
 /// a|\
@@ -45,7 +54,7 @@ pub fn start(tokenizer: &mut Tokenizer, code: Code) -> StateFnResult {
     }
 }
 
-/// At the end of a hard break escape, after `\`.
+/// At the end of a hard break (escape), after `\`.
 ///
 /// ```markdown
 /// a\|
diff --git a/src/construct/hard_break_trailing.rs b/src/construct/hard_break_trailing.rs
new file mode 100644
index 0000000..46337c5
--- /dev/null
+++ b/src/construct/hard_break_trailing.rs
@@ -0,0 +1,83 @@
+//! Hard break (trailing) is a construct that occurs in the  [text][] content
+//! type.
+//!
+//! They’re formed with the following BNF:
+//!
+//! ```bnf
+//! ; Restriction: followed by a line ending  (that is part of the construct
+//! ; instead of ending it).
+//! hard_break_trailing ::= 2*' '
+//! ```
+//!
+//! The minimum number of the spaces is defined in
+//! [`HARD_BREAK_PREFIX_SIZE_MIN`][hard_break_prefix_size_min].
+//!
+//! Hard breaks in markdown relate to the HTML element `
`.
+//! See [*§ 4.5.27 The `br` element* in the HTML spec][html] for more info.
+//!
+//! It is also possible to create a hard break with a similar construct: a
+//! [hard break (escape)][hard_break_escape] is a backslash followed
+//! by a line ending.
+//! That construct is recommended because it is similar to a
+//! [character escape][character_escape] and similar to how line endings can be
+//! “escaped” in other languages.
+//! Trailing spaces are typically invisible in editors, or even automatically
+//! removed, making hard break (trailing) hard to use.
+//!
+//! ## References
+//!
+//! *   [`lib/initialize/text.js` in `micromark`](https://github.com/micromark/micromark/blob/main/packages/micromark/dev/lib/initialize/text.js)
+//! *   [*§ 6.7 Hard line breaks* in `CommonMark`](https://spec.commonmark.org/0.30/#hard-line-breaks)
+//!
+//! [text]: crate::content::text
+//! [hard_break_escape]: crate::construct::hard_break_escape
+//! [character_escape]: crate::construct::character_escape
+//! [hard_break_prefix_size_min]: crate::constant::HARD_BREAK_PREFIX_SIZE_MIN
+//! [html]: https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-br-element
+
+use crate::constant::HARD_BREAK_PREFIX_SIZE_MIN;
+use crate::tokenizer::{Code, State, StateFnResult, TokenType, Tokenizer};
+
+/// Start of a hard break (trailing).
+///
+/// ```markdown
+/// a|  ␊
+/// b
+/// ```
+pub fn start(tokenizer: &mut Tokenizer, code: Code) -> StateFnResult {
+    match code {
+        Code::Char(' ') => {
+            tokenizer.enter(TokenType::HardBreakTrailing);
+            tokenizer.enter(TokenType::HardBreakTrailingSpace);
+            tokenizer.consume(code);
+            (State::Fn(Box::new(|t, c| inside(t, c, 1))), None)
+        }
+        _ => (State::Nok, None),
+    }
+}
+
+/// Inside the hard break (trailing).
+///
+/// ```markdown
+/// a  |␊
+/// b
+/// ```
+fn inside(tokenizer: &mut Tokenizer, code: Code, size: usize) -> StateFnResult {
+    match code {
+        Code::Char(' ') => {
+            tokenizer.consume(code);
+            (
+                State::Fn(Box::new(move |t, c| inside(t, c, size + 1))),
+                None,
+            )
+        }
+        Code::CarriageReturnLineFeed | Code::Char('\r' | '\n')
+            if size >= HARD_BREAK_PREFIX_SIZE_MIN =>
+        {
+            tokenizer.exit(TokenType::HardBreakTrailingSpace);
+            tokenizer.exit(TokenType::HardBreakTrailing);
+            (State::Ok, Some(vec![code]))
+        }
+        _ => (State::Nok, None),
+    }
+}
diff --git a/src/construct/mod.rs b/src/construct/mod.rs
index 27f4308..880d055 100644
--- a/src/construct/mod.rs
+++ b/src/construct/mod.rs
@@ -26,7 +26,8 @@
 //! *   [code (text)][code_text]
 //! *   content
 //! *   definition
-//! *   [hard break escape][hard_break_escape]
+//! *   [hard break (escape)][hard_break_escape]
+//! *   [hard break (trailing)][hard_break_trailing]
 //! *   [heading (atx)][heading_atx]
 //! *   heading (setext)
 //! *   [html (flow)][html_flow]
@@ -61,6 +62,7 @@ pub mod code_fenced;
 pub mod code_indented;
 pub mod code_text;
 pub mod hard_break_escape;
+pub mod hard_break_trailing;
 pub mod heading_atx;
 pub mod html_flow;
 pub mod html_text;
diff --git a/src/content/text.rs b/src/content/text.rs
index d4d5493..f61b390 100644
--- a/src/content/text.rs
+++ b/src/content/text.rs
@@ -8,7 +8,8 @@
 //! *   [Autolink][crate::construct::autolink]
 //! *   Attention
 //! *   [HTML (text)][crate::construct::html_text]
-//! *   [Hard break escape][crate::construct::hard_break_escape]
+//! *   [Hard break (escape)][crate::construct::hard_break_escape]
+//! *   [Hard break (trailing)][crate::construct::hard_break_trailing]
 //! *   [Code (text)][crate::construct::code_text]
 //! *   Line ending
 //! *   Label start (image)
@@ -19,7 +20,8 @@
 use crate::construct::{
     autolink::start as autolink, character_escape::start as character_escape,
     character_reference::start as character_reference, code_text::start as code_text,
-    hard_break_escape::start as hard_break_escape, html_text::start as html_text,
+    hard_break_escape::start as hard_break_escape,
+    hard_break_trailing::start as hard_break_trailing, html_text::start as html_text,
 };
 use crate::tokenizer::{Code, State, StateFnResult, TokenType, Tokenizer};
 
@@ -35,10 +37,11 @@ use crate::tokenizer::{Code, State, StateFnResult, TokenType, Tokenizer};
 pub fn start(tokenizer: &mut Tokenizer, code: Code) -> StateFnResult {
     match code {
         Code::None => (State::Ok, None),
-        _ => tokenizer.attempt_6(
+        _ => tokenizer.attempt_7(
             character_reference,
             character_escape,
             hard_break_escape,
+            hard_break_trailing,
             autolink,
             html_text,
             code_text,
@@ -78,12 +81,12 @@ fn before_data(tokenizer: &mut Tokenizer, code: Code) -> StateFnResult {
 /// ```
 fn in_data(tokenizer: &mut Tokenizer, code: Code) -> StateFnResult {
     match code {
-        Code::None => {
+        Code::None | Code::CarriageReturnLineFeed | Code::Char('\r' | '\n') => {
             tokenizer.exit(TokenType::Data);
-            (State::Ok, None)
+            before_data(tokenizer, code)
         }
         // To do: somehow get these markers from constructs.
-        Code::CarriageReturnLineFeed | Code::Char('\r' | '\n' | '&' | '<' | '\\' | '`') => {
+        Code::Char(' ' | '&' | '<' | '\\' | '`') => {
             tokenizer.exit(TokenType::Data);
             start(tokenizer, code)
         }
diff --git a/src/tokenizer.rs b/src/tokenizer.rs
index a63d209..da45ee5 100644
--- a/src/tokenizer.rs
+++ b/src/tokenizer.rs
@@ -62,6 +62,8 @@ pub enum TokenType {
 
     HardBreakEscape,
     HardBreakEscapeMarker,
+    HardBreakTrailing,
+    HardBreakTrailingSpace,
 
     HtmlFlow,
     HtmlFlowData,
@@ -445,6 +447,7 @@ impl Tokenizer {
             None,
             None,
             None,
+            None,
             done,
         )
     }
@@ -464,12 +467,13 @@ impl Tokenizer {
             None,
             None,
             None,
+            None,
             done,
         )
     }
 
     #[allow(clippy::too_many_arguments, clippy::many_single_char_names)]
-    pub fn attempt_6(
+    pub fn attempt_7(
         &mut self,
         a: impl FnOnce(&mut Tokenizer, Code) -> StateFnResult + 'static,
         b: impl FnOnce(&mut Tokenizer, Code) -> StateFnResult + 'static,
@@ -477,6 +481,7 @@ impl Tokenizer {
         d: impl FnOnce(&mut Tokenizer, Code) -> StateFnResult + 'static,
         e: impl FnOnce(&mut Tokenizer, Code) -> StateFnResult + 'static,
         f: impl FnOnce(&mut Tokenizer, Code) -> StateFnResult + 'static,
+        g: impl FnOnce(&mut Tokenizer, Code) -> StateFnResult + 'static,
         done: impl FnOnce(bool) -> Box + 'static,
     ) -> Box {
         self.call_multiple(
@@ -487,6 +492,7 @@ impl Tokenizer {
             Some(Box::new(d)),
             Some(Box::new(e)),
             Some(Box::new(f)),
+            Some(Box::new(g)),
             done,
         )
     }
@@ -501,6 +507,7 @@ impl Tokenizer {
         d: Option>,
         e: Option>,
         f: Option>,
+        g: Option>,
         done: impl FnOnce(bool) -> Box + 'static,
     ) -> Box {
         if let Some(head) = a {
@@ -509,7 +516,9 @@ impl Tokenizer {
                     done(ok)
                 } else {
                     Box::new(move |tokenizer: &mut Tokenizer, code| {
-                        tokenizer.call_multiple(check, b, c, d, e, f, None, done)(tokenizer, code)
+                        tokenizer.call_multiple(check, b, c, d, e, f, g, None, done)(
+                            tokenizer, code,
+                        )
                     })
                 }
             };
diff --git a/src/util/span.rs b/src/util/span.rs
index c48549b..02811cc 100644
--- a/src/util/span.rs
+++ b/src/util/span.rs
@@ -36,7 +36,7 @@ pub fn from_exit_event(events: &[Event], index: usize) -> Span {
     assert_eq!(
         exit.event_type,
         EventType::Exit,
-        "expected `get_span` to be called on `exit` event"
+        "expected `from_exit_event` to be called on `exit` event"
     );
     let mut enter_index = index - 1;
 
diff --git a/tests/hard_break_escape.rs b/tests/hard_break_escape.rs
index fe4c82b..2e3a3ba 100644
--- a/tests/hard_break_escape.rs
+++ b/tests/hard_break_escape.rs
@@ -1,49 +1,21 @@
 extern crate micromark;
-use micromark::{micromark};
+use micromark::micromark;
 
 #[test]
 fn hard_break_escape() {
-    // To do: trailing.
-    // assert_eq!(
-    //     micromark("foo  \nbaz"),
-    //     "foo
\nbaz
",
-    //     "should support two trailing spaces to form a hard break"
-    // );
-
     assert_eq!(
         micromark("foo\\\nbaz"),
         "foo
\nbaz
",
         "should support a backslash to form a hard break"
     );
 
-    // To do: trailing.
-    // assert_eq!(
-    //     micromark("foo       \nbaz"),
-    //     "foo
\nbaz
",
-    //     "should support multiple trailing spaces"
-    // );
-
-    // To do: trailing.
-    // assert_eq!(
-    //     micromark("foo  \n     bar"),
-    //     "foo
\nbar
",
-    //     "should support leading spaces after a trailing hard break"
-    // );
-
-    // To do: trim paragraph whitespace.
+    // To do: trimming whitespace in paragraphs.
     // assert_eq!(
     //     micromark("foo\\\n     bar"),
     //     "foo
\nbar
",
     //     "should support leading spaces after an escape hard break"
     // );
 
-    // To do: trailing, attention.
-    // assert_eq!(
-    //     micromark("*foo  \nbar*"),
-    //     "foo
\nbar
",
-    //     "should support trailing hard breaks in emphasis"
-    // );
-
     // To do: attention.
     // assert_eq!(
     //     micromark("*foo\\\nbar*"),
@@ -51,25 +23,12 @@ fn hard_break_escape() {
     //     "should support escape hard breaks in emphasis"
     // );
 
-    assert_eq!(
-        micromark("`code  \ntext`"),
-        "code   text
",
-        "should not support trailing hard breaks in code"
-    );
-
     assert_eq!(
         micromark("``code\\\ntext``"),
         "code\\ text
",
         "should not support escape hard breaks in code"
     );
 
-    // To do: paragraph trimming.
-    // assert_eq!(
-    //     micromark("foo  "),
-    //     "foo
",
-    //     "should not support trailing hard breaks at the end of a paragraph"
-    // );
-
     assert_eq!(
         micromark("foo\\"),
         "foo\\
",
@@ -82,82 +41,6 @@ fn hard_break_escape() {
         "should not support escape hard breaks at the end of a heading"
     );
 
-    assert_eq!(
-        micromark("### foo  "),
-        "foo
",
-        "should not support trailing hard breaks at the end of a heading"
-    );
-
-    // To do: paragraph trimming.
-    // assert_eq!(
-    //     micromark("aaa  \t\nbb"),
-    //     "aaa\nbb
",
-    //     "should support a mixed line suffix (1)"
-    // );
-
-    // To do: paragraph trimming.
-    // assert_eq!(
-    //     micromark("aaa\t  \nbb"),
-    //     "aaa\nbb
",
-    //     "should support a mixed line suffix (2)"
-    // );
-
-    // To do: paragraph trimming.
-    // assert_eq!(
-    //     micromark("aaa  \t  \nbb"),
-    //     "aaa\nbb
",
-    //     "should support a mixed line suffix (3)"
-    // );
-
-    // To do: trailing.
-    // assert_eq!(
-    //     micromark("aaa\0  \nbb"),
-    //     "aaa�
\nbb
",
-    //     "should support a hard break after a replacement character"
-    // );
-
-    // To do: trailing.
-    // assert_eq!(
-    //     micromark("aaa\0\t\nbb"),
-    //     "aaa�\nbb
",
-    //     "should support a line suffix after a replacement character"
-    // );
-
-    // To do: attention, trailing.
-    // assert_eq!(
-    //     micromark("*a*  \nbb"),
-    //     "a
\nbb
",
-    //     "should support a hard break after a span"
-    // );
-
-    // To do: attention, trailing.
-    // assert_eq!(
-    //     micromark("*a*\t\nbb"),
-    //     "a\nbb
",
-    //     "should support a line suffix after a span"
-    // );
-
-    // To do: attention, trailing.
-    // assert_eq!(
-    //     micromark("*a*  \t\nbb"),
-    //     "a\nbb
",
-    //     "should support a mixed line suffix after a span (1)"
-    // );
-
-    // To do: attention, trailing.
-    // assert_eq!(
-    //     micromark("*a*\t  \nbb"),
-    //     "a\nbb
",
-    //     "should support a mixed line suffix after a span (2)"
-    // );
-
-    // To do: attention, trailing.
-    // assert_eq!(
-    //     micromark("*a*  \t  \nbb"),
-    //     "a\nbb
",
-    //     "should support a mixed line suffix after a span (3)"
-    // );
-
     // // To do: turning off things.
     // assert_eq!(
     //   micromark("a\\\nb", {extensions: [{disable: {null: ["hardBreakEscape"]}}]}),
diff --git a/tests/hard_break_trailing.rs b/tests/hard_break_trailing.rs
new file mode 100644
index 0000000..6c29020
--- /dev/null
+++ b/tests/hard_break_trailing.rs
@@ -0,0 +1,133 @@
+extern crate micromark;
+use micromark::micromark;
+
+#[test]
+fn hard_break_trailing() {
+    assert_eq!(
+        micromark("foo  \nbaz"),
+        "foo
\nbaz
",
+        "should support two trailing spaces to form a hard break"
+    );
+
+    assert_eq!(
+        micromark("foo       \nbaz"),
+        "foo
\nbaz
",
+        "should support multiple trailing spaces"
+    );
+
+    // To do: trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("foo  \n     bar"),
+    //     "foo
\nbar
",
+    //     "should support leading spaces after a trailing hard break"
+    // );
+
+    // To do: attention.
+    // assert_eq!(
+    //     micromark("*foo  \nbar*"),
+    //     "foo
\nbar
",
+    //     "should support trailing hard breaks in emphasis"
+    // );
+
+    // To do: attention.
+    // assert_eq!(
+    //     micromark("*foo\\\nbar*"),
+    //     "foo
\nbar
",
+    //     "should support escape hard breaks in emphasis"
+    // );
+
+    assert_eq!(
+        micromark("`code  \ntext`"),
+        "code   text
",
+        "should not support trailing hard breaks in code"
+    );
+
+    // To do: trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("foo  "),
+    //     "foo
",
+    //     "should not support trailing hard breaks at the end of a paragraph"
+    // );
+
+    assert_eq!(
+        micromark("### foo  "),
+        "foo
",
+        "should not support trailing hard breaks at the end of a heading"
+    );
+
+    // To do: trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("aaa  \t\nbb"),
+    //     "aaa\nbb
",
+    //     "should support a mixed line suffix (1)"
+    // );
+
+    // To do: trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("aaa\t  \nbb"),
+    //     "aaa\nbb
",
+    //     "should support a mixed line suffix (2)"
+    // );
+
+    // To do: trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("aaa  \t  \nbb"),
+    //     "aaa\nbb
",
+    //     "should support a mixed line suffix (3)"
+    // );
+
+    assert_eq!(
+        micromark("aaa\0  \nbb"),
+        "aaa�
\nbb
",
+        "should support a hard break after a replacement character"
+    );
+
+    // To do: trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("aaa\0\t\nbb"),
+    //     "aaa�\nbb
",
+    //     "should support a line suffix after a replacement character"
+    // );
+
+    // To do: attention.
+    // assert_eq!(
+    //     micromark("*a*  \nbb"),
+    //     "a
\nbb
",
+    //     "should support a hard break after a span"
+    // );
+
+    // To do: attention, trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("*a*\t\nbb"),
+    //     "a\nbb
",
+    //     "should support a line suffix after a span"
+    // );
+
+    // To do: attention, trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("*a*  \t\nbb"),
+    //     "a\nbb
",
+    //     "should support a mixed line suffix after a span (1)"
+    // );
+
+    // To do: attention, trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("*a*\t  \nbb"),
+    //     "a\nbb
",
+    //     "should support a mixed line suffix after a span (2)"
+    // );
+
+    // To do: attention, trimming whitespace in paragraphs.
+    // assert_eq!(
+    //     micromark("*a*  \t  \nbb"),
+    //     "a\nbb
",
+    //     "should support a mixed line suffix after a span (3)"
+    // );
+
+    // // To do: turning off things.
+    // assert_eq!(
+    //   micromark("a  \nb", {extensions: [{disable: {null: ["hardBreakTrailing"]}}]}),
+    //   "a\nb
",
+    //   "should support turning off hard break (trailing)"
+    // );
+}
-- 
cgit