html5 0.1.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/History.txt +9 -2
  2. data/Manifest.txt +61 -2
  3. data/README +41 -5
  4. data/Rakefile.rb +22 -6
  5. data/{parse.rb → bin/html5} +11 -11
  6. data/lib/core_ext/string.rb +17 -0
  7. data/lib/html5/constants.rb +228 -0
  8. data/lib/html5/filters/iso639codes.rb +752 -0
  9. data/lib/html5/filters/rfc2046.rb +30 -0
  10. data/lib/html5/filters/rfc3987.rb +89 -0
  11. data/lib/html5/filters/validator.rb +830 -0
  12. data/lib/html5/html5parser.rb +25 -25
  13. data/lib/html5/html5parser/after_body_phase.rb +3 -3
  14. data/lib/html5/html5parser/after_frameset_phase.rb +3 -4
  15. data/lib/html5/html5parser/after_head_phase.rb +6 -6
  16. data/lib/html5/html5parser/before_head_phase.rb +1 -1
  17. data/lib/html5/html5parser/in_body_phase.rb +54 -48
  18. data/lib/html5/html5parser/in_caption_phase.rb +7 -6
  19. data/lib/html5/html5parser/in_cell_phase.rb +3 -3
  20. data/lib/html5/html5parser/in_column_group_phase.rb +1 -1
  21. data/lib/html5/html5parser/in_frameset_phase.rb +5 -5
  22. data/lib/html5/html5parser/in_head_phase.rb +10 -10
  23. data/lib/html5/html5parser/in_row_phase.rb +4 -2
  24. data/lib/html5/html5parser/in_select_phase.rb +7 -6
  25. data/lib/html5/html5parser/in_table_body_phase.rb +8 -5
  26. data/lib/html5/html5parser/in_table_phase.rb +12 -7
  27. data/lib/html5/html5parser/initial_phase.rb +5 -6
  28. data/lib/html5/html5parser/phase.rb +5 -9
  29. data/lib/html5/html5parser/root_element_phase.rb +1 -2
  30. data/lib/html5/html5parser/trailing_end_phase.rb +3 -3
  31. data/lib/html5/inputstream.rb +25 -31
  32. data/lib/html5/liberalxmlparser.rb +2 -2
  33. data/lib/html5/sanitizer.rb +6 -6
  34. data/lib/html5/serializer/htmlserializer.rb +2 -3
  35. data/lib/html5/sniffer.rb +45 -0
  36. data/lib/html5/tokenizer.rb +57 -59
  37. data/lib/html5/treebuilders/rexml.rb +7 -6
  38. data/lib/html5/treebuilders/simpletree.rb +1 -1
  39. data/lib/html5/treewalkers/base.rb +8 -0
  40. data/lib/html5/version.rb +3 -0
  41. data/testdata/encoding/chardet/test_big5.txt +51 -0
  42. data/testdata/encoding/test-yahoo-jp.dat +10 -0
  43. data/testdata/encoding/tests1.dat +394 -0
  44. data/testdata/encoding/tests2.dat +81 -0
  45. data/testdata/sanitizer/tests1.dat +416 -0
  46. data/testdata/serializer/core.test +104 -0
  47. data/testdata/serializer/injectmeta.test +65 -0
  48. data/testdata/serializer/optionaltags.test +900 -0
  49. data/testdata/serializer/options.test +60 -0
  50. data/testdata/serializer/whitespace.test +51 -0
  51. data/testdata/sites/google-results.htm +1 -0
  52. data/testdata/sites/python-ref-import.htm +1 -0
  53. data/testdata/sites/web-apps-old.htm +1 -0
  54. data/testdata/sites/web-apps.htm +34275 -0
  55. data/testdata/sniffer/htmlOrFeed.json +43 -0
  56. data/testdata/tokenizer/contentModelFlags.test +48 -0
  57. data/testdata/tokenizer/entities.test +2339 -0
  58. data/testdata/tokenizer/escapeFlag.test +21 -0
  59. data/testdata/tokenizer/test1.test +172 -0
  60. data/testdata/tokenizer/test2.test +129 -0
  61. data/testdata/tokenizer/test3.test +367 -0
  62. data/testdata/tokenizer/test4.test +198 -0
  63. data/testdata/tree-construction/tests1.dat +1950 -0
  64. data/testdata/tree-construction/tests2.dat +773 -0
  65. data/testdata/tree-construction/tests3.dat +270 -0
  66. data/testdata/tree-construction/tests4.dat +60 -0
  67. data/testdata/tree-construction/tests5.dat +175 -0
  68. data/testdata/tree-construction/tests6.dat +196 -0
  69. data/testdata/validator/attributes.test +1035 -0
  70. data/testdata/validator/base-href-attribute.test +787 -0
  71. data/testdata/validator/base-target-attribute.test +35 -0
  72. data/testdata/validator/blockquote-cite-attribute.test +7 -0
  73. data/testdata/validator/classattribute.test +152 -0
  74. data/testdata/validator/contenteditableattribute.test +59 -0
  75. data/testdata/validator/contextmenuattribute.test +115 -0
  76. data/testdata/validator/dirattribute.test +59 -0
  77. data/testdata/validator/draggableattribute.test +63 -0
  78. data/testdata/validator/html-xmlns-attribute.test +23 -0
  79. data/testdata/validator/idattribute.test +115 -0
  80. data/testdata/validator/inputattributes.test +2795 -0
  81. data/testdata/validator/irrelevantattribute.test +63 -0
  82. data/testdata/validator/langattribute.test +5579 -0
  83. data/testdata/validator/li-value-attribute.test +7 -0
  84. data/testdata/validator/link-href-attribute.test +7 -0
  85. data/testdata/validator/link-hreflang-attribute.test +7 -0
  86. data/testdata/validator/link-rel-attribute.test +271 -0
  87. data/testdata/validator/ol-start-attribute.test +7 -0
  88. data/testdata/validator/starttags.test +375 -0
  89. data/testdata/validator/style-scoped-attribute.test +7 -0
  90. data/testdata/validator/tabindexattribute.test +79 -0
  91. data/tests/preamble.rb +7 -17
  92. data/tests/test_encoding.rb +1 -1
  93. data/tests/test_lxp.rb +16 -0
  94. data/tests/test_parser.rb +2 -2
  95. data/tests/test_sniffer.rb +27 -0
  96. data/tests/test_treewalkers.rb +41 -22
  97. data/tests/test_validator.rb +31 -0
  98. metadata +65 -6
