class Rack::PageSpeed::Filters::CombineCSS

Public Instance Methods

execute!(document) click to toggle source
# File lib/rack/pagespeed/filters/combine_css.rb, line 11
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 Instance Methods

group_siblings(nodes) click to toggle source
# File lib/rack/pagespeed/filters/combine_css.rb, line 71
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
local_css?(node) click to toggle source
# File lib/rack/pagespeed/filters/combine_css.rb, line 34
def local_css? node
  node.name == 'link' and content_for(node)[0] == 200
end
merge(nodes, document) click to toggle source
# File lib/rack/pagespeed/filters/combine_css.rb, line 50
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
merge_contents(nodes, separator = ';') click to toggle source
# File lib/rack/pagespeed/filters/combine_css.rb, line 24
def merge_contents nodes, separator = ';'
  nodes.map { |node| content_only(node) rescue "" }.join("\n")
end
save(nodes) click to toggle source
# File lib/rack/pagespeed/filters/combine_css.rb, line 28
def save nodes
  contents = merge_contents nodes
  nodes_id = unique_id nodes
  @options[:store]["#{nodes_id}.css"] = contents
end
topmost_of_sequence(nodes) click to toggle source
# File lib/rack/pagespeed/filters/combine_css.rb, line 38
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
unique_id(nodes) click to toggle source
# File lib/rack/pagespeed/filters/combine_css.rb, line 58
def unique_id nodes
  return Digest::MD5.hexdigest nodes.map { |node| 
    status, headers, body = content_for node
    next unless status == 200
    full_body = ""; body.each do |part| full_body << part end
    headers['Last-Modified'] + full_body
  }.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