use ammonia::Builder; use pulldown_cmark::{Parser, Options, html::push_html}; use std::collections::HashSet; pub fn render_markdown_dirty(input: &str) -> String { let input = &autolinks(&parse_alignment(&parse_backslash_breaks(input))); let mut options = Options::empty(); options.insert(Options::ENABLE_STRIKETHROUGH); options.insert(Options::ENABLE_GFM); options.insert(Options::ENABLE_FOOTNOTES); options.insert(Options::ENABLE_TABLES); options.insert(Options::ENABLE_HEADING_ATTRIBUTES); options.insert(Options::ENABLE_SUBSCRIPT); let parser = Parser::new_ext(input, options); let mut html = String::new(); push_html(&mut html, parser); html } pub fn clean_html(html: String, allowed_attributes: HashSet<&str>) -> String { Builder::default() .generic_attributes(allowed_attributes) .add_tags(&[ "video", "source", "img", "b", "span", "p", "i", "strong", "em", "a", "align", ]) .rm_tags(&["script", "style", "link", "canvas"]) .add_tag_attributes("a", &["href", "target"]) .add_url_schemes(&["atto"]) .clean(&html.replace("