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