html_escape/encode/element/
style.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_style_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't' | b'T' => $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'y' | b'Y' => $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'l' | b'L' => $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'e' | b'E' => $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'>' | 9..=13 | 28..=32 => {
91                        $step = 0;
92                        $b
93                    },
94                    $(b'\\' => $step = 100,
95                    $(| $addi)+ => {
96                        $step = 0;
97                        $bq
98                    },)?
99                    _ => $step = 0,
100                }
101            }
102            10 => {
103                match $e {
104                    b'-' => $step = 11,
105                    $(b'\\' => $step = 100,
106                    $(| $addi)+ => {
107                        $step = 0;
108                        $bq
109                    },)?
110                    _ => $step = 0,
111                }
112            }
113            11 => {
114                match $e {
115                    b'-' => {
116                        $step = 0;
117                        $bc
118                    },
119                    $(b'\\' => $step = 100,
120                    $(| $addi)+ => {
121                        $step = 0;
122                        $bq
123                    },)?
124                    _ => $step = 0,
125                }
126            }
127            100 => {
128                match $e {
129                    b'<' => $step = 1,
130                    _ => $step = 0,
131                }
132            }
133            _ => unreachable!(),
134        }
135    };
136}
137
138macro_rules! parse_style_comment_single_quoted_text {
139    ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => {
140        parse_style_comment!($e, $step, $b, $bq, $bc, b'\'');
141    };
142}
143
144macro_rules! parse_style_comment_double_quoted_text {
145    ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => {
146        parse_style_comment!($e, $step, $b, $bq, $bc, b'"');
147    };
148}
149
150macro_rules! parse_style_comment_quoted_text {
151    ($e:expr, $step:ident, $b:block, $bq:block, $bc:block) => {
152        parse_style_comment!($e, $step, $b, $bq, $bc, b'\'', b'"');
153    };
154}
155
156encode_impl! {
157    6;
158    /// The following substring is escaped:
159    ///
160    /// * `</style>` => `<\/style>`
161    /// * `<!--` => `<\!--`
162    parse_style_comment;
163    /// Encode text used in the `<style>` element.
164    encode_style;
165    /// Write text used in the `<style>` element to a mutable `String` reference and return the encoded string slice.
166    encode_style_to_string;
167    /// Write text used in the `<style>` element to a mutable `Vec<u8>` reference and return the encoded data slice.
168    encode_style_to_vec;
169    /// Write text used in the `<style>` element to a writer.
170    encode_style_to_writer;
171}
172
173encode_impl! {
174    6;
175    /// The following substring and character are escaped:
176    ///
177    /// * `</style>` => `<\/style>`
178    /// * `'` => `\'`
179    /// * `<!--` => `<\!--`
180    parse_style_comment_single_quoted_text;
181    /// Encode text used in a single quoted text in the `<style>` element.
182    encode_style_single_quoted_text;
183    /// Write text used in a single quoted text in the `<style>` element to a mutable `String` reference and return the encoded string slice.
184    encode_style_single_quoted_text_to_string;
185    /// Write text used in a single quoted text in the `<style>` element to a mutable `Vec<u8>` reference and return the encoded data slice.
186    encode_style_single_quoted_text_to_vec;
187    /// Write text used in a single quoted text in the `<style>` element to a writer.
188    encode_style_single_quoted_text_to_writer;
189}
190
191encode_impl! {
192    6;
193    /// The following substring and character are escaped:
194    ///
195    /// * `</style>` => `<\/style>`
196    /// * `"` => `\"`
197    /// * `<!--` => `<\!--`
198    parse_style_comment_double_quoted_text;
199    /// Encode text used in a double quoted text in the `<style>` element.
200    encode_style_double_quoted_text;
201    /// Write text used in a double quoted text in the `<style>` element to a mutable `String` reference and return the encoded string slice.
202    encode_style_double_quoted_text_to_string;
203    /// Write text used in a double quoted text in the `<style>` element to a mutable `Vec<u8>` reference and return the encoded data slice.
204    encode_style_double_quoted_text_to_vec;
205    /// Write text used in a double quoted text in the `<style>` element to a writer.
206    encode_style_double_quoted_text_to_writer;
207}
208
209encode_impl! {
210    6;
211    /// The following substring and characters are escaped:
212    ///
213    /// * `</style>` => `<\/style>`
214    /// * `"` => `\"`
215    /// * `'` => `\'`
216    /// * `<!--` => `<\!--`
217    parse_style_comment_quoted_text;
218    /// Encode text used in a quoted text in the `<style>` element.
219    encode_style_quoted_text;
220    /// Write text used in a quoted text in the `<style>` element to a mutable `String` reference and return the encoded string slice.
221    encode_style_quoted_text_to_string;
222    /// Write text used in a quoted text in the `<style>` element to a mutable `Vec<u8>` reference and return the encoded data slice.
223    encode_style_quoted_text_to_vec;
224    /// Write text used in a quoted text in the `<style>` element to a writer.
225    encode_style_quoted_text_to_writer;
226}