Ticket #92: doctype.patch

File doctype.patch, 4.9 KB (added by jeff.barczewski@…, 3 years ago)

Patch containing test cases and fixes for doctype sax event and missing name exception

  • src/rexml/parsers/baseparser.rb

    diff -Naurb rexml_3.1.5/src/rexml/parsers/baseparser.rb rexml_3.1.5.patch_doctype/src/rexml/parsers/baseparser.rb
    old new  
    5353      STANDALONE = /\bstandalone=["'](.*?)['"]/um 
    5454 
    5555      ENTITY_START = /^\s*<!ENTITY/ 
    56       IDENTITY = /^([!\*\w\-]+)(\s+#{NCNAME_STR})?(\s+["'].*?['"])?(\s+['"].*?["'])?/u 
     56      IDENTITY = /^([!\*\w\-]+)(\s+#{NCNAME_STR})?(\s+["'](.*?)['"])?(\s+['"](.*?)["'])?/u 
    5757      ELEMENTDECL_START = /^\s*<!ELEMENT/um 
    5858      ELEMENTDECL_PATTERN = /^\s*(<!ELEMENT.*?)>/um 
    5959      SYSTEMENTITY = /^\s*(%.*?;)\s*$/um 
     
    219219            close = md[2] 
    220220            identity =~ IDENTITY 
    221221            name = $1 
    222             raise REXML::ParseException("DOCTYPE is missing a name") if name.nil? 
     222            raise REXML::ParseException.new("DOCTYPE is missing a name") if name.nil? 
    223223            pub_sys = $2.nil? ? nil : $2.strip 
    224             long_name = $3.nil? ? nil : $3.strip 
    225             uri = $4.nil? ? nil : $4.strip 
     224            long_name = $4.nil? ? nil : $4.strip 
     225            uri = $6.nil? ? nil : $6.strip 
    226226            args = [ :start_doctype, name, pub_sys, long_name, uri ] 
    227227            if close == ">" 
    228228              @document_status = :after_doctype 
  • src/rexml/parsers/sax2parser.rb

    diff -Naurb rexml_3.1.5/src/rexml/parsers/sax2parser.rb rexml_3.1.5.patch_doctype/src/rexml/parsers/sax2parser.rb
    old new  
    9090                                        when :end_document 
    9191                                                handle( :end_document ) 
    9292                                                break 
     93                                        when :start_doctype 
     94                                                handle( :doctype, *event[1..-1]) 
    9395                                        when :end_doctype 
    9496                                                context = context[1] 
    9597                                        when :start_element 
     
    163165          when :entitydecl 
    164166            @entities[ event[1] ] = event[2] if event.size == 3 
    165167                                                handle( *event ) 
    166                                         when :processing_instruction, :comment, :doctype, :attlistdecl,  
     168                                        when :processing_instruction, :comment, :attlistdecl,  
    167169                                                :elementdecl, :cdata, :notationdecl, :xmldecl 
    168170                                                handle( *event ) 
    169171                                        end 
  • test/sax.rb

    diff -Naurb rexml_3.1.5/test/sax.rb rexml_3.1.5.patch_doctype/test/sax.rb
    old new  
    8484    assert_equal 1, end_document 
    8585  end 
    8686 
     87 
     88 
     89  # used by test_simple_doctype_listener 
     90  # submitted by Jeff Barczewski 
     91  class SimpleDoctypeListener 
     92    include REXML::SAX2Listener 
     93    attr_reader :name, :pub_sys, :long_name, :uri 
     94 
     95    def initialize 
     96      @name = @pub_sys = @long_name = @uri = nil 
     97    end 
     98 
     99    def doctype(name, pub_sys, long_name, uri) 
     100      @name = name 
     101      @pub_sys = pub_sys 
     102      @long_name = long_name 
     103      @uri = uri 
     104    end 
     105  end 
     106 
     107  # test simple non-entity doctype in sax listener 
     108  # submitted by Jeff Barczewski 
     109  def test_simple_doctype_listener 
     110    xml = <<-END 
     111      <?xml version="1.0"?> 
     112      <!DOCTYPE greeting PUBLIC "Hello Greeting DTD" "http://foo/hello.dtd"> 
     113      <greeting>Hello, world!</greeting> 
     114    END 
     115    parser = Parsers::SAX2Parser.new(xml) 
     116    dtl = SimpleDoctypeListener.new 
     117    parser.listen(dtl) 
     118    tname = nil 
     119    tpub_sys = nil 
     120    tlong_name = nil 
     121    turi = nil 
     122    parser.listen(:doctype) do |name, pub_sys, long_name, uri| 
     123      tname = name 
     124      tpub_sys = pub_sys 
     125      tlong_name = long_name 
     126      turi = uri 
     127    end 
     128    parser.parse 
     129    assert_equal 'greeting', tname, 'simple doctype block listener failed - incorrect name' 
     130    assert_equal 'PUBLIC', tpub_sys, 'simple doctype block listener failed - incorrect pub_sys' 
     131    assert_equal 'Hello Greeting DTD', tlong_name, 'simple doctype block listener failed - incorrect long_name' 
     132    assert_equal 'http://foo/hello.dtd', turi, 'simple doctype block listener failed - incorrect uri' 
     133    assert_equal 'greeting', dtl.name, 'simple doctype listener failed - incorrect name' 
     134    assert_equal 'PUBLIC', dtl.pub_sys, 'simple doctype listener failed - incorrect pub_sys' 
     135    assert_equal 'Hello Greeting DTD', dtl.long_name, 'simple doctype listener failed - incorrect long_name' 
     136    assert_equal 'http://foo/hello.dtd', dtl.uri, 'simple doctype listener failed - incorrect uri' 
     137  end 
     138 
     139  # test doctype with missing name, should throw ParseException 
     140  # submitted by Jeff Barczewseki 
     141  def test_doctype_with_mising_name_throws_exception 
     142    xml = <<-END 
     143      <?xml version="1.0"?> 
     144      <!DOCTYPE > 
     145      <greeting>Hello, world!</greeting> 
     146    END 
     147    parser = Parsers::SAX2Parser.new(xml) 
     148    assert_raise(REXML::ParseException, 'doctype missing name did not throw ParseException') do 
     149      parser.parse 
     150    end 
     151  end 
     152 
     153 
    87154  class KouListener 
    88155    include REXML::SAX2Listener 
    89156    attr_accessor :sdoc, :edoc