1require "rexml/parseexception"
2require "rexml/formatters/pretty"
3require "rexml/formatters/default"
4
5module REXML
6  # Represents a node in the tree.  Nodes are never encountered except as
7  # superclasses of other objects.  Nodes have siblings.
8  module Node
9    # @return the next sibling (nil if unset)
10    def next_sibling_node
11      return nil if @parent.nil?
12      @parent[ @parent.index(self) + 1 ]
13    end
14
15    # @return the previous sibling (nil if unset)
16    def previous_sibling_node
17      return nil if @parent.nil?
18      ind = @parent.index(self)
19      return nil if ind == 0
20      @parent[ ind - 1 ]
21    end
22
23    # indent::
24    #   *DEPRECATED* This parameter is now ignored.  See the formatters in the
25    #   REXML::Formatters package for changing the output style.
26    def to_s indent=nil
27      unless indent.nil?
28        Kernel.warn( "#{self.class.name}.to_s(indent) parameter is deprecated" )
29        f = REXML::Formatters::Pretty.new( indent )
30        f.write( self, rv = "" )
31      else
32        f = REXML::Formatters::Default.new
33        f.write( self, rv = "" )
34      end
35      return rv
36    end
37
38    def indent to, ind
39                        if @parent and @parent.context and not @parent.context[:indentstyle].nil? then
40                                indentstyle = @parent.context[:indentstyle]
41                        else
42                                indentstyle = '  '
43                        end
44                        to << indentstyle*ind unless ind<1
45    end
46
47    def parent?
48      false;
49    end
50
51
52    # Visit all subnodes of +self+ recursively
53    def each_recursive(&block) # :yields: node
54      self.elements.each {|node|
55        block.call(node)
56        node.each_recursive(&block)
57      }
58    end
59
60    # Find (and return) first subnode (recursively) for which the block
61    # evaluates to true. Returns +nil+ if none was found.
62    def find_first_recursive(&block) # :yields: node
63      each_recursive {|node|
64        return node if block.call(node)
65      }
66      return nil
67    end
68
69    # Returns the position that +self+ holds in its parent's array, indexed
70    # from 1.
71    def index_in_parent
72      parent.index(self)+1
73    end
74  end
75end
76