# 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 439
    def initialize context
      super
      @choice = 0
    end

### Public Instance Methods

expected() click to toggle source

    # File lib/rexml/validation/relaxng.rb, line 510
    def expected
      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 521
    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 505
    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 476
    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
      if ( @events[@current].kind_of? State )
        @current += 1
        @events[@current-1].previous = self
        return @events[@current-1].next( event )
      end
      return @previous.pop.next( event ) if @events[@current].nil?
      if ( @events[@current].matches?(event) )
        @current += 1
        if @events[@current].nil?
          return self unless @choices[@choice].nil?
          return @previous.pop
        elsif @events[@current].kind_of? State
          @current += 1
          @events[@current-1].previous = self
          return @events[@current-1]
        else
          return self
        end
      else
        return nil
      end
    end

next_current( event ) click to toggle source

    # File lib/rexml/validation/relaxng.rb, line 448
    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

      @events = [] unless @events
    end

reset() click to toggle source

    # File lib/rexml/validation/relaxng.rb, line 444
    def reset
      @choice = 0
    end