extern crate markdown;
use markdown::{
mdast::{InlineCode, Node, Paragraph, Root, Text},
to_html, to_html_with_options, to_mdast,
unist::Position,
CompileOptions, Constructs, Options, ParseOptions,
};
use pretty_assertions::assert_eq;
#[test]
fn code_text() -> Result<(), String> {
let danger = Options {
compile: CompileOptions {
allow_dangerous_html: true,
allow_dangerous_protocol: true,
..Default::default()
},
..Default::default()
};
assert_eq!(
to_html("`foo`"),
"
foo
",
"should support code"
);
assert_eq!(
to_html("`` foo ` bar ``"),
"foo ` bar
",
"should support code w/ more accents"
);
assert_eq!(
to_html("` `` `"),
"``
",
"should support code w/ fences inside, and padding"
);
assert_eq!(
to_html("` `` `"),
" ``
",
"should support code w/ extra padding"
);
assert_eq!(
to_html("` a`"),
" a
",
"should support code w/ unbalanced padding"
);
assert_eq!(
to_html("`\u{a0}b\u{a0}`"),
"\u{a0}b\u{a0}
",
"should support code w/ non-padding whitespace"
);
assert_eq!(
to_html("` `\n` `"),
"
\n
",
"should support code w/o data"
);
assert_eq!(
to_html("``\nfoo\nbar \nbaz\n``"),
"foo bar baz
",
"should support code w/o line endings (1)"
);
assert_eq!(
to_html("``\nfoo \n``"),
"foo
",
"should support code w/o line endings (2)"
);
assert_eq!(
to_html("`foo bar \nbaz`"),
"foo bar baz
",
"should not support whitespace collapsing"
);
assert_eq!(
to_html("`foo\\`bar`"),
"foo\\
bar`
",
"should not support character escapes"
);
assert_eq!(
to_html("``foo`bar``"),
"foo`bar
",
"should support more accents"
);
assert_eq!(
to_html("` foo `` bar `"),
"foo `` bar
",
"should support less accents"
);
assert_eq!(
to_html("*foo`*`"),
"*foo*
",
"should precede over emphasis"
);
assert_eq!(
to_html("[not a `link](/foo`)"),
"[not a link](/foo
)
",
"should precede over links"
);
assert_eq!(
to_html("``"),
"<a href="
">`
",
"should have same precedence as HTML (1)"
);
assert_eq!(
to_html_with_options("`", &danger)?,
"`
",
"should have same precedence as HTML (2)"
);
assert_eq!(
to_html("``"),
"<http://foo.bar.
baz>`
",
"should have same precedence as autolinks (1)"
);
assert_eq!(
to_html("`"),
"http://foo.bar.`baz`
",
"should have same precedence as autolinks (2)"
);
assert_eq!(
to_html("```foo``"),
"```foo``
",
"should not support more accents before a fence"
);
assert_eq!(
to_html("`foo"),
"`foo
",
"should not support no closing fence (1)"
);
assert_eq!(
to_html("`foo``bar``"),
"`foobar
",
"should not support no closing fence (2)"
);
// Extra:
assert_eq!(
to_html("`foo\t\tbar`"),
"foo\t\tbar
",
"should support tabs in code"
);
assert_eq!(
to_html("\\``x`"),
"`x
",
"should support an escaped initial grave accent"
);
assert_eq!(
to_html_with_options(
"`a`",
&Options {
parse: ParseOptions {
constructs: Constructs {
code_text: false,
..Default::default()
},
..Default::default()
},
..Default::default()
}
)?,
"`a`
",
"should support turning off code (text)"
);
assert_eq!(
to_mdast("a `alpha` b.", &Default::default())?,
Node::Root(Root {
children: vec![Node::Paragraph(Paragraph {
children: vec![
Node::Text(Text {
value: "a ".into(),
position: Some(Position::new(1, 1, 0, 1, 3, 2))
}),
Node::InlineCode(InlineCode {
value: "alpha".into(),
position: Some(Position::new(1, 3, 2, 1, 10, 9))
}),
Node::Text(Text {
value: " b.".into(),
position: Some(Position::new(1, 10, 9, 1, 13, 12))
})
],
position: Some(Position::new(1, 1, 0, 1, 13, 12))
})],
position: Some(Position::new(1, 1, 0, 1, 13, 12))
}),
"should support code (text) as `InlineCode`s in mdast"
);
Ok(())
}