html_escape/encode/element/
script.rs

1use core::str::from_utf8_unchecked;
2
3use alloc::borrow::Cow;
4use alloc::string::String;
5use alloc::vec::Vec;
6
7#[cfg(feature = "std")]
8use std::io::{self, Write};
9
10macro_rules! parse_script_comment {
11    ($e:expr, $step:ident, $b:block, $bq:block, $bc:block $(, $($addi:expr),+)?) => {
12        match $step {
13            0 => {
14                match $e {
15                    b'<' => $step = 1,
16                    $(b'\\' => $step = 100,
17                    $(| $addi)+ => $bq,)?
18                    _ => (),
19                }
20            }
21            1 => {
22                match $e {
23                    b'/' => $step = 2,
24                    b'!' => $step = 10,
25                    $(b'\\' => $step = 100,
26                    $(| $addi)+ => {
27                        $step = 0;
28                        $bq
29                    },)?
30                    _ => $step = 0,
31                }
32            }
33            2 => {
34                match $e {
35                    b's' | b'S' => $step = 3,
36                    $(b'\\' => $step = 100,
37                    $(| $addi)+ => {
38                        $step = 0;
39                        $bq
40                    },)?
41                    _ => $step = 0,
42                }
43            }
44            3 => {
45                match $e {
46                    b'c' | b'C' => $step = 4,
47                    $(b'\\' => $step = 100,
48                    $(| $addi)+ => {
49                        $step = 0;
50                        $bq
51                    },)?
52                    _ => $step = 0,
53                }
54            }
55            4 => {
56                match $e {
57                    b'r' | b'R' => $step = 5,
58                    $(b'\\' => $step = 100,
59                    $(| $addi)+ => {
60                        $step = 0;
61                        $bq
62                    },)?
63                    _ => $step = 0,
64                }
65            }
66            5 => {
67                match $e {
68                    b'i' | b'I' => $step = 6,
69                    $(b'\\' => $step = 100,
70                    $(| $addi)+ => {
71                        $step = 0;
72                        $bq
73                    },)?
74                    _ => $step = 0,
75                }
76            }
77            6 => {
78                match $e {
79                    b'p' | b'P' => $step = 7,
80                    $(b'\\' => $step = 100,
81                    $(| $addi)+ => {
82                        $step = 0;
83                        $bq
84                    },)?
85                    _ => $step = 0,
86                }
87            }
88            7 => {
89                match $e {
90                    b't' | b'T' => $step = 8,
91                    $(b'\\' => $step = 100,
92                    $(| $addi)+ => {
93                        $step = 0;
94                        $bq
95                    },)?
96                    _ => $step = 0,
97                }
98            }
99            8 => {
100                match $e {
101                    b'>' | 9..=13 | 28..=32 => {
102                        $step = 0;
103                        $b
104                    },
105                    $(b'\\' => $step = 100,
106                    $(| $addi)+ => {
107                        $step = 0;
108                        $bq
109                    },)?
110                    _ => $step = 0,
111                }
112            }
113            10 => {
114                match $e {
115                    b'-' => $step = 11,
116                    $(b'\\' => $step = 100,
117                    $(| $addi)+ => {
118                        $step = 0;
119                        $bq
120                    },)?
121                    _ => $step = 0,
122                }
123            }
124            11 => {
125                match $e {
126                    b'-' => {
127                        $step = 0;
128                        $bc
129                    },
130                    $(b'\\' => $step = 100,
131                    $(| $addi)+ => {
132                        $step = 0;
133                        $bq
134                    },)?
135                    _ => $step = 0,
136                }
137            }
138            100 => {
139                match $e {
140                    b'<' => $step = 1,
141                    _ => $step = 0,
142                }
143            }
144            _ => unreachable!(),
145        }
146    };
147}
148
149macro_rules! parse_script_comment_single_quoted_text {
150    ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => {
151        parse_script_comment!($e, $step, $b, $bq, $bc, b'\'');
152    };
153}
154
155macro_rules! parse_script_comment_double_quoted_text {
156    ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => {
157        parse_script_comment!($e, $step, $b, $bq, $bc, b'"');
158    };
159}
160
161macro_rules! parse_script_comment_quoted_text {
162    ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => {
163        parse_script_comment!($e, $step, $b, $bq, $bc, b'\'', b'"');
164    };
165}
166
167encode_impl! {
168    7;
169    /// The following substring is escaped:
170    ///
171    /// * `</script>` => `<\/script>`
172    /// * `<!--` => `<\!--`
173    parse_script_comment;
174    /// Encode text used in the `<script>` element.
175    encode_script;
176    /// Write text used in the `<script>` element to a mutable `String` reference and return the encoded string slice.
177    encode_script_to_string;
178    /// Write text used in the `<script>` element to a mutable `Vec<u8>` reference and return the encoded data slice.
179    encode_script_to_vec;
180    /// Write text used in the `<script>` element to a writer.
181    encode_script_to_writer;
182}
183
184encode_impl! {
185    7;
186    /// The following substring and character are escaped:
187    ///
188    /// * `</script>` => `<\/script>`
189    /// * `'` => `\'`
190    /// * `<!--` => `<\!--`
191    parse_script_comment_single_quoted_text;
192    /// Encode text used in a single quoted text in the `<script>` element.
193    encode_script_single_quoted_text;
194    /// Write text used in a single quoted text in the `<script>` element to a mutable `String` reference and return the encoded string slice.
195    encode_script_single_quoted_text_to_string;
196    /// Write text used in a single quoted text in the `<script>` element to a mutable `Vec<u8>` reference and return the encoded data slice.
197    encode_script_single_quoted_text_to_vec;
198    /// Write text used in a single quoted text in the `<script>` element to a writer.
199    encode_script_single_quoted_text_to_writer;
200}
201
202encode_impl! {
203    7;
204    /// The following substring and character are escaped:
205    ///
206    /// * `</script>` => `<\/script>`
207    /// * `"` => `\"`
208    /// * `<!--` => `<\!--`
209    parse_script_comment_double_quoted_text;
210    /// Encode text used in a double quoted text in the `<script>` element.
211    encode_script_double_quoted_text;
212    /// Write text used in a double quoted text in the `<script>` element to a mutable `String` reference and return the encoded string slice.
213    encode_script_double_quoted_text_to_string;
214    /// Write text used in a double quoted text in the `<script>` element to a mutable `Vec<u8>` reference and return the encoded data slice.
215    encode_script_double_quoted_text_to_vec;
216    /// Write text used in a double quoted text in the `<script>` element to a writer.
217    encode_script_double_quoted_text_to_writer;
218}
219
220encode_impl! {
221    7;
222    /// The following substring and characters are escaped:
223    ///
224    /// * `</script>` => `<\/script>`
225    /// * `"` => `\"`
226    /// * `'` => `\'`
227    /// * `<!--` => `<\!--`
228    parse_script_comment_quoted_text;
229    /// Encode text used in a quoted text in the `<script>` element.
230    encode_script_quoted_text;
231    /// Write text used in a quoted text in the `<script>` element to a mutable `String` reference and return the encoded string slice.
232    encode_script_quoted_text_to_string;
233    /// Write text used in a quoted text in the `<script>` element to a mutable `Vec<u8>` reference and return the encoded data slice.
234    encode_script_quoted_text_to_vec;
235    /// Write text used in a quoted text in the `<script>` element to a writer.
236    encode_script_quoted_text_to_writer;
237}