{}", highlighted)
} else {
format!(
"{}",
crate::utils::html::escape_html(&code_buffer)
)
};
events.push(Event::Html(html.into()));
in_codeblock = false;
}
_ if !in_codeblock => {
events.push(event);
}
_ => {}
}
}
let mut html = String::new();
pulldown_cmark::html::push_html(&mut html, events.into_iter());
clean_comment_html(&html)
}
#[cfg(all(test, feature = "server"))]
mod tests {
use super::*;
#[test]
fn render_comment_heading_converted_to_strong() {
let result = render_comment_markdown("## Hello World");
assert!(result.contains("Hello World"));
assert!(!result.contains(""));
assert!(result.contains("main"));
}
#[test]
fn render_comment_code_block_without_language() {
let result = render_comment_markdown("```\nplain text\n```");
assert!(result.contains(""));
assert!(result.contains("plain text"));
}
#[test]
fn render_comment_code_block_without_language_escapes_html() {
let result = render_comment_markdown("```\nalert('xss')\n```");
assert!(result.contains("<div>"));
assert!(!result.contains(""));
}
#[test]
fn render_comment_strips_script() {
let result = render_comment_markdown("");
assert!(!result.contains("script"));
}
#[test]
fn render_comment_no_img_tags() {
let result = render_comment_markdown("");
assert!(!result.contains("
text");
assert!(result.contains("text"));
assert!(!result.contains("onerror"));
}
#[test]
fn render_comment_link_data_uri_removed() {
let result = render_comment_markdown("[click](data:text/html,)");
assert!(result.contains("click"));
assert!(!result.contains("data:"));
}
#[test]
fn render_comment_code_block_escapes_html_entities() {
let result = render_comment_markdown("```\n&\n```");
assert!(result.contains("&"));
}
#[test]
fn render_comment_no_id_attribute() {
let result = render_comment_markdown("text");
assert!(!result.contains("id="));
}
#[test]
fn render_comment_table() {
let result = render_comment_markdown("| a | b |\n|---|---|\n| 1 | 2 |");
assert!(result.contains(""));
}
#[test]
fn render_comment_strikethrough() {
let result = render_comment_markdown("~~deleted~~");
assert!(result.contains("deleted"));
}
#[test]
fn render_comment_inline_code() {
let result = render_comment_markdown("Use `println!` to print");
assert!(result.contains("println!"));
}
#[test]
fn clean_comment_html_removes_details_summary() {
let result =
clean_comment_html("Click
Content
");
assert!(!result.contains("details"));
assert!(!result.contains("summary"));
}
#[test]
fn clean_comment_html_removes_data_uri() {
let result =
clean_comment_html("alert(1)\">click");
assert!(!result.contains("data:"));
}
#[test]
fn render_comment_empty() {
let result = render_comment_markdown("");
assert!(result.is_empty());
}
#[test]
fn render_comment_heading_with_inline_code() {
let result = render_comment_markdown("## Using `foo()`");
assert!(result.contains(""));
assert!(result.contains("foo()"));
assert!(!result.contains(""));
}
}