@@ -17,19 +17,31 @@ pub(crate) struct CssPath {
17
17
}
18
18
19
19
/// When encountering a `"` or a `'`, returns the whole string, including the quote characters.
20
- fn get_string ( iter : & mut Peekable < Chars < ' _ > > , string_start : char ) -> String {
21
- let mut s = String :: with_capacity ( 2 ) ;
22
-
23
- s. push ( string_start) ;
20
+ fn get_string ( iter : & mut Peekable < Chars < ' _ > > , string_start : char , buffer : & mut String ) {
21
+ buffer. push ( string_start) ;
24
22
while let Some ( c) = iter. next ( ) {
25
- s . push ( c) ;
23
+ buffer . push ( c) ;
26
24
if c == '\\' {
27
25
iter. next ( ) ;
28
26
} else if c == string_start {
29
27
break ;
30
28
}
31
29
}
32
- s
30
+ }
31
+
32
+ fn get_inside_paren (
33
+ iter : & mut Peekable < Chars < ' _ > > ,
34
+ paren_start : char ,
35
+ paren_end : char ,
36
+ buffer : & mut String ,
37
+ ) {
38
+ buffer. push ( paren_start) ;
39
+ while let Some ( c) = iter. next ( ) {
40
+ handle_common_chars ( c, buffer, iter) ;
41
+ if c == paren_end {
42
+ break ;
43
+ }
44
+ }
33
45
}
34
46
35
47
/// Skips a `/*` comment.
@@ -52,9 +64,11 @@ fn skip_line_comment(iter: &mut Peekable<Chars<'_>>) {
52
64
53
65
fn handle_common_chars ( c : char , buffer : & mut String , iter : & mut Peekable < Chars < ' _ > > ) {
54
66
match c {
55
- '"' | '\'' => buffer . push_str ( & get_string ( iter, c) ) ,
67
+ '"' | '\'' => get_string ( iter, c, buffer ) ,
56
68
'/' if iter. peek ( ) == Some ( & '*' ) => skip_comment ( iter) ,
57
69
'/' if iter. peek ( ) == Some ( & '/' ) => skip_line_comment ( iter) ,
70
+ '(' => get_inside_paren ( iter, c, ')' , buffer) ,
71
+ '[' => get_inside_paren ( iter, c, ']' , buffer) ,
58
72
_ => buffer. push ( c) ,
59
73
}
60
74
}
0 commit comments