mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
These validation files for REXML need to be included in the main branch.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6596 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
77e092c31c
commit
0fcc88d07c
3 changed files with 720 additions and 0 deletions
152
lib/rexml/validation/validation.rb
Normal file
152
lib/rexml/validation/validation.rb
Normal file
|
@ -0,0 +1,152 @@
|
|||
require 'rexml/validation/validationexception'
|
||||
|
||||
module REXML
|
||||
module Validation
|
||||
module Validator
|
||||
NILEVENT = [ nil ]
|
||||
def reset
|
||||
@current = @root
|
||||
@root.reset
|
||||
@root.previous = true
|
||||
@attr_stack = []
|
||||
self
|
||||
end
|
||||
def dump
|
||||
puts @root.inspect
|
||||
end
|
||||
def validate( event )
|
||||
#puts "Current: #@current"
|
||||
#puts "Event: #{event.inspect}"
|
||||
@attr_stack = [] unless defined? @attr_stack
|
||||
match = @current.next(event)
|
||||
raise ValidationException.new( "Validation error. Expected: "+
|
||||
@current.expected.join( " or " )+" from #{@current.inspect} "+
|
||||
" but got #{Event.new( event[0], event[1] ).inspect}" ) unless match
|
||||
@current = match
|
||||
|
||||
# Check for attributes
|
||||
case event[0]
|
||||
when :start_element
|
||||
#puts "Checking attributes"
|
||||
@attr_stack << event[2]
|
||||
begin
|
||||
sattr = [:start_attribute, nil]
|
||||
eattr = [:end_attribute]
|
||||
text = [:text, nil]
|
||||
k,v = event[2].find { |k,v|
|
||||
sattr[1] = k
|
||||
#puts "Looking for #{sattr.inspect}"
|
||||
m = @current.next( sattr )
|
||||
#puts "Got #{m.inspect}"
|
||||
if m
|
||||
# If the state has text children...
|
||||
#puts "Looking for #{eattr.inspect}"
|
||||
#puts "Expect #{m.expected}"
|
||||
if m.matches?( eattr )
|
||||
#puts "Got end"
|
||||
@current = m
|
||||
else
|
||||
#puts "Didn't get end"
|
||||
text[1] = v
|
||||
#puts "Looking for #{text.inspect}"
|
||||
m = m.next( text )
|
||||
#puts "Got #{m.inspect}"
|
||||
text[1] = nil
|
||||
return false unless m
|
||||
@current = m if m
|
||||
end
|
||||
m = @current.next( eattr )
|
||||
if m
|
||||
@current = m
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
else
|
||||
false
|
||||
end
|
||||
}
|
||||
event[2].delete(k) if k
|
||||
end while k
|
||||
when :end_element
|
||||
attrs = @attr_stack.pop
|
||||
raise ValidationException.new( "Validation error. Illegal "+
|
||||
" attributes: #{attrs.inspect}") if attrs.length > 0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Event
|
||||
def initialize(event_type, event_arg=nil )
|
||||
@event_type = event_type
|
||||
@event_arg = event_arg
|
||||
end
|
||||
|
||||
attr_reader :done?
|
||||
attr_reader :event_type
|
||||
attr_accessor :event_arg
|
||||
|
||||
def single?
|
||||
return (@event_type != :start_element and @event_type != :start_attribute)
|
||||
end
|
||||
|
||||
def matches?( event )
|
||||
#puts "#@event_type =? #{event[0]} && #@event_arg =? #{event[1]} "
|
||||
return false unless event[0] == @event_type
|
||||
case event[0]
|
||||
when nil
|
||||
return true
|
||||
when :start_element
|
||||
return true if event[1] == @event_arg
|
||||
when :end_element
|
||||
return true
|
||||
when :start_attribute
|
||||
return true if event[1] == @event_arg
|
||||
when :end_attribute
|
||||
return true
|
||||
when :end_document
|
||||
return true
|
||||
when :text
|
||||
return (@event_arg.nil? or @event_arg == event[1])
|
||||
=begin
|
||||
when :processing_instruction
|
||||
false
|
||||
when :xmldecl
|
||||
false
|
||||
when :start_doctype
|
||||
false
|
||||
when :end_doctype
|
||||
false
|
||||
when :externalentity
|
||||
false
|
||||
when :elementdecl
|
||||
false
|
||||
when :entity
|
||||
false
|
||||
when :attlistdecl
|
||||
false
|
||||
when :notationdecl
|
||||
false
|
||||
when :end_doctype
|
||||
false
|
||||
=end
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def ==( other )
|
||||
return false unless other.kind_of? Event
|
||||
@event_type == other.event_type and @event_arg == other.event_arg
|
||||
end
|
||||
|
||||
def to_s
|
||||
inspect
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#{@event_type.inspect}( #@event_arg )"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue