Class: Oga::XML::Node

Inherits:
Object
  • Object
show all
Includes:
ToXML, Traversal
Defined in:
lib/oga/xml/node.rb

Overview

A generic XML node. Instances of this class can belong to a NodeSet and can be used to query surrounding and parent nodes.

Direct Known Subclasses

CharacterNode, Doctype, Element

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ToXML

#to_xml

Methods included from Traversal

#each_node

Constructor Details

#initialize(options = {}) ⇒ Node

Returns a new instance of Node

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):



26
27
28
29
# File 'lib/oga/xml/node.rb', line 26

def initialize(options = {})
  self.node_set = options[:node_set]
  self.children = options[:children] if options[:children]
end

Instance Attribute Details

#nextOga::XML::Node

Returns:



17
18
19
# File 'lib/oga/xml/node.rb', line 17

def next
  @next
end

#node_setOga::XML::NodeSet

Returns:



11
12
13
# File 'lib/oga/xml/node.rb', line 11

def node_set
  @node_set
end

#previousOga::XML::Node

Returns:



14
15
16
# File 'lib/oga/xml/node.rb', line 14

def previous
  @previous
end

Instance Method Details

#after(other) ⇒ Object

Inserts the given node after the current node.

Parameters:



152
153
154
155
156
# File 'lib/oga/xml/node.rb', line 152

def after(other)
  index = node_set.index(self) + 1

  node_set.insert(index, other)
end

#before(other) ⇒ Object

Inserts the given node before the current node.

Parameters:



143
144
145
146
147
# File 'lib/oga/xml/node.rb', line 143

def before(other)
  index = node_set.index(self)

  node_set.insert(index, other)
end

#childrenOga::XML::NodeSet

Returns the child nodes of the current node.

Returns:



43
44
45
# File 'lib/oga/xml/node.rb', line 43

def children
  @children ||= NodeSet.new([], self)
end

#children=(nodes) ⇒ Object

Sets the child nodes of the element.

Parameters:



50
51
52
53
54
55
56
# File 'lib/oga/xml/node.rb', line 50

def children=(nodes)
  if nodes.is_a?(NodeSet)
    @children = nodes
  else
    @children = NodeSet.new(nodes, self)
  end
end

#each_ancestor {|| ... } ⇒ Object

Yields all ancestor elements of the current node.

Examples:

some_element.each_ancestor do |node|
  # ...
end

Yield Parameters:



182
183
184
185
186
187
188
189
190
191
192
# File 'lib/oga/xml/node.rb', line 182

def each_ancestor
  return to_enum(:each_ancestor) unless block_given?

  node = parent

  while node.is_a?(XML::Element)
    yield node

    node = node.parent
  end
end

#html?TrueClass|FalseClass

Returns:

  • (TrueClass|FalseClass)


159
160
161
162
163
164
165
166
167
# File 'lib/oga/xml/node.rb', line 159

def html?
  if @html_p.nil?
    root = root_node

    @html_p = root.is_a?(Document) && root.html?
  end

  @html_p
end

#next_elementOga::XML::Element

Returns the next element node or nil if there is none.

Returns:



82
83
84
85
86
87
88
89
90
# File 'lib/oga/xml/node.rb', line 82

def next_element
  node = self

  while node = node.next
    return node if node.is_a?(Element)
  end

  return
end

#parentOga::XML::Node

Returns the parent node of the current node. If there is no parent node nil is returned instead.

Returns:



62
63
64
# File 'lib/oga/xml/node.rb', line 62

def parent
  node_set ? node_set.owner : nil
end

#previous_elementOga::XML::Element

Returns the previous element node or nil if there is none.

Returns:



69
70
71
72
73
74
75
76
77
# File 'lib/oga/xml/node.rb', line 69

def previous_element
  node = self

  while node = node.previous
    return node if node.is_a?(Element)
  end

  return
end

#removeOga::XML::Node

Removes the current node from the owning node set.

Returns:



117
118
119
# File 'lib/oga/xml/node.rb', line 117

def remove
  return node_set.delete(self) if node_set
end

#replace(other) ⇒ Object

Replaces the current node with another.

Examples:

Replacing with an element

element = Oga::XML::Element.new(:name => 'div')
some_node.replace(element)

Replacing with a String

some_node.replace('this will replace the current node with a text node')

Parameters:



131
132
133
134
135
136
137
138
# File 'lib/oga/xml/node.rb', line 131

def replace(other)
  if other.is_a?(String)
    other = Text.new(:text => other)
  end

  before(other)
  remove
end

#root_nodeOga::XML::Document|Oga::XML::Node

Returns the root document/node of the current node. The node is retrieved by traversing upwards in the DOM tree from the current node.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/oga/xml/node.rb', line 96

def root_node
  unless @root_node
    node = self

    loop do
      if !node.is_a?(Document) and node.node_set
        node = node.node_set.owner
      else
        break
      end
    end

    @root_node = node
  end

  @root_node
end

#xml?TrueClass|FalseClass

Returns:

  • (TrueClass|FalseClass)


170
171
172
# File 'lib/oga/xml/node.rb', line 170

def xml?
  !html?
end