Class: REXML::Parent

Inherits:
Child show all
Includes:
Enumerable
Defined in:
lib/rexml/parent.rb

Overview

A parent has children, and has methods for accessing them. The Parent class is never encountered except as the superclass for some other object.

Direct Known Subclasses

DocType, Element

Instance Attribute Summary

Attributes inherited from Child

#parent

Instance Method Summary collapse

Methods inherited from Child

#bytes, #document, #next_sibling=, #previous_sibling=, #remove, #replace_with

Methods included from Node

#each_recursive, #find_first_recursive, #indent, #index_in_parent, #next_sibling_node, #previous_sibling_node, #to_s

Constructor Details

#initialize(parent = nil) ⇒ Parent

Constructor



12
13
14
15
# File 'lib/rexml/parent.rb', line 12

def initialize parent=nil
  super(parent)
  @children = []
end

Instance Method Details

#[](index) ⇒ Object

Fetches a child at a given index



58
59
60
# File 'lib/rexml/parent.rb', line 58

def []( index )
  @children[index]
end

#[]=(*args) ⇒ Object

Set an index entry. See Array.[]=



71
72
73
74
# File 'lib/rexml/parent.rb', line 71

def []=( *args )
  args[-1].parent = self
  @children[*args[0..-2]] = args[-1]
end

#add(object) ⇒ Object Also known as: push



17
18
19
20
21
22
23
# File 'lib/rexml/parent.rb', line 17

def add( object )
  #puts "PARENT GOTS #{size} CHILDREN"
  object.parent = self
  @children << object
  #puts "PARENT NOW GOTS #{size} CHILDREN"
  object
end

#deep_cloneObject

Deeply clones this object. This creates a complete duplicate of this Parent, including all descendants.



149
150
151
152
153
154
155
156
157
158
159
# File 'lib/rexml/parent.rb', line 149

def deep_clone
  cl = clone()
  each do |child|
    if child.kind_of? Parent
      cl << child.deep_clone
    else
      cl << child.clone
    end
  end
  cl
end

#delete(object) ⇒ Object



33
34
35
36
37
38
# File 'lib/rexml/parent.rb', line 33

def delete( object )
  found = false
  @children.delete_if {|c| c.equal?(object) and found = true }
  object.parent = nil if found
  found ? object : nil
end

#delete_at(index) ⇒ Object



48
49
50
# File 'lib/rexml/parent.rb', line 48

def delete_at( index )
  @children.delete_at index
end

#delete_if(&block) ⇒ Object



44
45
46
# File 'lib/rexml/parent.rb', line 44

def delete_if( &block )
  @children.delete_if(&block)
end

#each(&block) ⇒ Object Also known as: each_child



40
41
42
# File 'lib/rexml/parent.rb', line 40

def each(&block)
  @children.each(&block)
end

#each_index(&block) ⇒ Object



52
53
54
# File 'lib/rexml/parent.rb', line 52

def each_index( &block )
  @children.each_index(&block)
end

#index(child) ⇒ Object

Fetches the index of a given child of this parent.



124
125
126
127
128
# File 'lib/rexml/parent.rb', line 124

def index( child )
  count = -1
  @children.find { |i| count += 1 ; i.hash == child.hash }
  count
end

#insert_after(child1, child2) ⇒ Object

Inserts an child after another child child2 will be inserted after child1 in the child list of the parent. If an xpath, child2 will be inserted after the first child to match the xpath.



103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/rexml/parent.rb', line 103

def insert_after( child1, child2 )
  if child1.kind_of? String
    child1 = XPath.first( self, child1 )
    child1.parent.insert_after child1, child2
  else
    ind = index(child1)+1
    child2.parent.delete(child2) if child2.parent
    @children[ind,0] = child2
    child2.parent = self
  end
  self
end

#insert_before(child1, child2) ⇒ Object

Inserts an child before another child child2 will be inserted before child1 in the child list of the parent. If an xpath, child2 will be inserted before the first child to match the xpath.



83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/rexml/parent.rb', line 83

def insert_before( child1, child2 )
  if child1.kind_of? String
    child1 = XPath.first( self, child1 )
    child1.parent.insert_before child1, child2
  else
    ind = index(child1)
    child2.parent.delete(child2) if child2.parent
    @children[ind,0] = child2
    child2.parent = self
  end
  self
end

#parent?Boolean



163
164
165
# File 'lib/rexml/parent.rb', line 163

def parent?
  true
end

#replace_child(to_replace, replacement) ⇒ Object

Replaces one child with another, making sure the nodelist is correct Child)



141
142
143
144
145
# File 'lib/rexml/parent.rb', line 141

def replace_child( to_replace, replacement )
  @children.map! {|c| c.equal?( to_replace ) ? replacement : c }
  to_replace.parent = nil
  replacement.parent = self
end

#sizeObject Also known as: length



131
132
133
# File 'lib/rexml/parent.rb', line 131

def size
  @children.size
end

#to_aObject Also known as: children



116
117
118
# File 'lib/rexml/parent.rb', line 116

def to_a
  @children.dup
end

#unshift(object) ⇒ Object



28
29
30
31
# File 'lib/rexml/parent.rb', line 28

def unshift( object )
  object.parent = self
  @children.unshift object
end