module Hpricot::Container::Trav

Public Instance Methods

classes() click to toggle source

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

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

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.

# File lib/hpricot/traverse.rb, line 404
def containers
  children.grep(Container::Trav)
end
each_child() { |child_node| ... } click to toggle source

each_child iterates over each child.

# 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() { |child_node, index| ... } click to toggle source

each_child_with_index iterates over each child.

# 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_uri(base_uri=nil) { |URI| ... } click to toggle source

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|)).

# 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
find_element(*names) click to toggle source

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

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

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

# 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
get_element_by_id(id) click to toggle 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
get_elements_by_tag_name(*a) click to toggle 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_after(nodes, ele) click to toggle source

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

# 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_before(nodes, ele) click to toggle source

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

# 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
next_sibling() click to toggle source

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.

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

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

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

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.

# 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_child(old, new) click to toggle source

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

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

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.

# 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

Private Instance Methods