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