mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* lib/rexml/parsers/ultralightparser.rb
(REXML::Parsers::UltraLightParser#parse): Fix wrong :start_doctype position. [Bug #9061] [ruby-dev:47778] Patch by Ippei Obayashi. Thanks!!! * test/rexml/parser/test_ultra_light.rb: Add a test for this case. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43693 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									bc3db2a512
								
							
						
					
					
						commit
						a66a9fbb10
					
				
					 3 changed files with 78 additions and 1 deletions
				
			
		
							
								
								
									
										10
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								ChangeLog
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,13 @@
 | 
			
		|||
Sat Nov 16 18:28:08 2013  Kouhei Sutou  <kou@cozmixng.org>
 | 
			
		||||
 | 
			
		||||
	* lib/rexml/parsers/ultralightparser.rb
 | 
			
		||||
	  (REXML::Parsers::UltraLightParser#parse): Fix wrong :start_doctype
 | 
			
		||||
	  position.
 | 
			
		||||
	  [Bug #9061] [ruby-dev:47778]
 | 
			
		||||
	  Patch by Ippei Obayashi. Thanks!!!
 | 
			
		||||
 | 
			
		||||
	* test/rexml/parser/test_ultra_light.rb: Add a test for this case.
 | 
			
		||||
 | 
			
		||||
Sat Nov 16 02:13:56 2013  Masaya Tarui  <tarui@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* cont.c : Introduce ensure rollback mechanism. Please see below.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ module REXML
 | 
			
		|||
            break
 | 
			
		||||
          when :end_doctype
 | 
			
		||||
            context = context[1]
 | 
			
		||||
          when :start_element, :doctype
 | 
			
		||||
          when :start_element, :start_doctype
 | 
			
		||||
            context << event
 | 
			
		||||
            event[1,0] = [context]
 | 
			
		||||
            context = event
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										67
									
								
								test/rexml/parser/test_ultra_light.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								test/rexml/parser/test_ultra_light.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,67 @@
 | 
			
		|||
require "test/unit"
 | 
			
		||||
require "rexml/parsers/ultralightparser"
 | 
			
		||||
 | 
			
		||||
class TestUltraLightParser < Test::Unit::TestCase
 | 
			
		||||
  class TestDocumentTypeDeclaration < self
 | 
			
		||||
    def test_entity_declaration
 | 
			
		||||
      assert_equal([
 | 
			
		||||
                     [
 | 
			
		||||
                       :start_doctype,
 | 
			
		||||
                       :parent,
 | 
			
		||||
                       "root",
 | 
			
		||||
                       "SYSTEM",
 | 
			
		||||
                       "urn:x-test",
 | 
			
		||||
                       nil,
 | 
			
		||||
                       [:entitydecl, "name", "value"]
 | 
			
		||||
                     ],
 | 
			
		||||
                     [:text, "\n"],
 | 
			
		||||
                     [:start_element, :parent, "root", {}],
 | 
			
		||||
                     [:text, "\n"],
 | 
			
		||||
                   ],
 | 
			
		||||
                   parse(<<-INTERNAL_SUBSET))
 | 
			
		||||
<!ENTITY name "value">
 | 
			
		||||
      INTERNAL_SUBSET
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    private
 | 
			
		||||
    def xml(internal_subset)
 | 
			
		||||
      <<-XML
 | 
			
		||||
<!DOCTYPE root SYSTEM "urn:x-test" [
 | 
			
		||||
#{internal_subset}
 | 
			
		||||
]>
 | 
			
		||||
<root/>
 | 
			
		||||
      XML
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def parse(internal_subset)
 | 
			
		||||
      parser = REXML::Parsers::UltraLightParser.new(xml(internal_subset))
 | 
			
		||||
      normalize(parser.parse)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def normalize(root)
 | 
			
		||||
      root.collect do |child|
 | 
			
		||||
        normalize_child(child)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def normalize_child(child)
 | 
			
		||||
      tag = child.first
 | 
			
		||||
      case tag
 | 
			
		||||
      when :start_doctype
 | 
			
		||||
        normalized_parent = :parent
 | 
			
		||||
        normalized_doctype = child.dup
 | 
			
		||||
        normalized_doctype[1] = normalized_parent
 | 
			
		||||
        normalized_doctype
 | 
			
		||||
      when :start_element
 | 
			
		||||
        tag, parent, name, attributes, *children = child
 | 
			
		||||
        normalized_parent = :parent
 | 
			
		||||
        normalized_children = children.collect do |sub_child|
 | 
			
		||||
          normalize_child(sub_child)
 | 
			
		||||
        end
 | 
			
		||||
        [tag, normalized_parent, name, attributes, *normalized_children]
 | 
			
		||||
      else
 | 
			
		||||
        child
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue