#![allow(missing_docs)]
use html_to_markdown_rs::{ConversionOptions, WhitespaceMode};
fn convert(html: &str, opts: Option<ConversionOptions>) -> html_to_markdown_rs::error::Result<String> {
html_to_markdown_rs::convert(html, opts).map(|r| r.content.unwrap_or_default())
}
#[test]
fn should_fold_newline_in_code_span_inside_table_cell_when_br_in_tables_is_false() {
let html = "<table><tr><td><code>a\nb</code></td></tr></table>";
let options = ConversionOptions {
br_in_tables: false,
compact_tables: true,
..Default::default()
};
let result = convert(html, Some(options)).unwrap();
assert_eq!(result, "| `a b` |\n| --- |\n", "actual: {result}");
assert_eq!(
result.lines().count(),
2,
"table row must stay on one physical line: {result}"
);
}
#[test]
fn should_fold_newline_in_code_span_inside_table_cell_when_br_in_tables_is_true() {
let html = "<table><tr><td><code>a\nb</code></td></tr></table>";
let options = ConversionOptions {
br_in_tables: true,
compact_tables: true,
..Default::default()
};
let result = convert(html, Some(options)).unwrap();
assert_eq!(result, "| `a b` |\n| --- |\n", "actual: {result}");
assert!(
!result.contains("<br>"),
"a code span must never contain a literal <br>: {result}"
);
assert_eq!(
result.lines().count(),
2,
"table row must stay on one physical line: {result}"
);
}
#[test]
fn should_fold_decoded_carriage_return_in_code_span_inside_table_cell() {
let html = "<table><tr><td><code>a b</code></td></tr></table>";
let options = ConversionOptions {
compact_tables: true,
..Default::default()
};
let result = convert(html, Some(options)).unwrap();
assert_eq!(result, "| `a b` |\n| --- |\n", "actual: {result}");
assert_eq!(
result.lines().count(),
2,
"table row must stay on one physical line: {result}"
);
}
#[test]
fn should_fold_decoded_crlf_in_code_span_inside_table_cell_to_a_single_space() {
let html = "<table><tr><td><code>a b</code></td></tr></table>";
let options = ConversionOptions {
compact_tables: true,
..Default::default()
};
let result = convert(html, Some(options)).unwrap();
assert_eq!(result, "| `a b` |\n| --- |\n", "actual: {result}");
assert_eq!(
result.lines().count(),
2,
"table row must stay on one physical line: {result}"
);
}
#[test]
fn should_preserve_multiple_consecutive_spaces_in_code_span_inside_table_cell() {
let html = "<table><tr><td><code>a b</code></td></tr></table>";
let options = ConversionOptions {
compact_tables: true,
..Default::default()
};
let result = convert(html, Some(options)).unwrap();
assert_eq!(result, "| `a b` |\n| --- |\n", "actual: {result}");
assert_eq!(
result.lines().count(),
2,
"table row must stay on one physical line: {result}"
);
}
#[test]
fn should_fold_newline_in_code_span_inside_table_cell_under_strict_whitespace_mode() {
let html = "<table><tr><td><code>a\nb</code></td></tr></table>";
let options = ConversionOptions {
whitespace_mode: WhitespaceMode::Strict,
compact_tables: true,
..Default::default()
};
let result = convert(html, Some(options)).unwrap();
assert_eq!(result, "| `a b` |\n| --- |\n", "actual: {result}");
assert_eq!(
result.lines().count(),
2,
"table row must stay on one physical line: {result}"
);
}
#[test]
fn should_preserve_newline_verbatim_in_code_span_outside_table_cell() {
let html = "<p>see <code>a\nb</code> here</p>";
let result = convert(html, None).unwrap();
assert_eq!(result, "see `a\nb` here\n", "actual: {result:?}");
}
#[test]
fn should_preserve_decoded_carriage_return_verbatim_in_code_span_outside_table_cell() {
let html = "<p>see <code>a b</code> here</p>";
let result = convert(html, None).unwrap();
assert_eq!(result, "see `a\rb` here\n", "actual: {result:?}");
}
#[test]
fn should_fold_newline_in_kbd_inside_table_cell_when_br_in_tables_is_true() {
let html = "<table><tr><td><kbd>a\nb</kbd></td></tr></table>";
let options = ConversionOptions {
br_in_tables: true,
compact_tables: true,
..Default::default()
};
let result = convert(html, Some(options)).unwrap();
assert_eq!(result, "| `a b` |\n| --- |\n", "actual: {result}");
assert_eq!(
result.lines().count(),
2,
"table row must stay on one physical line: {result}"
);
}