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_reference() -> Result<(), String> { assert_eq!( micromark( " & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸" ), "
\u{a0} & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸
", "should support named character references" ); assert_eq!( micromark("# Ӓ Ϡ "), "# Ӓ Ϡ �
", "should support decimal character references" ); assert_eq!( micromark("" ആ ಫ"), "" ആ ಫ
", "should support hexadecimal character references" ); assert_eq!( micromark( "  &x; \n\nabcdef0;\n&ThisIsNotDefined; &hi?;"), "  &x; &#; &#x;\n�\n&#abcdef0;\n&ThisIsNotDefined; &hi?;
", "should not support other things that look like character references" ); assert_eq!( micromark("©"), "©
", "should not support character references w/o semicolon" ); assert_eq!( micromark("&MadeUpEntity;"), "&MadeUpEntity;
", "should not support unknown named character references" ); assert_eq!( micromark_with_options( "", &Options { compile: CompileOptions { allow_dangerous_html: true, allow_dangerous_protocol: true, ..CompileOptions::default() }, ..Options::default() } )?, "", "should not care about character references in html" ); assert_eq!( micromark("[foo](/föö \"föö\")"), "", "should support character references in resource URLs and titles" ); assert_eq!( micromark("[foo]: /föö \"föö\"\n\n[foo]"), "", "should support character references in definition URLs and titles" ); assert_eq!( micromark("``` föö\nfoo\n```"), "foo\n
",
"should support character references in code language"
);
assert_eq!(
micromark("`föö`"),
"föö
föfö\n
",
"should not support character references in indented code"
);
assert_eq!(
micromark("*foo*\n*foo*"),
"*foo*\nfoo
", "should not support character references as construct markers (1)" ); assert_eq!( micromark("* foo\n\n* foo"), "* foo
\n[a](url "tit")
", "should not support character references as construct markers (3)" ); assert_eq!( micromark("foo bar"), "foo\n\nbar
", "should not support character references as whitespace (1)" ); assert_eq!( micromark(" foo"), "\tfoo
", "should not support character references as whitespace (2)" ); // Extra: assert_eq!( micromark("∳"), "∳
", "should support the longest possible named character reference" ); assert_eq!( micromark(""), "�
", "should “support” a longest possible hexadecimal character reference" ); assert_eq!( micromark(""), "�
", "should “support” a longest possible decimal character reference" ); assert_eq!( micromark("&CounterClockwiseContourIntegrali;"), "&CounterClockwiseContourIntegrali;
", "should not support the longest possible named character reference" ); assert_eq!( micromark(""), "�
", "should not support a longest possible hexadecimal character reference" ); assert_eq!( micromark(""), "�
", "should not support a longest possible decimal character reference" ); assert_eq!( micromark("&-;"), "&-;
", "should not support the other characters after `&`" ); assert_eq!( micromark("-;"), "&#-;
", "should not support the other characters after `#`" ); assert_eq!( micromark("-;"), "&#x-;
", "should not support the other characters after `#x`" ); assert_eq!( micromark("<-;"), "<-;
", "should not support the other characters inside a name" ); assert_eq!( micromark(" -;"), "	-;
", "should not support the other characters inside a demical" ); assert_eq!( micromark(" -;"), "	-;
", "should not support the other characters inside a hexademical" ); assert_eq!( micromark_with_options( "&", &Options { parse: ParseOptions { constructs: Constructs { character_reference: false, ..Constructs::default() }, ..ParseOptions::default() }, ..Options::default() } )?, "&
", "should support turning off character references" ); assert_eq!( micromark_to_mdast(" & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸", &ParseOptions::default())?, Node::Root(Root { children: vec![Node::Paragraph(Paragraph { children: vec![Node::Text(Text { value: "\u{a0} & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸".to_string(), position: Some(Position::new(1, 1, 0, 3, 33, 109)) }),], position: Some(Position::new(1, 1, 0, 3, 33, 109)) })], position: Some(Position::new(1, 1, 0, 3, 33, 109)) }), "should support character references as `Text`s in mdast" ); Ok(()) }