@@ -200,48 +200,59 @@ pub fn keyframes_to_keyframes_name(keyframes: &str, filename: Option<&str>) -> S
200200 }
201201}
202202
203+ /// ASCII lookup table for selector encoding. `None` means pass through (alphanumeric, `-`, `_`)
204+ /// or fall through to the Unicode escape path.
205+ const SELECTOR_ENCODE : [ Option < & str > ; 128 ] = {
206+ let mut table: [ Option < & str > ; 128 ] = [ None ; 128 ] ;
207+ table[ b'&' as usize ] = Some ( "_a_" ) ;
208+ table[ b':' as usize ] = Some ( "_c_" ) ;
209+ table[ b'(' as usize ] = Some ( "_lp_" ) ;
210+ table[ b')' as usize ] = Some ( "_rp_" ) ;
211+ table[ b'[' as usize ] = Some ( "_lb_" ) ;
212+ table[ b']' as usize ] = Some ( "_rb_" ) ;
213+ table[ b'=' as usize ] = Some ( "_eq_" ) ;
214+ table[ b'>' as usize ] = Some ( "_gt_" ) ;
215+ table[ b'<' as usize ] = Some ( "_lt_" ) ;
216+ table[ b'~' as usize ] = Some ( "_tl_" ) ;
217+ table[ b'+' as usize ] = Some ( "_pl_" ) ;
218+ table[ b' ' as usize ] = Some ( "_s_" ) ;
219+ table[ b'*' as usize ] = Some ( "_st_" ) ;
220+ table[ b'.' as usize ] = Some ( "_d_" ) ;
221+ table[ b'#' as usize ] = Some ( "_h_" ) ;
222+ table[ b',' as usize ] = Some ( "_cm_" ) ;
223+ table[ b'"' as usize ] = Some ( "_dq_" ) ;
224+ table[ b'\'' as usize ] = Some ( "_sq_" ) ;
225+ table[ b'/' as usize ] = Some ( "_sl_" ) ;
226+ table[ b'\\' as usize ] = Some ( "_bs_" ) ;
227+ table[ b'%' as usize ] = Some ( "_pc_" ) ;
228+ table[ b'^' as usize ] = Some ( "_cr_" ) ;
229+ table[ b'$' as usize ] = Some ( "_dl_" ) ;
230+ table[ b'|' as usize ] = Some ( "_pp_" ) ;
231+ table[ b'@' as usize ] = Some ( "_at_" ) ;
232+ table[ b'!' as usize ] = Some ( "_ex_" ) ;
233+ table[ b'?' as usize ] = Some ( "_qm_" ) ;
234+ table[ b';' as usize ] = Some ( "_sc_" ) ;
235+ table[ b'{' as usize ] = Some ( "_lc_" ) ;
236+ table[ b'}' as usize ] = Some ( "_rc_" ) ;
237+ table
238+ } ;
239+
203240fn encode_selector ( selector : & str ) -> String {
204- let mut result = String :: with_capacity ( selector. len ( ) * 2 ) ;
241+ use std:: fmt:: Write ;
242+ let mut result = String :: with_capacity ( selector. len ( ) * 3 ) ;
205243 for c in selector. chars ( ) {
206- match c {
207- '&' => result. push_str ( "_a_" ) ,
208- ':' => result. push_str ( "_c_" ) ,
209- '(' => result. push_str ( "_lp_" ) ,
210- ')' => result. push_str ( "_rp_" ) ,
211- '[' => result. push_str ( "_lb_" ) ,
212- ']' => result. push_str ( "_rb_" ) ,
213- '=' => result. push_str ( "_eq_" ) ,
214- '>' => result. push_str ( "_gt_" ) ,
215- '<' => result. push_str ( "_lt_" ) ,
216- '~' => result. push_str ( "_tl_" ) ,
217- '+' => result. push_str ( "_pl_" ) ,
218- ' ' => result. push_str ( "_s_" ) ,
219- '*' => result. push_str ( "_st_" ) ,
220- '.' => result. push_str ( "_d_" ) ,
221- '#' => result. push_str ( "_h_" ) ,
222- ',' => result. push_str ( "_cm_" ) ,
223- '"' => result. push_str ( "_dq_" ) ,
224- '\'' => result. push_str ( "_sq_" ) ,
225- '/' => result. push_str ( "_sl_" ) ,
226- '\\' => result. push_str ( "_bs_" ) ,
227- '%' => result. push_str ( "_pc_" ) ,
228- '^' => result. push_str ( "_cr_" ) ,
229- '$' => result. push_str ( "_dl_" ) ,
230- '|' => result. push_str ( "_pp_" ) ,
231- '@' => result. push_str ( "_at_" ) ,
232- '!' => result. push_str ( "_ex_" ) ,
233- '?' => result. push_str ( "_qm_" ) ,
234- ';' => result. push_str ( "_sc_" ) ,
235- '{' => result. push_str ( "_lc_" ) ,
236- '}' => result. push_str ( "_rc_" ) ,
237- '-' => result. push ( '-' ) ,
238- '_' => result. push ( '_' ) ,
239- _ if c. is_ascii_alphanumeric ( ) => result. push ( c) ,
240- _ => {
241- result. push_str ( "_u" ) ;
242- result. push_str ( & format ! ( "{:04x}" , c as u32 ) ) ;
243- result. push ( '_' ) ;
244+ if c. is_ascii ( ) {
245+ let byte = c as u8 ;
246+ if let Some ( encoded) = SELECTOR_ENCODE [ byte as usize ] {
247+ result. push_str ( encoded) ;
248+ } else if c. is_ascii_alphanumeric ( ) || c == '-' || c == '_' {
249+ result. push ( c) ;
250+ } else {
251+ // ASCII but not in table and not alphanumeric/-/_
252+ let _ = write ! ( result, "_u{:04x}_" , c as u32 ) ;
244253 }
254+ } else {
255+ let _ = write ! ( result, "_u{:04x}_" , c as u32 ) ;
245256 }
246257 }
247258 result
0 commit comments