").count(), 1_000);
assert_eq!(actual.matches("deep").count(), 1);
})
.expect("spawn small-stack test")
.join()
.expect("header table conversion should not recurse");
}
#[test]
fn conversion_is_limited_to_the_supplied_subtree() {
let mut dom = Tree::new();
let first = dom.leaf(0, "p", "first");
dom.leaf(0, "p", "second");
assert_eq!(convert(&dom, first), "first");
let converter = Converter::new(Options {
max_depth: 0,
..Options::default()
});
assert_eq!(converter.convert(&dom, first), "");
}
fn rendered_html(markdown: &str) -> String {
let parser = pulldown_cmark::Parser::new_ext(
markdown,
pulldown_cmark::Options::ENABLE_TABLES | pulldown_cmark::Options::ENABLE_STRIKETHROUGH,
);
let mut html = String::new();
pulldown_cmark::html::push_html(&mut html, parser);
html
}
#[test]
fn markdown_parser_recovers_adjacent_and_nested_formatting() {
let mut dom = Tree::new();
dom.leaf(0, "em", "foo");
dom.leaf(0, "em", "bar");
dom.text(0, " ");
let strong = dom.element(0, "strong");
dom.leaf(strong, "em", "both");
dom.text(0, " ");
dom.leaf(0, "del", "deleted");
assert_eq!(
rendered_html(&convert(&dom, 0)),
"foobar both deleted
\n"
);
}
#[test]
fn markdown_parser_recovers_unicode_spaces_at_emphasis_boundaries() {
let mut dom = Tree::new();
dom.leaf(0, "em", "\u{a0} a \u{2003}");
dom.text(0, "b");
assert_eq!(
rendered_html(&convert(&dom, 0)),
"\u{a0} a \u{2003}b
\n"
);
let mut dom = Tree::new();
dom.leaf(0, "p", "\u{a0} a");
assert_eq!(convert(&dom, 0), "\u{a0} a");
}
#[test]
fn markdown_parser_recovers_intraword_emphasis_next_to_punctuation() {
for (tag, html_tag) in [("strong", "strong"), ("em", "em"), ("del", "del")] {
for text in ["(word)", "word!", "!word", "日本語。"] {
let mut dom = Tree::new();
dom.text(0, "before");
dom.leaf(0, tag, text);
dom.text(0, "after");
let markdown = convert(&dom, 0);
assert_eq!(
rendered_html(&markdown),
format!("before<{html_tag}>{text}{html_tag}>after
\n"),
"{markdown}"
);
}
}
}
#[test]
fn markdown_parser_recovers_literal_hashes_at_the_end_of_headings() {
let mut dom = Tree::new();
dom.leaf(0, "h1", "title #");
assert_eq!(rendered_html(&convert(&dom, 0)), "title #
\n");
}
#[test]
fn markdown_parser_recovers_pipes_and_preformatted_code_inside_tables() {
let mut dom = Tree::new();
let table = dom.element(0, "table");
let header = dom.element(table, "tr");
dom.leaf(header, "th", "Code");
let row = dom.element(table, "tr");
let cell = dom.element(row, "td");
dom.leaf(cell, "code", "a|b");
let row = dom.element(table, "tr");
let cell = dom.element(row, "td");
dom.leaf(cell, "pre", " |b\nnext\n");
let markdown = convert(&dom, 0);
let html = support::rendered_html(&markdown);
assert!(html.contains("a|b"), "{html}");
assert_eq!(html.matches("").count(), 2);
let parsed = support::Tree::parse(&html);
assert!(
parsed
.nodes
.iter()
.any(|node| node.text.as_deref() == Some(" |b\nnext\n")),
"{html}"
);
}
|