From f61f11a936a233f032dafa0298890ab8116c63bd Mon Sep 17 00:00:00 2001 From: kou Date: Sun, 11 Aug 2013 09:09:25 +0000 Subject: [PATCH] * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse): Support NDATA in external entity declaration. * test/rexml/parser/test_sax2.rb: Add tests for the above case. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42516 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/rexml/parsers/sax2parser.rb | 6 ++++++ test/rexml/parser/test_sax2.rb | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/ChangeLog b/ChangeLog index b96482d641..a429bb49a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Aug 11 18:08:40 2013 Kouhei Sutou + + * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse): + Support NDATA in external entity declaration. + * test/rexml/parser/test_sax2.rb: Add tests for the above case. + Sun Aug 11 18:07:39 2013 Kouhei Sutou * lib/rexml/parsers/baseparser.rb diff --git a/lib/rexml/parsers/sax2parser.rb b/lib/rexml/parsers/sax2parser.rb index d73daf7036..4a95bc6fff 100644 --- a/lib/rexml/parsers/sax2parser.rb +++ b/lib/rexml/parsers/sax2parser.rb @@ -177,6 +177,12 @@ module REXML handle( :characters, copy ) when :entitydecl @entities[ event[1] ] = event[2] if event.size == 3 + case event[2] + when "SYSTEM" + event[4, 0] = "NDATA" if event.size == 5 + when "PUBLIC" + event[5, 0] = "NDATA" if event.size == 6 + end handle( event[0], event[1..-1] ) when :processing_instruction, :comment, :attlistdecl, :elementdecl, :cdata, :notationdecl, :xmldecl diff --git a/test/rexml/parser/test_sax2.rb b/test/rexml/parser/test_sax2.rb index f1e64121af..a4279fa5d3 100644 --- a/test/rexml/parser/test_sax2.rb +++ b/test/rexml/parser/test_sax2.rb @@ -54,6 +54,18 @@ class TestSAX2Parser < Test::Unit::TestCase class TestExternlID < self class TestSystem < self + def test_with_ndata + declaration = [ + "name", + "SYSTEM", "system-literal", + "NDATA", "ndata-name", + ] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) + + INTERNAL_SUBSET + end + def test_without_ndata declaration = [ "name", @@ -67,6 +79,18 @@ class TestSAX2Parser < Test::Unit::TestCase end class TestPublic < self + def test_with_ndata + declaration = [ + "name", + "PUBLIC", "public-literal", "system-literal", + "NDATA", "ndata-name", + ] + assert_equal([declaration], + parse(<<-INTERNAL_SUBSET)) + + INTERNAL_SUBSET + end + def test_without_ndata declaration = [ "name",