better_html 0.0.12 → 1.0.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/lib/better_html.rb +0 -2
  3. data/lib/better_html/ast/iterator.rb +32 -0
  4. data/lib/better_html/ast/node.rb +14 -0
  5. data/lib/better_html/better_erb/runtime_checks.rb +3 -3
  6. data/lib/better_html/config.rb +12 -0
  7. data/lib/better_html/parser.rb +286 -0
  8. data/lib/better_html/test_helper/ruby_expr.rb +8 -5
  9. data/lib/better_html/test_helper/safe_erb_tester.rb +121 -108
  10. data/lib/better_html/test_helper/safe_lodash_tester.rb +44 -42
  11. data/lib/better_html/tokenizer/base_erb.rb +79 -0
  12. data/lib/better_html/tokenizer/html_erb.rb +31 -0
  13. data/lib/better_html/{node_iterator → tokenizer}/html_lodash.rb +30 -34
  14. data/lib/better_html/tokenizer/javascript_erb.rb +15 -0
  15. data/lib/better_html/{node_iterator → tokenizer}/location.rb +9 -3
  16. data/lib/better_html/tokenizer/token.rb +16 -0
  17. data/lib/better_html/tokenizer/token_array.rb +54 -0
  18. data/lib/better_html/tree/attribute.rb +31 -0
  19. data/lib/better_html/tree/attributes_list.rb +25 -0
  20. data/lib/better_html/tree/tag.rb +39 -0
  21. data/lib/better_html/version.rb +1 -1
  22. data/test/better_html/parser_test.rb +279 -0
  23. data/test/better_html/test_helper/safe_erb_tester_test.rb +11 -0
  24. data/test/better_html/test_helper/safe_lodash_tester_test.rb +11 -1
  25. data/test/better_html/tokenizer/html_erb_test.rb +158 -0
  26. data/test/better_html/tokenizer/html_lodash_test.rb +98 -0
  27. data/test/better_html/tokenizer/location_test.rb +57 -0
  28. data/test/better_html/tokenizer/token_array_test.rb +144 -0
  29. data/test/better_html/tokenizer/token_test.rb +15 -0
  30. metadata +45 -30
  31. data/lib/better_html/node_iterator.rb +0 -144
  32. data/lib/better_html/node_iterator/attribute.rb +0 -34
  33. data/lib/better_html/node_iterator/base.rb +0 -27
  34. data/lib/better_html/node_iterator/cdata.rb +0 -8
  35. data/lib/better_html/node_iterator/comment.rb +0 -8
  36. data/lib/better_html/node_iterator/content_node.rb +0 -13
  37. data/lib/better_html/node_iterator/element.rb +0 -26
  38. data/lib/better_html/node_iterator/html_erb.rb +0 -70
  39. data/lib/better_html/node_iterator/javascript_erb.rb +0 -55
  40. data/lib/better_html/node_iterator/text.rb +0 -8
  41. data/lib/better_html/node_iterator/token.rb +0 -8
  42. data/lib/better_html/tree.rb +0 -113
  43. data/test/better_html/node_iterator/html_erb_test.rb +0 -116
  44. data/test/better_html/node_iterator/html_lodash_test.rb +0 -132
  45. data/test/better_html/node_iterator/location_test.rb +0 -36
  46. data/test/better_html/node_iterator_test.rb +0 -221
  47. data/test/better_html/tree_test.rb +0 -110
