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_reference() { assert_eq!( micromark("[bar]: /url \"title\"\n\n[foo][bar]"), "
", "should support link references" ); assert_eq!( micromark("[ref]: /uri\n\n[link [foo [bar]]][ref]"), "", "should support balanced brackets in link references" ); assert_eq!( micromark("[ref]: /uri\n\n[link \\[bar][ref]"), "", "should support escaped brackets in link references" ); assert_eq!( micromark("[ref]: /uri\n\n[link *foo **bar** `#`*][ref]"), "", "should support content in link references" ); assert_eq!( micromark("[ref]: /uri\n\n[![moon](moon.jpg)][ref]"), "", "should support images in link references" ); assert_eq!( micromark("[ref]: /uri\n\n[foo [bar](/uri)][ref]"), "", "should not support links in link references" ); assert_eq!( micromark("[ref]: /uri\n\n[foo *bar [baz][ref]*][ref]"), "", "should not support deep links in link references" ); // To do: link/attention interplay. // assert_eq!( // micromark("[ref]: /uri\n\n*[foo*][ref]"), // "*foo*
", // "should prefer link references over emphasis (1)" // ); assert_eq!( micromark("[ref]: /uri\n\n[foo *bar][ref]"), "", "should prefer link references over emphasis (2)" ); assert_eq!( micromark_with_options("[ref]: /uri\n\n[foo[foo
[foo][ref]
[foohttp://example.com/?search=][ref]
", "should prefer autolinks over link references" ); assert_eq!( micromark("[bar]: /url \"title\"\n\n[foo][BaR]"), "", "should match references to definitions case-insensitively" ); assert_eq!( micromark("[ТОЛПОЙ]: /url\n\n[Толпой][Толпой] is a Russian word."), "Толпой is a Russian word.
", "should match references to definitions w/ unicode case-folding" ); assert_eq!( micromark("[Foo\n bar]: /url\n\n[Baz][Foo bar]"), "", "should match references to definitions w/ collapsing" ); assert_eq!( micromark("[bar]: /url \"title\"\n\n[foo] [bar]"), "[foo] bar
", "should not support whitespace between label and reference (1)" ); assert_eq!( micromark("[bar]: /url \"title\"\n\n[foo]\n[bar]"), "[foo]\nbar
", "should not support whitespace between label and reference (2)" ); assert_eq!( micromark("[foo]: /url1\n\n[foo]: /url2\n\n[bar][foo]"), "", "should prefer earlier definitions" ); assert_eq!( micromark("[foo!]: /url\n\n[bar][foo\\!]"), "[bar][foo!]
", "should not match references to definitions w/ escapes" ); assert_eq!( micromark("[ref[]: /uri\n\n[foo][ref[]"), "[ref[]: /uri
\n[foo][ref[]
", "should not support references w/ brackets (1)" ); assert_eq!( micromark("[ref[bar]]: /uri\n\n[foo][ref[bar]]"), "[ref[bar]]: /uri
\n[foo][ref[bar]]
", "should not support references w/ brackets (2)" ); assert_eq!( micromark("[[[foo]]]: /url\n\n[[[foo]]]"), "[[[foo]]]: /url
\n[[[foo]]]
", "should not support references w/ brackets (3)" ); assert_eq!( micromark("[ref\\[]: /uri\n\n[foo][ref\\[]"), "", "should match references to definitions w/ matching escapes" ); assert_eq!( micromark("[bar\\\\]: /uri\n\n[bar\\\\]"), "", "should support escapes" ); assert_eq!( micromark("[]: /uri\n\n[]"), "[]: /uri
\n[]
", "should not support empty references" ); assert_eq!( micromark("[\n ]: /uri\n\n[\n ]"), "[\n]: /uri
\n[\n]
", "should not support blank references" ); assert_eq!( micromark("[foo]: /url \"title\"\n\n[foo][]"), "", "should support collaped references" ); assert_eq!( micromark("[*foo* bar]: /url \"title\"\n\n[*foo* bar][]"), "", "should support content in collaped references" ); assert_eq!( micromark("[foo]: /url \"title\"\n\n[Foo][]"), "", "should match references to definitions case-insensitively" ); assert_eq!( micromark("[foo]: /url \"title\"\n\n[foo] \n[]"), "foo\n[]
", "should not support whitespace between label and collaped reference" ); assert_eq!( micromark("[foo]: /url \"title\"\n\n[foo]"), "", "should support shortcut references" ); assert_eq!( micromark("[*foo* bar]: /url \"title\"\n\n[*foo* bar]"), "", "should support content in shortcut references (1)" ); assert_eq!( micromark("[*foo* bar]: /url \"title\"\n\n[[*foo* bar]]"), "[foo bar]
", "should support content in shortcut references (2)" ); assert_eq!( micromark("[foo]: /url\n\n[[bar [foo]"), "[[bar foo
", "should support content in shortcut references (3)" ); assert_eq!( micromark("[foo]: /url \"title\"\n\n[Foo]"), "", "should match shortcut references to definitions case-insensitively" ); assert_eq!( micromark("[foo]: /url\n\n[foo] bar"), "foo bar
", "should support whitespace after a shortcut reference" ); assert_eq!( micromark("[foo]: /url \"title\"\n\n\\[foo]"), "[foo]
", "should “support” an escaped shortcut reference" ); // To do: link/attention interplay. // assert_eq!( // micromark("[foo*]: /url\n\n*[foo*]"), // "*foo*
", // "should prefer shortcut references over emphasis" // ); assert_eq!( micromark("[foo]: /url1\n[bar]: /url2\n\n[foo][bar]"), "", "should prefer full references over shortcut references" ); assert_eq!( micromark("[foo]: /url1\n\n[foo][]"), "", "should prefer collapsed references over shortcut references" ); assert_eq!( micromark("[foo]: /url\n\n[foo]()"), "", "should prefer resources over shortcut references (1)" ); assert_eq!( micromark("[foo]: /url \"title\"\n\n[foo]()"), "", "should prefer resources over shortcut references (2)" ); assert_eq!( micromark("[foo]: /url1\n\n[foo](not a link)"), "foo(not a link)
", "should support shortcut references when followed by nonconforming resources" ); assert_eq!( micromark("[baz]: /url\n\n[foo][bar][baz]"), "[foo]bar
", "stable/unstable (1)" ); assert_eq!( micromark("[baz]: /url1\n[bar]: /url2\n\n[foo][bar][baz]"), "", "stable/unstable (2)" ); assert_eq!( micromark("[baz]: /url1\n[foo]: /url2\n\n[foo][bar][baz]"), "[foo]bar
", "stable/unstable (3)" ); // Extra // This matches most implimentations, but is not strictly according to spec. // See:[x][ ], [x][\t], [x][\n], x
", "should not support whitespace-only full references" ); // See also:Will it link? [+], [;]
", "should not support mismatched character escapes in shortcuts" ); assert_eq!( micromark("[©]: example.com\n[&]: example.com\n\nWill it link? [©], [&]"), "Will it link? [©], [&]
", "should not support mismatched character references in shortcuts" ); assert_eq!( micromark("[+]: example.com\n[\\;]: example.com\n\nWill it link? [\\+][], [;][]"), "Will it link? [+][], [;][]
", "should not support mismatched character escapes in collapsed" ); assert_eq!( micromark("[©]: example.com\n[&]: example.com\n\nWill it link? [©][], [&][]"), "Will it link? [©][], [&][]
", "should not support mismatched character references in collapsed" ); assert_eq!( micromark("[+]: example.com\n[\\;]: example.com\n\nWill it link? [a][ \\+ ], [b][ ; ]"), "Will it link? [a][ + ], [b][ ; ]
", "should not support mismatched character escapes in fulls" ); assert_eq!( micromark( "[©]: example.com\n[&]: example.com\n\nWill it link? [a][ © ], [b][ & ]" ), "Will it link? [a][ © ], [b][ & ]
", "should not support mismatched character references in fulls" ); assert_eq!( micromark( "[*f*][] [;][] [\\;][] [;][] [*f*;][] [*f*\\;][] [*f*;][] [*f*]: alpha [;]: bravo [\\;]: charlie [;]: delta [*f*;]: echo [*f*\\;]: foxtrot [*f*;]: golf" ), " ", "should properly handle labels w/ character references and -escapes, and phrasing" ); // 999 `x` characters. let max = "x".repeat(999); assert_eq!( micromark(format!("[{}]: a\n[y][{}]", max, max).as_str()), "", "should support 999 characters in a reference" ); assert_eq!( micromark(format!("[{}x]: a\n[y][{}x]", max, max).as_str()), format!("[{}x]: a\n[y][{}x]
", max, max), "should not support 1000 characters in a reference" ); assert_eq!( micromark("[x] missing-colon\n\nWill it link? [x]"), "[x] missing-colon
\nWill it link? [x]
", "should not fail on a missing colon in a definition" ); // To do: turning things off. // assert_eq!( // micromark("[x]()", {extensions: [{disable: {null: ["labelStartLink"]}}]}), // "[x]()
", // "should support turning off label start (link)" // ); // To do: turning things off. // assert_eq!( // micromark("[x]()", {extensions: [{disable: {null: ["labelEnd"]}}]}), // "[x]()
", // "should support turning off label end" // ); }