Sha256: d3c9d267834f1b5c1979b1f7e8cf7cf69cf1e5412e545051131abd8cd9c38707

Contents?: true

Size: 1.96 KB

Versions: 11

Compression:

Stored size: 1.96 KB

Contents

begin
  require 'md5'
rescue LoadError
  require 'digest/md5'
end

class Rack::PageSpeed::Filters::CombineCSS < Rack::PageSpeed::Filter
  requires_store
  priority 9
  
  def execute! document
    nodes = document.css('link[rel="stylesheet"][href]')
    return false unless nodes.count > 0
    groups = group_siblings topmost_of_sequence(nodes)
    groups.each do |group|
      save group
      merged = merge group, document
      group.first.before merged
      group.map { |node| node.remove }
    end
  end

  private
  def merge_contents nodes, separator = ';'
    nodes.map { |node| file_for(node).read rescue "" }.join("\n")
  end
  
  def save nodes
    contents = merge_contents nodes
    nodes_id = unique_id nodes
    @options[:store]["#{nodes_id}.css"] = contents
  end
  
  def local_css? node
    node.name == 'link' and file_for(node)
  end
  
  def topmost_of_sequence nodes
    result = []
    nodes.each do |node|
      _previous, _next = node.previous_sibling, node.next_sibling
      if _previous && local_css?(_previous) &&
        (!_next || !local_css?(_next))
        result << node
      end
    end
    result
  end
  
  def merge nodes, document
    nodes_id = unique_id nodes
    node = Nokogiri::XML::Node.new 'link', document
    node['rel'] = 'stylesheet'
    node['href'] = "/rack-pagespeed-#{nodes_id}.css"
    node
  end

  def unique_id nodes
    return Digest::MD5.hexdigest nodes.map { |node| 
      file = file_for node
      next unless file
      file.mtime.to_i.to_s + file.read
    }.join unless @options[:hash]
    @options[:hash].each do |urls, hash|
      next unless (nodes.map { |node| node['href'] } & urls).length == urls.length
      return hash
    end
  end

  def group_siblings nodes
    nodes.inject([]) do |result, node|
      group, current = [], node
      group << node
      while previous = current.previous_sibling and local_css?(previous)
        current = previous
        group.unshift current
      end
      result << group
    end
  end
end

Version data entries

11 entries across 11 versions & 2 rubygems

Version Path
rack-pagespeed-fork-0.1.0 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.1.2 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.1.1 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.1.0 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.0.9 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.0.8 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.0.7 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.0.6 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.0.5 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.0.4 lib/rack/pagespeed/filters/combine_css.rb
rack-pagespeed-1.0.3 lib/rack/pagespeed/filters/combine_css.rb