Module Hpricot::Container::Trav
In: lib/hpricot/modules.rb
lib/hpricot/traverse.rb

Methods

Included Modules

Traverse

Public Instance methods

Returns a list of CSS classes to which this element belongs.

[Source]

# File lib/hpricot/traverse.rb, line 518
    def classes
      get_attribute('class').to_s.strip.split(/\s+/)
    end

Return all children of this node which can contain other nodes. This is a good way to get all HTML elements which aren‘t text, comment, doctype or processing instruction nodes.

[Source]

# File lib/hpricot/traverse.rb, line 404
    def containers
      children.grep(Container::Trav)
    end

each_child iterates over each child.

[Source]

# File lib/hpricot/traverse.rb, line 498
    def each_child(&block) # :yields: child_node
      children.each(&block) if children
      nil
    end

each_child_with_index iterates over each child.

[Source]

# File lib/hpricot/traverse.rb, line 504
    def each_child_with_index(&block) # :yields: child_node, index
      children.each_with_index(&block) if children
      nil
    end

each_hyperlink traverses hyperlinks such as HTML href attribute of A element.

It yields Hpricot::Text.

Note that each_hyperlink yields HTML href attribute of BASE element.

[Source]

# File lib/hpricot/traverse.rb, line 614
    def each_hyperlink # :yields: text
      links = []
      each_hyperlink_attribute {|elem, attr, hyperlink|
        yield hyperlink
      }
    end

each_hyperlink_uri traverses hyperlinks such as HTML href attribute of A element.

It yields Hpricot::Text and URI for each hyperlink.

The URI objects are created with a base URI which is given by HTML BASE element or the argument ((|base_uri|)). each_hyperlink_uri doesn‘t yields href of the BASE element.

[Source]

# File lib/hpricot/traverse.rb, line 591
    def each_hyperlink_uri(base_uri=nil) # :yields: hyperlink, uri
      base_uri = URI.parse(base_uri) if String === base_uri
      links = []
      each_hyperlink_attribute {|elem, attr, hyperlink|
        if %r{\{http://www.w3.org/1999/xhtml\}(?:base)\z}i =~ elem.name
          base_uri = URI.parse(hyperlink.to_s)
        else
          links << hyperlink
        end
      }
      if base_uri
        links.each {|hyperlink| yield hyperlink, base_uri + hyperlink.to_s }
      else
        links.each {|hyperlink| yield hyperlink, URI.parse(hyperlink.to_s) }
      end
    end

each_uri traverses hyperlinks such as HTML href attribute of A element.

It yields URI for each hyperlink.

The URI objects are created with a base URI which is given by HTML BASE element or the argument ((|base_uri|)).

[Source]

# File lib/hpricot/traverse.rb, line 628
    def each_uri(base_uri=nil) # :yields: URI
      each_hyperlink_uri(base_uri) {|hyperlink, uri| yield uri }
    end

filter rebuilds the tree without some components.

  node.filter {|descendant_node| predicate } -> node
  loc.filter {|descendant_loc| predicate } -> node

filter yields each node except top node. If given block returns false, corresponding node is dropped. If given block returns true, corresponding node is retained and inner nodes are examined.

filter returns an node. It doesn‘t return location object even if self is location object.

[Source]

# File lib/hpricot/traverse.rb, line 719
    def filter(&block)
      subst = {}
      each_child_with_index {|descendant, i|
        if yield descendant
          if descendant.elem?
            subst[i] = descendant.filter(&block)
          else
            subst[i] = descendant
          end
        else
          subst[i] = nil
        end
      }
      to_node.subst_subnode(subst)
    end

find_element searches an element which universal name is specified by the arguments. It returns nil if not found.

[Source]

# File lib/hpricot/traverse.rb, line 512
    def find_element(*names)
      traverse_element(*names) {|e| return e }
      nil
    end

Find sibling elements which follow the current one. Like the other "sibling" methods, this weeds out text and comment nodes.

[Source]

# File lib/hpricot/traverse.rb, line 435
    def following_siblings()
      sibs = parent.containers
      si = sibs.index(self) + 1
      return Elements[*sibs[si...sibs.length]]
    end

[Source]

# File lib/hpricot/traverse.rb, line 522
    def get_element_by_id(id)
      traverse_all_element do |ele|
          if ele.elem? and eid = ele.get_attribute('id')
              return ele if eid.to_s == id
          end
      end
      nil
    end

[Source]

# File lib/hpricot/traverse.rb, line 531
    def get_elements_by_tag_name(*a)
      list = Elements[]
      a.delete("*")
      traverse_element(*a.map { |tag| [tag, "{http://www.w3.org/1999/xhtml}#{tag}"] }.flatten) do |e|
        list << e if e.elem?
      end
      list
    end

Insert nodes, an array of HTML elements or a single element, after the node ele, a child of the current node.

[Source]

# File lib/hpricot/traverse.rb, line 486
    def insert_after(nodes, ele)
      case nodes
      when Array
        nodes.reverse_each { |n| insert_after(n, ele) }
      else
        reparent nodes
        idx = children.index(ele)
        children[idx ? idx + 1 : children.length, 0] = nodes
      end
    end

Insert nodes, an array of HTML elements or a single element, before the node ele, a child of the current node.

[Source]

# File lib/hpricot/traverse.rb, line 474
    def insert_before(nodes, ele)
      case nodes
      when Array
        nodes.each { |n| insert_before(n, ele) }
      else
        reparent nodes
        children[children.index(ele) || 0, 0] = nodes
      end
    end

Returns the container node neighboring this node to the south: just below it. By "container" node, I mean: this method does not find text nodes or comments or cdata or any of that. See Hpricot::Traverse#next_node if you need to hunt out all kinds of nodes.

[Source]

# File lib/hpricot/traverse.rb, line 411
    def next_sibling
      sib = parent.containers
      sib[sib.index(self) + 1] if parent
    end

Find all preceding sibling elements. Like the other "sibling" methods, this weeds out text and comment nodes.

[Source]

# File lib/hpricot/traverse.rb, line 427
    def preceding_siblings()
      sibs = parent.containers
      si = sibs.index(self)
      return Elements[*sibs[0...si]]
    end

Returns the container node neighboring this node to the north: just above it. By "container" node, I mean: this method does not find text nodes or comments or cdata or any of that. See Hpricot::Traverse#previous_node if you need to hunt out all kinds of nodes.

[Source]

# File lib/hpricot/traverse.rb, line 419
    def previous_sibling
      sib = parent.containers
      x = sib.index(self) - 1
      sib[x] if sib and x >= 0
    end

Replace old, a child of the current node, with new node.

[Source]

# File lib/hpricot/traverse.rb, line 467
    def replace_child(old, new)
      reparent new
      children[children.index(old), 1] = [*new]
    end

Puts together an array of neighboring sibling elements based on their proximity to this element.

This method accepts ranges and sets of numbers.

   ele.siblings_at(-3..-1, 1..3) # gets three elements before and three after
   ele.siblings_at(1, 5, 7) # gets three elements at offsets below the current element
   ele.siblings_at(0, 5..6) # the current element and two others

Like the other "sibling" methods, this doesn‘t find text and comment nodes. Use nodes_at to include those nodes.

[Source]

# File lib/hpricot/traverse.rb, line 452
    def siblings_at(*pos)
      sib = parent.containers
      i, si = 0, sib.index(self)
      Elements[*
        sib.select do |x|
          sel = case i - si when *pos
                  true
                end
          i += 1
          sel
        end
      ]
    end

[Validate]