1require "rexml/child"
2require "rexml/source"
3
4module REXML
5  # Represents an XML Instruction; IE, <? ... ?>
6  # TODO: Add parent arg (3rd arg) to constructor
7  class Instruction < Child
8    START = '<\?'
9    STOP = '\?>'
10
11    # target is the "name" of the Instruction; IE, the "tag" in <?tag ...?>
12    # content is everything else.
13    attr_accessor :target, :content
14
15    # Constructs a new Instruction
16    # @param target can be one of a number of things.  If String, then
17    # the target of this instruction is set to this.  If an Instruction,
18    # then the Instruction is shallowly cloned (target and content are
19    # copied).  If a Source, then the source is scanned and parsed for
20    # an Instruction declaration.
21    # @param content Must be either a String, or a Parent.  Can only
22    # be a Parent if the target argument is a Source.  Otherwise, this
23    # String is set as the content of this instruction.
24    def initialize(target, content=nil)
25      if target.kind_of? String
26        super()
27        @target = target
28        @content = content
29      elsif target.kind_of? Instruction
30        super(content)
31        @target = target.target
32        @content = target.content
33      end
34      @content.strip! if @content
35    end
36
37    def clone
38      Instruction.new self
39    end
40
41    # == DEPRECATED
42    # See the rexml/formatters package
43    #
44    def write writer, indent=-1, transitive=false, ie_hack=false
45      Kernel.warn( "#{self.class.name}.write is deprecated" )
46      indent(writer, indent)
47      writer << START.sub(/\\/u, '')
48      writer << @target
49      writer << ' '
50      writer << @content
51      writer << STOP.sub(/\\/u, '')
52    end
53
54    # @return true if other is an Instruction, and the content and target
55    # of the other matches the target and content of this object.
56    def ==( other )
57      other.kind_of? Instruction and
58      other.target == @target and
59      other.content == @content
60    end
61
62    def node_type
63      :processing_instruction
64    end
65
66    def inspect
67      "<?p-i #{target} ...?>"
68    end
69  end
70end
71