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 8898d08831.
This commit is contained in:
Yorick Peterse 2014-03-18 18:55:16 +01:00
parent 9687dd379f
commit 7271e74396
4 changed files with 60 additions and 34 deletions

View File

@ -77,18 +77,16 @@ rule
element element
: element_open attributes element_body T_ELEM_CLOSE : element_open attributes element_body T_ELEM_CLOSE
{ {
namespace, name = val[0] s(:element, val[0], val[1], val[2])
s(name, namespace, val[1], val[2])
} }
; ;
element_open element_open
# <p> # <p>
: T_ELEM_OPEN T_ELEM_NAME { [nil, val[1].to_sym] } : T_ELEM_OPEN T_ELEM_NAME { [nil, val[1]] }
# <foo:p> # <foo:p>
| 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 elements

View File

@ -20,24 +20,27 @@ describe Oga::Parser do
# <html> # <html>
s( s(
:html, :element,
nil, nil,
'html',
nil, nil,
s(:text, "\n"), s(:text, "\n"),
# <head> # <head>
s( s(
:head, :element,
nil, nil,
'head',
nil, nil,
s(:text, "\n"), s(:text, "\n"),
# <title> # <title>
s( s(
:title, :element,
nil, nil,
'title',
nil, nil,
s(:text, 'Title') s(:text, 'Title')
), ),
@ -47,7 +50,7 @@ describe Oga::Parser do
# <body> # <body>
s(:text, "\n"), s(:text, "\n"),
s(:body, nil, nil, nil), s(:element, nil, 'body', nil, nil),
s(:text, "\n") s(:text, "\n")
), ),
s(:text, "\n") s(:text, "\n")

View File

@ -3,27 +3,30 @@ require 'spec_helper'
describe Oga::Parser do describe Oga::Parser do
context 'elements' do context 'elements' do
example 'parse an empty element' 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 end
example 'parse an element with text' do example 'parse an element with text' do
parse('<p>foo</p>').should == s( parse('<p>foo</p>').should == s(
:document, :document,
s(:p, nil, nil, s(:text, 'foo')) s(:element, nil, 'p', nil, s(:text, 'foo'))
) )
end end
example 'parse an element with a single attribute' do example 'parse an element with a single attribute' do
parse('<p foo></p>').should == s( parse('<p foo></p>').should == s(
:document, :document,
s(:p, nil, s(:attributes, s(:attribute, 'foo')), nil) s(:element, nil, 'p', s(:attributes, s(:attribute, 'foo')), nil)
) )
end end
example 'parse an element with a single attribute with a value' do example 'parse an element with a single attribute with a value' do
parse('<p foo="bar"></p>').should == s( parse('<p foo="bar"></p>').should == s(
:document, :document,
s(:p, nil, s(:attributes, s(:attribute, 'foo', 'bar')), nil) s(:element, nil, 'p', s(:attributes, s(:attribute, 'foo', 'bar')), nil)
) )
end end
@ -31,8 +34,9 @@ describe Oga::Parser do
parse('<p foo="bar" baz="bad"></p>').should == s( parse('<p foo="bar" baz="bad"></p>').should == s(
:document, :document,
s( s(
:p, :element,
nil, nil,
'p',
s( s(
:attributes, :attributes,
s(:attribute, 'foo', 'bar'), s(:attribute, 'foo', 'bar'),
@ -47,8 +51,9 @@ describe Oga::Parser do
parse('<p class="foo">Bar</p>').should == s( parse('<p class="foo">Bar</p>').should == s(
:document, :document,
s( s(
:p, :element,
nil, nil,
'p',
s(:attributes, s(:attribute, 'class', 'foo')), s(:attributes, s(:attribute, 'class', 'foo')),
s(:text, 'Bar') s(:text, 'Bar')
) )
@ -58,7 +63,7 @@ describe Oga::Parser do
example 'parse an element with a namespace' do example 'parse an element with a namespace' do
parse('<foo:p></p>').should == s( parse('<foo:p></p>').should == s(
:document, :document,
s(:p, 'foo', nil, nil) s(:element, 'foo', 'p', nil, nil)
) )
end end
@ -66,8 +71,9 @@ describe Oga::Parser do
parse('<foo:p class="bar"></p>').should == s( parse('<foo:p class="bar"></p>').should == s(
:document, :document,
s( s(
:p, :element,
'foo', 'foo',
'p',
s(:attributes, s(:attribute, 'class', 'bar')), s(:attributes, s(:attribute, 'class', 'bar')),
nil nil
) )
@ -77,7 +83,7 @@ describe Oga::Parser do
example 'parse an element nested inside another element' do example 'parse an element nested inside another element' do
parse('<p><a></a></p>').should == s( parse('<p><a></a></p>').should == s(
:document, :document,
s(:p, nil, nil, s(:a, nil, nil, nil)) s(:element, nil, 'p', nil, s(:element, nil, 'a', nil, nil))
) )
end end
@ -85,11 +91,12 @@ describe Oga::Parser do
parse('<p>Foo<a>Bar</a></p>').should == s( parse('<p>Foo<a>Bar</a></p>').should == s(
:document, :document,
s( s(
:p, :element,
nil, nil,
'p',
nil, nil,
s(:text, 'Foo'), s(:text, 'Foo'),
s(:a, nil, nil, s(:text, 'Bar')) s(:element, nil, 'a', nil, s(:text, 'Bar'))
) )
) )
end end
@ -98,11 +105,12 @@ describe Oga::Parser do
parse('<p>Foo<a>Bar</a>Baz</p>').should == s( parse('<p>Foo<a>Bar</a>Baz</p>').should == s(
:document, :document,
s( s(
:p, :element,
nil, nil,
'p',
nil, nil,
s(:text, 'Foo'), s(:text, 'Foo'),
s(:a, nil, nil, s(:text, 'Bar')), s(:element, nil, 'a', nil, s(:text, 'Bar')),
s(:text, 'Baz') s(:text, 'Baz')
) )
) )
@ -112,10 +120,11 @@ describe Oga::Parser do
parse('<p><a>Bar</a>Baz</p>').should == s( parse('<p><a>Bar</a>Baz</p>').should == s(
:document, :document,
s( s(
:p, :element,
nil, nil,
'p',
nil, nil,
s(:a, nil, nil, s(:text, 'Bar')), s(:element, nil, 'a', nil, s(:text, 'Bar')),
s(:text, 'Baz') s(:text, 'Baz')
) )
) )
@ -125,12 +134,13 @@ describe Oga::Parser do
parse('<p><a>Bar</a>Baz<span>Da</span></p>').should == s( parse('<p><a>Bar</a>Baz<span>Da</span></p>').should == s(
:document, :document,
s( s(
:p, :element,
nil, nil,
'p',
nil, nil,
s(:a, nil, nil, s(:text, 'Bar')), s(:element, nil, 'a', nil, s(:text, 'Bar')),
s(:text, 'Baz'), s(:text, 'Baz'),
s(:span, nil, nil, s(:text, 'Da')) s(:element, nil, 'span', nil, s(:text, 'Da'))
) )
) )
end end

View File

@ -5,14 +5,14 @@ describe Oga::Parser do
example 'parse a void element that omits the closing /' do example 'parse a void element that omits the closing /' do
parse('<link>', :html => true).should == s( parse('<link>', :html => true).should == s(
:document, :document,
s(:link, nil, nil, nil) s(:element, nil, 'link', nil, nil)
) )
end end
example 'parse a void element inside another element' do example 'parse a void element inside another element' do
parse('<head><link></head>', :html => true).should == s( parse('<head><link></head>', :html => true).should == s(
:document, :document,
s(:head, nil, nil, s(:link, nil, nil, nil)) s(:element, nil, 'head', nil, s(:element, nil, 'link', nil, nil))
) )
end end
@ -20,12 +20,14 @@ describe Oga::Parser do
parse('<head><link href="foo.css"></head>', :html => true).should == s( parse('<head><link href="foo.css"></head>', :html => true).should == s(
:document, :document,
s( s(
:head, :element,
nil, nil,
'head',
nil, nil,
s( s(
:link, :element,
nil, nil,
'link',
s(:attributes, s(:attribute, 'href', 'foo.css')), s(:attributes, s(:attribute, 'href', 'foo.css')),
nil nil
) )
@ -37,11 +39,24 @@ describe Oga::Parser do
parse('<head><link><title>Foo</title></head>', :html => true).should == s( parse('<head><link><title>Foo</title></head>', :html => true).should == s(
:document, :document,
s( s(
:head, :element,
nil, nil,
'head',
nil, nil,
s(:link, nil, nil, nil), s(
s(:title, nil, nil, s(:text, 'Foo')) :element,
nil,
'link',
nil,
nil
),
s(
:element,
nil,
'title',
nil,
s(:text, 'Foo')
)
) )
) )
end end