Skip to main content

hpx_browser/
utils.rs

1//! Shared utility functions for the browser crate.
2
3/// Escape a string for safe interpolation into a JS single-quoted literal.
4///
5/// Handles `\`, `'`, `` ` ``, `\n`, `\r`, and `\t` — the characters that
6/// would break a single-quoted JS string or template literal.
7#[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}