Something went wrong. Try again.
Markdown parser fork with extended syntax for personal use.
Something went wrong. Try again.
15 kB · 481 lines
Rust
at hack
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482use markdown::{ mdast::{Html, Node, Paragraph, Root, Text}, message, to_html, to_html_with_options, to_mdast, unist::Position, CompileOptions, Constructs, Options, ParseOptions,};use pretty_assertions::assert_eq;
#[test]fn html_text() -> Result<(), message::Message> { let danger = Options { compile: CompileOptions { allow_dangerous_html: true, allow_dangerous_protocol: true, ..Default::default() }, ..Default::default() };
assert_eq!( to_html("a <b> c"), "<p>a <b> c</p>", "should encode dangerous html by default" );
assert_eq!( to_html_with_options("<a><bab><c2c>", &danger)?, "<p><a><bab><c2c></p>", "should support opening tags" );
assert_eq!( to_html_with_options("<a/><b2/>", &danger)?, "<p><a/><b2/></p>", "should support self-closing tags" );
assert_eq!( to_html_with_options("<a /><b2\ndata=\"foo\" >", &danger)?, "<p><a /><b2\ndata=\"foo\" ></p>", "should support whitespace in tags" );
assert_eq!( to_html_with_options( "<a foo=\"bar\" bam = 'baz <em>\"</em>'\n_boolean zoop:33=zoop:33 />", &danger )?, "<p><a foo=\"bar\" bam = 'baz <em>\"</em>'\n_boolean zoop:33=zoop:33 /></p>", "should support attributes on tags" );
assert_eq!( to_html_with_options("Foo <responsive-image src=\"foo.jpg\" />", &danger)?, "<p>Foo <responsive-image src=\"foo.jpg\" /></p>", "should support non-html tags" );
assert_eq!( to_html_with_options("<33> <__>", &danger)?, "<p><33> <__></p>", "should not support nonconforming tag names" );
assert_eq!( to_html_with_options("<a h*#ref=\"hi\">", &danger)?, "<p><a h*#ref="hi"></p>", "should not support nonconforming attribute names" );
assert_eq!( to_html_with_options("<a href=\"hi'> <a href=hi'>", &danger)?, "<p><a href="hi'> <a href=hi'></p>", "should not support nonconforming attribute values" );
assert_eq!( to_html_with_options("< a><\nfoo><bar/ >\n<foo bar=baz\nbim!bop />", &danger)?, "<p>< a><\nfoo><bar/ >\n<foo bar=baz\nbim!bop /></p>", "should not support nonconforming whitespace" );
assert_eq!( to_html_with_options("<a href='bar'title=title>", &danger)?, "<p><a href='bar'title=title></p>", "should not support missing whitespace" );
assert_eq!( to_html_with_options("</a></foo >", &danger)?, "<p></a></foo ></p>", "should support closing tags" );
assert_eq!( to_html_with_options("</a href=\"foo\">", &danger)?, "<p></a href="foo"></p>", "should not support closing tags w/ attributes" );
assert_eq!( to_html_with_options("foo <!-- this is a\ncomment - with hyphen -->", &danger)?, "<p>foo <!-- this is a\ncomment - with hyphen --></p>", "should support comments" );
assert_eq!( to_html_with_options("foo <!-- not a comment -- two hyphens -->", &danger)?, "<p>foo <!-- not a comment -- two hyphens --></p>", "should support comments w/ two dashes inside" );
assert_eq!( to_html_with_options("foo <!--> foo -->", &danger)?, "<p>foo <!--> foo --></p>", "should support nonconforming comments (1)" );
assert_eq!( to_html_with_options("foo <!-- foo--->", &danger)?, "<p>foo <!-- foo---></p>", "should support nonconforming comments (2)" );
assert_eq!( to_html_with_options("foo <?php echo $a; ?>", &danger)?, "<p>foo <?php echo $a; ?></p>", "should support instructions" );
assert_eq!( to_html_with_options("foo <!ELEMENT br EMPTY>", &danger)?, "<p>foo <!ELEMENT br EMPTY></p>", "should support declarations" );
assert_eq!( to_html_with_options("foo <![CDATA[>&<]]>", &danger)?, "<p>foo <![CDATA[>&<]]></p>", "should support cdata" );
assert_eq!( to_html_with_options("foo <a href=\"ö\">", &danger)?, "<p>foo <a href=\"ö\"></p>", "should support (ignore) character references" );
assert_eq!( to_html_with_options("foo <a href=\"\\*\">", &danger)?, "<p>foo <a href=\"\\*\"></p>", "should not support character escapes (1)" );
assert_eq!( to_html_with_options("<a href=\"\\\"\">", &danger)?, "<p><a href="""></p>", "should not support character escapes (2)" );
// Extra: assert_eq!( to_html_with_options("foo <!1>", &danger)?, "<p>foo <!1></p>", "should not support non-comment, non-cdata, and non-named declaration" );
assert_eq!( to_html_with_options("foo <!-not enough!-->", &danger)?, "<p>foo <!-not enough!--></p>", "should not support comments w/ not enough dashes" );
assert_eq!( to_html_with_options("foo <!---ok-->", &danger)?, "<p>foo <!---ok--></p>", "should support comments that start w/ a dash, if it’s not followed by a greater than" );
assert_eq!( to_html_with_options("foo <!--->", &danger)?, "<p>foo <!---></p>", "should support comments that start w/ `->`" );
assert_eq!( to_html_with_options("foo <!-- -> -->", &danger)?, "<p>foo <!-- -> --></p>", "should support `->` in a comment" );
assert_eq!( to_html_with_options("foo <!--", &danger)?, "<p>foo <!--</p>", "should not support eof in a comment (1)" );
assert_eq!( to_html_with_options("foo <!--a", &danger)?, "<p>foo <!--a</p>", "should not support eof in a comment (2)" );
assert_eq!( to_html_with_options("foo <!--a-", &danger)?, "<p>foo <!--a-</p>", "should not support eof in a comment (3)" );
assert_eq!( to_html_with_options("foo <!--a--", &danger)?, "<p>foo <!--a--</p>", "should not support eof in a comment (4)" );
// Note: cmjs parses this differently. // See: <https://github.com/commonmark/commonmark.js/issues/193> assert_eq!( to_html_with_options("foo <![cdata[]]>", &danger)?, "<p>foo <![cdata[]]></p>", "should not support lowercase “cdata”" );
assert_eq!( to_html_with_options("foo <![CDATA", &danger)?, "<p>foo <![CDATA</p>", "should not support eof in a CDATA (1)" );
assert_eq!( to_html_with_options("foo <![CDATA[", &danger)?, "<p>foo <![CDATA[</p>", "should not support eof in a CDATA (2)" );
assert_eq!( to_html_with_options("foo <![CDATA[]", &danger)?, "<p>foo <![CDATA[]</p>", "should not support eof in a CDATA (3)" );
assert_eq!( to_html_with_options("foo <![CDATA[]]", &danger)?, "<p>foo <![CDATA[]]</p>", "should not support eof in a CDATA (4)" );
assert_eq!( to_html_with_options("foo <![CDATA[asd", &danger)?, "<p>foo <![CDATA[asd</p>", "should not support eof in a CDATA (5)" );
assert_eq!( to_html_with_options("foo <![CDATA[]]]]>", &danger)?, "<p>foo <![CDATA[]]]]></p>", "should support end-like constructs in CDATA" );
assert_eq!( to_html_with_options("foo <!doctype", &danger)?, "<p>foo <!doctype</p>", "should not support eof in declarations" );
assert_eq!( to_html_with_options("foo <?php", &danger)?, "<p>foo <?php</p>", "should not support eof in instructions (1)" );
assert_eq!( to_html_with_options("foo <?php?", &danger)?, "<p>foo <?php?</p>", "should not support eof in instructions (2)" );
assert_eq!( to_html_with_options("foo <???>", &danger)?, "<p>foo <???></p>", "should support question marks in instructions" );
assert_eq!( to_html_with_options("foo </3>", &danger)?, "<p>foo </3></p>", "should not support closing tags that don’t start w/ alphas" );
assert_eq!( to_html_with_options("foo </a->", &danger)?, "<p>foo </a-></p>", "should support dashes in closing tags" );
assert_eq!( to_html_with_options("foo </a >", &danger)?, "<p>foo </a ></p>", "should support whitespace after closing tag names" );
assert_eq!( to_html_with_options("foo </a!>", &danger)?, "<p>foo </a!></p>", "should not support other characters after closing tag names" );
assert_eq!( to_html_with_options("foo <a->", &danger)?, "<p>foo <a-></p>", "should support dashes in opening tags" );
assert_eq!( to_html_with_options("foo <a >", &danger)?, "<p>foo <a ></p>", "should support whitespace after opening tag names" );
assert_eq!( to_html_with_options("foo <a!>", &danger)?, "<p>foo <a!></p>", "should not support other characters after opening tag names" );
assert_eq!( to_html_with_options("foo <a !>", &danger)?, "<p>foo <a !></p>", "should not support other characters in opening tags (1)" );
assert_eq!( to_html_with_options("foo <a b!>", &danger)?, "<p>foo <a b!></p>", "should not support other characters in opening tags (2)" );
assert_eq!( to_html_with_options("foo <a b/>", &danger)?, "<p>foo <a b/></p>", "should support a self-closing slash after an attribute name" );
assert_eq!( to_html_with_options("foo <a b>", &danger)?, "<p>foo <a b></p>", "should support a greater than after an attribute name" );
assert_eq!( to_html_with_options("foo <a b=<>", &danger)?, "<p>foo <a b=<></p>", "should not support less than to start an unquoted attribute value" );
assert_eq!( to_html_with_options("foo <a b=>>", &danger)?, "<p>foo <a b=>></p>", "should not support greater than to start an unquoted attribute value" );
assert_eq!( to_html_with_options("foo <a b==>", &danger)?, "<p>foo <a b==></p>", "should not support equals to to start an unquoted attribute value" );
assert_eq!( to_html_with_options("foo <a b=`>", &danger)?, "<p>foo <a b=`></p>", "should not support grave accent to start an unquoted attribute value" );
assert_eq!( to_html_with_options("foo <a b=\"asd", &danger)?, "<p>foo <a b="asd</p>", "should not support eof in double quoted attribute value" );
assert_eq!( to_html_with_options("foo <a b='asd", &danger)?, "<p>foo <a b='asd</p>", "should not support eof in single quoted attribute value" );
assert_eq!( to_html_with_options("foo <a b=asd", &danger)?, "<p>foo <a b=asd</p>", "should not support eof in unquoted attribute value" );
assert_eq!( to_html_with_options("foo <a b=\nasd>", &danger)?, "<p>foo <a b=\nasd></p>", "should support an eol before an attribute value" );
assert_eq!(to_html_with_options("<x> a", &danger)?,"<p><x> a</p>","should support starting a line w/ a tag if followed by anything other than an eol (after optional space/tabs)");
assert_eq!( to_html_with_options("<span foo=", &danger)?, "<p><span foo=</p>", "should support an EOF before an attribute value" );
assert_eq!( to_html_with_options("a <!b\nc>", &danger)?, "<p>a <!b\nc></p>", "should support an EOL in a declaration" ); assert_eq!( to_html_with_options("a <![CDATA[\n]]>", &danger)?, "<p>a <![CDATA[\n]]></p>", "should support an EOL in cdata" );
// Note: cmjs parses this differently. // See: <https://github.com/commonmark/commonmark.js/issues/196> assert_eq!( to_html_with_options("a <?\n?>", &danger)?, "<p>a <?\n?></p>", "should support an EOL in an instruction" );
assert_eq!( to_html_with_options( "a <x>", &Options { parse: ParseOptions { constructs: Constructs { html_text: false, ..Default::default() }, ..Default::default() }, ..Default::default() } )?, "<p>a <x></p>", "should support turning off html (text)" );
assert_eq!( to_mdast("alpha <i>bravo</b> charlie.", &Default::default())?, Node::Root(Root { children: vec![Node::Paragraph(Paragraph { children: vec![ Node::Text(Text { value: "alpha ".into(), position: Some(Position::new(1, 1, 0, 1, 7, 6)) }), Node::Html(Html { value: "<i>".into(), position: Some(Position::new(1, 7, 6, 1, 10, 9)) }), Node::Text(Text { value: "bravo".into(), position: Some(Position::new(1, 10, 9, 1, 15, 14)) }), Node::Html(Html { value: "</b>".into(), position: Some(Position::new(1, 15, 14, 1, 19, 18)) }), Node::Text(Text { value: " charlie.".into(), position: Some(Position::new(1, 19, 18, 1, 28, 27)) }) ], position: Some(Position::new(1, 1, 0, 1, 28, 27)) })], position: Some(Position::new(1, 1, 0, 1, 28, 27)) }), "should support HTML (text) as `Html`s in mdast" );
Ok(())}