@@ -0,0 +1,7 @@
1
+ {"tests": [
2
+
3
+ {"description": "invalid style scoped attribute value 'inherit'",
4
+ "input": "<style scoped=inherit>",
5
+ "fail-unless": "invalid-boolean-value"}
6
+
7
+ ]}
@@ -0,0 +1,79 @@
1
+ {"tests": [
2
+
3
+ {"description": "valid tabindex attribute value '-1'",
4
+ "input": "<span tabindex=-1>",
5
+ "fail-if": "invalid-integer-value"},
6
+
7
+ {"description": "valid tabindex attribute value '0'",
8
+ "input": "<span tabindex=0>",
9
+ "fail-if": "invalid-integer-value"},
10
+
11
+ {"description": "valid tabindex attribute value '1'",
12
+ "input": "<span tabindex=1>",
13
+ "fail-if": "invalid-integer-value"},
14
+
15
+ {"description": "valid tabindex attribute value '32768'",
16
+ "input": "<span tabindex=32768>",
17
+ "fail-if": "invalid-integer-value"},
18
+
19
+ {"description": "valid tabindex attribute value '-32768'",
20
+ "input": "<span tabindex=-32768>",
21
+ "fail-if": "invalid-integer-value"},
22
+
23
+ {"description": "valid tabindex attribute value with leading spaces",
24
+ "input": "<span tabindex=' -32768'>",
25
+ "fail-if": "invalid-integer-value"},
26
+
27
+ {"description": "valid tabindex attribute value with trailing spaces",
28
+ "input": "<span tabindex='-32768 '>",
29
+ "fail-if": "invalid-integer-value"},
30
+
31
+ {"description": "valid tabindex attribute value with trailing junk",
32
+ "input": "<span tabindex='32768a'>",
33
+ "fail-if": "invalid-integer-value"},
34
+
35
+ {"description": "valid tabindex attribute value with trailing junk and whitespace",
36
+ "input": "<span tabindex='32768a '>",
37
+ "fail-if": "invalid-integer-value"},
38
+
39
+ {"description": "valid tabindex attribute value with trailing whitespace and junk",
40
+ "input": "<span tabindex='32768 a'>",
41
+ "fail-if": "invalid-integer-value"},
42
+
43
+ {"description": "valid tabindex attribute value with leading spaces",
44
+ "input": "<span tabindex=' 32768'>",
45
+ "fail-if": "invalid-integer-value"},
46
+
47
+ {"description": "valid tabindex attribute value with leading spaces (with sign)",
48
+ "input": "<span tabindex=' -32768'>",
49
+ "fail-if": "invalid-integer-value"},
50
+
51
+ {"description": "invalid tabindex attribute value (blank)",
52
+ "input": "<span tabindex>",
53
+ "fail-unless": "attribute-value-can-not-be-blank"},
54
+
55
+ {"description": "invalid tabindex attribute value due to leading junk",
56
+ "input": "<span tabindex=a1>",
57
+ "fail-unless": "invalid-integer-value"},
58
+
59
+ {"description": "invalid tabindex attribute value due to two hyphens",
60
+ "input": "<span tabindex=--1>",
61
+ "fail-unless": "invalid-integer-value"},
62
+
63
+ {"description": "invalid tabindex attribute value due to non-numeric",
64
+ "input": "<span tabindex=foo>",
65
+ "fail-unless": "invalid-integer-value"},
66
+
67
+ {"description": "invalid tabindex attribute value due to positive sign",
68
+ "input": "<span tabindex=+1>",
69
+ "fail-unless": "invalid-integer-value"},
70
+
71
+ {"description": "invalid tabindex attribute value due to decimal point",
72
+ "input": "<span tabindex=.1>",
73
+ "fail-unless": "invalid-integer-value"},
74
+
75
+ {"description": "valid tabindex attribute value with trailing decimal point",
76
+ "input": "<span tabindex=1.0>",
77
+ "fail-if": "invalid-integer-value"}
78
+
79
+ ]}
@@ -8,28 +8,18 @@ else
8
8
  TESTDATA_DIR = File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'testdata')
