@@ -7,31 +7,43 @@ def initialize(raw_css)
77 def redundancies ( minimum = nil )
88 rule_sets = CSSPool . CSS ( @raw_css ) . rule_sets
99 matches = { }
10+ parents = { }
1011 rule_sets . each do |rule_set |
1112 rule_set . declarations . each do |dec |
12- dec . property . downcase!
13- dec . expressions do |exp |
14- exp . value . downcase!
15- end
16-
1713 sel = Selector . new ( rule_set . selectors . map ( &:to_s ) )
18-
1914 original_dec = Declaration . from_csspool ( dec )
2015
2116 if parser = shorthand_parser ( dec . property )
22- if new_decs = parser . parse ( dec . expressions )
17+ if new_decs = parser . parse ( dec . property , dec . expressions )
18+ if original_dec . property == "border"
19+ %w( border-top border-right border-bottom border-left ) . each do |property |
20+ border_dec = Declaration . new ( property , original_dec . value )
21+ parents [ border_dec ] ||= [ ]
22+ ( parents [ border_dec ] << original_dec ) . uniq!
23+ border_dec . parents = parents [ border_dec ]
24+
25+ matches [ border_dec ] ||= [ ]
26+ matches [ border_dec ] << sel
27+ matches [ border_dec ] . uniq!
28+ end
29+ end
30+
2331 new_decs . each do |new_dec |
2432 # replace any non-derivatives with derivatives
2533 existing = matches . delete ( new_dec ) || [ ]
2634 existing << sel
27- new_dec . parent = original_dec
35+ parents [ new_dec ] ||= [ ]
36+ ( parents [ new_dec ] << original_dec ) . uniq!
37+ new_dec . parents = parents [ new_dec ]
2838 matches [ new_dec ] = existing
39+ matches [ new_dec ] . uniq!
2940 end
3041 end
3142 end
3243
3344 matches [ original_dec ] ||= [ ]
3445 matches [ original_dec ] << sel
46+ matches [ original_dec ] . uniq!
3547 end
3648 end
3749
@@ -68,13 +80,25 @@ def redundancies(minimum = nil)
6880 # trims any derivative declarations alongside shorthand
6981 final_inverted_matches . each do |selectors , declarations |
7082 redundant_derivatives = declarations . select do |dec |
71- dec . derivative? && declarations . include? ( dec . parent )
83+ dec . derivative? && declarations . detect { | dec2 | dec2 > dec }
7284 end
7385 unless redundant_derivatives . empty?
7486 final_inverted_matches [ selectors ] = declarations - redundant_derivatives
7587 end
88+
89+ # border needs to be reduced even more
90+ %w( width style color ) . each do |property |
91+ decs = final_inverted_matches [ selectors ] . select do |dec |
92+ dec . derivative? && dec . property =~ /border-\w +-#{ property } /
93+ end
94+ if decs . size == 4 && decs . map ( &:value ) . uniq . size == 1
95+ final_inverted_matches [ selectors ] -= decs
96+ final_inverted_matches [ selectors ] << Declaration . new ( "border-#{ property } " , decs . first . value )
97+ end
98+ end
7699 end
77100
101+
78102 # sort hash by number of matches
79103 sorted_array = final_inverted_matches . sort { |( _ , v1 ) , ( _ , v2 ) | v2 . size <=> v1 . size }
80104 { } . tap do |sorted_hash |
@@ -86,10 +110,16 @@ def redundancies(minimum = nil)
86110
87111 def shorthand_parser ( property )
88112 case property
89- when "background" then Parser ::Background
90- when "list-style" then Parser ::ListStyle
91- when "margin" then Parser ::Margin
92- when "padding" then Parser ::Padding
113+ when "background" then Parser ::Background
114+ when "list-style" then Parser ::ListStyle
115+ when "margin" then Parser ::Margin
116+ when "padding" then Parser ::Padding
117+ when "border" then Parser ::Border
118+ when "border-width" then Parser ::BorderWidth
119+ when "border-style" then Parser ::BorderStyle
120+ when "border-color" then Parser ::BorderColor
121+ when "border-top" , "border-right" , "border-bottom" , "border-left"
122+ Parser ::BorderSide
93123 end
94124 end
95125 end
0 commit comments