From a3dd207e3b1ebcbcb6cec0f703a695e51ae4ece0 Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Fri, 24 Jun 2022 17:57:10 +0200 Subject: Add link, images (resource) This is still some messy code that needs cleaning up, but it adds support for links and images, of the resource kind (`[a](b)`). References (`[a][b]`) are parsed and will soon be supported, but need matching. * Fix bug to pad percent-encoded bytes when normalizing urls * Fix bug with escapes counting as balancing in destination * Add `space_or_tab_one_line_ending`, to parse whitespace including up to one line ending (but not a blank line) * Add `ParserState` to share codes, definitions, etc --- tests/link_resource.rs | 464 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 464 insertions(+) create mode 100644 tests/link_resource.rs (limited to 'tests/link_resource.rs') diff --git a/tests/link_resource.rs b/tests/link_resource.rs new file mode 100644 index 0000000..b1e1905 --- /dev/null +++ b/tests/link_resource.rs @@ -0,0 +1,464 @@ +extern crate micromark; +use micromark::{micromark, micromark_with_options, Options}; + +const DANGER: &Options = &Options { + allow_dangerous_html: true, + allow_dangerous_protocol: true, + default_line_ending: None, +}; + +#[test] +fn link_resource() { + assert_eq!( + micromark("[link](/uri \"title\")"), + "

link

", + "should support links" + ); + + assert_eq!( + micromark("[link](/uri)"), + "

link

", + "should support links w/o title" + ); + + assert_eq!( + micromark("[link]()"), + "

link

", + "should support links w/o destination" + ); + + assert_eq!( + micromark("[link](<>)"), + "

link

", + "should support links w/ empty enclosed destination" + ); + + assert_eq!( + micromark("[link](/my uri)"), + "

[link](/my uri)

", + "should not support links w/ spaces in destination" + ); + + assert_eq!( + micromark("[link]()"), + "

link

", + "should support links w/ spaces in enclosed destination" + ); + + assert_eq!( + micromark("[link](foo\nbar)"), + "

[link](foo\nbar)

", + "should not support links w/ line endings in destination" + ); + + assert_eq!( + micromark_with_options("[link]()", DANGER), + "

[link]()

", + "should not support links w/ line endings in enclosed destination" + ); + + assert_eq!( + micromark("[a]()"), + "

a

", + "should support links w/ closing parens in destination" + ); + + assert_eq!( + micromark("[link]()"), + "

[link](<foo>)