9
9
  end
10
10
 
11
- $:.unshift File.join(File.dirname(File.dirname(__FILE__)),'lib')
11
+ # $:.unshift File.join(File.dirname(File.dirname(__FILE__)), 'lib')
12
12
 
13
- $:.unshift File.dirname(__FILE__)
13
+ # $:.unshift File.dirname(__FILE__)
14
+
15
+ require 'core_ext/string'
14
16
 
15
17
  def html5_test_files(subdirectory)
16
18
  Dir[File.join(TESTDATA_DIR, subdirectory, '*.*')]
17
19
  end
18
20
 
19
- begin
20
- require 'rubygems'
21
- require 'json'
22
- rescue LoadError
23
- class JSON
24
- def self.parse json
25
- json.gsub!(/\$/, "\\$")
26
- json.gsub!(/"\s*:/, '"=>')
27
- json.gsub!(/\\u[0-9a-fA-F]{4}/) {|x| [x[2..-1].to_i(16)].pack('U')}
28
- null = nil
29
- eval json
30
- end
31
- end
32
- end
21
+ require 'rubygems'
22
+ require 'json'
33
23
 
34
24
  module HTML5
35
25
  module TestSupport
@@ -54,7 +44,7 @@ module HTML5
54
44
 
55
45
  def each
56
46
  data = {}
57
- key=nil
47
+ key = nil
58
48
  @f.each_line do |line|
59
49
  if line[0] == ?# and @sections.include?(line[1..-2])
60
50
  heading = line[1..-2]
@@ -10,7 +10,7 @@ class Html5EncodingTestCase < Test::Unit::TestCase
10
10
  require 'rubygems'
11
11
  require 'UniversalDetector'
12
12
 
13
- def test_chardet
13
+ def test_chardet #TODO: can we get rid of this?
14
14
  file = File.open(File.join(TESTDATA_DIR, 'encoding', 'chardet', 'test_big5.txt'), 'r')
15
15
  stream = HTML5::HTMLInputStream.new(file, :chardet => true)
16
16
  assert_equal 'big5', stream.char_encoding.downcase
@@ -257,6 +257,22 @@ EOX1
257
257
  <head><title>PROLOG</title></head>
258
258
  <body>
259
259
  </body></html>
260
+ EOX2
261
+ end
262
+
263
+ def test_tagsoup
264
+ assert_xhtml_equal <<EOX1, <<EOX2.strip
265
+ <html xmlns="http://www.w3.org/1999/xhtml">
266
+ <head><title>TAGSOUP</title></head>
267
+ <body>
268
+ <u><blockquote><p></u>
269
+ </body></html>
270
+ EOX1
271
+ <html xmlns="http://www.w3.org/1999/xhtml">
272
+ <head><title>TAGSOUP</title></head>
273
+ <body>
274
+ <u/><blockquote><u/><p><u/>
275
+ </p></blockquote></body></html>
260
276
  EOX2
261
277
  end
262
278
 
@@ -50,8 +50,8 @@ class Html5ParserTestCase < Test::Unit::TestCase
50
50
  '', 'Recieved:', actual_output
51
51
  ].join("\n")
