@@ -10,6 +10,7 @@ pub type StyleValue = Vec<StyleValueType>;
1010
1111pub struct StyleData < ' i > {
1212 pub style_record : Rc < RefCell < HashMap < SpanKey , Vec < ( String , Property < ' i > ) > > > > ,
13+ pub pesudo_style_record : Rc < RefCell < HashMap < SpanKey , Vec < ( String , Vec < ( String , Property < ' i > ) > ) > > > > ,
1314 pub all_style : Rc < RefCell < HashMap < String , StyleValue > > > ,
1415}
1516
@@ -42,7 +43,7 @@ impl<'i> Visitor<'i> for StyleVisitor<'i> {
4243 match rule {
4344 CssRule :: Style ( style) => {
4445 let selectors_str = style. selectors . to_string ( ) ;
45- let selectors = selectors_str. split ( "," ) . collect :: < Vec < & str > > ( ) ;
46+ let selectors: Vec < & str > = selectors_str. split ( "," ) . collect :: < Vec < & str > > ( ) ;
4647 for index in 0 ..selectors. len ( ) {
4748 let selector = selectors[ index] . trim ( ) . replace ( "." , "" ) ;
4849 let mut all_style = self . all_style . borrow_mut ( ) ;
@@ -92,11 +93,11 @@ impl<'i> StyleParser<'i> {
9293 // 遍历 style_record,计算每个节点的最终样式
9394 let mut all_style = self . all_style . borrow_mut ( ) ;
9495 let mut style_record = HashMap :: new ( ) ;
96+ let mut pesudo_style_record = HashMap :: new ( ) ;
9597 let mut final_all_style = self . calc_style_record ( & mut all_style) ;
9698
9799 // final_all_style 转换为驼峰命名
98100 let mut final_all_style = final_all_style. iter_mut ( ) . map ( |( selector, style_value) | {
99- // calc_style_record 已经处理掉了所有important_declarations,所以这里不需要再处理
100101 let properties = style_value. declaration . declarations . iter ( ) . map ( |property| {
101102 (
102103 to_camel_case (
@@ -115,13 +116,48 @@ impl<'i> StyleParser<'i> {
115116 } )
116117 . collect :: < Vec < ( _ , _ ) > > ( ) ;
117118
119+ let mut pesudo_selector = None ;
118120 for ( selector, style_value) in final_all_style. iter_mut ( ) {
121+ // 判断是否伪类
122+
123+ if selector. contains ( ":" ) {
124+ let selectors = selector. split ( ":" ) . collect :: < Vec < & str > > ( ) ;
125+ let new_selector = selectors[ 0 ] . to_string ( ) ;
126+ pesudo_selector = selectors[ 1 ] . parse :: < String > ( ) . ok ( ) ;
127+ * selector = new_selector;
128+ }
129+
119130 let elements = self . document . select ( selector) ;
120131 for element in elements {
121- let declarations = style_record. entry ( element. span ) . or_insert ( vec ! [ ] ) ;
122- declarations. push ( style_value. clone ( ) ) ;
132+ match pesudo_selector {
133+ Some ( ref selector) => {
134+ let declarations= pesudo_style_record. entry ( element. span ) . or_insert ( vec ! [ ] ) ;
135+ declarations. push ( ( selector. clone ( ) , style_value. clone ( ) ) ) ;
136+ }
137+ None => {
138+ let declarations: & mut Vec < Vec < ( String , Property < ' _ > ) > > = style_record. entry ( element. span ) . or_insert ( vec ! [ ] ) ;
139+ declarations. push ( style_value. clone ( ) ) ;
140+ }
141+ }
123142 }
124- }
143+ }
144+
145+ // 进行样式解析优化,提前解析 ArkUI 的样式,减少运行时的计算
146+ let final_all_style = final_all_style
147+ . iter_mut ( )
148+ . map ( |( selector, properties) | {
149+ (
150+ selector. to_owned ( ) ,
151+ parse_style_properties (
152+ & properties
153+ . iter ( )
154+ . map ( |( k, v) | ( k. to_owned ( ) , v. clone ( ) ) )
155+ . collect :: < Vec < _ > > ( ) ,
156+ ) ,
157+ )
158+ } )
159+ . collect :: < HashMap < _ , _ > > ( ) ;
160+
125161
126162 let final_style_record = style_record
127163 . iter_mut ( )
@@ -147,24 +183,12 @@ impl<'i> StyleParser<'i> {
147183 } )
148184 . collect :: < HashMap < _ , _ > > ( ) ;
149185
150- // 进行样式解析优化,提前解析 ArkUI 的样式,减少运行时的计算
151- let final_all_style = final_all_style
152- . iter_mut ( )
153- . map ( |( selector, properties) | {
154- (
155- selector. to_owned ( ) ,
156- parse_style_properties (
157- & properties
158- . iter ( )
159- . map ( |( k, v) | ( k. to_owned ( ) , v. clone ( ) ) )
160- . collect :: < Vec < _ > > ( ) ,
161- ) ,
162- )
163- } )
164- . collect :: < HashMap < _ , _ > > ( ) ;
186+ let final_pesudo_style_record = pesudo_style_record;
187+
165188
166189 StyleData {
167190 style_record : Rc :: new ( RefCell :: new ( final_style_record) ) ,
191+ pesudo_style_record : Rc :: new ( RefCell :: new ( final_pesudo_style_record) ) ,
168192 all_style : Rc :: new ( RefCell :: new ( final_all_style) ) ,
169193 }
170194 }
0 commit comments