html5 0.1.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|