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



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

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

Instance Method Details

#[](index) ⇒ Object

Fetches a child at a given index



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

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

#[]=(*args) ⇒ Object

Set an index entry. See Array.[]=



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

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

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



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

def add( object )
  object.parent = self
  @children << object
  object
end

#deep_cloneObject

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



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

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



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

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



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

def delete_at( index )
  @children.delete_at index
end

#delete_if(&block) ⇒ Object



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

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

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



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

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

#each_index(&block) ⇒ Object



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

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

#index(child) ⇒ Object

Fetches the index of a given child of this parent.



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

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.



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

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.



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

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



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

def parent?
  true
end

#replace_child(to_replace, replacement) ⇒ Object

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



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

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



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

def size
  @children.size
end

#to_aObject Also known as: children



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

def to_a
  @children.dup
end

#unshift(object) ⇒ Object



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

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