1 | use core::str::from_utf8_unchecked; |
2 | |
3 | use alloc::borrow::Cow; |
4 | use alloc::string::String; |
5 | use alloc::vec::Vec; |
6 | |
7 | #[cfg (feature = "std" )] |
8 | use std::io::{self, Write}; |
9 | |
10 | macro_rules! parse_script { |
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 | _ => (), |
18 | } |
19 | } |
20 | 1 => { |
21 | match $e { |
22 | b' \\' => $step = 2, |
23 | _ => (), |
24 | } |
25 | } |
26 | 2 => { |
27 | match $e { |
28 | b'/' => $step = 3, |
29 | b'!' => $step = 10, |
30 | $($(| $addi)+ => { |
31 | $step = 0; |
32 | $bq |
33 | },)? |
34 | _ => $step = 0, |
35 | } |
36 | } |
37 | 3 => { |
38 | match $e { |
39 | b's' | b'S' => $step = 4, |
40 | b' \\' => $step = 100, |
41 | _ => $step = 0, |
42 | } |
43 | } |
44 | 4 => { |
45 | match $e { |
46 | b'c' | b'C' => $step = 5, |
47 | b' \\' => $step = 100, |
48 | _ => $step = 0, |
49 | } |
50 | } |
51 | 5 => { |
52 | match $e { |
53 | b'r' | b'R' => $step = 6, |
54 | b' \\' => $step = 100, |
55 | _ => $step = 0, |
56 | } |
57 | } |
58 | 6 => { |
59 | match $e { |
60 | b'i' | b'I' => $step = 7, |
61 | b' \\' => $step = 100, |
62 | _ => $step = 0, |
63 | } |
64 | } |
65 | 7 => { |
66 | match $e { |
67 | b'p' | b'P' => $step = 8, |
68 | b' \\' => $step = 100, |
69 | _ => $step = 0, |
70 | } |
71 | } |
72 | 8 => { |
73 | match $e { |
74 | b't' | b'T' => $step = 9, |
75 | b' \\' => $step = 100, |
76 | _ => $step = 0, |
77 | } |
78 | } |
79 | 9 => { |
80 | match $e { |
81 | b'>' | 9..=13 | 28..=32 => { |
82 | $step = 0; |
83 | $b |
84 | }, |
85 | b' \\' => $step = 100, |
86 | _ => $step = 0, |
87 | } |
88 | } |
89 | 10 => { |
90 | match $e { |
91 | b'-' => $step = 11, |
92 | b' \\' => $step = 100, |
93 | _ => $step = 0, |
94 | } |
95 | } |
96 | 11 => { |
97 | match $e { |
98 | b'-' => { |
99 | $step = 0; |
100 | $bc |
101 | }, |
102 | b' \\' => $step = 100, |
103 | _ => $step = 0, |
104 | } |
105 | } |
106 | 100 => { |
107 | match $e { |
108 | b'<' => $step = 1, |
109 | $($(| $addi)+ => { |
110 | $step = 0; |
111 | $bq |
112 | },)? |
113 | _ => $step = 0, |
114 | } |
115 | } |
116 | _ => unreachable!(), |
117 | } |
118 | }; |
119 | } |
120 | |
121 | macro_rules! parse_script_single_quoted_text { |
122 | ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => { |
123 | parse_script!($e, $step, $b, $bq, $bc, b' \'' ); |
124 | }; |
125 | } |
126 | |
127 | macro_rules! parse_script_double_quoted_text { |
128 | ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => { |
129 | parse_script!($e, $step, $b, $bq, $bc, b'"' ); |
130 | }; |
131 | } |
132 | |
133 | macro_rules! parse_script_quoted_text { |
134 | ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => { |
135 | parse_script!($e, $step, $b, $bq, $bc, b' \'' , b'"' ); |
136 | }; |
137 | } |
138 | |
139 | decode_impl! { |
140 | 7; |
141 | /// The following substring is unescaped: |
142 | /// |
143 | /// * `<\/script>` => `</script>` |
144 | parse_script; |
145 | /// Decode text from the `<script>` element. |
146 | decode_script; |
147 | /// Write text from the `<script>` element to a mutable `String` reference and return the encoded string slice. |
148 | decode_script_to_string; |
149 | /// Write text from the `<script>` element to a mutable `Vec<u8>` reference and return the encoded data slice. |
150 | decode_script_to_vec; |
151 | /// Write text from the `<script>` element to a writer. |
152 | decode_script_to_writer; |
153 | } |
154 | |
155 | decode_impl! { |
156 | 7; |
157 | /// The following substring and character is unescaped: |
158 | /// |
159 | /// * `<\/script>` => `</script>` |
160 | /// * `\'` => `'` |
161 | parse_script_single_quoted_text; |
162 | /// Decode text from a single quoted text in the `<script>` element. |
163 | decode_script_single_quoted_text; |
164 | /// Write text from a single quoted text in the `<script>` element to a mutable `String` reference and return the encoded string slice. |
165 | decode_script_single_quoted_text_to_string; |
166 | /// Write text from a single quoted text in the `<script>` element to a mutable `Vec<u8>` reference and return the encoded data slice. |
167 | decode_script_single_quoted_text_to_vec; |
168 | /// Write text from a single quoted text in the `<script>` element to a writer. |
169 | decode_script_single_quoted_text_to_writer; |
170 | } |
171 | |
172 | decode_impl! { |
173 | 7; |
174 | /// The following substring and character are unescaped: |
175 | /// |
176 | /// * `<\/script>` => `</script>` |
177 | /// * `\"` => `"` |
178 | parse_script_double_quoted_text; |
179 | /// Decode text from a double quoted text in the `<script>` element. |
180 | decode_script_double_quoted_text; |
181 | /// Write text from a double quoted text in the `<script>` element to a mutable `String` reference and return the encoded string slice. |
182 | decode_script_double_quoted_text_to_string; |
183 | /// Write text from a double quoted text in the `<script>` element to a mutable `Vec<u8>` reference and return the encoded data slice. |
184 | decode_script_double_quoted_text_to_vec; |
185 | /// Write text from a double quoted text in the `<script>` element to a writer. |
186 | decode_script_double_quoted_text_to_writer; |
187 | } |
188 | |
189 | decode_impl! { |
190 | 7; |
191 | /// The following substring and characters are unescaped: |
192 | /// |
193 | /// * `<\/script>` => `</script>` |
194 | /// * `\"` => `"` |
195 | /// * `\'` => `'` |
196 | parse_script_quoted_text; |
197 | /// Decode text from a quoted text in the `<script>` element. |
198 | decode_script_quoted_text; |
199 | /// Write text from a quoted text in the `<script>` element to a mutable `String` reference and return the encoded string slice. |
200 | decode_script_quoted_text_to_string; |
201 | /// Write text from a quoted text in the `<script>` element to a mutable `Vec<u8>` reference and return the encoded data slice. |
202 | decode_script_quoted_text_to_vec; |
203 | /// Write text from a quoted text in the `<script>` element to a writer. |
204 | decode_script_quoted_text_to_writer; |
205 | } |
206 | |