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



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

Parameters:

  • index

    the Integer index of the child to fetch



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

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)



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.

Parameters:

  • child

    the child to get the index of

Returns:

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



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.

Parameters:

  • child1

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

  • child2

    the child to insert

Returns:

  • the parent (self)



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.

Parameters:

  • child1

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

  • child2

    the child to insert

Returns:

  • the parent (self)



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

Returns:

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

Parameters:

  • to_replace

    the child to replace (must be a Child)

  • replacement

    the child to insert into the nodelist (must be a



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

Returns the number of children of this parent.

Returns:

  • the number of children of this parent



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