1pub fn escape_html_attribute(text: &str) -> String {
11 let mut output = String::with_capacity(text.len() * 2);
12 for c in text.chars() {
13 match c {
14 'a'..='z' | 'A'..='Z' | '0'..='9' => output.push(c),
15 _ => output.push_str(&format!("&#x{:x};", c as u32)),
16 }
17 }
18 output
19}
20
21pub fn escape_html(text: &str) -> String {
25 let mut output = String::with_capacity(text.len() * 2);
26 for c in text.chars() {
27 match c {
28 '&' => output.push_str("&"),
29 '<' => output.push_str("<"),
30 '>' => output.push_str(">"),
31 '"' => output.push_str("""),
32 '\'' => output.push_str("'"),
33 _ => output.push(c),
34 }
35 }
36 output
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn test_escape_html_attribute() {
45 assert_eq!(
46 "ABZabz0123456789",
47 escape_html_attribute("ABZabz0123456789")
48 );
49 assert_eq!("Käse", escape_html_attribute("Käse"));
50 assert_eq!(
51 "<script>alert(1)</script>",
52 escape_html_attribute("<script>alert(1)</script>")
53 );
54 assert_eq!(
55 "test">foo<span bar="",
56 escape_html_attribute("test\">foo<span bar=\"")
57 );
58 assert_eq!(
59 "I've got a quote!",
60 escape_html_attribute("I've got a quote!")
61 );
62 }
63}