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



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

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)



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

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
# File 'lib/rexml/parent.rb', line 17

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.



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

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



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

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



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

def delete_at( index )
  @children.delete_at index
end

#delete_if(&block) ⇒ Object



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

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

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



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

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

#each_index(&block) ⇒ Object



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

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



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

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)



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

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)



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

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)


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

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



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

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



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

def size
  @children.size
end

#to_aObject Also known as: children



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

def to_a
  @children.dup
end

#unshift(object) ⇒ Object



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

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