Class: REXML::Validation::Interleave

Inherits:
Choice show all
Defined in:
lib/rexml/validation/relaxng.rb

Instance Method Summary collapse

Methods inherited from Choice

#<<

Methods inherited from State

#<<, #previous=, #to_s

Constructor Details

#initialize(context) ⇒ Interleave

Returns a new instance of Interleave.



449
450
451
452
# File 'lib/rexml/validation/relaxng.rb', line 449

def initialize context
  super
  @choice = 0
end

Instance Method Details

#expectedObject



529
530
531
532
533
534
535
536
537
538
539
540
# 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

#inspectObject



542
543
544
# 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) ⇒ Boolean

Returns:

  • (Boolean)


524
525
526
527
# 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) ⇒ Object



488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
# 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) ⇒ Object



458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
# 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

#resetObject



454
455
456
# File 'lib/rexml/validation/relaxng.rb', line 454

def reset
  @choice = 0
end