Class: Slimmer::Processors::TagMover
- Inherits:
-
Object
- Object
- Slimmer::Processors::TagMover
- Defined in:
- lib/slimmer/processors/tag_mover.rb
Instance Method Summary collapse
- #filter(src, dest) ⇒ Object
- #include_tag?(node, min_attrs) ⇒ Boolean
- #move_tags(src, dest, type, opts) ⇒ Object
- #tag_fingerprint(node, attrs) ⇒ Object
- #wrap_node(src, node) ⇒ Object
Instance Method Details
#filter(src, dest) ⇒ Object
3 4 5 6 7 |
# File 'lib/slimmer/processors/tag_mover.rb', line 3 def filter(src,dest) (src, dest, 'script', :must_have => ['src']) (src, dest, 'link', :must_have => ['href']) (src, dest, 'meta', :must_have => ['name', 'content'], :keys => ['name', 'content', 'http-equiv']) end |
#include_tag?(node, min_attrs) ⇒ Boolean
9 10 11 |
# File 'lib/slimmer/processors/tag_mover.rb', line 9 def include_tag?(node, min_attrs) min_attrs.inject(true) { |all_okay, attr_name| all_okay && node.has_attribute?(attr_name) } end |
#move_tags(src, dest, type, opts) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/slimmer/processors/tag_mover.rb', line 26 def (src, dest, type, opts) comparison_attrs = opts[:keys] || opts[:must_have] min_attrs = opts[:must_have] already_there = dest.css(type).map { |node| tag_fingerprint(node, comparison_attrs) }.compact src.css(type).each do |node| if include_tag?(node, min_attrs) && !already_there.include?(tag_fingerprint(node, comparison_attrs)) node = wrap_node(src, node) node.remove dest.at_xpath('/html/head') << node end end end |
#tag_fingerprint(node, attrs) ⇒ Object
13 14 15 16 17 |
# File 'lib/slimmer/processors/tag_mover.rb', line 13 def tag_fingerprint(node, attrs) attrs.collect do |attr_name| node.has_attribute?(attr_name) ? node.attr(attr_name) : nil end.compact.sort end |
#wrap_node(src, node) ⇒ Object
19 20 21 22 23 24 |
# File 'lib/slimmer/processors/tag_mover.rb', line 19 def wrap_node(src, node) if node.previous_sibling.to_s =~ /<!--\[if[^\]]+\]><!-->/ and node.next_sibling.to_s == '<!--<![endif]-->' node = Nokogiri::XML::NodeSet.new(src, [node.previous_sibling, node, node.next_sibling]) end node end |