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}