lib/roadie/style_block.rb in roadie-3.3.0 vs lib/roadie/style_block.rb in roadie-3.4.0

- old
+ new

@@ -3,30 +3,51 @@ module Roadie # @api private # A style block is the combination of a {Selector} and a list of {StyleProperty}. class StyleBlock extend Forwardable - attr_reader :selector, :properties + attr_reader :selector, :properties, :media # @param [Selector] selector # @param [Array<StyleProperty>] properties - def initialize(selector, properties) + # @param [Array<String>] media Array of media types, e.g. + # @media screen, print and (max-width 800px) will become + # ['screen', 'print and (max-width 800px)'] + def initialize(selector, properties, media) @selector = selector @properties = properties + @media = media.map(&:to_s) end # @!method specificity # @see Selector#specificity - # @!method inlinable? - # @see Selector#inlinable? - def_delegators :selector, :specificity, :inlinable? + def_delegators :selector, :specificity # @!method selector_string # @see Selector#to_s def_delegator :selector, :to_s, :selector_string + # Checks whether the media query can be inlined + # @see inlineable_media + # @return {Boolean} + def inlinable? + inlinable_media? && selector.inlinable? + end + # String representation of the style block. This is valid CSS and can be # used in the DOM. + # @return {String} def to_s + # NB - leave off redundant final semicolon - see https://www.w3.org/TR/CSS2/syndata.html#declaration "#{selector}{#{properties.map(&:to_s).join(';')}}" + end + + private + + # A media query cannot be inlined if it contains any advanced rules + # e.g. @media only screen {...} is ok to inline but + # @media only screen and (max-width: 600px) {...} cannot be inlined + # @return {Boolean} + def inlinable_media? + @media.none? { |media_query| media_query.include? '(' } end end end