65 lines
1.4 KiB
Rust
65 lines
1.4 KiB
Rust
use ammonia::Builder;
|
|
use once_cell::sync::Lazy;
|
|
|
|
static BUILDER: Lazy<Builder> = Lazy::new(|| {
|
|
let mut builder = Builder::empty();
|
|
builder.tags(
|
|
[
|
|
"a",
|
|
"span",
|
|
"p",
|
|
"br",
|
|
"b",
|
|
"strong",
|
|
"i",
|
|
"em",
|
|
"s",
|
|
"del",
|
|
"u",
|
|
"code",
|
|
"pre",
|
|
"ul",
|
|
"ol",
|
|
"li",
|
|
"blockquote",
|
|
"img",
|
|
]
|
|
.into_iter()
|
|
.collect(),
|
|
);
|
|
builder.tag_attributes(
|
|
[
|
|
("a", ["href", "data-user"].into_iter().collect()),
|
|
("img", ["src"].into_iter().collect()),
|
|
]
|
|
.into_iter()
|
|
.collect(),
|
|
);
|
|
builder.set_tag_attribute_values(
|
|
// note: rel="noopener noreferrer" is added automatically
|
|
[("a", [("target", "_blank")].into_iter().collect())]
|
|
.into_iter()
|
|
.collect(),
|
|
);
|
|
builder
|
|
});
|
|
|
|
pub fn sanitize_html(html: &str) -> String {
|
|
BUILDER.clean(html).to_string()
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::sanitize_html;
|
|
|
|
#[test]
|
|
fn test_a_attrs() {
|
|
let source = r#"<p>hello <a href="https://example.com">world</a></p>"#;
|
|
let output = sanitize_html(source);
|
|
assert_eq!(
|
|
output,
|
|
r#"<p>hello <a href="https://example.com" target="_blank" rel="noopener noreferrer">world</a></p>"#
|
|
);
|
|
}
|
|
}
|