From 8898d08831c57fffee49f3aa7fd6188241f5ff93 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Mon, 17 Mar 2014 21:03:54 +0100 Subject: [PATCH] Compacter parser AST. The AST no longer uses the generic `element` type for element nodes but instead changes the type based on the element type. That is, a

element now results in an (p) node, in (link), etc. --- 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, 34 insertions(+), 60 deletions(-) diff --git a/lib/oga/parser.y b/lib/oga/parser.y index 6c86e5c..d844f1c 100644 --- a/lib/oga/parser.y +++ b/lib/oga/parser.y @@ -77,16 +77,18 @@ rule element : element_open attributes element_body T_ELEM_CLOSE { - s(:element, val[0], val[1], val[2]) + namespace, name = val[0] + + s(name, namespace, val[1], val[2]) } ; element_open #

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