pub fn escape_html_attribute(text: &str) -> String {
let mut output = String::with_capacity(text.len() * 2);
for c in text.chars() {
match c {
'a'..='z' | 'A'..='Z' | '0'..='9' => output.push(c),
_ => output.push_str(&format!("&#x{:x};", c as u32)),
}
}
output
}
pub fn escape_html(text: &str) -> String {
let mut output = String::with_capacity(text.len() * 2);
for c in text.chars() {
match c {
'&' => output.push_str("&"),
'<' => output.push_str("<"),
'>' => output.push_str(">"),
'"' => output.push_str("""),
'\'' => output.push_str("'"),
_ => output.push(c),
}
}
output
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_escape_html_attribute() {
assert_eq!(
"ABZabz0123456789",
escape_html_attribute("ABZabz0123456789")
);
assert_eq!("Käse", escape_html_attribute("Käse"));
assert_eq!(
"<script>alert(1)</script>",
escape_html_attribute("<script>alert(1)</script>")
);
assert_eq!(
"test">foo<span bar="",
escape_html_attribute("test\">foo<span bar=\"")
);
assert_eq!(
"I've got a quote!",
escape_html_attribute("I've got a quote!")
);
}
}