html5 0.1.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -2
- data/Manifest.txt +61 -2
- data/README +41 -5
- data/Rakefile.rb +22 -6
- data/{parse.rb → bin/html5} +11 -11
- data/lib/core_ext/string.rb +17 -0
- data/lib/html5/constants.rb +228 -0
- data/lib/html5/filters/iso639codes.rb +752 -0
- data/lib/html5/filters/rfc2046.rb +30 -0
- data/lib/html5/filters/rfc3987.rb +89 -0
- data/lib/html5/filters/validator.rb +830 -0
- data/lib/html5/html5parser.rb +25 -25
- data/lib/html5/html5parser/after_body_phase.rb +3 -3
- data/lib/html5/html5parser/after_frameset_phase.rb +3 -4
- data/lib/html5/html5parser/after_head_phase.rb +6 -6
- data/lib/html5/html5parser/before_head_phase.rb +1 -1
- data/lib/html5/html5parser/in_body_phase.rb +54 -48
- data/lib/html5/html5parser/in_caption_phase.rb +7 -6
- data/lib/html5/html5parser/in_cell_phase.rb +3 -3
- data/lib/html5/html5parser/in_column_group_phase.rb +1 -1
- data/lib/html5/html5parser/in_frameset_phase.rb +5 -5
- data/lib/html5/html5parser/in_head_phase.rb +10 -10
- data/lib/html5/html5parser/in_row_phase.rb +4 -2
- data/lib/html5/html5parser/in_select_phase.rb +7 -6
- data/lib/html5/html5parser/in_table_body_phase.rb +8 -5
- data/lib/html5/html5parser/in_table_phase.rb +12 -7
- data/lib/html5/html5parser/initial_phase.rb +5 -6
- data/lib/html5/html5parser/phase.rb +5 -9
- data/lib/html5/html5parser/root_element_phase.rb +1 -2
- data/lib/html5/html5parser/trailing_end_phase.rb +3 -3
- data/lib/html5/inputstream.rb +25 -31
- data/lib/html5/liberalxmlparser.rb +2 -2
- data/lib/html5/sanitizer.rb +6 -6
- data/lib/html5/serializer/htmlserializer.rb +2 -3
- data/lib/html5/sniffer.rb +45 -0
- data/lib/html5/tokenizer.rb +57 -59
- data/lib/html5/treebuilders/rexml.rb +7 -6
- data/lib/html5/treebuilders/simpletree.rb +1 -1
- data/lib/html5/treewalkers/base.rb +8 -0
- data/lib/html5/version.rb +3 -0
- data/testdata/encoding/chardet/test_big5.txt +51 -0
- data/testdata/encoding/test-yahoo-jp.dat +10 -0
- data/testdata/encoding/tests1.dat +394 -0
- data/testdata/encoding/tests2.dat +81 -0
- data/testdata/sanitizer/tests1.dat +416 -0
- data/testdata/serializer/core.test +104 -0
- data/testdata/serializer/injectmeta.test +65 -0
- data/testdata/serializer/optionaltags.test +900 -0
- data/testdata/serializer/options.test +60 -0
- data/testdata/serializer/whitespace.test +51 -0
- data/testdata/sites/google-results.htm +1 -0
- data/testdata/sites/python-ref-import.htm +1 -0
- data/testdata/sites/web-apps-old.htm +1 -0
- data/testdata/sites/web-apps.htm +34275 -0
- data/testdata/sniffer/htmlOrFeed.json +43 -0
- data/testdata/tokenizer/contentModelFlags.test +48 -0
- data/testdata/tokenizer/entities.test +2339 -0
- data/testdata/tokenizer/escapeFlag.test +21 -0
- data/testdata/tokenizer/test1.test +172 -0
- data/testdata/tokenizer/test2.test +129 -0
- data/testdata/tokenizer/test3.test +367 -0
- data/testdata/tokenizer/test4.test +198 -0
- data/testdata/tree-construction/tests1.dat +1950 -0
- data/testdata/tree-construction/tests2.dat +773 -0
- data/testdata/tree-construction/tests3.dat +270 -0
- data/testdata/tree-construction/tests4.dat +60 -0
- data/testdata/tree-construction/tests5.dat +175 -0
- data/testdata/tree-construction/tests6.dat +196 -0
- data/testdata/validator/attributes.test +1035 -0
- data/testdata/validator/base-href-attribute.test +787 -0
- data/testdata/validator/base-target-attribute.test +35 -0
- data/testdata/validator/blockquote-cite-attribute.test +7 -0
- data/testdata/validator/classattribute.test +152 -0
- data/testdata/validator/contenteditableattribute.test +59 -0
- data/testdata/validator/contextmenuattribute.test +115 -0
- data/testdata/validator/dirattribute.test +59 -0
- data/testdata/validator/draggableattribute.test +63 -0
- data/testdata/validator/html-xmlns-attribute.test +23 -0
- data/testdata/validator/idattribute.test +115 -0
- data/testdata/validator/inputattributes.test +2795 -0
- data/testdata/validator/irrelevantattribute.test +63 -0
- data/testdata/validator/langattribute.test +5579 -0
- data/testdata/validator/li-value-attribute.test +7 -0
- data/testdata/validator/link-href-attribute.test +7 -0
- data/testdata/validator/link-hreflang-attribute.test +7 -0
- data/testdata/validator/link-rel-attribute.test +271 -0
- data/testdata/validator/ol-start-attribute.test +7 -0
- data/testdata/validator/starttags.test +375 -0
- data/testdata/validator/style-scoped-attribute.test +7 -0
- data/testdata/validator/tabindexattribute.test +79 -0
- data/tests/preamble.rb +7 -17
- data/tests/test_encoding.rb +1 -1
- data/tests/test_lxp.rb +16 -0
- data/tests/test_parser.rb +2 -2
- data/tests/test_sniffer.rb +27 -0
- data/tests/test_treewalkers.rb +41 -22
- data/tests/test_validator.rb +31 -0
- metadata +65 -6
@@ -18,7 +18,7 @@ module HTML5
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def startTagTableElement(name, attributes)
|
21
|
-
parse_error
|
21
|
+
parse_error "unexpected-end-tag", {"name" => name}
|
22
22
|
#XXX Have to duplicate logic here to find out if the tag is ignored
|
23
23
|
ignoreEndTag = ignoreEndTagCaption
|
24
24
|
@parser.phase.processEndTag('caption')
|
@@ -33,13 +33,15 @@ module HTML5
|
|
33
33
|
if ignoreEndTagCaption
|
34
34
|
# inner_html case
|
35
35
|
assert @parser.inner_html
|
36
|
-
parse_error
|
36
|
+
parse_error "unexpected-end-tag", {"name" => name}
|
37
37
|
else
|
38
38
|
# AT this code is quite similar to endTagTable in "InTable"
|
39
39
|
@tree.generateImpliedEndTags
|
40
40
|
|
41
41
|
unless @tree.open_elements[-1].name == 'caption'
|
42
|
-
parse_error(
|
42
|
+
parse_error("expected-one-end-tag-but-got-another",
|
43
|
+
{"gotName" => "caption",
|
44
|
+
"expectedName" => @tree.open_elements.last.name})
|
43
45
|
end
|
44
46
|
|
45
47
|
remove_open_elements_until('caption')
|
@@ -50,19 +52,18 @@ module HTML5
|
|
50
52
|
end
|
51
53
|
|
52
54
|
def endTagTable(name)
|
53
|
-
parse_error
|
55
|
+
parse_error "unexpected-end-table-in-caption"
|
54
56
|
ignoreEndTag = ignoreEndTagCaption
|
55
57
|
@parser.phase.processEndTag('caption')
|
56
58
|
@parser.phase.processEndTag(name) unless ignoreEndTag
|
57
59
|
end
|
58
60
|
|
59
61
|
def endTagIgnore(name)
|
60
|
-
parse_error(
|
62
|
+
parse_error("unexpected-end-tag", {"name" => name})
|
61
63
|
end
|
62
64
|
|
63
65
|
def endTagOther(name)
|
64
66
|
@parser.phases[:inBody].processEndTag(name)
|
65
67
|
end
|
66
|
-
|
67
68
|
end
|
68
69
|
end
|
@@ -33,7 +33,7 @@ module HTML5
|
|
33
33
|
if in_scope?(name, true)
|
34
34
|
@tree.generateImpliedEndTags(name)
|
35
35
|
if @tree.open_elements.last.name != name
|
36
|
-
parse_error("
|
36
|
+
parse_error("unexpected-cell-end-tag", {"name" => name})
|
37
37
|
|
38
38
|
remove_open_elements_until(name)
|
39
39
|
else
|
@@ -42,12 +42,12 @@ module HTML5
|
|
42
42
|
@tree.clearActiveFormattingElements
|
43
43
|
@parser.phase = @parser.phases[:inRow]
|
44
44
|
else
|
45
|
-
parse_error(
|
45
|
+
parse_error("unexpected-end-tag", {"name" => name})
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
def endTagIgnore(name)
|
50
|
-
parse_error(
|
50
|
+
parse_error("unexpected-end-tag", {"name" => name})
|
51
51
|
end
|
52
52
|
|
53
53
|
def endTagImply(name)
|
@@ -10,7 +10,7 @@ module HTML5
|
|
10
10
|
handle_end 'frameset', 'noframes'
|
11
11
|
|
12
12
|
def processCharacters(data)
|
13
|
-
parse_error(
|
13
|
+
parse_error("unexpected-char-in-frameset")
|
14
14
|
end
|
15
15
|
|
16
16
|
def startTagFrameset(name, attributes)
|
@@ -27,13 +27,14 @@ module HTML5
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def startTagOther(name, attributes)
|
30
|
-
parse_error(
|
30
|
+
parse_error("unexpected-start-tag-in-frameset",
|
31
|
+
{"name" => name})
|
31
32
|
end
|
32
33
|
|
33
34
|
def endTagFrameset(name)
|
34
35
|
if @tree.open_elements.last.name == 'html'
|
35
36
|
# inner_html case
|
36
|
-
parse_error(
|
37
|
+
parse_error("unexpected-frameset-in-frameset-innerhtml")
|
37
38
|
else
|
38
39
|
@tree.open_elements.pop
|
39
40
|
end
|
@@ -50,8 +51,7 @@ module HTML5
|
|
50
51
|
end
|
51
52
|
|
52
53
|
def endTagOther(name)
|
53
|
-
parse_error(
|
54
|
+
parse_error("unexpected-end-tag-in-frameset", {"name" => name})
|
54
55
|
end
|
55
|
-
|
56
56
|
end
|
57
57
|
end
|
@@ -12,10 +12,10 @@ module HTML5
|
|
12
12
|
|
13
13
|
def process_eof
|
14
14
|
if ['title', 'style', 'script'].include?(name = @tree.open_elements.last.name)
|
15
|
-
parse_error(
|
15
|
+
parse_error("expected-named-closing-tag-but-got-eof", {"name" => @tree.open_elements.last.name})
|
16
16
|
@tree.open_elements.pop
|
17
17
|
end
|
18
|
-
|
18
|
+
anything_else
|
19
19
|
@parser.phase.process_eof
|
20
20
|
end
|
21
21
|
|
@@ -23,13 +23,13 @@ module HTML5
|
|
23
23
|
if %w[title style script noscript].include?(@tree.open_elements.last.name)
|
24
24
|
@tree.insertText(data)
|
25
25
|
else
|
26
|
-
|
26
|
+
anything_else
|
27
27
|
@parser.phase.processCharacters(data)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
def startTagHead(name, attributes)
|
32
|
-
parse_error(
|
32
|
+
parse_error("two-heads-are-not-better-than-one")
|
33
33
|
end
|
34
34
|
|
35
35
|
def startTagTitle(name, attributes)
|
@@ -85,7 +85,7 @@ module HTML5
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def startTagOther(name, attributes)
|
88
|
-
|
88
|
+
anything_else
|
89
89
|
@parser.phase.processStartTag(name, attributes)
|
90
90
|
end
|
91
91
|
|
@@ -93,13 +93,13 @@ module HTML5
|
|
93
93
|
if @tree.open_elements.last.name == 'head'
|
94
94
|
@tree.open_elements.pop
|
95
95
|
else
|
96
|
-
parse_error(
|
96
|
+
parse_error("unexpected-end-tag", {"name" => "head"})
|
97
97
|
end
|
98
98
|
@parser.phase = @parser.phases[:afterHead]
|
99
99
|
end
|
100
100
|
|
101
101
|
def endTagImplyAfterHead(name)
|
102
|
-
|
102
|
+
anything_else
|
103
103
|
@parser.phase.processEndTag(name)
|
104
104
|
end
|
105
105
|
|
@@ -107,15 +107,15 @@ module HTML5
|
|
107
107
|
if @tree.open_elements.last.name == name
|
108
108
|
@tree.open_elements.pop
|
109
109
|
else
|
110
|
-
parse_error(
|
110
|
+
parse_error("unexpected-end-tag", {"name" => name})
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
114
|
def endTagOther(name)
|
115
|
-
parse_error(
|
115
|
+
parse_error("unexpected-end-tag", {"name" => name})
|
116
116
|
end
|
117
117
|
|
118
|
-
def
|
118
|
+
def anything_else
|
119
119
|
if @tree.open_elements.last.name == 'head'
|
120
120
|
endTagHead('head')
|
121
121
|
else
|
@@ -62,7 +62,8 @@ module HTML5
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def endTagIgnore(name)
|
65
|
-
parse_error(
|
65
|
+
parse_error("unexpected-end-tag-in-table-row",
|
66
|
+
{"name" => name})
|
66
67
|
end
|
67
68
|
|
68
69
|
def endTagOther(name)
|
@@ -74,7 +75,8 @@ module HTML5
|
|
74
75
|
# XXX unify this with other table helper methods
|
75
76
|
def clearStackToTableRowContext
|
76
77
|
until %w[tr html].include?(name = @tree.open_elements.last.name)
|
77
|
-
parse_error(
|
78
|
+
parse_error("unexpected-implied-end-tag-in-table-row",
|
79
|
+
{"name" => @tree.open_elements.last.name})
|
78
80
|
@tree.open_elements.pop
|
79
81
|
end
|
80
82
|
end
|
@@ -26,19 +26,19 @@ module HTML5
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def startTagSelect(name, attributes)
|
29
|
-
parse_error(
|
29
|
+
parse_error("unexpected-select-in-select")
|
30
30
|
endTagSelect('select')
|
31
31
|
end
|
32
32
|
|
33
33
|
def startTagOther(name, attributes)
|
34
|
-
parse_error(
|
34
|
+
parse_error("unexpected-start-tag-in-select", {"name" => name})
|
35
35
|
end
|
36
36
|
|
37
37
|
def endTagOption(name)
|
38
38
|
if @tree.open_elements.last.name == 'option'
|
39
39
|
@tree.open_elements.pop
|
40
40
|
else
|
41
|
-
parse_error(
|
41
|
+
parse_error("unexpected-end-tag-in-select", {"name" => "option"})
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -52,7 +52,8 @@ module HTML5
|
|
52
52
|
@tree.open_elements.pop
|
53
53
|
# But nothing else
|
54
54
|
else
|
55
|
-
parse_error(
|
55
|
+
parse_error("unexpected-end-tag-in-select",
|
56
|
+
{"name" => "optgroup"})
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
@@ -68,7 +69,7 @@ module HTML5
|
|
68
69
|
end
|
69
70
|
|
70
71
|
def endTagTableElements(name)
|
71
|
-
parse_error(
|
72
|
+
parse_error("unexpected-end-tag-in-select", {"name" => name})
|
72
73
|
|
73
74
|
if in_scope?(name, true)
|
74
75
|
endTagSelect('select')
|
@@ -77,7 +78,7 @@ module HTML5
|
|
77
78
|
end
|
78
79
|
|
79
80
|
def endTagOther(name)
|
80
|
-
parse_error(
|
81
|
+
parse_error("unexpected-end-tag-in-select", {"name" => name})
|
81
82
|
end
|
82
83
|
|
83
84
|
end
|
@@ -7,7 +7,7 @@ module HTML5
|
|
7
7
|
|
8
8
|
handle_start 'html', 'tr', %w( td th ) => 'TableCell', %w( caption col colgroup tbody tfoot thead ) => 'TableOther'
|
9
9
|
|
10
|
-
handle_end 'table', %w( tbody tfoot thead ) => 'TableRowGroup', %w( body caption col colgroup html td th tr ) => '
|
10
|
+
handle_end 'table', %w( tbody tfoot thead ) => 'TableRowGroup', %w( body caption col colgroup html td th tr ) => 'Ignore'
|
11
11
|
|
12
12
|
def processCharacters(data)
|
13
13
|
@parser.phases[:inTable].processCharacters(data)
|
@@ -20,7 +20,7 @@ module HTML5
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def startTagTableCell(name, attributes)
|
23
|
-
parse_error(
|
23
|
+
parse_error("unexpected-cell-in-table-body", {"name" => name})
|
24
24
|
startTagTr('tr', {})
|
25
25
|
@parser.phase.processStartTag(name, attributes)
|
26
26
|
end
|
@@ -47,7 +47,8 @@ module HTML5
|
|
47
47
|
@tree.open_elements.pop
|
48
48
|
@parser.phase = @parser.phases[:inTable]
|
49
49
|
else
|
50
|
-
parse_error(
|
50
|
+
parse_error("unexpected-end-tag-in-table-body",
|
51
|
+
{"name" => name})
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
@@ -63,7 +64,8 @@ module HTML5
|
|
63
64
|
end
|
64
65
|
|
65
66
|
def endTagIgnore(name)
|
66
|
-
parse_error(
|
67
|
+
parse_error("unexpected-end-tag-in-table-body",
|
68
|
+
{"name" => name})
|
67
69
|
end
|
68
70
|
|
69
71
|
def endTagOther(name)
|
@@ -74,7 +76,8 @@ module HTML5
|
|
74
76
|
|
75
77
|
def clearStackToTableBodyContext
|
76
78
|
until %w[tbody tfoot thead html].include?(name = @tree.open_elements.last.name)
|
77
|
-
parse_error(
|
79
|
+
parse_error("unexpected-implied-end-tag-in-table",
|
80
|
+
{"name" => @tree.open_elements.last.name})
|
78
81
|
@tree.open_elements.pop
|
79
82
|
end
|
80
83
|
end
|
@@ -12,7 +12,7 @@ module HTML5
|
|
12
12
|
handle_end 'table', %w( body caption col colgroup html tbody td tfoot th thead tr ) => 'Ignore'
|
13
13
|
|
14
14
|
def processCharacters(data)
|
15
|
-
parse_error(
|
15
|
+
parse_error("unexpected-char-implies-table-voodoo")
|
16
16
|
# Make all the special element rearranging voodoo kick in
|
17
17
|
@tree.insert_from_table = true
|
18
18
|
# Process the character in the "in body" mode
|
@@ -50,13 +50,15 @@ module HTML5
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def startTagTable(name, attributes)
|
53
|
-
parse_error(
|
53
|
+
parse_error("unexpected-start-tag-implies-end-tag",
|
54
|
+
{"startName" => "table", "endName" => "table"})
|
54
55
|
@parser.phase.processEndTag('table')
|
55
56
|
@parser.phase.processStartTag(name, attributes) unless @parser.inner_html
|
56
57
|
end
|
57
58
|
|
58
59
|
def startTagOther(name, attributes)
|
59
|
-
parse_error(
|
60
|
+
parse_error("unexpected-start-tag-implies-table-voodoo",
|
61
|
+
{"name" => name})
|
60
62
|
# Make all the special element rearranging voodoo kick in
|
61
63
|
@tree.insert_from_table = true
|
62
64
|
# Process the start tag in the "in body" mode
|
@@ -69,7 +71,9 @@ module HTML5
|
|
69
71
|
@tree.generateImpliedEndTags
|
70
72
|
|
71
73
|
unless @tree.open_elements.last.name == 'table'
|
72
|
-
parse_error(
|
74
|
+
parse_error("end-tag-too-early-named",
|
75
|
+
{"gotName" => "table",
|
76
|
+
"expectedName" => @tree.open_elements.last.name})
|
73
77
|
end
|
74
78
|
|
75
79
|
remove_open_elements_until('table')
|
@@ -83,11 +87,11 @@ module HTML5
|
|
83
87
|
end
|
84
88
|
|
85
89
|
def endTagIgnore(name)
|
86
|
-
parse_error(
|
90
|
+
parse_error("unexpected-end-tag", {"name" => name})
|
87
91
|
end
|
88
92
|
|
89
93
|
def endTagOther(name)
|
90
|
-
parse_error(
|
94
|
+
parse_error("unexpected-end-tag-implies-table-voodoo", {"name" => name})
|
91
95
|
# Make all the special element rearranging voodoo kick in
|
92
96
|
@tree.insert_from_table = true
|
93
97
|
# Process the end tag in the "in body" mode
|
@@ -100,7 +104,8 @@ module HTML5
|
|
100
104
|
def clearStackToTableContext
|
101
105
|
# "clear the stack back to a table context"
|
102
106
|
until %w[table html].include?(name = @tree.open_elements.last.name)
|
103
|
-
parse_error(
|
107
|
+
parse_error("unexpected-implied-end-tag-in-table",
|
108
|
+
{"name" => @tree.open_elements.last.name})
|
104
109
|
@tree.open_elements.pop
|
105
110
|
end
|
106
111
|
# When the current node is <html> it's an inner_html case
|
@@ -8,7 +8,7 @@ module HTML5
|
|
8
8
|
# "quirks mode". It is expected that a future version of HTML5 will define this.
|
9
9
|
|
10
10
|
def process_eof
|
11
|
-
parse_error(
|
11
|
+
parse_error("expected-doctype-but-got-eof")
|
12
12
|
@parser.phase = @parser.phases[:rootElement]
|
13
13
|
@parser.phase.process_eof
|
14
14
|
end
|
@@ -19,7 +19,7 @@ module HTML5
|
|
19
19
|
|
20
20
|
def processDoctype(name, publicId, systemId, correct)
|
21
21
|
if name.downcase != 'html' or publicId or systemId
|
22
|
-
parse_error(
|
22
|
+
parse_error("unknown-doctype")
|
23
23
|
end
|
24
24
|
# XXX need to update DOCTYPE tokens
|
25
25
|
@tree.insertDoctype(name, publicId, systemId)
|
@@ -113,22 +113,21 @@ module HTML5
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def processCharacters(data)
|
116
|
-
parse_error(
|
116
|
+
parse_error("expected-doctype-but-got-chars")
|
117
117
|
@parser.phase = @parser.phases[:rootElement]
|
118
118
|
@parser.phase.processCharacters(data)
|
119
119
|
end
|
120
120
|
|
121
121
|
def processStartTag(name, attributes)
|
122
|
-
parse_error(
|
122
|
+
parse_error("expected-doctype-but-got-start-tag", {"name" => name})
|
123
123
|
@parser.phase = @parser.phases[:rootElement]
|
124
124
|
@parser.phase.processStartTag(name, attributes)
|
125
125
|
end
|
126
126
|
|
127
127
|
def processEndTag(name)
|
128
|
-
parse_error(
|
128
|
+
parse_error("expected-doctype-but-got-end-tag", {"name" => name})
|
129
129
|
@parser.phase = @parser.phases[:rootElement]
|
130
130
|
@parser.phase.processEndTag(name)
|
131
131
|
end
|
132
|
-
|
133
132
|
end
|
134
133
|
end
|
@@ -87,13 +87,13 @@ module HTML5
|
|
87
87
|
@tree.generateImpliedEndTags
|
88
88
|
|
89
89
|
if @tree.open_elements.length > 2
|
90
|
-
parse_error(
|
90
|
+
parse_error("expected-closing-tag-but-got-eof")
|
91
91
|
elsif @tree.open_elements.length == 2 and @tree.open_elements[1].name != 'body'
|
92
92
|
# This happens for framesets or something?
|
93
|
-
parse_error(
|
93
|
+
parse_error("expected-closing-tag-but-got-eof")
|
94
94
|
elsif @parser.inner_html and @tree.open_elements.length > 1
|
95
95
|
# XXX This is not what the specification says. Not sure what to do here.
|
96
|
-
parse_error(
|
96
|
+
parse_error("eof-in-innerhtml")
|
97
97
|
end
|
98
98
|
# Betting ends.
|
99
99
|
end
|
@@ -105,7 +105,7 @@ module HTML5
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def processDoctype(name, publicId, systemId, correct)
|
108
|
-
parse_error(
|
108
|
+
parse_error("unexpected-doctype")
|
109
109
|
end
|
110
110
|
|
111
111
|
def processSpaceCharacters(data)
|
@@ -118,7 +118,7 @@ module HTML5
|
|
118
118
|
|
119
119
|
def startTagHtml(name, attributes)
|
120
120
|
if @parser.first_start_tag == false and name == 'html'
|
121
|
-
parse_error(
|
121
|
+
parse_error("non-html-root")
|
122
122
|
end
|
123
123
|
# XXX Need a check here to see if the first start tag token emitted is
|
124
124
|
# this token... If it's not, invoke parse_error.
|
@@ -134,10 +134,6 @@ module HTML5
|
|
134
134
|
send self.class.end_tag_handlers[name], name
|
135
135
|
end
|
136
136
|
|
137
|
-
def _(string)
|
138
|
-
string
|
139
|
-
end
|
140
|
-
|
141
137
|
def assert(value)
|
142
138
|
throw AssertionError.new unless value
|
143
139
|
end
|