1 require "rexml/child"
2 module 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
39 end