module Rules URI_RE = /^([a-zA-Z][0-9a-zA-Z+\-\.]*:)?\/{0,2}[0-9a-zA-Z;\/?:@&=+$\.\-_!~*'()%,#]*$/ class Rfc2396 < DataElement def message log :InvalidLink end def validate value if value =~ URI_RE log :ValidURI else message end end end class Rfc2396_attr < Rfc2396 def message log :InvalidURIAttribute end end class Rfc2396_rel < Rfc2396 def message log :InvalidAtomLinkRel end end class Rfc2396_full < DataElement def validate value if value =~ /^[a-zA-Z][0-9a-zA-Z+\-\.]*:(\/\/)?[0-9a-zA-Z;\/?:@&=+$\.\-_!~*'()%,#]+$/ log :ValidURI else log :InvalidFullLink end end end class SetXmlBase < DataElement def validate value if value =~ URI_RE log :ValidURI require 'uri' @parent.xmlbase = @parent.xmlbase.merge(value) if @parent.xmlbase else log :InvalidURI end end end class XmlBase < DataElement def validate value if @xmlbase require 'uri' root = parent root = root.parent while root.respond_to? :parent docbase = root.xmlbase.normalize.to_s.split('#')[0] elembase = @xmlbase.normalize.to_s.split('#')[0] value = @xmlbase.merge(value).normalize.to_s.split('#')[0] if (value==elembase) and (elembase!=docbase): log :SameDocumentReference end end rescue URI::InvalidURIError end end end