47 lines
1.6 KiB
Rust
47 lines
1.6 KiB
Rust
use ammonia::Builder;
|
|
use comrak::{Options, markdown_to_html};
|
|
use std::collections::HashSet;
|
|
|
|
/// Render markdown input into HTML
|
|
pub fn render_markdown(input: &str) -> String {
|
|
let mut options = Options::default();
|
|
|
|
options.extension.table = true;
|
|
options.extension.superscript = true;
|
|
options.extension.strikethrough = true;
|
|
options.extension.autolink = true;
|
|
options.extension.header_ids = Option::Some(String::new());
|
|
// options.extension.tagfilter = true;
|
|
options.render.unsafe_ = true;
|
|
// options.render.escape = true;
|
|
options.parse.smart = false;
|
|
|
|
let html = markdown_to_html(input, &options);
|
|
|
|
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");
|
|
|
|
allowed_attributes.insert("data-color");
|
|
allowed_attributes.insert("data-font-family");
|
|
|
|
Builder::default()
|
|
.generic_attributes(allowed_attributes)
|
|
.add_tags(&[
|
|
"video", "source", "img", "b", "span", "p", "i", "strong", "em",
|
|
])
|
|
.rm_tags(&["script", "style", "link", "canvas"])
|
|
.clean(&html)
|
|
.to_string()
|
|
.replace("src=\"", "loading=\"lazy\" src=\"/api/v1/util/proxy?url=")
|
|
.replace("<video loading=", "<video controls loading=")
|
|
.replace("-->", "<align class=\"right\">")
|
|
.replace("->", "<align class=\"center\">")
|
|
.replace("<-", "</align>")
|
|
}
|