haml 4.0.7 → 5.2.2

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.
Files changed (124) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/test.yml +36 -0
  3. data/.gitignore +19 -0
  4. data/.gitmodules +3 -0
  5. data/.yardopts +2 -3
  6. data/CHANGELOG.md +146 -4
  7. data/FAQ.md +4 -14
  8. data/Gemfile +16 -0
  9. data/MIT-LICENSE +2 -2
  10. data/README.md +90 -47
  11. data/REFERENCE.md +160 -74
  12. data/Rakefile +44 -63
  13. data/TODO +24 -0
  14. data/benchmark.rb +70 -0
  15. data/haml.gemspec +45 -0
  16. data/lib/haml/.gitattributes +1 -0
  17. data/lib/haml/attribute_builder.rb +219 -0
  18. data/lib/haml/attribute_compiler.rb +237 -0
  19. data/lib/haml/attribute_parser.rb +150 -0
  20. data/lib/haml/buffer.rb +12 -175
  21. data/lib/haml/compiler.rb +110 -320
  22. data/lib/haml/engine.rb +34 -41
  23. data/lib/haml/error.rb +28 -24
  24. data/lib/haml/escapable.rb +77 -0
  25. data/lib/haml/exec.rb +38 -20
  26. data/lib/haml/filters.rb +22 -27
  27. data/lib/haml/generator.rb +42 -0
  28. data/lib/haml/helpers/action_view_extensions.rb +4 -2
  29. data/lib/haml/helpers/action_view_mods.rb +45 -60
  30. data/lib/haml/helpers/action_view_xss_mods.rb +2 -0
  31. data/lib/haml/helpers/safe_erubi_template.rb +20 -0
  32. data/lib/haml/helpers/safe_erubis_template.rb +5 -1
  33. data/lib/haml/helpers/xss_mods.rb +23 -13
  34. data/lib/haml/helpers.rb +134 -89
  35. data/lib/haml/options.rb +63 -69
  36. data/lib/haml/parser.rb +319 -227
  37. data/lib/haml/plugin.rb +54 -0
  38. data/lib/haml/railtie.rb +43 -12
  39. data/lib/haml/sass_rails_filter.rb +18 -4
  40. data/lib/haml/template/options.rb +13 -2
  41. data/lib/haml/template.rb +13 -6
  42. data/lib/haml/temple_engine.rb +124 -0
  43. data/lib/haml/temple_line_counter.rb +30 -0
  44. data/lib/haml/util.rb +83 -202
  45. data/lib/haml/version.rb +3 -1
  46. data/lib/haml.rb +2 -0
  47. data/yard/default/.gitignore +1 -0
  48. data/yard/default/fulldoc/html/css/common.sass +15 -0
  49. data/yard/default/layout/html/footer.erb +12 -0
  50. metadata +73 -115
  51. data/lib/haml/template/plugin.rb +0 -41
  52. data/test/engine_test.rb +0 -2013
  53. data/test/erb/_av_partial_1.erb +0 -12
  54. data/test/erb/_av_partial_2.erb +0 -8
  55. data/test/erb/action_view.erb +0 -62
  56. data/test/erb/standard.erb +0 -55
  57. data/test/filters_test.rb +0 -254
  58. data/test/gemfiles/Gemfile.rails-3.0.x +0 -5
  59. data/test/gemfiles/Gemfile.rails-3.1.x +0 -6
  60. data/test/gemfiles/Gemfile.rails-3.2.x +0 -5
  61. data/test/gemfiles/Gemfile.rails-4.0.x +0 -5
  62. data/test/haml-spec/LICENSE +0 -14
  63. data/test/haml-spec/README.md +0 -106
  64. data/test/haml-spec/lua_haml_spec.lua +0 -38
  65. data/test/haml-spec/perl_haml_test.pl +0 -81
  66. data/test/haml-spec/ruby_haml_test.rb +0 -23
  67. data/test/haml-spec/tests.json +0 -660
  68. data/test/helper_test.rb +0 -583
  69. data/test/markaby/standard.mab +0 -52
  70. data/test/mocks/article.rb +0 -6
  71. data/test/parser_test.rb +0 -105
  72. data/test/results/content_for_layout.xhtml +0 -12
  73. data/test/results/eval_suppressed.xhtml +0 -9
  74. data/test/results/helpers.xhtml +0 -70
  75. data/test/results/helpful.xhtml +0 -10
  76. data/test/results/just_stuff.xhtml +0 -70
  77. data/test/results/list.xhtml +0 -12
  78. data/test/results/nuke_inner_whitespace.xhtml +0 -40
  79. data/test/results/nuke_outer_whitespace.xhtml +0 -148
  80. data/test/results/original_engine.xhtml +0 -20
  81. data/test/results/partial_layout.xhtml +0 -5
  82. data/test/results/partial_layout_erb.xhtml +0 -5
  83. data/test/results/partials.xhtml +0 -21
  84. data/test/results/render_layout.xhtml +0 -3
  85. data/test/results/silent_script.xhtml +0 -74
  86. data/test/results/standard.xhtml +0 -162
  87. data/test/results/tag_parsing.xhtml +0 -23
  88. data/test/results/very_basic.xhtml +0 -5
  89. data/test/results/whitespace_handling.xhtml +0 -90
  90. data/test/template_test.rb +0 -354
  91. data/test/templates/_av_partial_1.haml +0 -9
  92. data/test/templates/_av_partial_1_ugly.haml +0 -9
  93. data/test/templates/_av_partial_2.haml +0 -5
  94. data/test/templates/_av_partial_2_ugly.haml +0 -5
  95. data/test/templates/_layout.erb +0 -3
  96. data/test/templates/_layout_for_partial.haml +0 -3
  97. data/test/templates/_partial.haml +0 -8
  98. data/test/templates/_text_area.haml +0 -3
  99. data/test/templates/_text_area_helper.html.haml +0 -4
  100. data/test/templates/action_view.haml +0 -47
  101. data/test/templates/action_view_ugly.haml +0 -47
  102. data/test/templates/breakage.haml +0 -8
  103. data/test/templates/content_for_layout.haml +0 -8
  104. data/test/templates/eval_suppressed.haml +0 -11
  105. data/test/templates/helpers.haml +0 -55
  106. data/test/templates/helpful.haml +0 -11
  107. data/test/templates/just_stuff.haml +0 -85
  108. data/test/templates/list.haml +0 -12
  109. data/test/templates/nuke_inner_whitespace.haml +0 -32
  110. data/test/templates/nuke_outer_whitespace.haml +0 -144
  111. data/test/templates/original_engine.haml +0 -17
  112. data/test/templates/partial_layout.haml +0 -3
  113. data/test/templates/partial_layout_erb.erb +0 -4
  114. data/test/templates/partialize.haml +0 -1
  115. data/test/templates/partials.haml +0 -12
  116. data/test/templates/render_layout.haml +0 -2
  117. data/test/templates/silent_script.haml +0 -45
  118. data/test/templates/standard.haml +0 -43
  119. data/test/templates/standard_ugly.haml +0 -43
  120. data/test/templates/tag_parsing.haml +0 -21
  121. data/test/templates/very_basic.haml +0 -4
  122. data/test/templates/whitespace_handling.haml +0 -87
  123. data/test/test_helper.rb +0 -81
  124. data/test/util_test.rb +0 -63
