module CSSPlop

Constants

VERSION

Public Class Methods

apply(stylesheet, document) click to toggle source
# File lib/cssplop.rb, line 21
def self.apply stylesheet, document
  css_doc = if stylesheet.is_a? CSSPool::CSS::Document
    stylesheet
  else
    CSSPool.CSS stylesheet
  end

  html_doc = if document.is_a? Nokogiri::XML::Node
    document.dup # no sideeffects
  else
    Nokogiri::HTML.fragment document
  end

  self.apply! css_doc, html_doc

  if document.is_a? Nokogiri::XML::Node
    return html_doc
  else
    return html_doc.to_html
  end
end
apply!(stylesheet, document) click to toggle source
# File lib/cssplop.rb, line 43
def self.apply! stylesheet, document
  elements_declarations_map = {}

  stylesheet.rule_sets.each do |rule_set|
    selectors = rule_set.selectors.map &:to_css
    elements = document.css *selectors
    elements.each do |element|
      elements_declarations_map[element] ||= []
      elements_declarations_map[element].concat rule_set.declarations
    end
  end

  elements_declarations_map.each do |element, declarations|
    element_style_doc = CSSPool.CSS "* {#{element[:style]}}"
    element_declarations = element_style_doc.rule_sets.first.declarations
    element_declarations.concat declarations.flatten

    element[:style] = element_declarations.map(&:to_css).join.strip
  end

  return document
end
inline_styles(document) click to toggle source
# File lib/cssplop.rb, line 5
def self.inline_styles document
  html_doc = Nokogiri::HTML.fragment document

  # All styles that don't have sources.
  styles = html_doc.xpath 'descendant-or-self::style[not(@src)]'
  styles.each do |style|
    begin
      stylesheet = CSSPool::CSS style.text
      self.apply! stylesheet, html_doc
      style.remove
    end
  end

  return html_doc.to_html
end