1require "rexml/child" 2module REXML 3 module DTD 4 class NotationDecl < Child 5 START = "<!NOTATION" 6 START_RE = /^\s*#{START}/um 7 PUBLIC = /^\s*#{START}\s+(\w[\w-]*)\s+(PUBLIC)\s+((["']).*?\4)\s*>/um 8 SYSTEM = /^\s*#{START}\s+(\w[\w-]*)\s+(SYSTEM)\s+((["']).*?\4)\s*>/um 9 def initialize src 10 super() 11 if src.match( PUBLIC ) 12 md = src.match( PUBLIC, true ) 13 elsif src.match( SYSTEM ) 14 md = src.match( SYSTEM, true ) 15 else 16 raise ParseException.new( "error parsing notation: no matching pattern", src ) 17 end 18 @name = md[1] 19 @middle = md[2] 20 @rest = md[3] 21 end 22 23 def to_s 24 "<!NOTATION #@name #@middle #@rest>" 25 end 26 27 def write( output, indent ) 28 indent( output, indent ) 29 output << to_s 30 end 31 32 def NotationDecl.parse_source source, listener 33 md = source.match( PATTERN_RE, true ) 34 thing = md[0].squeeze(" \t\n\r") 35 listener.send inspect.downcase, thing 36 end 37 end 38 end 39end 40