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:
parent
9687dd379f
commit
7271e74396
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue