Basic support for parsing elements.
This includes support for elements with namespaces and attributes. Nested elements are not yet supported.
This commit is contained in:
parent
5ce515d224
commit
8cfa81aed9
|
@ -5,6 +5,7 @@ token T_STRING T_TEXT
|
||||||
token T_DOCTYPE_START T_DOCTYPE_END T_DOCTYPE_TYPE
|
token T_DOCTYPE_START T_DOCTYPE_END T_DOCTYPE_TYPE
|
||||||
token T_CDATA_START T_CDATA_END
|
token T_CDATA_START T_CDATA_END
|
||||||
token T_COMMENT_START T_COMMENT_END
|
token T_COMMENT_START T_COMMENT_END
|
||||||
|
token T_ELEM_OPEN T_ELEM_NAME T_ELEM_NS T_ELEM_CLOSE T_ATTR
|
||||||
|
|
||||||
options no_result_var
|
options no_result_var
|
||||||
|
|
||||||
|
@ -23,6 +24,8 @@ rule
|
||||||
: doctype
|
: doctype
|
||||||
| cdata
|
| cdata
|
||||||
| comment
|
| comment
|
||||||
|
| element
|
||||||
|
| text
|
||||||
;
|
;
|
||||||
|
|
||||||
# Doctypes
|
# Doctypes
|
||||||
|
@ -70,6 +73,66 @@ rule
|
||||||
| T_COMMENT_START T_TEXT T_COMMENT_END { s(:comment, val[1]) }
|
| T_COMMENT_START T_TEXT T_COMMENT_END { s(:comment, val[1]) }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
# Elements
|
||||||
|
|
||||||
|
element
|
||||||
|
# <p></p>
|
||||||
|
: element_open T_ELEM_CLOSE { s(:element, val[0]) }
|
||||||
|
|
||||||
|
# <p class="foo"></p>
|
||||||
|
| element_open attributes T_ELEM_CLOSE
|
||||||
|
{
|
||||||
|
s(:element, val[0], val[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
# <p>foo</p>
|
||||||
|
| element_open text T_ELEM_CLOSE
|
||||||
|
{
|
||||||
|
s(:element, val[0], nil, val[1])
|
||||||
|
}
|
||||||
|
|
||||||
|
# <p class="foo">Bar</p>
|
||||||
|
| element_open attributes text T_ELEM_CLOSE
|
||||||
|
{
|
||||||
|
s(:element, val[0], val[1], val[2])
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
element_open
|
||||||
|
# <p>
|
||||||
|
: T_ELEM_OPEN T_ELEM_NAME { [nil, val[1]] }
|
||||||
|
|
||||||
|
# <foo:p>
|
||||||
|
| T_ELEM_OPEN T_ELEM_NS T_ELEM_NAME { [val[1], val[2]] }
|
||||||
|
;
|
||||||
|
|
||||||
|
# Attributes
|
||||||
|
|
||||||
|
attributes
|
||||||
|
: attributes_ { s(:attributes, val[0]) }
|
||||||
|
;
|
||||||
|
|
||||||
|
attributes_
|
||||||
|
: attributes_ attribute { val }
|
||||||
|
| attribute { val }
|
||||||
|
;
|
||||||
|
|
||||||
|
attribute
|
||||||
|
# foo
|
||||||
|
: T_ATTR { s(:attribute, val[0]) }
|
||||||
|
|
||||||
|
# foo="bar"
|
||||||
|
| T_ATTR T_STRING { s(:attribute, val[0], val[1]) }
|
||||||
|
;
|
||||||
|
|
||||||
|
# Plain text
|
||||||
|
|
||||||
|
text
|
||||||
|
: T_TEXT { s(:text, val[0]) }
|
||||||
|
;
|
||||||
|
|
||||||
|
# Whitespace
|
||||||
|
|
||||||
whitespaces
|
whitespaces
|
||||||
: whitespaces whitespace
|
: whitespaces whitespace
|
||||||
| whitespace
|
| whitespace
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Oga::Parser do
|
||||||
|
context 'elements' do
|
||||||
|
example 'parse an empty element' do
|
||||||
|
parse_html('<p></p>').should == s(:document, s(:element, nil, 'p'))
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with text' do
|
||||||
|
parse_html('<p>foo</p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(:element, nil, 'p', nil, s(:text, 'foo'))
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with a single attribute' do
|
||||||
|
parse_html('<p foo></p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(:element, nil, 'p', s(:attributes, s(:attribute, 'foo')))
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with a single attribute with a value' do
|
||||||
|
parse_html('<p foo="bar"></p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(:element, nil, 'p', s(:attributes, s(:attribute, 'foo', 'bar')))
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with multiple attributes' do
|
||||||
|
parse_html('<p foo="bar" baz="bad"></p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'p',
|
||||||
|
s(
|
||||||
|
:attributes,
|
||||||
|
s(:attribute, 'foo', 'bar'),
|
||||||
|
s(:attribute, 'baz', 'bad')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with text and attributes' do
|
||||||
|
parse_html('<p class="foo">Bar</p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'p',
|
||||||
|
s(:attributes, s(:attribute, 'class', 'foo')),
|
||||||
|
s(:text, 'Bar')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with a namespace' do
|
||||||
|
parse_html('<foo:p></p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(:element, 'foo', 'p')
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with a namespace and an attribute' do
|
||||||
|
parse_html('<foo:p class="bar"></p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(:element, 'foo', 'p', s(:attributes, s(:attribute, 'class', 'bar')))
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue