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

Parameters:

  • parent (defaults to: nil)

    if supplied, will be set as the parent of this object



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

Parameters:

  • index

    the Integer index of the child to fetch



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

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

#[]=(*args) ⇒ Object

Set an index entry. See Array.[]=

Parameters:

  • index

    the index of the element to set

  • opt

    either the object to set, or an Integer length

  • child

    if opt is an Integer, this is the child to set

Returns:

  • the parent (self)



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.

Parameters:

  • child

    the child to get the index of

Returns:

  • the index of the child, or nil if the object is not a child



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.

Parameters:

  • child1

    this is either an xpath or an Element. If an Element,

  • child2

    the child to insert

Returns:

  • the parent (self)



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.

Parameters:

  • child1

    this is either an xpath or an Element. If an Element,

  • child2

    the child to insert

Returns:

  • the parent (self)



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

Returns:

  • (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)

Parameters:

  • to_replace

    the child to replace (must be a Child)

  • replacement

    the child to insert into the nodelist (must be a



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

Returns the number of children of this parent.

Returns:

  • the number of children of this parent



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