308 lines
7.8 KiB
Rust
308 lines
7.8 KiB
Rust
use markdown::mdast::{Definition, InlineMath, Math, Node, Paragraph, 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 math() {
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$a$\n",
|
|
"should serialize math (text)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to_md_with_opts(
|
|
&Node::InlineMath(InlineMath {
|
|
value: String::from("a"),
|
|
position: None
|
|
}),
|
|
&Options {
|
|
single_dollar_text_math: false,
|
|
..Default::default()
|
|
}
|
|
)
|
|
.unwrap(),
|
|
"$$a$$\n",
|
|
"should serialize math (text) with at least 2 dollars w/ `single_dollar_text_math: false`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::new(),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$$\n",
|
|
"should serialize math (text) w/o `value`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a \\$ b"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$$a \\$ b$$\n",
|
|
"should serialize math (text) w/ two dollar signs when including a dollar"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a \\$"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$$ a \\$ $$\n",
|
|
"should serialize math (text) w/ padding when ending in a dollar sign"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("$ a"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$$ $ a $$\n",
|
|
"should serialize math (text) w/ padding when starting in a dollar sign"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from(" a "),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$ a $\n",
|
|
"should pad w/ a space if the value starts and ends w/ a space"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from(" a"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$ a$\n",
|
|
"should not pad w/ spaces if the value ends w/ a non-space"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a "),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$a $\n",
|
|
"should not pad w/ spaces if the value starts w/ a non-space"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Math(Math {
|
|
value: String::from("a"),
|
|
position: None,
|
|
meta: None
|
|
}))
|
|
.unwrap(),
|
|
"$$\na\n$$\n",
|
|
"should serialize math (flow)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Math(Math {
|
|
value: String::new(),
|
|
position: None,
|
|
meta: None
|
|
}))
|
|
.unwrap(),
|
|
"$$\n$$\n",
|
|
"should serialize math (flow) w/o `value`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Math(Math {
|
|
value: String::new(),
|
|
position: None,
|
|
meta: String::from("a").into()
|
|
}))
|
|
.unwrap(),
|
|
"$$a\n$$\n",
|
|
"should serialize math (flow) w/ `meta`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Math(Math {
|
|
value: String::from("$$"),
|
|
position: None,
|
|
meta: None
|
|
}))
|
|
.unwrap(),
|
|
"$$$\n$$\n$$$\n",
|
|
"should serialize math (flow) w/ more dollars than occur together in `value`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Paragraph(Paragraph {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("a $ b"),
|
|
position: None
|
|
})],
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"a \\$ b\n",
|
|
"should escape `$` in phrasing"
|
|
);
|
|
|
|
assert_eq!(
|
|
to_md_with_opts(
|
|
&Node::Paragraph(Paragraph {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("a $ b"),
|
|
position: None
|
|
})],
|
|
position: None
|
|
}),
|
|
&Options {
|
|
single_dollar_text_math: false,
|
|
..Default::default()
|
|
}
|
|
)
|
|
.unwrap(),
|
|
"a $ b\n",
|
|
"should not escape a single dollar in phrasing w/ `single_dollar_text_math: false`'"
|
|
);
|
|
|
|
assert_eq!(
|
|
to_md_with_opts(
|
|
&Node::Paragraph(Paragraph {
|
|
children: vec![Node::Text(Text {
|
|
value: String::from("a $$ b"),
|
|
position: None
|
|
})],
|
|
position: None
|
|
}),
|
|
&Options {
|
|
single_dollar_text_math: false,
|
|
..Default::default()
|
|
}
|
|
)
|
|
.unwrap(),
|
|
"a \\$$ b\n",
|
|
"should escape two dollars in phrasing w/ `single_dollar_text_math: false`"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Paragraph(Paragraph {
|
|
children: vec![
|
|
Node::Text(Text {
|
|
value: String::from("a $"),
|
|
position: None
|
|
}),
|
|
Node::InlineMath(InlineMath {
|
|
value: String::from("b"),
|
|
position: None
|
|
}),
|
|
Node::Text(Text {
|
|
value: String::from("$ c"),
|
|
position: None
|
|
}),
|
|
],
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"a \\$$b$\\$ c\n",
|
|
"should escape `$` around math (text)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Definition(Definition {
|
|
position: None,
|
|
url: String::from("b"),
|
|
title: String::from("a\n$\nb").into(),
|
|
identifier: String::from("a"),
|
|
label: String::from("a").into(),
|
|
}))
|
|
.unwrap(),
|
|
"[a]: b \"a\n$\nb\"\n",
|
|
"should not escape `$` at the start of a line"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Math(Math {
|
|
value: String::new(),
|
|
position: None,
|
|
meta: String::from("a\rb\nc").into()
|
|
}))
|
|
.unwrap(),
|
|
"$$a
b
c\n$$\n",
|
|
"should escape `\\r`, `\\n` when in `meta` of math (flow)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::Math(Math {
|
|
value: String::new(),
|
|
position: None,
|
|
meta: String::from("a$b").into()
|
|
}))
|
|
.unwrap(),
|
|
"$$a$b\n$$\n",
|
|
"should escape `$` when in `meta` of math (flow)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a\n- b"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$a - b$\n",
|
|
"should prevent breaking out of code (-)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a\n#"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$a #$\n",
|
|
"should prevent breaking out of code (#)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a\n1. "),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$a 1. $\n",
|
|
"should prevent breaking out of code (\\d\\.)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a\r- b"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$a - b$\n",
|
|
"should prevent breaking out of code (cr)"
|
|
);
|
|
|
|
assert_eq!(
|
|
to(&Node::InlineMath(InlineMath {
|
|
value: String::from("a\n- b"),
|
|
position: None
|
|
}))
|
|
.unwrap(),
|
|
"$a - b$\n",
|
|
"should prevent breaking out of code (crlf)"
|
|
);
|
|
}
|