use markdown::{ mdast::{Heading, Node, Root, Text}, to_html, to_html_with_options, to_mdast, unist::Position, Constructs, Options, ParseOptions, }; use pretty_assertions::assert_eq; #[test] fn heading_setext() -> Result<(), String> { assert_eq!( to_html("Foo *bar*\n========="), "

Foo bar

", "should support a heading w/ an equals to (rank of 1)" ); assert_eq!( to_html("Foo *bar*\n---------"), "

Foo bar

", "should support a heading w/ a dash (rank of 2)" ); assert_eq!( to_html("Foo *bar\nbaz*\n===="), "

Foo bar\nbaz

", "should support line endings in setext headings" ); assert_eq!( to_html(" Foo *bar\nbaz*\t\n===="), "

Foo bar\nbaz

", "should not include initial and final whitespace around content" ); assert_eq!( to_html("Foo\n-------------------------"), "

Foo

", "should support long underlines" ); assert_eq!( to_html("Foo\n="), "

Foo

", "should support short underlines" ); assert_eq!( to_html(" Foo\n ==="), "

Foo

", "should support indented content w/ 1 space" ); assert_eq!( to_html(" Foo\n---"), "

Foo

", "should support indented content w/ 2 spaces" ); assert_eq!( to_html(" Foo\n---"), "

Foo

", "should support indented content w/ 3 spaces" ); assert_eq!( to_html(" Foo\n ---"), "
Foo\n---\n
", "should not support too much indented content (1)" ); assert_eq!( to_html(" Foo\n---"), "
Foo\n
\n
", "should not support too much indented content (2)" ); assert_eq!( to_html("Foo\n ---- "), "

Foo

", "should support initial and final whitespace around the underline" ); assert_eq!( to_html("Foo\n ="), "

Foo

", "should support whitespace before underline" ); assert_eq!( to_html("Foo\n ="), "

Foo\n=

", "should not support too much whitespace before underline (1)" ); assert_eq!( to_html("Foo\n\t="), "

Foo\n=

", "should not support too much whitespace before underline (2)" ); assert_eq!( to_html("Foo\n= ="), "

Foo\n= =

", "should not support whitespace in the underline (1)" ); assert_eq!( to_html("Foo\n--- -"), "

Foo

\n
", "should not support whitespace in the underline (2)" ); assert_eq!( to_html("Foo \n-----"), "

Foo

", "should not support a hard break w/ spaces at the end" ); assert_eq!( to_html("Foo\\\n-----"), "

Foo\\

", "should not support a hard break w/ backslash at the end" ); assert_eq!( to_html("`Foo\n----\n`"), "

`Foo

\n

`

", "should precede over inline constructs (1)" ); assert_eq!( to_html(""), "

<a title="a lot

\n

of dashes"/>

", "should precede over inline constructs (2)" ); assert_eq!( to_html("> Foo\n---"), "
\n

Foo

\n
\n
", "should not allow underline to be lazy (1)" ); assert_eq!( to_html("> foo\nbar\n==="), "
\n

foo\nbar\n===

\n
", "should not allow underline to be lazy (2)" ); assert_eq!( to_html("- Foo\n---"), "\n
", "should not allow underline to be lazy (3)" ); assert_eq!( to_html("Foo\nBar\n---"), "

Foo\nBar

", "should support line endings in setext headings" ); assert_eq!( to_html("---\nFoo\n---\nBar\n---\nBaz"), "
\n

Foo

\n

Bar

\n

Baz

", "should support adjacent setext headings" ); assert_eq!( to_html("\n===="), "

====

", "should not support empty setext headings" ); assert_eq!( to_html("---\n---"), "
\n
", "should prefer other constructs over setext headings (1)" ); assert_eq!( to_html("- foo\n-----"), "\n
", "should prefer other constructs over setext headings (2)" ); assert_eq!( to_html(" foo\n---"), "
foo\n
\n
", "should prefer other constructs over setext headings (3)" ); assert_eq!( to_html("> foo\n-----"), "
\n

foo

\n
\n
", "should prefer other constructs over setext headings (4)" ); assert_eq!( to_html("\\> foo\n------"), "

> foo

", "should support starting w/ character escapes" ); assert_eq!( to_html("Foo\nbar\n---\nbaz"), "

Foo\nbar

\n

baz

", "paragraph and heading interplay (1)" ); assert_eq!( to_html("Foo\n\nbar\n---\nbaz"), "

Foo

\n

bar

\n

baz

", "paragraph and heading interplay (2)" ); assert_eq!( to_html("Foo\nbar\n\n---\n\nbaz"), "

Foo\nbar

\n
\n

baz

", "paragraph and heading interplay (3)" ); assert_eq!( to_html("Foo\nbar\n* * *\nbaz"), "

Foo\nbar

\n
\n

baz

", "paragraph and heading interplay (4)" ); assert_eq!( to_html("Foo\nbar\n\\---\nbaz"), "

Foo\nbar\n---\nbaz

", "paragraph and heading interplay (5)" ); // Extra: assert_eq!( to_html("Foo \nbar\n-----"), "

Foo
\nbar

", "should support a hard break w/ spaces in between" ); assert_eq!( to_html("Foo\\\nbar\n-----"), "

Foo
\nbar

", "should support a hard break w/ backslash in between" ); assert_eq!( to_html("a\n-\nb"), "

a

\n

b

", "should prefer a setext heading over an interrupting list" ); assert_eq!( to_html("[a]: b\n=\n="), "

=

", "should support a two setext heading underlines after a definition, as a setext heading" ); assert_eq!( to_html("> ===\na"), "
\n

===\na

\n
", "should not support lazyness (1)" ); assert_eq!( to_html("> a\n==="), "
\n

a\n===

\n
", "should not support lazyness (2)" ); assert_eq!( to_html("a\n- ==="), "

a

\n", "should not support piercing (1)" ); assert_eq!( to_html("a\n* ---"), "

a

\n", "should not support piercing (2)" ); assert_eq!( to_html_with_options( "a\n-", &Options { parse: ParseOptions { constructs: Constructs { heading_setext: false, ..Default::default() }, ..Default::default() }, ..Default::default() } )?, "

a\n-

", "should support turning off setext underlines" ); assert_eq!( to_mdast("alpha\nbravo\n==", &Default::default())?, Node::Root(Root { children: vec![Node::Heading(Heading { depth: 1, children: vec![Node::Text(Text { value: "alpha\nbravo".into(), position: Some(Position::new(1, 1, 0, 2, 6, 11)) }),], position: Some(Position::new(1, 1, 0, 3, 3, 14)) })], position: Some(Position::new(1, 1, 0, 3, 3, 14)) }), "should support heading (atx) as `Heading`s in mdast" ); Ok(()) }