class REXML::Validation::Interleave

Public Class Methods

new(context) click to toggle source
Calls superclass method REXML::Validation::Choice.new
# File lib/rexml/validation/relaxng.rb, line 449
def initialize context
 super
 @choice = 0
end

Public Instance Methods

expected() click to toggle source
# File lib/rexml/validation/relaxng.rb, line 529
def expected
 #puts "IN CHOICE EXPECTED"
 #puts "EVENTS = #{@events.inspect}"
 return [@events[@current]] if @events[@current]
 return @choices[@choice..-1].collect do |x|
 if x[0].kind_of? State
 x[0].expected
 else
 x[0]
 end
 end.flatten
end
inspect() click to toggle source
# File lib/rexml/validation/relaxng.rb, line 542
def inspect
 "< #{to_s} #{@choices.collect{|e| e.collect{|f|f.to_s}.join(', ')}.join(' and ')} >"
end
matches?( event ) click to toggle source
# File lib/rexml/validation/relaxng.rb, line 524
def matches?( event )
 return @events[@current].matches?( event ) if @events[@current]
 !@choices[@choice..-1].find{|evt| evt[0].matches?(event)}.nil?
end
next( event ) click to toggle source
# File lib/rexml/validation/relaxng.rb, line 488
def next( event )
 # Find the next series
 next_current(event) unless @events[@current]
 return nil unless @events[@current]
 expand_ref_in( @events, @current ) if @events[@current].class == Ref
 #puts "In next with #{event.inspect}."
 #puts "Next (#@current) is #{@events[@current]}"
 if ( @events[@current].kind_of? State )
 @current += 1
 @events[@current-1].previous = self
 return @events[@current-1].next( event )
 end
 #puts "Current isn't a state"
 return @previous.pop.next( event ) if @events[@current].nil?
 if ( @events[@current].matches?(event) )
 @current += 1
 if @events[@current].nil?
 #puts "#{inspect[0,5]} 1RETURNING self" unless @choices[@choice].nil?
 return self unless @choices[@choice].nil?
 #puts "#{inspect[0,5]} 1RETURNING #{@previous[-1].inspect[0,5]}"
 return @previous.pop
 elsif @events[@current].kind_of? State
 @current += 1
 #puts "#{inspect[0,5]} 2RETURNING (#{@current-1}) #{@events[@current-1].inspect[0,5]}; on return, next is #{@events[@current]}"
 @events[@current-1].previous = self
 return @events[@current-1]
 else
 #puts "#{inspect[0,5]} RETURNING self w/ next(#@current) = #{@events[@current]}"
 return self
 end
 else
 return nil
 end
end
next_current( event ) click to toggle source
# File lib/rexml/validation/relaxng.rb, line 458
def next_current( event )
 # Expand references
 c = 0 ; max = @choices.size
 while c < max
 if @choices[c][0].class == Ref
 expand_ref_in( @choices[c], 0 )
 @choices += @choices[c]
 @choices.delete( @choices[c] )
 max -= 1
 else
 c += 1
 end
 end
 @events = @choices[@choice..-1].find { |evt| evt[0].matches? event }
 @current = 0
 if @events
 # reorder the choices
 old = @choices[@choice]
 idx = @choices.index( @events )
 @choices[@choice] = @events
 @choices[idx] = old
 @choice += 1
 end
 #puts "In next with #{event.inspect}."
 #puts "events is #{@events.inspect}"
 @events = [] unless @events
end
reset() click to toggle source
# File lib/rexml/validation/relaxng.rb, line 454
def reset
 @choice = 0
end