mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
95be40a06d
@@ SAX2 listener bug fixes @@ @@ Undid a code change that caused a 10x speed regression @@ @@ Indentation fixes, and a new word wrapping feature for text nodes was contributed by Devin Bayer (documentation forthcoming; see the change logs for now) @@ The XPath bug fix is really ugly and inefficient, but I spent two days hacking at it and this was the best I could come up with. The SAX2 listener fixes had to do with crashes in certain conditions, like when there was a carriage return at the end of a document Several people submitted patches for the speed regression; it is embarrassing how long it took me to get around to looking at this. To this day, I don't know where the offending code came from. Encoding fixes Added a contributed word wrapping option for text formatting. Devin Bayer contributed this. Here's his comment: "Setting :wordwrapping to :all, wordwraps all text nodes longer than 60 characters. Setting :indentstyle to aString, make aString used as indentation, instead of the default ' '. And as long as :respect_whitespace isn't set for the element, multiline text nodes will be indented." git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5696 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
56 lines
1.4 KiB
Ruby
56 lines
1.4 KiB
Ruby
require "rexml/child"
|
|
module REXML
|
|
module DTD
|
|
class EntityDecl < Child
|
|
START = "<!ENTITY"
|
|
START_RE = /^\s*#{START}/um
|
|
PUBLIC = /^\s*#{START}\s+(?:%\s+)?(\w+)\s+PUBLIC\s+((["']).*?\3)\s+((["']).*?\5)\s*>/um
|
|
SYSTEM = /^\s*#{START}\s+(?:%\s+)?(\w+)\s+SYSTEM\s+((["']).*?\3)(?:\s+NDATA\s+\w+)?\s*>/um
|
|
PLAIN = /^\s*#{START}\s+(\w+)\s+((["']).*?\3)\s*>/um
|
|
PERCENT = /^\s*#{START}\s+%\s+(\w+)\s+((["']).*?\3)\s*>/um
|
|
# <!ENTITY name SYSTEM "...">
|
|
# <!ENTITY name "...">
|
|
def initialize src
|
|
super()
|
|
md = nil
|
|
if src.match( PUBLIC )
|
|
md = src.match( PUBLIC, true )
|
|
@middle = "PUBLIC"
|
|
@content = "#{md[2]} #{md[4]}"
|
|
elsif src.match( SYSTEM )
|
|
md = src.match( SYSTEM, true )
|
|
@middle = "SYSTEM"
|
|
@content = md[2]
|
|
elsif src.match( PLAIN )
|
|
md = src.match( PLAIN, true )
|
|
@middle = ""
|
|
@content = md[2]
|
|
elsif src.match( PERCENT )
|
|
md = src.match( PERCENT, true )
|
|
@middle = ""
|
|
@content = md[2]
|
|
end
|
|
raise ParseException.new("failed Entity match", src) if md.nil?
|
|
@name = md[1]
|
|
end
|
|
|
|
def to_s
|
|
rv = "<!ENTITY #@name "
|
|
rv << "#@middle " if @middle.size > 0
|
|
rv << @content
|
|
rv
|
|
end
|
|
|
|
def write( output, indent )
|
|
indent( output, indent )
|
|
output << to_s
|
|
end
|
|
|
|
def EntityDecl.parse_source source, listener
|
|
md = source.match( PATTERN_RE, true )
|
|
thing = md[0].squeeze(" \t\n\r")
|
|
listener.send inspect.downcase, thing
|
|
end
|
|
end
|
|
end
|
|
end
|