@@ -43,30 +43,34 @@ pub fn optimize_value(value: &str) -> String {
4343 ret = s;
4444 }
4545 }
46- let replaced = F_RGBA_RE . replace_all ( & ret, |c : & regex_lite:: Captures | {
47- let r = c[ 1 ] . parse :: < i32 > ( ) . unwrap ( ) ;
48- let g = c[ 2 ] . parse :: < i32 > ( ) . unwrap ( ) ;
49- let b = c[ 3 ] . parse :: < i32 > ( ) . unwrap ( ) ;
50- let a = c[ 4 ] . parse :: < f32 > ( ) . unwrap ( ) ;
51- format ! (
52- "#{:02X}{:02X}{:02X}{:02X}" ,
53- r,
54- g,
55- b,
56- ( a * 255.0 ) . round( ) as i32
57- )
58- } ) ;
59- if let std:: borrow:: Cow :: Owned ( s) = replaced {
60- ret = s;
46+ if ret. contains ( "rgba(" ) {
47+ let replaced = F_RGBA_RE . replace_all ( & ret, |c : & regex_lite:: Captures | {
48+ let r = c[ 1 ] . parse :: < i32 > ( ) . unwrap ( ) ;
49+ let g = c[ 2 ] . parse :: < i32 > ( ) . unwrap ( ) ;
50+ let b = c[ 3 ] . parse :: < i32 > ( ) . unwrap ( ) ;
51+ let a = c[ 4 ] . parse :: < f32 > ( ) . unwrap ( ) ;
52+ format ! (
53+ "#{:02X}{:02X}{:02X}{:02X}" ,
54+ r,
55+ g,
56+ b,
57+ ( a * 255.0 ) . round( ) as i32
58+ )
59+ } ) ;
60+ if let std:: borrow:: Cow :: Owned ( s) = replaced {
61+ ret = s;
62+ }
6163 }
62- let replaced = F_RGB_RE . replace_all ( & ret, |c : & regex_lite:: Captures | {
63- let r = c[ 1 ] . parse :: < i32 > ( ) . unwrap ( ) ;
64- let g = c[ 2 ] . parse :: < i32 > ( ) . unwrap ( ) ;
65- let b = c[ 3 ] . parse :: < i32 > ( ) . unwrap ( ) ;
66- format ! ( "#{r:02X}{g:02X}{b:02X}" )
67- } ) ;
68- if let std:: borrow:: Cow :: Owned ( s) = replaced {
69- ret = s;
64+ if ret. contains ( "rgb(" ) {
65+ let replaced = F_RGB_RE . replace_all ( & ret, |c : & regex_lite:: Captures | {
66+ let r = c[ 1 ] . parse :: < i32 > ( ) . unwrap ( ) ;
67+ let g = c[ 2 ] . parse :: < i32 > ( ) . unwrap ( ) ;
68+ let b = c[ 3 ] . parse :: < i32 > ( ) . unwrap ( ) ;
69+ format ! ( "#{r:02X}{g:02X}{b:02X}" )
70+ } ) ;
71+ if let std:: borrow:: Cow :: Owned ( s) = replaced {
72+ ret = s;
73+ }
7074 }
7175 if ret. contains ( '#' ) {
7276 let replaced =
@@ -91,32 +95,33 @@ pub fn optimize_value(value: &str) -> String {
9195
9296 let mut lower = ret. to_lowercase ( ) ;
9397 for f in ZERO_PERCENT_FUNCTION . iter ( ) {
94- if lower. contains ( f) {
95- let index = lower . find ( f ) . unwrap ( ) + f. len ( ) ;
98+ if let Some ( start ) = lower. find ( f) {
99+ let index = start + f. len ( ) ;
96100 let mut zero_idx = Vec :: with_capacity ( 4 ) ;
97- let mut depth = 0 ;
98- let chars: Vec < char > = lower. chars ( ) . collect ( ) ;
99- let byte_indices: Vec < usize > = lower. char_indices ( ) . map ( |( i, _) | i) . collect ( ) ;
101+ let mut depth: i32 = 0 ;
102+ let bytes = lower. as_bytes ( ) ;
100103
101- for ( char_idx , & ch ) in chars . iter ( ) . enumerate ( ) . skip ( index ) {
102- if ch == '(' {
103- depth += 1 ;
104- } else if ch == ')' {
105- depth -= 1 ;
106- } else if ch == '0'
107- && ( char_idx == 0 || !chars [ char_idx - 1 ] . is_ascii_digit ( ) )
108- && ( char_idx + 1 >= chars . len ( ) || !chars [ char_idx + 1 ] . is_ascii_digit ( ) )
109- && depth == 0
110- {
111- zero_idx . push ( byte_indices [ char_idx ] ) ;
104+ for i in index..bytes . len ( ) {
105+ match bytes [ i ] {
106+ b'(' => depth += 1 ,
107+ b ')' => depth -= 1 ,
108+ b'0' if depth == 0
109+ && ( i == 0 || !bytes [ i - 1 ] . is_ascii_digit ( ) )
110+ && ( i + 1 >= bytes . len ( ) || !bytes [ i + 1 ] . is_ascii_digit ( ) ) =>
111+ {
112+ zero_idx . push ( i ) ;
113+ }
114+ _ => { }
112115 }
113116 }
114117 // In-place replacement: replace each '0' with '0%' from back to front
115118 for i in zero_idx. iter ( ) . rev ( ) {
116119 ret. replace_range ( * i..* i + 1 , "0%" ) ;
117120 }
118- // Refresh lowercase after modification for subsequent iterations
119- lower = ret. to_lowercase ( ) ;
121+ if !zero_idx. is_empty ( ) {
122+ // Refresh lowercase only when modification occurred
123+ lower = ret. to_lowercase ( ) ;
124+ }
120125 }
121126 }
122127 }
0 commit comments