class CssParser::RuleSet
Constants
- BACKGROUND_PROPERTIES
- BORDER_PROPERTIES
- BORDER_STYLE_PROPERTIES
- DIMENSIONS
- FONT_STYLE_PROPERTIES
- LIST_STYLE_PROPERTIES
- NUMBER_OF_DIMENSIONS
- RE_ELEMENTS_AND_PSEUDO_ELEMENTS
Patterns for specificity calculations
- RE_NON_ID_ATTRIBUTES_AND_PSEUDO_CLASSES
Attributes
selectors[R]
Array of selector strings.
specificity[RW]
Integer with the specificity to use for this RuleSet
.
Public Class Methods
new(selectors, block, specificity = nil)
click to toggle source
# File lib/css_parser/rule_set.rb, line 30 def initialize(selectors, block, specificity = nil) @selectors = [] @specificity = specificity @declarations = {} @order = 0 parse_selectors!(selectors) if selectors parse_declarations!(block) end
Public Instance Methods
add_declaration!(property, value)
click to toggle source
Add a CSS declaration to the current RuleSet
.
rule_set.add_declaration!('color', 'blue') puts rule_set['color'] => 'blue;' rule_set.add_declaration!('margin', '0px auto !important') puts rule_set['margin'] => '0px auto !important;'
If the property already exists its value will be over-written.
# File lib/css_parser/rule_set.rb, line 67 def add_declaration!(property, value) if value.nil? or value.empty? @declarations.delete(property) return end value.gsub!(/;\Z/, '') is_important = !value.gsub!(CssParser::IMPORTANT_IN_PROPERTY_RX, '').nil? property = property.downcase property.strip! #puts "SAVING #{property} #{value} #{is_important.inspect}" @declarations[property] = { :value => value, :is_important => is_important, :order => @order += 1 } end
Also aliased as: []=
create_shorthand!()
click to toggle source
Create shorthand declarations (e.g. margin
or font
) whenever possible.
# File lib/css_parser/rule_set.rb, line 314 def create_shorthand! create_background_shorthand! create_dimensions_shorthand! # border must be shortened after dimensions create_border_shorthand! create_font_shorthand! create_list_style_shorthand! end
declarations_to_s(options = {})
click to toggle source
Return all declarations as a string.
# File lib/css_parser/rule_set.rb, line 122 def declarations_to_s(options = {}) str = String.new each_declaration do |prop, val, is_important| importance = (options[:force_important] || is_important) ? ' !important' : '' str << "#{prop}: #{val}#{importance}; " end str.gsub!(/^[\s^(\{)]+|[\n\r\f\t]*|[\s]+$/mx, '') str.strip! str end
each_declaration() { |property, value, is_important| ... }
click to toggle source
Iterate through declarations.
# File lib/css_parser/rule_set.rb, line 110 def each_declaration # :yields: property, value, is_important decs = @declarations.sort { |a,b| a[1][:order].nil? || b[1][:order].nil? ? 0 : a[1][:order] <=> b[1][:order] } decs.each do |property, data| value = data[:value] yield property.downcase.strip, value.strip, data[:is_important] end end
each_selector(options = {}) { |selector, declarations, specificity| ... }
click to toggle source
Iterate through selectors.
Options
-
force_important
– boolean
Example¶ ↑
ruleset.each_selector do |sel, dec, spec| ... end
# File lib/css_parser/rule_set.rb, line 100 def each_selector(options = {}) # :yields: selector, declarations, specificity declarations = declarations_to_s(options) if @specificity @selectors.each { |sel| yield sel.strip, declarations, @specificity } else @selectors.each { |sel| yield sel.strip, declarations, CssParser.calculate_specificity(sel) } end end
expand_shorthand!()
click to toggle source
Split shorthand declarations (e.g. margin
or font
) into their constituent parts.
# File lib/css_parser/rule_set.rb, line 140 def expand_shorthand! # border must be expanded before dimensions expand_border_shorthand! expand_dimensions_shorthand! expand_font_shorthand! expand_background_shorthand! expand_list_style_shorthand! end
extract_background_size_from(value)
click to toggle source
# File lib/css_parser/rule_set.rb, line 174 def extract_background_size_from(value) size = value.slice!(CssParser::RE_BACKGROUND_SIZE) size.sub(/^\s*\/\s*/, '') if size end
get_value(property)
click to toggle source
Get the value of a property
# File lib/css_parser/rule_set.rb, line 40 def get_value(property) return '' unless property and not property.empty? property = property.downcase.strip properties = @declarations.inject(String.new) do |val, (key, data)| #puts "COMPARING #{key} #{key.inspect} against #{property} #{property.inspect}" importance = data[:is_important] ? ' !important' : '' val << "#{data[:value]}#{importance}; " if key.downcase.strip == property val end return properties ? properties.strip : '' end
Also aliased as: []
remove_declaration!(property)
click to toggle source
Remove CSS declaration from the current RuleSet
.
rule_set.remove_declaration!('color')
# File lib/css_parser/rule_set.rb, line 87 def remove_declaration!(property) @declarations.delete(property) end
to_s()
click to toggle source
Return the CSS rule set as a string.
# File lib/css_parser/rule_set.rb, line 134 def to_s decs = declarations_to_s "#{@selectors.join(',')} { #{decs} }" end