class ForemanThemeSatellite::CssCompare
Semantically compares two css files. returns hash: rule => prop => value
Attributes
left[R]
right[R]
Public Class Methods
new(left_filename: nil, left_css: nil, right_filename: nil, right_css: nil)
click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 11 def initialize(left_filename: nil, left_css: nil, right_filename: nil, right_css: nil) @left = left_filename ? Sass::Engine.for_file(left_filename, syntax: :scss) : Sass::Engine.new(left_css, syntax: :scss) @right = right_filename ? Sass::Engine.for_file(right_filename, syntax: :scss) : Sass::Engine.new(right_css, syntax: :scss) end
Public Instance Methods
diff()
click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 16 def diff result_hash = {} right_hash = rules_hash(right) rules_hash(left).each do |rule, props| right_props = right_hash[rule] unless props result_hash[rule] = props next end diffed_props = props_diff(props_hash(props), props_hash(right_props)) result_hash[rule] = diffed_props unless diffed_props.empty? end result_hash end
to_css(diff)
click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 36 def to_css(diff) diff.map do |rule, props| [ "#{rule} {", to_properties_css(props, ' '), '}' ] end.flatten.join("\n") end
Private Instance Methods
props_diff(left, right)
click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 71 def props_diff(left, right) right.reject { |k, v| left[k] == v } end
props_hash(props)
click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 59 def props_hash(props) Hash[ props.reject { |c| c.is_a? Sass::Tree::CommentNode }.map do |prop| raise "property has too many names: #{prop.to_sass}" if prop.name.length > 1 [ prop.name[0], (prop.value[0].is_a? String)? prop.value[0] : prop.value[0].to_sass ] end ] end
rules_hash(engine)
click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 48 def rules_hash(engine) root = engine.to_tree Hash[ root.children.select { |c| c.is_a? Sass::Tree::RuleNode }.map do |c| raise "Rule has too many names: #{c.to_sass}" if c.rule.length > 1 [c.rule[0], c.children] end ] end
to_properties_css(props, indent)
click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 75 def to_properties_css(props, indent) props.map do |prop, val| "#{indent}#{to_property_css(prop, val)}" end.join("\n") end
to_property_css(property, value)
click to toggle source
# File lib/generators/foreman_theme_satellite/lib/css_compare.rb, line 81 def to_property_css(property, value) "#{property}: #{value};" end