393 lines
10 KiB
Rust
393 lines
10 KiB
Rust
use markdown::mdast::{Link, Node, Text};
|
|
use mdast_util_to_markdown::{
|
|
to_markdown as to, to_markdown_with_options as to_md_with_opts, Options,
|
|
};
|
|
use pretty_assertions::assert_eq;
|
|
|
|
#[test]
|
|
fn text() {
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::new(),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[]()\n",
|
|
"should support a link"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("a"),
|
|
position: None
|
|
})],
|
|
position: None,
|
|
url: String::new(),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[a]()\n",
|
|
"should support children"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("a"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](a)\n",
|
|
"should support a url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::new(),
|
|
title: Some(String::from("a"))
|
|
}))
|
|
.unwrap(),
|
|
"[](<> \"a\")\n",
|
|
"should support a title"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("a"),
|
|
title: Some(String::from("b"))
|
|
}))
|
|
.unwrap(),
|
|
"[](a \"b\")\n",
|
|
"should support a url and title"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("b c"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](<b c>)\n",
|
|
"should support a link w/ enclosed url w/ whitespace in url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("b <c"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](<b \\<c>)\n",
|
|
"should escape an opening angle bracket in `url` in an enclosed url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("b >c"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](<b \\>c>)\n",
|
|
"should escape a closing angle bracket in `url` in an enclosed url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("b \\+c"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](<b \\\\+c>)\n",
|
|
"should escape a backslash in `url` in an enclosed url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("b\nc"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](<b
c>)\n",
|
|
"should encode a line ending in `url` in an enclosed url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("b(c"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](b\\(c)\n",
|
|
"should escape an opening paren in `url` in a raw url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("b)c"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](b\\)c)\n",
|
|
"should escape a closing paren in `url` in a raw url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("b\\.c"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](b\\\\.c)\n",
|
|
"should escape a backslash in `url` in a raw url"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("\x0C"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](<\x0C>)\n",
|
|
"should support control characters in links"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::new(),
|
|
title: Some(String::from("b\\-c"))
|
|
}))
|
|
.unwrap(),
|
|
"[](<> \"b\\\\-c\")\n",
|
|
"should escape a backslash in `title`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("tel:123"),
|
|
position: None
|
|
})],
|
|
position: None,
|
|
url: String::from("tel:123"),
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"<tel:123>\n",
|
|
"should use an autolink for nodes w/ a value similar to the url and a protocol"
|
|
);
|
|
|
|
assert_eq!(
|
|
to_md_with_opts(
|
|
&Node::Link(Link {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("tel:123"),
|
|
position: None
|
|
})],
|
|
position: None,
|
|
url: String::from("tel:123"),
|
|
title: None
|
|
}),
|
|
&Options {
|
|
resource_link: true,
|
|
..Default::default()
|
|
}
|
|
)
|
|
.unwrap(),
|
|
"[tel:123](tel:123)\n",
|
|
"should use a resource link (`resourceLink: true`)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("a"),
|
|
position: None
|
|
})],
|
|
position: None,
|
|
url: String::from("a"),
|
|
title: None
|
|
}),)
|
|
.unwrap(),
|
|
"[a](a)\n",
|
|
"should use a normal link for nodes w/ a value similar to the url w/o a protocol"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("tel:123"),
|
|
position: None
|
|
})],
|
|
position: None,
|
|
url: String::from("tel:123"),
|
|
title: None
|
|
}),)
|
|
.unwrap(),
|
|
"<tel:123>\n",
|
|
"should use an autolink for nodes w/ a value similar to the url and a protocol"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("tel:123"),
|
|
position: None
|
|
})],
|
|
position: None,
|
|
url: String::from("tel:123"),
|
|
title: Some(String::from("a"))
|
|
}),)
|
|
.unwrap(),
|
|
"[tel:123](tel:123 \"a\")\n",
|
|
"should use a normal link for nodes w/ a value similar to the url w/ a title"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("a@b.c"),
|
|
position: None
|
|
})],
|
|
position: None,
|
|
url: String::from("mailto:a@b.c"),
|
|
title: None
|
|
}),)
|
|
.unwrap(),
|
|
"<a@b.c>\n",
|
|
"should use an autolink for nodes w/ a value similar to the url and a protocol (email)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("a.b-c_d@a.b"),
|
|
position: None
|
|
})],
|
|
position: None,
|
|
url: String::from("mailto:a.b-c_d@a.b"),
|
|
title: None
|
|
}),)
|
|
.unwrap(),
|
|
"<a.b-c_d@a.b>\n",
|
|
"should not escape in autolinks"
|
|
);
|
|
|
|
assert_eq!(
|
|
to_md_with_opts(
|
|
&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::new(),
|
|
title: Some("b".to_string())
|
|
}),
|
|
&Options {
|
|
quote: '\'',
|
|
..Default::default()
|
|
}
|
|
)
|
|
.unwrap(),
|
|
"[](<> 'b')\n",
|
|
"should support a link w/ title when `quote: \"\'\"`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to_md_with_opts(
|
|
&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::new(),
|
|
title: Some("'".to_string())
|
|
}),
|
|
&Options {
|
|
quote: '\'',
|
|
..Default::default()
|
|
}
|
|
)
|
|
.unwrap(),
|
|
"[](<> '\\'')\n",
|
|
"should escape a quote in `title` in a title when `quote: \"\'\"`'"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: "a b,
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](<a b\n",
|
|
"should not escape unneeded characters in a `DestinationLiteral`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: "a,
|
|
title: None
|
|
}))
|
|
.unwrap(),
|
|
"[](a![b]\\(c*d_e[f_g`h<i</j)\n",
|
|
"should not escape unneeded characters in a `DestinationRaw`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("#"),
|
|
title: Some("a)
|
|
}))
|
|
.unwrap(),
|
|
"[](# \"a\n",
|
|
"should not escape unneeded characters in a `title` (double quotes)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to_md_with_opts(
|
|
&Node::Link(Link {
|
|
children: Vec::new(),
|
|
position: None,
|
|
url: String::from("#"),
|
|
title: Some("a)
|
|
}),
|
|
&Options {
|
|
quote: '\'',
|
|
..Default::default()
|
|
}
|
|
)
|
|
.unwrap(),
|
|
"[](# 'a\n",
|
|
"should not escape unneeded characters in a `title` (single quotes)"
|
|
);
|
|
}
|