| Class | REXML::Validation::State |
| In: |
lib/rexml/validation/relaxng.rb
|
| Parent: | Object |
# File lib/rexml/validation/relaxng.rb, line 127
127: def initialize( context )
128: @previous = []
129: @events = []
130: @current = 0
131: @count = context.count += 1
132: @references = context.references
133: @value = false
134: end
# File lib/rexml/validation/relaxng.rb, line 196
196: def <<( event )
197: add_event_to_arry( @events, event )
198: end
# File lib/rexml/validation/relaxng.rb, line 192
192: def expected
193: return [@events[@current]]
194: end
# File lib/rexml/validation/relaxng.rb, line 185
185: def inspect
186: "< #{to_s} #{@events.collect{|e|
187: pre = e == @events[@current] ? '#' : ''
188: pre + e.inspect unless self == e
189: }.join(', ')} >"
190: end
# File lib/rexml/validation/relaxng.rb, line 146
146: def next( event )
147: #print "In next with #{event.inspect}. "
148: #puts "Next (#@current) is #{@events[@current]}"
149: #p @previous
150: return @previous.pop.next( event ) if @events[@current].nil?
151: expand_ref_in( @events, @current ) if @events[@current].class == Ref
152: if ( @events[@current].kind_of? State )
153: @current += 1
154: @events[@current-1].previous = self
155: return @events[@current-1].next( event )
156: end
157: #puts "Current isn't a state"
158: if ( @events[@current].matches?(event) )
159: @current += 1
160: if @events[@current].nil?
161: #puts "#{inspect[0,5]} 1RETURNING #{@previous.inspect[0,5]}"
162: return @previous.pop
163: elsif @events[@current].kind_of? State
164: @current += 1
165: #puts "#{inspect[0,5]} 2RETURNING (#{@current-1}) #{@events[@current-1].inspect[0,5]}; on return, next is #{@events[@current]}"
166: @events[@current-1].previous = self
167: return @events[@current-1]
168: else
169: #puts "#{inspect[0,5]} RETURNING self w/ next(#@current) = #{@events[@current]}"
170: return self
171: end
172: else
173: return nil
174: end
175: end
# File lib/rexml/validation/relaxng.rb, line 142
142: def previous=( previous )
143: @previous << previous
144: end
# File lib/rexml/validation/relaxng.rb, line 136
136: def reset
137: return if @current == 0
138: @current = 0
139: @events.each {|s| s.reset if s.kind_of? State }
140: end
# File lib/rexml/validation/relaxng.rb, line 177
177: def to_s
178: # Abbreviated:
179: self.class.name =~ /(?:::)(\w)\w+$/
180: # Full:
181: #self.class.name =~ /(?:::)(\w+)$/
182: "#$1.#@count"
183: end
# File lib/rexml/validation/relaxng.rb, line 210
210: def add_event_to_arry( arry, evt )
211: evt = generate_event( evt )
212: if evt.kind_of? String
213: arry[-1].event_arg = evt if arry[-1].kind_of? Event and @value
214: @value = false
215: else
216: arry << evt
217: end
218: end
# File lib/rexml/validation/relaxng.rb, line 202
202: def expand_ref_in( arry, ind )
203: new_events = []
204: @references[ arry[ind].to_s ].each{ |evt|
205: add_event_to_arry(new_events,evt)
206: }
207: arry[ind,1] = new_events
208: end
# File lib/rexml/validation/relaxng.rb, line 220
220: def generate_event( event )
221: return event if event.kind_of? State or event.class == Ref
222: evt = nil
223: arg = nil
224: case event[0]
225: when :start_element
226: case event[1]
227: when "element"
228: evt = :start_element
229: arg = event[2]["name"]
230: when "attribute"
231: evt = :start_attribute
232: arg = event[2]["name"]
233: when "text"
234: evt = :text
235: when "value"
236: evt = :text
237: @value = true
238: end
239: when :text
240: return event[1]
241: when :end_document
242: return Event.new( event[0] )
243: else # then :end_element
244: case event[1]
245: when "element"
246: evt = :end_element
247: when "attribute"
248: evt = :end_attribute
249: end
250: end
251: return Event.new( evt, arg )
252: end