52
52
 
53
- actual_errors = parser.errors.map do |(line, col), message|
54
- 'Line: %i Col: %i %s' % [line, col, message]
53
+ actual_errors = parser.errors.map do |(line, col), message, datavars|
54
+ 'Line: %i Col: %i %s' % [line, col, E[message] % datavars]
55
55
  end
56
56
  assert_equal errors.length, parser.errors.length, [
57
57
  '', 'Input', input,
@@ -0,0 +1,27 @@
1
+ require File.join(File.dirname(__FILE__), 'preamble')
2
+ require "html5/sniffer"
3
+
4
+ class TestFeedTypeSniffer < Test::Unit::TestCase
5
+ include HTML5
6
+ include TestSupport
7
+ include Sniffer
8
+
9
+ html5_test_files('sniffer').each do |test_file|
10
+ test_name = File.basename(test_file).sub('.test', '')
11
+
12
+ tests = JSON.parse(File.read(test_file))
13
+
14
+ tests.each_with_index do |data, index|
15
+ define_method('test_%s_%d' % [test_name, index + 1]) do
16
+ assert_equal data['type'], html_or_feed(data['input'])
17
+ end
18
+ end
19
+ end
20
+ # each_with_index do |t, i|
21
+ # define_method "test_#{i}" do
22
+ # assert_equal t[0], sniff_feed_type(t[1])
23
+ # end
24
+ # end
25
+
26
+
27
+ end
@@ -47,31 +47,29 @@ class TestTreeWalkers < Test::Unit::TestCase
47
47
  indent = 0
48
48
  concatenateCharacterTokens(tokens) do |token|
49
49
  case token[:type]
50
- when :StartTag, :EmptyTag
51
- output << "#{' '*indent}<#{token[:name]}>"
52
- indent += 2
53
- for name, value in token[:data].to_a.sort
54
- next if name=='xmlns'
55
- output << "#{' '*indent}#{name}=\"#{value}\""
56
- end
57
- indent -= 2 if token[:type] == :EmptyTag
58
- when :EndTag
59
- indent -= 2
60
- when :Comment
61
- output << "#{' '*indent}<!-- #{token[:data]} -->"
62
- when :Doctype
63
- if token[:name] and token[:name].any?
64
- output << "#{' '*indent}<!DOCTYPE #{token[:name]}>"
65
- else
66
- output << "#{' '*indent}<!DOCTYPE >"
67
- end
68
- when :Characters, :SpaceCharacters
69
- output << "#{' '*indent}\"#{token[:data]}\""
50
+ when :StartTag, :EmptyTag
51
+ output << "#{' '*indent}<#{token[:name]}>"
52
+ indent += 2
53
+ for name, value in token[:data].to_a.sort
54
+ next if name=='xmlns'
55
+ output << "#{' '*indent}#{name}=\"#{value}\""
56
+ end
57
+ indent -= 2 if token[:type] == :EmptyTag
58
+ when :EndTag
59
+ indent -= 2
60
+ when :Comment
61
+ output << "#{' '*indent}<!-- #{token[:data]} -->"
62
+ when :Doctype
63
+ if token[:name] and token[:name].any?
64
+ output << "#{' '*indent}<!DOCTYPE #{token[:name]}>"
70
65
  else
71
- # TODO: what to do with errors?
66
+ output << "#{' '*indent}<!DOCTYPE >"
67
+ end
68
+ when :Characters, :SpaceCharacters
69
+ output << "#{' '*indent}\"#{token[:data]}\""
72
70
  end
73
71
  end
74
- return output.join("\n")
72
+ output.join("\n")
75
73
  end
76
74
 
77
75
  html5_test_files('tree-construction').each do |test_file|
@@ -113,4 +111,25 @@ class TestTreeWalkers < Test::Unit::TestCase
113
111
  end
114
112
  end
115
113
  end
114
+
115
+ def test_all_tokens
116
+ expected = [
117
+ {:data => [], :type => :StartTag, :name => 'html'},
118
+ {:data => [], :type => :StartTag, :name => 'head'},
119
+ {:data => [], :type => :EndTag, :name => 'head'},
120
+ {:data => [], :type => :StartTag, :name => 'body'},
121
+ {:data => [], :type => :EndTag, :name => 'body'},
122
+ {:data => [], :type => :EndTag, :name => 'html'}]
123
+ for treeName, tree_class in $tree_types_to_test
124
+ p = HTML5::HTMLParser.new(:tree => tree_class[:builder])
125
+ document = p.parse("<html></html>")
126
+ # document = tree_class.get(:adapter)(document)
127
+ output = tree_class[:walker].new(document)
128
+ expected.zip(output) do |expected_token, output_token|
129
+ assert_equal(expected_token, output_token)
130
+ end
131
+ end
132
+ end
133
+
134
+
116
135
  end
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby -wKU
2
+
3
+ require File.join(File.dirname(__FILE__), 'preamble')
4
+
5
+ require 'html5'
6
+ require 'html5/filters/validator'
7
+
8
+ class TestValidator < Test::Unit::TestCase
9
+ def run_validator_test(test)
10
+ p = HTML5::HTMLParser.new(:tokenizer => HTMLConformanceChecker)
11
+ p.parse(test['input'])
12
+ errorCodes = p.errors.collect{|e| e[1]}
13
+ if test.has_key?('fail-if')
14
+ assert !errorCodes.include?(test['fail-if'])
15
+ end
16
+ if test.has_key?('fail-unless')
17
+ assert errorCodes.include?(test['fail-unless'])
18
+ end
19
+ end
20
+
21
+ for filename in html5_test_files('validator')
22
+ tests = JSON.load(open(filename))
23
+ testName = File.basename(filename).sub(".test", "")
24
+ tests['tests'].each_with_index do |test, index|
25
+ define_method "test_#{testName}_#{index}" do
26
+ run_validator_test(test)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
metadata CHANGED
@@ -3,15 +3,15 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: html5
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
7
- date: 2007-08-07 00:00:00 -07:00
6
+ version: 0.10.0
7
+ date: 2007-10-08 00:00:00 -07:00
8
8
  summary: HTML5 parser/tokenizer.
9
9
  require_paths:
10
10
  - lib
11
11
  email: ryan@theryanking.com
12
12
  homepage: http://code.google.com/p/html5lib
13
13
  rubyforge_project: html5
14
- description: A ruby based HTML parser/tokenizer based on the WHATWG HTML5 specification for maximum compatibility with major desktop web browsers.
14
+ description: "A ruby implementation of the parsing algorithm in HTML5. == FEATURES/PROBLEMS: == SYNOPSIS: TODO"
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
@@ -33,12 +33,18 @@ files:
33
33
  - Manifest.txt
34
34
  - README
35
35
  - Rakefile.rb
36
+ - bin/html5
37
+ - lib/core_ext/string.rb
36
38
  - lib/html5.rb
37
39
  - lib/html5/constants.rb
38
40
  - lib/html5/filters/base.rb
39
41
  - lib/html5/filters/inject_meta_charset.rb
42
+ - lib/html5/filters/iso639codes.rb
40
43
  - lib/html5/filters/optionaltags.rb
44
+ - lib/html5/filters/rfc2046.rb
45
+ - lib/html5/filters/rfc3987.rb
41
46
  - lib/html5/filters/sanitizer.rb
47
+ - lib/html5/filters/validator.rb
42
48
  - lib/html5/filters/whitespace.rb
43
49
  - lib/html5/html5parser.rb
44
50
  - lib/html5/html5parser/after_body_phase.rb
@@ -65,6 +71,7 @@ files:
65
71
  - lib/html5/serializer.rb
66
72
  - lib/html5/serializer/htmlserializer.rb
67
73
  - lib/html5/serializer/xhtmlserializer.rb
74
+ - lib/html5/sniffer.rb
68
75
  - lib/html5/tokenizer.rb
69
76
  - lib/html5/treebuilders.rb
70
77
  - lib/html5/treebuilders/base.rb
@@ -76,16 +83,68 @@ files:
76
83
  - lib/html5/treewalkers/hpricot.rb
77
84
  - lib/html5/treewalkers/rexml.rb
78
85
  - lib/html5/treewalkers/simpletree.rb
79
- - parse.rb
86
+ - lib/html5/version.rb
87
+ - testdata/encoding/chardet/test_big5.txt
88
+ - testdata/encoding/test-yahoo-jp.dat
89
+ - testdata/encoding/tests1.dat
90
+ - testdata/encoding/tests2.dat
91
+ - testdata/sanitizer/tests1.dat
92
+ - testdata/serializer/core.test
93
+ - testdata/serializer/injectmeta.test
94
+ - testdata/serializer/optionaltags.test
95
+ - testdata/serializer/options.test
96
+ - testdata/serializer/whitespace.test
97
+ - testdata/sites/google-results.htm
98
+ - testdata/sites/python-ref-import.htm
99
+ - testdata/sites/web-apps-old.htm
100
+ - testdata/sites/web-apps.htm
101
+ - testdata/sniffer/htmlOrFeed.json
102
+ - testdata/tokenizer/contentModelFlags.test
103
+ - testdata/tokenizer/entities.test
104
+ - testdata/tokenizer/escapeFlag.test
105
+ - testdata/tokenizer/test1.test
106
+ - testdata/tokenizer/test2.test
107
+ - testdata/tokenizer/test3.test
108
+ - testdata/tokenizer/test4.test
109
+ - testdata/tree-construction/tests1.dat
110
+ - testdata/tree-construction/tests2.dat
111
+ - testdata/tree-construction/tests3.dat
112
+ - testdata/tree-construction/tests4.dat
113
+ - testdata/tree-construction/tests5.dat
114
+ - testdata/tree-construction/tests6.dat
115
+ - testdata/validator/attributes.test
116
+ - testdata/validator/base-href-attribute.test
117
+ - testdata/validator/base-target-attribute.test
118
+ - testdata/validator/blockquote-cite-attribute.test
119
+ - testdata/validator/classattribute.test
120
+ - testdata/validator/contenteditableattribute.test
121
+ - testdata/validator/contextmenuattribute.test
122
+ - testdata/validator/dirattribute.test
123
+ - testdata/validator/draggableattribute.test
124
+ - testdata/validator/html-xmlns-attribute.test
125
+ - testdata/validator/idattribute.test
126
+ - testdata/validator/inputattributes.test
127
+ - testdata/validator/irrelevantattribute.test
128
+ - testdata/validator/langattribute.test
129
+ - testdata/validator/li-value-attribute.test
130
+ - testdata/validator/link-href-attribute.test
131
+ - testdata/validator/link-hreflang-attribute.test
132
+ - testdata/validator/link-rel-attribute.test
133
+ - testdata/validator/ol-start-attribute.test
134
+ - testdata/validator/starttags.test
135
+ - testdata/validator/style-scoped-attribute.test
136
+ - testdata/validator/tabindexattribute.test
80
137
  - tests/preamble.rb
81
138
  - tests/test_encoding.rb
82
139
  - tests/test_lxp.rb
83
140
  - tests/test_parser.rb
84
141
  - tests/test_sanitizer.rb
85
142
  - tests/test_serializer.rb
143
+ - tests/test_sniffer.rb
86
144
  - tests/test_stream.rb
87
145
  - tests/test_tokenizer.rb
88
146
  - tests/test_treewalkers.rb
147
+ - tests/test_validator.rb
89
148
  - tests/tokenizer_test_parser.rb
90
149
  test_files: []
91
150
 
@@ -93,8 +152,8 @@ rdoc_options: []
93
152
 
94
153
  extra_rdoc_files: []
95
154
 
96
- executables: []
97
-
155
+ executables:
156
+ - html5
98
157
  extensions: []
99
158
 
100
159
  requirements: []