class Rack::PageSpeed::Filters::CombineJavaScripts

Public Instance Methods

execute!(document) click to toggle source
# File lib/rack/pagespeed/filters/combine_javascripts.rb, line 12
def execute! document
  nodes = document.css('script[src]')
  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_javascripts.rb, line 67
def group_siblings nodes
  nodes.inject([]) do |result, node|
    group, current = [], node
    group << node
    while previous = current.previous_sibling and local_script?(previous)
      current = previous
      group.unshift current
    end
    result << group
  end
end
local_script?(node) click to toggle source
# File lib/rack/pagespeed/filters/combine_javascripts.rb, line 38
def local_script? node
  node.name == 'script' and content?(node)
end
merge(nodes, document) click to toggle source
# File lib/rack/pagespeed/filters/combine_javascripts.rb, line 31
def merge nodes, document
  nodes_id = unique_id nodes
  node = Nokogiri::XML::Node.new 'script', document
  node['src'] = "/rack-pagespeed-#{nodes_id}.js"
  node
end
save(nodes) click to toggle source
# File lib/rack/pagespeed/filters/combine_javascripts.rb, line 25
def save nodes
  contents = nodes.map { |node| content_only(node) rescue "" }.join(';')
  nodes_id = unique_id nodes
  @options[:store]["#{nodes_id}.js"] = contents
end
topmost_of_sequence(nodes) click to toggle source
# File lib/rack/pagespeed/filters/combine_javascripts.rb, line 42
def topmost_of_sequence nodes
  result = []
  nodes.each do |node|
    _previous, _next = node.previous_sibling, node.next_sibling
    if _previous && local_script?(_previous) &&
      (!_next || !local_script?(_next))
      result << node
    end
  end
  result
end
unique_id(nodes) click to toggle source
# File lib/rack/pagespeed/filters/combine_javascripts.rb, line 54
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['src'] } & urls).length == urls.length
    return hash
  end
end