use ammonia::Builder; use pulldown_cmark::{Parser, Options, html::push_html}; use std::collections::HashSet; /// Render markdown input into HTML pub fn render_markdown(input: &str, proxy_images: bool) -> String { let input = &autolinks(&parse_alignment(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); options.insert(Options::ENABLE_SUPERSCRIPT); let parser = Parser::new_ext(input, options); let mut html = String::new(); push_html(&mut html, parser); let mut allowed_attributes = HashSet::new(); allowed_attributes.insert("id"); allowed_attributes.insert("class"); allowed_attributes.insert("ref"); allowed_attributes.insert("aria-label"); allowed_attributes.insert("lang"); allowed_attributes.insert("title"); allowed_attributes.insert("align"); allowed_attributes.insert("src"); let output = 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) .to_string() .replace("