", + "should not support links w/ enclosed destinations w/o end" + ); + + assert_eq!( + micromark_with_options("[a](\n[a](c)", DANGER), + "

[a](<b)c\n[a](<b)c>\n[a](c)

", + "should not support links w/ unmatched enclosed destinations" + ); + + assert_eq!( + micromark("[link](\\(foo\\))"), + "

link

", + "should support links w/ destinations w/ escaped parens" + ); + + assert_eq!( + micromark("[link](foo(and(bar)))"), + "

link

", + "should support links w/ destinations w/ balanced parens" + ); + + assert_eq!( + micromark("[link](foo\\(and\\(bar\\))"), + "

link

", + "should support links w/ destinations w/ escaped parens" + ); + + assert_eq!( + micromark("[link]()"), + "

link

", + "should support links w/ enclosed destinations w/ parens" + ); + + assert_eq!( + micromark_with_options("[link](foo\\)\\:)", DANGER), + "

link

", + "should support links w/ escapes in destinations" + ); + + assert_eq!( + micromark("[link](#fragment)"), + "

link

", + "should support links w/ destinations to fragments" + ); + + assert_eq!( + micromark("[link](http://example.com#fragment)"), + "

link

", + "should support links w/ destinations to URLs w/ fragments" + ); + + assert_eq!( + micromark("[link](http://example.com?foo=3#frag)"), + "

link

", + "should support links w/ destinations to URLs w/ search and fragments" + ); + + assert_eq!( + micromark("[link](foo\\bar)"), + "

link

", + "should not support non-punctuation character escapes in links" + ); + + assert_eq!( + micromark("[link](foo%20bä)"), + "

link

", + "should support character references in links" + ); + + assert_eq!( + micromark("[link](\"title\")"), + "

link

", + "should not support links w/ only a title" + ); + + assert_eq!( + micromark("[link](/url \"title\")"), + "

link

", + "should support titles w/ double quotes" + ); + + assert_eq!( + micromark("[link](/url 'title')"), + "

link

", + "should support titles w/ single quotes" + ); + + assert_eq!( + micromark("[link](/url (title))"), + "

link

", + "should support titles w/ parens" + ); + + assert_eq!( + micromark("[link](/url \"title \\\""\")"), + "

link

", + "should support character references and escapes in titles" + ); + + assert_eq!( + micromark("[link](/url \"title\")"), + "

link

", + "should not support unicode whitespace between destination and title" + ); + + assert_eq!( + micromark("[link](/url \"title \"and\" title\")"), + "

[link](/url "title "and" title")

", + "should not support nested balanced quotes in title" + ); + + assert_eq!( + micromark("[link](/url 'title \"and\" title')"), + "

link

", + "should support the other quotes in titles" + ); + + assert_eq!( + micromark("[link]( /uri\n \"title\" )"), + "

link

", + "should support whitespace around destination and title (1)" + ); + + assert_eq!( + micromark("[link](\t\n/uri \"title\")"), + "

link

", + "should support whitespace around destination and title (2)" + ); + + assert_eq!( + micromark("[link](/uri \"title\"\t\n)"), + "

link

", + "should support whitespace around destination and title (3)" + ); + + assert_eq!( + micromark("[link] (/uri)"), + "

[link] (/uri)

", + "should not support whitespace between label and resource" + ); + + assert_eq!( + micromark("[link [foo [bar]]](/uri)"), + "

link [foo [bar]]

", + "should support balanced brackets" + ); + + assert_eq!( + micromark("[link] bar](/uri)"), + "

[link] bar](/uri)

", + "should not support unbalanced brackets (1)" + ); + + assert_eq!( + micromark("[link [bar](/uri)"), + "

[link bar

", + "should not support unbalanced brackets (2)" + ); + + assert_eq!( + micromark("[link \\[bar](/uri)"), + "

link [bar

", + "should support characer escapes" + ); + + // To do: attention. + // assert_eq!( + // micromark("[link *foo **bar** `#`*](/uri)"), + // "

link foo bar #

", + // "should support content" + // ); + + assert_eq!( + micromark("[![moon](moon.jpg)](/uri)"), + "

\"moon\"

", + "should support an image as content" + ); + + assert_eq!( + micromark("[foo [bar](/uri)](/uri)"), + "

[foo bar](/uri)

", + "should not support links in links (1)" + ); + + // To do: attention. + // assert_eq!( + // micromark("[foo *[bar [baz](/uri)](/uri)*](/uri)"), + // "

[foo [bar baz](/uri)](/uri)

", + // "should not support links in links (2)" + // ); + + // To do: tags in images. + // assert_eq!( + // micromark("![[[foo](uri1)](uri2)](uri3)"), + // "

\"[foo](uri2)\"

", + // "should not support links in links (3)" + // ); + + assert_eq!( + micromark("*[foo*](/uri)"), + "

*foo*

", + "should prefer links over emphasis (1)" + ); + + assert_eq!( + micromark("[foo *bar](baz*)"), + "

foo *bar

", + "should prefer links over emphasis (2)" + ); + + assert_eq!( + micromark_with_options("[foo ", DANGER), + "

[foo

", + "should prefer HTML over links" + ); + + assert_eq!( + micromark("[foo`](/uri)`"), + "

[foo](/uri)

", + "should prefer code over links" + ); + + assert_eq!( + micromark("[foo"), + "

[foohttp://example.com/?search=](uri)

", + "should prefer autolinks over links" + ); + + assert_eq!( + micromark("[foo"), + "

[foohttp://example.com/?search=](uri)

", + "should prefer autolinks over links" + ); + + // Extra + assert_eq!( + micromark("[]()"), + "

", + "should support an empty link" + ); + + // See: + assert_eq!( + micromark("[](<> \"\")"), + "

", + "should ignore an empty title" + ); + + assert_eq!( + micromark_with_options("[a](\"c\")", DANGER), + "

[a]("c")

", + "should require whitespace between enclosed destination and title" + ); + + assert_eq!( + micromark("[](<"), + "

[](<

", + "should not support an unclosed enclosed destination" + ); + + assert_eq!( + micromark("[]("), + "

[](

", + "should not support an unclosed destination" + ); + + assert_eq!( + micromark("[](\\<)"), + "

", + "should support unenclosed link destination starting w/ escapes" + ); + + assert_eq!( + micromark("[](<\\<>)"), + "

", + "should support enclosed link destination starting w/ escapes" + ); + + assert_eq!( + micromark("[](\\"), + "

[](\\

", + "should not support unenclosed link destination starting w/ an incorrect escape" + ); + + assert_eq!( + micromark("[](<\\"), + "

[](<\\

", + "should not support enclosed link destination starting w/ an incorrect escape" + ); + + assert_eq!( + micromark("[](a \""), + "

[](a "

", + "should not support an eof in a link title (1)" + ); + + assert_eq!( + micromark("[](a '"), + "

[](a '

", + "should not support an eof in a link title (2)" + ); + + assert_eq!( + micromark("[](a ("), + "

[](a (

", + "should not support an eof in a link title (3)" + ); + + assert_eq!( + micromark("[](a \"\\"), + "

[](a "\\

", + "should not support an eof in a link title escape (1)" + ); + + assert_eq!( + micromark("[](a '\\"), + "

[](a '\\

", + "should not support an eof in a link title escape (2)" + ); + + assert_eq!( + micromark("[](a (\\"), + "

[](a (\\

", + "should not support an eof in a link title escape (3)" + ); + + assert_eq!( + micromark("[](a \"\\\"\")"), + "

", + "should support a character escape to start a link title (1)" + ); + + assert_eq!( + micromark("[](a '\\'')"), + "

", + "should support a character escape to start a link title (2)" + ); + + assert_eq!( + micromark("[](a (\\)))"), + "

", + "should support a character escape to start a link title (3)" + ); + + assert_eq!( + micromark("[&©&](example.com/&©& \"&©&\")"), + "

&©&

", + "should support character references in links" + ); + + assert_eq!( + micromark("[a](1())"), + "

a

", + "should support 1 set of parens" + ); + + assert_eq!( + micromark("[a](1(2()))"), + "

a

", + "should support 2 sets of parens" + ); + + assert_eq!( + micromark( + "[a](1(2(3(4(5(6(7(8(9(10(11(12(13(14(15(16(17(18(19(20(21(22(23(24(25(26(27(28(29(30(31(32()))))))))))))))))))))))))))))))))" + ), + "

a

", + "should support 32 sets of parens" + ); + + assert_eq!( + micromark( + "[a](1(2(3(4(5(6(7(8(9(10(11(12(13(14(15(16(17(18(19(20(21(22(23(24(25(26(27(28(29(30(31(32(33())))))))))))))))))))))))))))))))))" + ), + "

[a](1(2(3(4(5(6(7(8(9(10(11(12(13(14(15(16(17(18(19(20(21(22(23(24(25(26(27(28(29(30(31(32(33())))))))))))))))))))))))))))))))))

", + "should not support 33 or more sets of parens" + ); + + assert_eq!( + micromark("[a](b \"\n c\")"), + "

a

", + "should support an eol at the start of a title" + ); + + assert_eq!( + micromark("[a](b( \"c\")"), + "

[a](b( "c")

", + "should not support whitespace when unbalanced in a raw destination" + ); + + assert_eq!( + micromark("[a](\0)"), + "

a

", + "should support a single NUL character as a link resource" + ); +} -- cgit