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