From 75a138732efe3c19e99154eb3f9795d5f93c26ec Mon Sep 17 00:00:00 2001 From: kou Date: Fri, 26 Jul 2013 14:17:24 +0000 Subject: * lib/rexml/parsers/streamparser.rb (REXML::Parsers::StreamParser#parse): Add "entity" event support to listener. [Bug #8689] [ruby-dev:47542] Reported by Ippei Obayashi. * test/rexml/test_stream.rb (StreamTester#entity): Add a test for the above case. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42198 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++++++++ lib/rexml/parsers/streamparser.rb | 4 ++++ test/rexml/test_stream.rb | 23 +++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/ChangeLog b/ChangeLog index f735413312..0185c30392 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Fri Jul 26 23:14:31 2013 Kouhei Sutou + + * lib/rexml/parsers/streamparser.rb + (REXML::Parsers::StreamParser#parse): Add "entity" event support to + listener. [Bug #8689] [ruby-dev:47542] + Reported by Ippei Obayashi. + * test/rexml/test_stream.rb (StreamTester#entity): Add a test for + the above case. + Fri Jul 26 23:05:27 2013 Nobuyoshi Nakada * parse.y (parser_yylex): separate numeric literal from succeeding diff --git a/lib/rexml/parsers/streamparser.rb b/lib/rexml/parsers/streamparser.rb index 073fcc2c21..9456ea8599 100644 --- a/lib/rexml/parsers/streamparser.rb +++ b/lib/rexml/parsers/streamparser.rb @@ -38,6 +38,10 @@ module REXML @listener.send( event[0].to_s, *event[1..-1] ) when :entitydecl, :notationdecl @listener.send( event[0].to_s, event[1..-1] ) + when :externalentity + entity_reference = event[1] + content = entity_reference.gsub(/\A%|;\z/, "") + @listener.entity(content) end end end diff --git a/test/rexml/test_stream.rb b/test/rexml/test_stream.rb index 3f876aed35..0ae1bc6df2 100644 --- a/test/rexml/test_stream.rb +++ b/test/rexml/test_stream.rb @@ -63,6 +63,29 @@ class StreamTester < Test::Unit::TestCase assert( listener.events[:elementdecl] ) assert( listener.events[:notationdecl] ) end + + def test_entity + listener = MyListener.new + class << listener + attr_accessor :entities + def entity(content) + @entities << content + end + end + listener.entities = [] + + source = StringIO.new(<<-XML) + +%ISOLat2; +]> + + XML + REXML::Document.parse_stream(source, listener) + + assert_equal(["ISOLat2"], listener.entities) + end end -- cgit v1.2.3