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