From 7271e74396d7f611c8b3bc16a3dfec3cc589856a Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Tue, 18 Mar 2014 18:55:16 +0100 Subject: [PATCH] Revert "Compacter parser AST." Although this AST is compacter it will result in conflicts between (text), (attributes) and (attribute) nodes in regular XML documents. This is due to XML allowing elements with these names (unlike in HTML). This reverts commit 8898d08831c57fffee49f3aa7fd6188241f5ff93. --- lib/oga/parser.y | 8 ++-- spec/oga/parser/documents_spec.rb | 11 ++++-- spec/oga/parser/elements_spec.rb | 46 +++++++++++++--------- spec/oga/parser/html_void_elements_spec.rb | 29 ++++++++++---- 4 files changed, 60 insertions(+), 34 deletions(-) diff --git a/lib/oga/parser.y b/lib/oga/parser.y index d844f1c..6c86e5c 100644 --- a/lib/oga/parser.y +++ b/lib/oga/parser.y @@ -77,18 +77,16 @@ rule element : element_open attributes element_body T_ELEM_CLOSE { - namespace, name = val[0] - - s(name, namespace, val[1], val[2]) + s(:element, val[0], val[1], val[2]) } ; element_open #

- : T_ELEM_OPEN T_ELEM_NAME { [nil, val[1].to_sym] } + : T_ELEM_OPEN T_ELEM_NAME { [nil, val[1]] } # - | T_ELEM_OPEN T_ELEM_NS T_ELEM_NAME { [val[1], val[2].to_sym] } + | T_ELEM_OPEN T_ELEM_NS T_ELEM_NAME { [val[1], val[2]] } ; elements diff --git a/spec/oga/parser/documents_spec.rb b/spec/oga/parser/documents_spec.rb index c289e4d..204f8d7 100644 --- a/spec/oga/parser/documents_spec.rb +++ b/spec/oga/parser/documents_spec.rb @@ -20,24 +20,27 @@ describe Oga::Parser do # s( - :html, + :element, nil, + 'html', nil, s(:text, "\n"), # s( - :head, + :element, nil, + 'head', nil, s(:text, "\n"), # s( - :title, + :element, nil, + 'title', nil, s(:text, 'Title') ), @@ -47,7 +50,7 @@ describe Oga::Parser do # <body> s(:text, "\n"), - s(:body, nil, nil, nil), + s(:element, nil, 'body', nil, nil), s(:text, "\n") ), s(:text, "\n") diff --git a/spec/oga/parser/elements_spec.rb b/spec/oga/parser/elements_spec.rb index 69156fd..9b71b5d 100644 --- a/spec/oga/parser/elements_spec.rb +++ b/spec/oga/parser/elements_spec.rb @@ -3,27 +3,30 @@ require 'spec_helper' describe Oga::Parser do context 'elements' do example 'parse an empty element' do - parse('<p></p>').should == s(:document, s(:p, nil, nil, nil)) + parse('<p></p>').should == s( + :document, + s(:element, nil, 'p', nil, nil) + ) end example 'parse an element with text' do parse('<p>foo</p>').should == s( :document, - s(:p, nil, nil, s(:text, 'foo')) + s(:element, nil, 'p', nil, s(:text, 'foo')) ) end example 'parse an element with a single attribute' do parse('<p foo></p>').should == s( :document, - s(:p, nil, s(:attributes, s(:attribute, 'foo')), nil) + s(:element, nil, 'p', s(:attributes, s(:attribute, 'foo')), nil) ) end example 'parse an element with a single attribute with a value' do parse('<p foo="bar"></p>').should == s( :document, - s(:p, nil, s(:attributes, s(:attribute, 'foo', 'bar')), nil) + s(:element, nil, 'p', s(:attributes, s(:attribute, 'foo', 'bar')), nil) ) end @@ -31,8 +34,9 @@ describe Oga::Parser do parse('<p foo="bar" baz="bad"></p>').should == s( :document, s( - :p, + :element, nil, + 'p', s( :attributes, s(:attribute, 'foo', 'bar'), @@ -47,8 +51,9 @@ describe Oga::Parser do parse('<p class="foo">Bar</p>').should == s( :document, s( - :p, + :element, nil, + 'p', s(:attributes, s(:attribute, 'class', 'foo')), s(:text, 'Bar') ) @@ -58,7 +63,7 @@ describe Oga::Parser do example 'parse an element with a namespace' do parse('<foo:p></p>').should == s( :document, - s(:p, 'foo', nil, nil) + s(:element, 'foo', 'p', nil, nil) ) end @@ -66,8 +71,9 @@ describe Oga::Parser do parse('<foo:p class="bar"></p>').should == s( :document, s( - :p, + :element, 'foo', + 'p', s(:attributes, s(:attribute, 'class', 'bar')), nil ) @@ -77,7 +83,7 @@ describe Oga::Parser do example 'parse an element nested inside another element' do parse('<p><a></a></p>').should == s( :document, - s(:p, nil, nil, s(:a, nil, nil, nil)) + s(:element, nil, 'p', nil, s(:element, nil, 'a', nil, nil)) ) end @@ -85,11 +91,12 @@ describe Oga::Parser do parse('<p>Foo<a>Bar</a></p>').should == s( :document, s( - :p, + :element, nil, + 'p', nil, s(:text, 'Foo'), - s(:a, nil, nil, s(:text, 'Bar')) + s(:element, nil, 'a', nil, s(:text, 'Bar')) ) ) end @@ -98,11 +105,12 @@ describe Oga::Parser do parse('<p>Foo<a>Bar</a>Baz</p>').should == s( :document, s( - :p, + :element, nil, + 'p', nil, s(:text, 'Foo'), - s(:a, nil, nil, s(:text, 'Bar')), + s(:element, nil, 'a', nil, s(:text, 'Bar')), s(:text, 'Baz') ) ) @@ -112,10 +120,11 @@ describe Oga::Parser do parse('<p><a>Bar</a>Baz</p>').should == s( :document, s( - :p, + :element, nil, + 'p', nil, - s(:a, nil, nil, s(:text, 'Bar')), + s(:element, nil, 'a', nil, s(:text, 'Bar')), s(:text, 'Baz') ) ) @@ -125,12 +134,13 @@ describe Oga::Parser do parse('<p><a>Bar</a>Baz<span>Da</span></p>').should == s( :document, s( - :p, + :element, nil, + 'p', nil, - s(:a, nil, nil, s(:text, 'Bar')), + s(:element, nil, 'a', nil, s(:text, 'Bar')), s(:text, 'Baz'), - s(:span, nil, nil, s(:text, 'Da')) + s(:element, nil, 'span', nil, s(:text, 'Da')) ) ) end diff --git a/spec/oga/parser/html_void_elements_spec.rb b/spec/oga/parser/html_void_elements_spec.rb index 3b98e2d..74d135e 100644 --- a/spec/oga/parser/html_void_elements_spec.rb +++ b/spec/oga/parser/html_void_elements_spec.rb @@ -5,14 +5,14 @@ describe Oga::Parser do example 'parse a void element that omits the closing /' do parse('<link>', :html => true).should == s( :document, - s(:link, nil, nil, nil) + s(:element, nil, 'link', nil, nil) ) end example 'parse a void element inside another element' do parse('<head><link></head>', :html => true).should == s( :document, - s(:head, nil, nil, s(:link, nil, nil, nil)) + s(:element, nil, 'head', nil, s(:element, nil, 'link', nil, nil)) ) end @@ -20,12 +20,14 @@ describe Oga::Parser do parse('<head><link href="foo.css"></head>', :html => true).should == s( :document, s( - :head, + :element, nil, + 'head', nil, s( - :link, + :element, nil, + 'link', s(:attributes, s(:attribute, 'href', 'foo.css')), nil ) @@ -37,11 +39,24 @@ describe Oga::Parser do parse('<head><link><title>Foo', :html => true).should == s( :document, s( - :head, + :element, nil, + 'head', nil, - s(:link, nil, nil, nil), - s(:title, nil, nil, s(:text, 'Foo')) + s( + :element, + nil, + 'link', + nil, + nil + ), + s( + :element, + nil, + 'title', + nil, + s(:text, 'Foo') + ) ) ) end