2015-12-16 00:07:31 -05:00
|
|
|
# frozen_string_literal: false
|
2003-06-09 21:31:01 -04:00
|
|
|
require "rexml/child"
|
|
|
|
module REXML
|
2008-10-01 09:46:53 -04:00
|
|
|
module DTD
|
|
|
|
class NotationDecl < Child
|
|
|
|
START = "<!NOTATION"
|
|
|
|
START_RE = /^\s*#{START}/um
|
|
|
|
PUBLIC = /^\s*#{START}\s+(\w[\w-]*)\s+(PUBLIC)\s+((["']).*?\4)\s*>/um
|
|
|
|
SYSTEM = /^\s*#{START}\s+(\w[\w-]*)\s+(SYSTEM)\s+((["']).*?\4)\s*>/um
|
|
|
|
def initialize src
|
|
|
|
super()
|
|
|
|
if src.match( PUBLIC )
|
|
|
|
md = src.match( PUBLIC, true )
|
|
|
|
elsif src.match( SYSTEM )
|
|
|
|
md = src.match( SYSTEM, true )
|
|
|
|
else
|
|
|
|
raise ParseException.new( "error parsing notation: no matching pattern", src )
|
|
|
|
end
|
|
|
|
@name = md[1]
|
|
|
|
@middle = md[2]
|
|
|
|
@rest = md[3]
|
|
|
|
end
|
2003-06-09 21:31:01 -04:00
|
|
|
|
2008-10-01 09:46:53 -04:00
|
|
|
def to_s
|
|
|
|
"<!NOTATION #@name #@middle #@rest>"
|
|
|
|
end
|
2003-06-09 21:31:01 -04:00
|
|
|
|
2008-10-01 09:46:53 -04:00
|
|
|
def write( output, indent )
|
2004-02-13 17:40:14 -05:00
|
|
|
indent( output, indent )
|
2008-10-01 09:46:53 -04:00
|
|
|
output << to_s
|
|
|
|
end
|
2003-06-09 21:31:01 -04:00
|
|
|
|
2008-10-01 09:46:53 -04:00
|
|
|
def NotationDecl.parse_source source, listener
|
|
|
|
md = source.match( PATTERN_RE, true )
|
|
|
|
thing = md[0].squeeze(" \t\n\r")
|
2009-03-05 22:56:38 -05:00
|
|
|
listener.send inspect.downcase, thing
|
2008-10-01 09:46:53 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2003-06-09 21:31:01 -04:00
|
|
|
end
|