1#[must_use]
8pub fn escape_js_string(s: &str) -> String {
9 let mut out = String::with_capacity(s.len());
10 for ch in s.chars() {
11 match ch {
12 '\\' => out.push_str("\\\\"),
13 '\'' => out.push_str("\\'"),
14 '"' => out.push_str("\\\""),
15 '`' => out.push_str("\\`"),
16 '\n' => out.push_str("\\n"),
17 '\r' => out.push_str("\\r"),
18 '\t' => out.push_str("\\t"),
19 _ => out.push(ch),
20 }
21 }
22 out
23}
24
25#[cfg(test)]
26mod tests {
27 use super::*;
28
29 #[test]
30 fn escape_js_string_simple() {
31 assert_eq!(escape_js_string("hello"), "hello");
32 }
33
34 #[test]
35 fn escape_js_string_quotes() {
36 assert_eq!(escape_js_string("it's"), "it\\'s");
37 }
38
39 #[test]
40 fn escape_js_string_backslash() {
41 assert_eq!(escape_js_string("a\\b"), "a\\\\b");
42 }
43
44 #[test]
45 fn escape_js_string_newlines() {
46 assert_eq!(escape_js_string("a\nb\r"), "a\\nb\\r");
47 }
48
49 #[test]
50 fn escape_js_string_backtick() {
51 assert_eq!(escape_js_string("a`b"), "a\\`b");
52 }
53
54 #[test]
55 fn escape_js_string_double_quote() {
56 assert_eq!(escape_js_string(r#"a"b"#), r#"a\"b"#);
57 }
58
59 #[test]
60 fn escape_js_string_tab() {
61 assert_eq!(escape_js_string("a\tb"), "a\\tb");
62 }
63
64 #[test]
65 fn escape_js_string_empty() {
66 assert_eq!(escape_js_string(""), "");
67 }
68
69 #[test]
70 fn escape_js_string_mixed() {
71 assert_eq!(
72 escape_js_string("it's a\n\"test\""),
73 "it\\'s a\\n\\\"test\\\""
74 );
75 }
76}