use comrak::{markdown_to_html, ComrakOptions};
pub fn parse_markdown_to_text(markdown: &str) -> String {
let html = markdown_to_html(markdown, &ComrakOptions::default());
html_to_text(&html)
}
fn html_to_text(html: &str) -> String {
let mut result = String::new();
let mut in_tag = false;
for c in html.chars() {
match c {
'<' => in_tag = true,
'>' => in_tag = false,
_ if !in_tag => result.push(c),
_ => {}
}
}
result.split_whitespace().collect::<Vec<&str>>().join(" ")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_simple_markdown() {
let markdown = "# Header\n\nThis is **bold** text.";
let expected_text = "Header This is bold text.";
assert_eq!(parse_markdown_to_text(markdown), expected_text);
}
#[test]
fn test_parse_markdown_with_link() {
let markdown = "Visit [Google](https://google.com)!";
let expected_text = "Visit Google!"; assert_eq!(parse_markdown_to_text(markdown), expected_text);
}
#[test]
fn test_parse_markdown_with_list() {
let markdown = "* Item 1\n* Item 2";
let expected_text = "Item 1 Item 2";
assert_eq!(parse_markdown_to_text(markdown), expected_text);
}
}