Parsing support for nested element/text nodes.
This commit is contained in:
parent
6b2f682c5c
commit
05ee3c13c9
|
@ -1,6 +1,5 @@
|
||||||
class Oga::Parser
|
class Oga::Parser
|
||||||
|
|
||||||
token T_NEWLINE T_SPACE
|
|
||||||
token T_STRING T_TEXT
|
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
|
||||||
|
@ -90,10 +89,19 @@ rule
|
||||||
| 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]] }
|
||||||
;
|
;
|
||||||
|
|
||||||
element_body
|
elements
|
||||||
: text
|
: elements element { val }
|
||||||
| element
|
| element
|
||||||
| /* none */ { nil }
|
;
|
||||||
|
|
||||||
|
element_body
|
||||||
|
: texts
|
||||||
|
| texts elements { val }
|
||||||
|
| texts elements texts { val }
|
||||||
|
| elements
|
||||||
|
| elements texts { val }
|
||||||
|
| elements texts elements { val }
|
||||||
|
| /* none */ { nil }
|
||||||
;
|
;
|
||||||
|
|
||||||
# Attributes
|
# Attributes
|
||||||
|
@ -122,16 +130,9 @@ rule
|
||||||
: T_TEXT { s(:text, val[0]) }
|
: T_TEXT { s(:text, val[0]) }
|
||||||
;
|
;
|
||||||
|
|
||||||
# Whitespace
|
texts
|
||||||
|
: texts text { val }
|
||||||
whitespaces
|
| text
|
||||||
: whitespaces whitespace
|
|
||||||
| whitespace
|
|
||||||
;
|
|
||||||
|
|
||||||
whitespace
|
|
||||||
: T_NEWLINE
|
|
||||||
| T_SPACE
|
|
||||||
;
|
;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Oga::Parser do
|
describe Oga::Lexer do
|
||||||
context 'HTML documents' do
|
context 'HTML documents' do
|
||||||
example 'lex a basic HTML document' do
|
example 'lex a basic HTML document' do
|
||||||
html = <<-EOF
|
html = <<-EOF
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Oga::Parser do
|
||||||
|
context 'HTML documents' do
|
||||||
|
example 'parse a basic HTML document' do
|
||||||
|
html = <<-EOF
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Title</title>
|
||||||
|
</head>
|
||||||
|
<body></body>
|
||||||
|
</html>
|
||||||
|
EOF
|
||||||
|
|
||||||
|
parse_html(html).should == s(
|
||||||
|
:document,
|
||||||
|
s(:doctype),
|
||||||
|
|
||||||
|
# <html>
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'html',
|
||||||
|
nil,
|
||||||
|
|
||||||
|
# <head>
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'head',
|
||||||
|
nil,
|
||||||
|
|
||||||
|
# <title>
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'title',
|
||||||
|
nil,
|
||||||
|
s(:text, 'Title')
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
# <body>
|
||||||
|
s(:element, nil, 'body', nil, nil)
|
||||||
|
),
|
||||||
|
s(:text, "\n")
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -86,5 +86,63 @@ describe Oga::Parser do
|
||||||
s(:element, nil, 'p', nil, s(:element, nil, 'a', nil, nil))
|
s(:element, nil, 'p', nil, s(:element, nil, 'a', nil, nil))
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
example 'parse an element with children text, element' do
|
||||||
|
parse_html('<p>Foo<a>Bar</a></p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'p',
|
||||||
|
nil,
|
||||||
|
s(:text, 'Foo'),
|
||||||
|
s(:element, nil, 'a', nil, s(:text, 'Bar'))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with children text, element, text' do
|
||||||
|
parse_html('<p>Foo<a>Bar</a>Baz</p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'p',
|
||||||
|
nil,
|
||||||
|
s(:text, 'Foo'),
|
||||||
|
s(:element, nil, 'a', nil, s(:text, 'Bar')),
|
||||||
|
s(:text, 'Baz')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with children element, text' do
|
||||||
|
parse_html('<p><a>Bar</a>Baz</p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'p',
|
||||||
|
nil,
|
||||||
|
s(:element, nil, 'a', nil, s(:text, 'Bar')),
|
||||||
|
s(:text, 'Baz')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
example 'parse an element with children element, text, element' do
|
||||||
|
parse_html('<p><a>Bar</a>Baz<span>Da</span></p>').should == s(
|
||||||
|
:document,
|
||||||
|
s(
|
||||||
|
:element,
|
||||||
|
nil,
|
||||||
|
'p',
|
||||||
|
nil,
|
||||||
|
s(:element, nil, 'a', nil, s(:text, 'Bar')),
|
||||||
|
s(:text, 'Baz'),
|
||||||
|
s(:element, nil, 'span', nil, s(:text, 'Da'))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,4 +4,8 @@ describe Oga::Parser do
|
||||||
example 'parse regular text' do
|
example 'parse regular text' do
|
||||||
parse_html('foo').should == s(:document, s(:text, 'foo'))
|
parse_html('foo').should == s(:document, s(:text, 'foo'))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
example 'parse a newline' do
|
||||||
|
parse_html("\n").should == s(:document, s(:text, "\n"))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue