extern crate micromark; use micromark::{ mdast::{Node, Paragraph, Root, Text}, micromark, micromark_to_mdast, micromark_with_options, unist::Position, CompileOptions, Constructs, Options, ParseOptions, }; use pretty_assertions::assert_eq; #[test] fn character_escape() -> Result<(), String> { let danger = Options { compile: CompileOptions { allow_dangerous_html: true, allow_dangerous_protocol: true, ..CompileOptions::default() }, ..Options::default() }; assert_eq!( micromark( "\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\-\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\\\\\]\\^\\_\\`\\{\\|\\}\\~"), "
!"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~
", "should support escaped ascii punctuation" ); assert_eq!( micromark("\\→\\A\\a\\ \\3\\φ\\«"), "\\→\\A\\a\\ \\3\\φ\\«
", "should not support other characters after a backslash" ); assert_eq!( micromark( "\\*not emphasized*\n\\*not emphasized*\n<br/> not a tag\n[not a link](/foo)\n`not code`\n1. not a list\n* not a list\n# not a heading\n[foo]: /url "not a reference"\nö not a character entity
", "should escape other constructs" ); assert_eq!( micromark("foo\\\nbar"), "foo
\nbar
\\[\\`
\\[\\]\n
",
"should not escape in indented code"
);
assert_eq!(
micromark("foo\n
",
"should escape in fenced code info"
);
assert_eq!(
micromark_with_options(
"\\> a",
&Options {
parse: ParseOptions {
constructs: Constructs {
character_escape: false,
..Constructs::default()
},
..ParseOptions::default()
},
..Options::default()
}
)?,
"\\> a
", "should support turning off character escapes" ); assert_eq!( micromark_to_mdast("a \\* b", &ParseOptions::default())?, Node::Root(Root { children: vec![Node::Paragraph(Paragraph { children: vec![Node::Text(Text { value: "a * b".into(), position: Some(Position::new(1, 1, 0, 1, 7, 6)) }),], position: Some(Position::new(1, 1, 0, 1, 7, 6)) })], position: Some(Position::new(1, 1, 0, 1, 7, 6)) }), "should support character escapes as `Text`s in mdast" ); Ok(()) }