data/test/parser_test.rb DELETED
@@ -1,105 +0,0 @@
1
- require 'test_helper'
2
-
3
- module Haml
4
- class ParserTest < MiniTest::Unit::TestCase
5
-
6
- test "should raise error for 'else' at wrong indent level" do
7
- begin
8
- parse("- if true\n #first\n text\n - else\n #second")
9
- flunk("Should have raised a Haml::SyntaxError")
10
- rescue SyntaxError => e
11
- assert_equal Error.message(:bad_script_indent, 'else', 0, 1), e.message
12
- end
13
- end
14
-
15
- test "should raise error for 'elsif' at wrong indent level" do
16
- begin
17
- parse("- if true\n #first\n text\n - elsif false\n #second")
18
- flunk("Should have raised a Haml::SyntaxError")
19
- rescue SyntaxError => e
20
- assert_equal Error.message(:bad_script_indent, 'elsif', 0, 1), e.message
21
- end
22
- end
23
-
24
- test "should raise error for 'else' at wrong indent level after unless" do
25
- begin
26
- parse("- unless true\n #first\n text\n - else\n #second")
27
- flunk("Should have raised a Haml::SyntaxError")
28
- rescue SyntaxError => e
29
- assert_equal Error.message(:bad_script_indent, 'else', 0, 1), e.message
30
- end
31
- end
32
-
33
- test "should raise syntax error for else with no if" do
34
- begin
35
- parse("- else\n 'foo'")
36
- flunk("Should have raised a Haml::SyntaxError")
37
- rescue SyntaxError => e
38
- assert_equal Error.message(:missing_if, 'else'), e.message
39
- end
40
- end
41
-
42
- test "should raise syntax error for nested else with no" do
43
- begin
44
- parse("#foo\n - else\n 'foo'")
45
- flunk("Should have raised a Haml::SyntaxError")
46
- rescue SyntaxError => e
47
- assert_equal Error.message(:missing_if, 'else'), e.message
48
- end
49
- end
50
-
51
- test "else after if containing case is accepted" do
52
- # see issue 572
53
- begin
54
- parse "- if true\n - case @foo\n - when 1\n bar\n- else\n bar"
55
- assert true
56
- rescue SyntaxError
57
- flunk 'else clause after if containing case should be accepted'
58
- end
59
- end
60
-
61
- test "else after if containing unless is accepted" do
62
- begin
63
- parse "- if true\n - unless @foo\n bar\n- else\n bar"
64
- assert true
65
- rescue SyntaxError
66
- flunk 'else clause after if containing unless should be accepted'
67
- end
68
- end
69
-
70
- test "loud script with else is accepted" do
71
- begin
72
- parse "= if true\n - 'A'\n-else\n - 'B'"
73
- assert true
74
- rescue SyntaxError
75
- flunk 'loud script (=) should allow else'
76
- end
77
- end
78
-
79
- test "else after nested loud script is accepted" do
80
- begin
81
- parse "-if true\n =if true\n - 'A'\n-else\n B"
82
- assert true
83
- rescue SyntaxError
84
- flunk 'else after nested loud script should be accepted'
85
- end
86
- end
87
-
88
- test "case with indented whens should allow else" do
89
- begin
90
- parse "- foo = 1\n-case foo\n -when 1\n A\n -else\n B"
91
- assert true
92
- rescue SyntaxError
93
- flunk 'case with indented whens should allow else'
94
- end
95
- end
96
-
97
- private
98
-
99
- def parse(haml, options = nil)
100
- options ||= Options.new
101
- parser = Parser.new(haml, options)
102
- parser.parse
103
- end
104
- end
105
- end
@@ -1,12 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html>
3
- <head></head>
4
- <body>
5
- <div id='yieldy'>
6
- Lorem ipsum dolor sit amet
7
- </div>
8
- <div id='nosym'>
9
- Lorem ipsum dolor sit amet
10
- </div>
11
- </body>
12
- </html>
@@ -1,9 +0,0 @@
1
- <p></p>
2
- <p></p>
3
- <h1>Me!</h1>
4
- <div id='foo'>
5
- <p id='bar'>All</p>
6
- <br />
7
- <p class='baz'>This</p>
8
- Should render
9
- </div>
@@ -1,70 +0,0 @@
1
- &amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp;
2
- <div>
3
- <p class='title'>Title</p>
4
- <p class='text'>
5
- Woah this is really crazy
6
- I mean wow,
7
- man.
8
- </p>
9
- </div>
10
- <div>
11
- <p class='title'>Title</p>
12
- <p class='text'>
13
- Woah this is really crazy
14
- I mean wow,
15
- man.
16
- </p>
17
- </div>
18
- <div>
19
- <p class='title'>Title</p>
20
- <p class='text'>
21
- Woah this is really crazy
22
- I mean wow,
23
- man.
24
- </p>
25
- </div>
26
- <p>foo</p>
27
- <p>reeeeeeeeeeeeeeeeeeeeeeeeeeeeeeally loooooooooooooooooong</p>
28
- <div class='woah'>
29
- <div id='funky'>
30
- <div>
31
- <h1>Big!</h1>
32
- <p>Small</p>
33
- <!-- Invisible -->
34
- </div>
35
- <div class='dilly'>
36
- <p>foo</p>
37
- <h1>bar</h1>
38
- </div>
39
- </div>
40
- (<strong>parentheses!</strong>)
41
- </div>
42
- *<span class='small'>Not really</span>
43
- click
44
- <a href='thing'>here</a>.
45
- <p>baz</p>
46
- <p>boom</p>
47
- foo
48
- <li><a href='http://www.google.com'>google</a></li>
49
- <p>
50
- foo
51
- <div>
52
- bar
53
- </div>
54
- boom
55
- baz
56
- boom, again
57
- </p>
58
- <table>
59
- <tr>
60
- <td class='cell'>
61
- <strong>strong!</strong>
62
- data
63
- </td>
64
- <td>
65
- more_data
66
- </td>
67
- </tr>
68
- </table>
69
- <hr />
70
- <div></div>
@@ -1,10 +0,0 @@
1
- <div class='article' id='article_1'>
2
- <h1>Hello</h1>
3
- <div>World</div>
4
- </div>
5
- <div class='article' id='id_article_1'>id</div>
6
- <div class='article class' id='article_1'>class</div>
7
- <div class='article class' id='id_article_1'>id class</div>
8
- <div class='article full' id='article_1'>boo</div>
9
- <div class='article full' id='article_1'>moo</div>
10
- <div class='article articleFull' id='article_1'>foo</div>
@@ -1,70 +0,0 @@
1
- <?xml version='1.0' encoding='utf-8' ?>
2
- <?xml version='1.0' encoding='iso-8859-1' ?>
3
- <?xml version='1.0' encoding='utf-8' ?>
4
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
6
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
7
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
8
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
9
- <strong apos="Foo's bar!">Boo!</strong>
10
- Embedded? false!
11
- Embedded? true!
12
- Embedded? true!
13
- Embedded? twice! true!
14
- Embedded? one af"t"er another!
15
- <p>Embedded? false!</p>
16
- <p>Embedded? true!</p>
17
- <p>Embedded? true!</p>
18
- <p>Embedded? twice! true!</p>
19
- <p>Embedded? one af"t"er another!</p>
20
- stuff followed by whitespace
21
- <strong>block with whitespace</strong>
22
- <p>
23
- Escape
24
- - character
25
- %p foo
26
- yee\ha
27
- </p>
28
- <!-- Short comment -->
29
- <!--
30
- This is a block comment
31
- cool, huh?
32
- <strong>there can even be sub-tags!</strong>
33
- Or script!
34
- -->
35
- <p class=''>class attribute should appear!</p>
36
- <p>this attribute shouldn't appear</p>
37
- <!--[if lte IE6]> conditional comment! <![endif]-->
38
- <!--[if gte IE7]>
39
- <p>Block conditional comment</p>
40
- <div>
41
- <h1>Cool, eh?</h1>
42
- </div>
43
- <![endif]-->
44
- <!--[if gte IE5.2]>
45
- Woah a period.
46
- <![endif]-->
47
- testtest
48
- <br />
49
- <meta foo='bar' />
50
- <img />
51
- <hr />
52
- <link />
53
- <script>Inline content</script>
54
- <br>
55
- Nested content
56
- </br>
57
- <p class='article bar foo' id='article_1'>Blah</p>
58
- <p class='article foo' id='article_1'>Blah</p>
59
- <p class='article bar baz foo' id='article_1'>Blah</p>
60
- <p class='article quux qux' id='article_1'>Blump</p>
61
- <p class='article' id='foo_bar_baz_article_1'>Whee</p>
62
- Woah inner quotes
63
- <p class='dynamic_quote' dyn='3' quotes="single '"></p>
64
- <p class='dynamic_self_closing' dyn='3' />
65
- <body>
66
- hello
67
- <div>
68
- <img />
69
- </div>
70
- </body>
@@ -1,12 +0,0 @@
1
- !Not a Doctype!
2
- <ul>
3
- <li>a</li>
4
- <li>b</li>
5
- <li>c</li>
6
- <li>d</li>
7
- <li>e</li>
8
- <li>f</li>
9
- <li>g</li>
10
- <li>h</li>
11
- <li>i</li>
12
- </ul>
@@ -1,40 +0,0 @@
1
- <p>
2
- <q>Foo</q>
3
- </p>
4
- <p>
5
- <q a='2'>Foo</q>
6
- </p>
7
- <p>
8
- <q>Foo
9
- Bar</q>
10
- </p>
11
- <p>
12
- <q a='2'>Foo
13
- Bar</q>
14
- </p>
15
- <p>
16
- <q>Foo
17
- Bar</q>
18
- </p>
19
- <p>
20
- <q a='2'>Foo
21
- Bar</q>
22
- </p>
23
- <p>
24
- <q><div>
25
- Foo
26
- Bar
27
- </div></q>
28
- </p>
29
- <p>
30
- <q a='2'><div>
31
- Foo
32
- Bar
33
- </div></q>
34
- </p>
35
- <p>
36
- <q>foo</q>
37
- <q a='2'>
38
- bar
39
- </q>
40
- </p>
@@ -1,148 +0,0 @@
1
- <p>
2
- <p><q>
3
- Foo
4
- </q></p>
5
- </p>
6
- <p>
7
- <p><q a='2'>
8
- Foo
9
- </q></p>
10
- </p>
11
- <p>
12
- <p><q>Foo</q></p>
13
- </p>
14
- <p>
15
- <p><q a='2'>Foo</q></p>
16
- </p>
17
- <p>
18
- <p><q>
19
- Foo
20
- </q></p>
21
- </p>
22
- <p>
23
- <p><q a='2'>
24
- Foo
25
- </q></p>
26
- </p>
27
- <p>
28
- <p><q>Foo</q></p>
29
- </p>
30
- <p>
31
- <p><q a='2'>Foo</q></p>
32
- </p>
33
- <p>
34
- <p><q>
35
- Foo
36
- Bar
37
- </q></p>
38
- </p>
39
- <p>
40
- <p><q a='2'>
41
- Foo
42
- Bar
43
- </q></p>
44
- </p>
45
- <p>
46
- <p><q>
47
- Foo
48
- Bar
49
- </q></p>
50
- </p>
51
- <p>
52
- <p><q a='2'>
53
- Foo
54
- Bar
55
- </q></p>
56
- </p>
57
- <p>
58
- <p>
59
- foo<q>
60
- Foo
61
- </q>bar
62
- </p>
63
- </p>
64
- <p>
65
- <p>
66
- foo<q a='2'>
67
- Foo
68
- </q>bar
69
- </p>
70
- </p>
71
- <p>
72
- <p>
73
- foo<q>Foo</q>bar
74
- </p>
75
- </p>
76
- <p>
77
- <p>
78
- foo<q a='2'>Foo</q>bar
79
- </p>
80
- </p>
81
- <p>
82
- <p>
83
- foo<q>
84
- Foo
85
- </q>bar
86
- </p>
87
- </p>
88
- <p>
89
- <p>
90
- foo<q a='2'>
91
- Foo
92
- </q>bar
93
- </p>
94
- </p>
95
- <p>
96
- <p>
97
- foo<q>Foo</q>bar
98
- </p>
99
- </p>
100
- <p>
101
- <p>
102
- foo<q a='2'>Foo</q>bar
103
- </p>
104
- </p>
105
- <p>
106
- <p>
107
- foo<q>
108
- Foo
109
- Bar
110
- </q>bar
111
- </p>
112
- </p>
113
- <p>
114
- <p>
115
- foo<q a='2'>
116
- Foo
117
- Bar
118
- </q>bar
119
- </p>
120
- </p>
121
- <p>
122
- <p>
123
- foo<q>
124
- Foo
125
- Bar
126
- </q>bar
127
- </p>
128
- </p>
129
- <p>
130
- <p>
131
- foo<q a='2'>
132
- Foo
133
- Bar
134
- </q>bar
135
- </p>
136
- </p>
137
- <p>
138
- <p><q></q></p>
139
- </p>
140
- <p>
141
- <p><q /></p>
142
- </p>
143
- <p>
144
- <p><q a='2'></q></p>
145
- </p>
146
- <p>
147
- <p><q a='2' /></p>
148
- </p>
@@ -1,20 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html>
3
- <head>
4
- <title>Stop. haml time</title>
5
- <div id='content'>
6
- <h1>This is a title!</h1>
7
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
8
- <p class='foo'>Cigarettes!</p>
9
- <h2>Man alive!</h2>
10
- <ul class='things'>
11
- <li>Slippers</li>
12
- <li>Shoes</li>
13
- <li>Bathrobe</li>
14
- <li>Coffee</li>
15
- </ul>
16
- <pre>This is some text that's in a pre block!
17
- Let's see what happens when it's rendered! What about now, since we're on a new line?</pre>
18
- </div>
19
- </head>
20
- </html>
@@ -1,5 +0,0 @@
1
- <h1>Partial layout used with for block:</h1>
2
- <div class='partial-layout'>
3
- <h2>This is inside a partial layout</h2>
4
- <p>Some content within a layout</p>
5
- </div>
@@ -1,5 +0,0 @@
1
- <h1>Partial layout used with for block:</h1>
2
- <div class='partial-layout'>
3
- <h2>This is inside a partial layout</h2>
4
- Some content within a layout
5
- </div>
@@ -1,21 +0,0 @@
1
- <p>
2
- @foo =
3
- value one
4
- </p>
5
- <p>
6
- @foo =
7
- value two
8
- </p>
9
- <p>
10
- @foo =
11
- value two
12
- </p>
13
- Toplevel? false
14
- <p>
15
- @foo =
16
- value three
17
- </p>
18
- <p>
19
- @foo =
20
- value three
21
- </p>
@@ -1,3 +0,0 @@
1
- Before
2
- During
3
- After
@@ -1,74 +0,0 @@
1
- <div>
2
- <h1>I can count!</h1>
3
- 1
4
- 2
5
- 3
6
- 4
7
- 5
8
- 6
9
- 7
10
- 8
11
- 9
12
- 10
13
- 11
14
- 12
15
- 13
16
- 14
17
- 15
18
- 16
19
- 17
20
- 18
21
- 19
22
- 20
23
- <h1>I know my ABCs!</h1>
24
- <ul>
25
- <li>a</li>
26
- <li>b</li>
27
- <li>c</li>
28
- <li>d</li>
29
- <li>e</li>
30
- <li>f</li>
31
- <li>g</li>
32
- <li>h</li>
33
- <li>i</li>
34
- <li>j</li>
35
- <li>k</li>
36
- <li>l</li>
37
- <li>m</li>
38
- <li>n</li>
39
- <li>o</li>
40
- <li>p</li>
41
- <li>q</li>
42
- <li>r</li>
43
- <li>s</li>
44
- <li>t</li>
45
- <li>u</li>
46
- <li>v</li>
47
- <li>w</li>
48
- <li>x</li>
49
- <li>y</li>
50
- <li>z</li>
51
- </ul>
52
- <h1>I can catch errors!</h1>
53
- Oh no! "foo" happened!
54
- <p>
55
- "false" is:
56
- false
57
- </p>
58
- Even!
59
- Odd!
60
- Even!
61
- Odd!
62
- Even!
63
- </div>
64
- <div class='foo'>
65
- <strong>foobar</strong>
66
- </div>
67
- <strong>0</strong>
68
- <strong>1</strong>
69
- <strong>2</strong>
70
- <strong>3</strong>
71
- <strong>4</strong>
72
- <div class='test'>
73
- <p>boom</p>
74
- </div>