pub fn extract_text(html: &str) -> String {
htmd::convert(html).unwrap_or_else(|_| {
html.lines()
.map(|line| line.trim())
.filter(|line| !line.is_empty())
.collect::<Vec<_>>()
.join("\n")
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extract_text_with_valid_html() {
let html = r#"<html><body><p>Hello World</p></body></html>"#;
let result = extract_text(html);
assert!(result.contains("Hello World"));
assert!(!result.contains("<html>"));
}
#[test]
fn test_extract_text_with_scripts_removed() {
let html = r#"
<html>
<head><script>var x = 1;</script></head>
<body><article>Main content here</article></body>
</html>
"#;
let result = extract_text(html);
assert!(result.contains("Main content"));
assert!(!result.contains("<script>"));
}
#[test]
fn test_extract_text_empty_html() {
let html = "";
let result = extract_text(html);
assert_eq!(result, "");
}
#[test]
fn test_extract_text_malformed_html() {
let html = "<div>Open div never closed<p>Paragraph";
let result = extract_text(html);
assert!(!result.is_empty());
}
}