Sha256: 9ad57ac5a3e74adf5d744f6b4eab070478aecf8bb498860cca450a431e3e363e

Contents?: true

Size: 1.27 KB

Versions: 5

Compression:

Stored size: 1.27 KB

Contents

require 'rubygems'
require 'nokogiri'
require 'css_inliner/extractor'
require 'css_inliner/csspool'

module CSSInliner
  class Inliner
    # @param [Nokogiri::XML::Document] document
    # @param [String] basedir
    def initialize(document, basedir)
      @document = document
      @basedir = basedir
      @extractor = Extractor.new @document, @basedir
    end

    def inline
      original_styles = {}
      @document.search('.//*[@style]').each do |elem|
        original_styles[elem] = elem['style']
        elem.remove_attribute('style')
      end

      css = @extractor.extract
      css.sorted_selectors.each do |selector|
        sel = selector.to_s
        next if sel =~ /@|:/
        sel = 'body' if sel == '*' or sel == 'html'
        @document.css(sel).each do |elem|
          base = CSSPool.CSS("* {#{elem['style']}}").rule_sets.first.declarations
          elem['style'] = CSSPool::CSS.update_declarations(base, selector.declarations).join
        end
      end

      original_styles.each_pair do |elem, style|
        base = CSSPool.CSS("* {#{elem['style']}}").rule_sets.first.declarations
        orig = CSSPool.CSS("* {#{style}}").rule_sets.first.declarations
        elem['style'] = CSSPool::CSS.update_declarations(base, orig).join
      end

      @document
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
css_inliner-0.3.2 lib/css_inliner/inliner.rb
css_inliner-0.3.1 lib/css_inliner/inliner.rb
css_inliner-0.3.0 lib/css_inliner/inliner.rb
css_inliner-0.2.1 lib/css_inliner/inliner.rb
css_inliner-0.2.0 lib/css_inliner/inliner.rb