@@ -1,116 +0,0 @@
1
- require 'test_helper'
2
-
3
- module BetterHtml
4
- class NodeIterator
5
- class HtmlErbTest < ActiveSupport::TestCase
6
- test "text" do
7
- scanner = BetterHtml::NodeIterator::HtmlErb.new("just some text")
8
- assert_equal 1, scanner.tokens.size
9
- token = scanner.tokens[0]
10
- assert_attributes ({ type: :text, text: 'just some text', code: nil }), token
11
- assert_attributes ({ start: 0, stop: 14, line: 1, column: 0 }), token.location
12
- end
13
-
14
- test "statement" do
15
- scanner = BetterHtml::NodeIterator::HtmlErb.new("<% statement %>")
16
- assert_equal 1, scanner.tokens.size
17
- token = scanner.tokens[0]
18
- assert_attributes ({ type: :stmt, text: '<% statement %>', code: ' statement ' }), token
19
- assert_attributes ({ start: 0, stop: 15, line: 1, column: 0 }), token.location
20
- end
21
-
22
- test "expression literal" do
23
- scanner = BetterHtml::NodeIterator::HtmlErb.new("<%= literal %>")
24
- assert_equal 1, scanner.tokens.size
25
- token = scanner.tokens[0]
26
- assert_attributes ({ type: :expr_literal, text: '<%= literal %>', code: ' literal ' }), token
27
- assert_attributes ({ start: 0, stop: 14, line: 1, column: 0 }), token.location
28
- end
29
-
30
- test "expression escaped" do
31
- scanner = BetterHtml::NodeIterator::HtmlErb.new("<%== escaped %>")
32
- assert_equal 1, scanner.tokens.size
33
- token = scanner.tokens[0]
34
- assert_attributes ({ type: :expr_escaped, text: '<%== escaped %>', code: ' escaped ' }), token
35
- assert_attributes ({ start: 0, stop: 15, line: 1, column: 0 }), token.location
36
- end
37
-
38
- test "line number for multi-line statements" do
39
- scanner = BetterHtml::NodeIterator::HtmlErb.new("before <% multi\nline %> after")
40
- assert_equal 3, scanner.tokens.size
41
-
42
- assert_attributes ({ type: :text, text: 'before ' }), scanner.tokens[0]
43
- assert_attributes ({ line: 1 }), scanner.tokens[0].location
44
-
45
- assert_attributes ({ type: :stmt, text: "<% multi\nline %>" }), scanner.tokens[1]
46
- assert_attributes ({ line: 1 }), scanner.tokens[1].location
47
-
48
- assert_attributes ({ type: :text, text: " after" }), scanner.tokens[2]
49
- assert_attributes ({ line: 2 }), scanner.tokens[2].location
50
- end
51
-
52
- test "multi-line statements with trim" do
53
- scanner = BetterHtml::NodeIterator::HtmlErb.new("before\n<% multi\nline -%>\nafter")
54
- assert_equal 4, scanner.tokens.size
55
-
56
- assert_attributes ({ type: :text, text: "before\n" }), scanner.tokens[0]
57
- assert_attributes ({ line: 1 }), scanner.tokens[0].location
58
-
59
- assert_attributes ({ type: :stmt, text: "<% multi\nline %>" }), scanner.tokens[1]
60
- assert_attributes ({ line: 2 }), scanner.tokens[1].location
61
-
62
- assert_attributes ({ type: :text, text: "\n" }), scanner.tokens[2]
63
- assert_attributes ({ line: 3 }), scanner.tokens[2].location
64
-
65
- assert_attributes ({ type: :text, text: "after" }), scanner.tokens[3]
66
- assert_attributes ({ line: 4 }), scanner.tokens[3].location
67
- end
68
-
69
- test "multi-line expression with trim" do
70
- scanner = BetterHtml::NodeIterator::HtmlErb.new("before\n<%= multi\nline -%>\nafter")
71
- assert_equal 4, scanner.tokens.size
72
-
73
- assert_attributes ({ type: :text, text: "before\n" }), scanner.tokens[0]
74
- assert_attributes ({ line: 1 }), scanner.tokens[0].location
75
-
76
- assert_attributes ({ type: :expr_literal, text: "<%= multi\nline %>" }), scanner.tokens[1]
77
- assert_attributes ({ line: 2 }), scanner.tokens[1].location
78
-
79
- assert_attributes ({ type: :text, text: "\n" }), scanner.tokens[2]
80
- assert_attributes ({ line: 3 }), scanner.tokens[2].location
81
-
82
- assert_attributes ({ type: :text, text: "after" }), scanner.tokens[3]
83
- assert_attributes ({ line: 4 }), scanner.tokens[3].location
84
- end
85
-
86
- test "line counts with comments" do
87
- scanner = BetterHtml::NodeIterator::HtmlErb.new("before\n<%# BO$$ Mode %>\nafter")
88
- assert_equal 4, scanner.tokens.size
89
-
90
- assert_attributes ({ type: :text, text: "before\n" }), scanner.tokens[0]
91
- assert_attributes ({ line: 1 }), scanner.tokens[0].location
92
-
93
- assert_attributes ({ type: :stmt, text: "<%# BO$$ Mode %>" }), scanner.tokens[1]
94
- assert_attributes ({ line: 2 }), scanner.tokens[1].location
95
-
96
- assert_attributes ({ type: :text, text: "\n" }), scanner.tokens[2]
97
- assert_attributes ({ line: 2 }), scanner.tokens[2].location
98
-
99
- assert_attributes ({ type: :text, text: "after" }), scanner.tokens[3]
100
- assert_attributes ({ line: 3 }), scanner.tokens[3].location
101
- end
102
-
103
- private
104
-
105
- def assert_attributes(attributes, token)
106
- attributes.each do |key, value|
107
- if value.nil?
108
- assert_nil token.send(key)
109
- else
110
- assert_equal value, token.send(key)
111
- end
112
- end
113
- end
114
- end
115
- end
116
- end
@@ -1,132 +0,0 @@
1
- require 'test_helper'
2
-
3
- module BetterHtml
4
- class NodeIterator
5
- class HtmlLodashTest < ActiveSupport::TestCase
6
- test "matches text" do
7
- scanner = BetterHtml::NodeIterator::HtmlLodash.new("just some text")
8
- assert_equal 1, scanner.tokens.size
9
- token = scanner.tokens[0]
10
- assert_equal :text, token.type
11
- assert_equal "just some text", token.text
12
- assert_nil token.code
13
- assert_equal 0, token.location.start
14
- assert_equal 14, token.location.stop
15
- assert_equal 1, token.location.line
16
- assert_equal 0, token.location.column
17
- end
18
-
19
- test "matches strings to be escaped" do
20
- scanner = BetterHtml::NodeIterator::HtmlLodash.new("[%= foo %]")
21
- assert_equal 1, scanner.tokens.size
22
- token = scanner.tokens[0]
23
- assert_equal :expr_literal, token.type
24
- assert_equal "[%= foo %]", token.text
25
- assert_equal " foo ", token.code
26
- assert_equal 0, token.location.start
27
- assert_equal 10, token.location.stop
28
- assert_equal 1, token.location.line
29
- assert_equal 0, token.location.column
30
- end
31
-
32
- test "matches interpolate" do
33
- scanner = BetterHtml::NodeIterator::HtmlLodash.new("[%! foo %]")
34
- assert_equal 1, scanner.tokens.size
35
- token = scanner.tokens[0]
36
- assert_equal :expr_escaped, token.type
37
- assert_equal "[%! foo %]", token.text
38
- assert_equal " foo ", token.code
39
- assert_equal 0, token.location.start
40
- assert_equal 10, token.location.stop
41
- assert_equal 1, token.location.line
42
- assert_equal 0, token.location.column
43
- end
44
-
45
- test "matches statement" do
46
- scanner = BetterHtml::NodeIterator::HtmlLodash.new("[% foo %]")
47
- assert_equal 1, scanner.tokens.size
48
- token = scanner.tokens[0]
49
- assert_equal :stmt, token.type
50
- assert_equal "[% foo %]", token.text
51
- assert_equal " foo ", token.code
52
- assert_equal 0, token.location.start
53
- assert_equal 9, token.location.stop
54
- assert_equal 1, token.location.line
55
- assert_equal 0, token.location.column
56
- end
57
-
58
- test "matches text before and after" do
59
- scanner = BetterHtml::NodeIterator::HtmlLodash.new("before\n[%= foo %]\nafter")
60
- assert_equal 3, scanner.tokens.size
61
-
62
- token = scanner.tokens[0]
63
- assert_equal :text, token.type
64
- assert_equal "before\n", token.text
65
- assert_nil token.code
66
- assert_equal 0, token.location.start
67
- assert_equal 7, token.location.stop
68
- assert_equal 1, token.location.line
69
- assert_equal 0, token.location.column
70
-
71
- token = scanner.tokens[1]
72
- assert_equal :expr_literal, token.type
73
- assert_equal "[%= foo %]", token.text
74
- assert_equal " foo ", token.code
75
- assert_equal 7, token.location.start
76
- assert_equal 17, token.location.stop
77
- assert_equal 2, token.location.line
78
- assert_equal 0, token.location.column
79
-
80
- token = scanner.tokens[2]
81
- assert_equal :text, token.type
82
- assert_equal "\nafter", token.text
83
- assert_nil token.code
84
- assert_equal 17, token.location.start
85
- assert_equal 23, token.location.stop
86
- assert_equal 2, token.location.line
87
- assert_equal 10, token.location.column
88
- end
89
-
90
- test "matches multiple" do
91
- scanner = BetterHtml::NodeIterator::HtmlLodash.new("[% if() { %][%= foo %][% } %]")
92
- assert_equal 3, scanner.tokens.size
93
-
94
- token = scanner.tokens[0]
95
- assert_equal :stmt, token.type
96
- assert_equal "[% if() { %]", token.text
97
- assert_equal " if() { ", token.code
98
- assert_equal 0, token.location.start
99
- assert_equal 12, token.location.stop
100
- assert_equal 1, token.location.line
101
- assert_equal 0, token.location.column
102
-
103
- token = scanner.tokens[1]
104
- assert_equal :expr_literal, token.type
105
- assert_equal "[%= foo %]", token.text
106
- assert_equal " foo ", token.code
107
- assert_equal 12, token.location.start
108
- assert_equal 22, token.location.stop
109
- assert_equal 1, token.location.line
110
- assert_equal 12, token.location.column
111
-
112
- token = scanner.tokens[2]
113
- assert_equal :stmt, token.type
114
- assert_equal "[% } %]", token.text
115
- assert_equal " } ", token.code
116
- assert_equal 22, token.location.start
117
- assert_equal 29, token.location.stop
118
- assert_equal 1, token.location.line
119
- assert_equal 22, token.location.column
120
- end
121
-
122
- test "parses out html correctly" do
123
- scanner = BetterHtml::NodeIterator::HtmlLodash.new('<div class="[%= foo %]">')
124
- assert_equal 9, scanner.tokens.size
125
- assert_equal [:tag_start, :tag_name, :whitespace, :attribute_name,
126
- :equal, :attribute_quoted_value_start, :expr_literal,
127
- :attribute_quoted_value_end, :tag_end], scanner.tokens.map(&:type)
128
- assert_equal ["<", "div", " ", "class", "=", "\"", "[%= foo %]", "\"", ">"], scanner.tokens.map(&:text)
129
- end
130
- end
131
- end
132
- end
@@ -1,36 +0,0 @@
1
- require 'test_helper'
2
- require 'better_html/test_helper/safe_erb_tester'
3
-
4
- module BetterHtml
5
- class NodeIterator
6
- class LocationTest < ActiveSupport::TestCase
7
- test "location without line and column" do
8
- loc = Location.new("foo\nbar\nbaz", 9, 10)
9
-
10
- assert_equal "a", loc.source
11
- assert_equal 3, loc.line
12
- assert_equal 1, loc.column
13
- end
14
-
15
- test "line_source_with_underline" do
16
- loc = Location.new("ui_helper(foo)", 10, 13)
17
-
18
- assert_equal "foo", loc.source
19
- assert_equal <<~EOL.strip, loc.line_source_with_underline
20
- ui_helper(foo)
21
- ^^^
22
- EOL
23
- end
24
-
25
- test "line_source_with_underline removes empty spaces" do
26
- loc = Location.new(" \t ui_helper(foo)", 17, 20)
27
-
28
- assert_equal "foo", loc.source
29
- assert_equal <<~EOL.strip, loc.line_source_with_underline
30
- ui_helper(foo)
31
- ^^^
32
- EOL
33
- end
34
- end
35
- end
36
- end
@@ -1,221 +0,0 @@
1
- require 'test_helper'
2
-
3
- module BetterHtml
4
- class NodeIteratorTest < ActiveSupport::TestCase
5
- test "consume cdata nodes" do
6
- tree = BetterHtml::NodeIterator.new("<![CDATA[ foo ]]>")
7
-
8
- assert_equal 1, tree.nodes.size
9
- assert_equal BetterHtml::NodeIterator::CData, tree.nodes.first.class
10
- assert_equal [" foo "], tree.nodes.first.content_parts.map(&:text)
11
- end
12
-
13
- test "unterminated cdata nodes are consumed until end" do
14
- tree = BetterHtml::NodeIterator.new("<![CDATA[ foo")
15
-
16
- assert_equal 1, tree.nodes.size
17
- assert_equal BetterHtml::NodeIterator::CData, tree.nodes.first.class
18
- assert_equal [" foo"], tree.nodes.first.content_parts.map(&:text)
19
- end
20
-
21
- test "consume cdata with interpolation" do
22
- tree = BetterHtml::NodeIterator.new("<![CDATA[ foo <%= bar %> baz ]]>")
23
-
24
- assert_equal 1, tree.nodes.size
25
- assert_equal BetterHtml::NodeIterator::CData, tree.nodes.first.class
26
- assert_equal [" foo ", "<%= bar %>", " baz "], tree.nodes.first.content_parts.map(&:text)
27
- end
28
-
29
- test "consume comment nodes" do
30
- tree = BetterHtml::NodeIterator.new("<!-- foo -->")
31
-
32
- assert_equal 1, tree.nodes.size
33
- assert_equal BetterHtml::NodeIterator::Comment, tree.nodes.first.class
34
- assert_equal [" foo "], tree.nodes.first.content_parts.map(&:text)
35
- end
36
-
37
- test "unterminated comment nodes are consumed until end" do
38
- tree = BetterHtml::NodeIterator.new("<!-- foo")
39
-
40
- assert_equal 1, tree.nodes.size
41
- assert_equal BetterHtml::NodeIterator::Comment, tree.nodes.first.class
42
- assert_equal [" foo"], tree.nodes.first.content_parts.map(&:text)
43
- end
44
-
45
- test "consume comment with interpolation" do
46
- tree = BetterHtml::NodeIterator.new("<!-- foo <%= bar %> baz -->")
47
-
48
- assert_equal 1, tree.nodes.size
49
- assert_equal BetterHtml::NodeIterator::Comment, tree.nodes.first.class
50
- assert_equal [" foo ", "<%= bar %>", " baz "], tree.nodes.first.content_parts.map(&:text)
51
- end
52
-
53
- test "consume tag nodes" do
54
- tree = BetterHtml::NodeIterator.new("<div>")
55
-
56
- assert_equal 1, tree.nodes.size
57
- assert_equal BetterHtml::NodeIterator::Element, tree.nodes.first.class
58
- assert_equal ["div"], tree.nodes.first.name_parts.map(&:text)
59
- assert_equal false, tree.nodes.first.self_closing?
60
- end
61
-
62
- test "consume tag nodes with solidus" do
63
- tree = BetterHtml::NodeIterator.new("</div>")
64
-
65
- assert_equal 1, tree.nodes.size
66
- assert_equal BetterHtml::NodeIterator::Element, tree.nodes.first.class
67
- assert_equal ["div"], tree.nodes.first.name_parts.map(&:text)
68
- assert_equal true, tree.nodes.first.closing?
69
- end
70
-
71
- test "sets self_closing when appropriate" do
72
- tree = BetterHtml::NodeIterator.new("<div/>")
73
-
74
- assert_equal 1, tree.nodes.size
75
- assert_equal BetterHtml::NodeIterator::Element, tree.nodes.first.class
76
- assert_equal ["div"], tree.nodes.first.name_parts.map(&:text)
77
- assert_equal true, tree.nodes.first.self_closing?
78
- end
79
-
80
- test "consume tag nodes until name ends" do
81
- tree = BetterHtml::NodeIterator.new("<div/>")
82
- assert_equal 1, tree.nodes.size
83
- assert_equal BetterHtml::NodeIterator::Element, tree.nodes.first.class
84
- assert_equal ["div"], tree.nodes.first.name_parts.map(&:text)
85
-
86
- tree = BetterHtml::NodeIterator.new("<div ")
87
- assert_equal 1, tree.nodes.size
88
- assert_equal BetterHtml::NodeIterator::Element, tree.nodes.first.class
89
- assert_equal ["div"], tree.nodes.first.name_parts.map(&:text)
90
- end
91
-
92
- test "consume tag nodes with interpolation" do
93
- tree = BetterHtml::NodeIterator.new("<ns:<%= name %>-thing>")
94
-
95
- assert_equal 1, tree.nodes.size
96
- assert_equal BetterHtml::NodeIterator::Element, tree.nodes.first.class
97
- assert_equal ["ns:", "<%= name %>", "-thing"], tree.nodes.first.name_parts.map(&:text)
98
- end
99
-
100
- test "consume tag attributes nodes unquoted value" do
101
- tree = BetterHtml::NodeIterator.new("<div foo=bar>")
102
-
103
- assert_equal 1, tree.nodes.size
104
- tag = tree.nodes.first
105
- assert_equal BetterHtml::NodeIterator::Element, tag.class
106
- assert_equal 1, tag.attributes.size
107
- attribute = tag.attributes.first
108
- assert_equal BetterHtml::NodeIterator::Attribute, attribute.class
109
- assert_equal ["foo"], attribute.name_parts.map(&:text)
110
- assert_equal ["bar"], attribute.value_parts.map(&:text)
111
- end
112
-
113
- test "consume attributes without name" do
114
- tree = BetterHtml::NodeIterator.new("<div 'thing'>")
115
-
116
- assert_equal 1, tree.nodes.size
117
- tag = tree.nodes.first
118
- assert_equal BetterHtml::NodeIterator::Element, tag.class
119
- assert_equal 1, tag.attributes.size
120
- attribute = tag.attributes.first
121
- assert_equal BetterHtml::NodeIterator::Attribute, attribute.class
122
- assert_predicate attribute.name, :empty?
123
- assert_equal ["'", "thing", "'"], attribute.value_parts.map(&:text)
124
- end
125
-
126
- test "consume tag attributes nodes quoted value" do
127
- tree = BetterHtml::NodeIterator.new("<div foo=\"bar\">")
128
-
129
- assert_equal 1, tree.nodes.size
130
- tag = tree.nodes.first
131
- assert_equal BetterHtml::NodeIterator::Element, tag.class
132
- assert_equal 1, tag.attributes.size
133
- attribute = tag.attributes.first
134
- assert_equal BetterHtml::NodeIterator::Attribute, attribute.class
135
- assert_equal ["foo"], attribute.name_parts.map(&:text)
136
- assert_equal ['"', "bar", '"'], attribute.value_parts.map(&:text)
137
- end
138
-
139
- test "consume tag attributes nodes interpolation in name and value" do
140
- tree = BetterHtml::NodeIterator.new("<div data-<%= foo %>=\"some <%= value %> foo\">")
141
-
142
- assert_equal 1, tree.nodes.size
143
- tag = tree.nodes.first
144
- assert_equal BetterHtml::NodeIterator::Element, tag.class
145
- assert_equal 1, tag.attributes.size
146
- attribute = tag.attributes.first
147
- assert_equal BetterHtml::NodeIterator::Attribute, attribute.class
148
- assert_equal ["data-", "<%= foo %>"], attribute.name_parts.map(&:text)
149
- assert_equal ['"', "some ", "<%= value %>", " foo", '"'], attribute.value_parts.map(&:text)
150
- end
151
-
152
- test "attributes can be accessed through [] on Element object" do
153
- tree = BetterHtml::NodeIterator.new("<div foo=\"bar\">")
154
-
155
- assert_equal 1, tree.nodes.size
156
- element = tree.nodes.first
157
- assert_equal BetterHtml::NodeIterator::Element, element.class
158
- assert_equal 1, element.attributes.size
159
- assert_nil element['nonexistent']
160
- refute_nil attribute = element['foo']
161
- assert_equal BetterHtml::NodeIterator::Attribute, attribute.class
162
- end
163
-
164
- test "attribute values can be read unescaped" do
165
- tree = BetterHtml::NodeIterator.new("<div foo=\"&lt;&quot;&gt;\">")
166
-
167
- element = tree.nodes.first
168
- assert_equal 1, element.attributes.size
169
- attribute = element['foo']
170
- assert_equal '<">', attribute.unescaped_value
171
- end
172
-
173
- test "attribute values does not unescape stuff inside erb" do
174
- tree = BetterHtml::NodeIterator.new("<div foo=\"&lt;<%= &gt; %>&gt;\">")
175
-
176
- element = tree.nodes.first
177
- assert_equal 1, element.attributes.size
178
- attribute = element['foo']
179
- assert_equal '<<%= &gt; %>>', attribute.unescaped_value
180
- end
181
-
182
- test "consume text nodes" do
183
- tree = BetterHtml::NodeIterator.new("here is <%= some %> text")
184
-
185
- assert_equal 1, tree.nodes.size
186
- assert_equal BetterHtml::NodeIterator::Text, tree.nodes.first.class
187
- assert_equal ["here is ", "<%= some %>", " text"], tree.nodes.first.content_parts.map(&:text)
188
- end
189
-
190
- test "javascript template parsing works" do
191
- tree = BetterHtml::NodeIterator.new("here is <%= some %> text", template_language: :javascript)
192
-
193
- assert_equal 1, tree.nodes.size
194
- assert_equal BetterHtml::NodeIterator::Text, tree.nodes.first.class
195
- assert_equal ["here is ", "<%= some %>", " text"], tree.nodes.first.content_parts.map(&:text)
196
- end
197
-
198
- test "javascript template does not consume html tags" do
199
- tree = BetterHtml::NodeIterator.new("<div <%= some %> />", template_language: :javascript)
200
-
201
- assert_equal 1, tree.nodes.size
202
- assert_equal BetterHtml::NodeIterator::Text, tree.nodes.first.class
203
- assert_equal ["<div ", "<%= some %>", " />"], tree.nodes.first.content_parts.map(&:text)
204
- end
205
-
206
- test "lodash template parsing works" do
207
- tree = BetterHtml::NodeIterator.new('<div class="[%= foo %]">', template_language: :lodash)
208
-
209
- assert_equal 1, tree.nodes.size
210
- node = tree.nodes.first
211
- assert_equal BetterHtml::NodeIterator::Element, node.class
212
- assert_equal "div", node.name
213
- assert_equal 1, node.attributes.size
214
- attribute = node.attributes.first
215
- assert_equal "class", attribute.name
216
- assert_equal [:attribute_quoted_value_start, :expr_literal,
217
- :attribute_quoted_value_end], attribute.value_parts.map(&:type)
218
- assert_equal ["\"", "[%= foo %]", "\""], attribute.value_parts.map(&:text)
219
- end
220
- end
221
- end