w_syntax_tree-erb 0.9.4 → 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.
- checksums.yaml +4 -4
- data/.husky/pre-commit +4 -0
- data/.vscode/launch.json +25 -0
- data/CHANGELOG.md +37 -1
- data/Gemfile.lock +8 -8
- data/README.md +16 -1
- data/lib/syntax_tree/erb/format.rb +158 -28
- data/lib/syntax_tree/erb/nodes.rb +189 -48
- data/lib/syntax_tree/erb/parser.rb +103 -22
- data/lib/syntax_tree/erb/pretty_print.rb +9 -1
- data/lib/syntax_tree/erb/version.rb +1 -1
- data/lib/syntax_tree/erb.rb +1 -0
- data/package.json +10 -0
- data/syntax_tree-erb.gemspec +6 -6
- metadata +34 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e48aeaba8ef070f5f13bdd166cf4dd9f1f1e4693de8537d2dbf5b86f90092de6
|
4
|
+
data.tar.gz: ade025cc4a31c3f0b5461650a97ff2074de6dc868197ab09a2d2b0c047b1d0cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58ff254dc23a076b7bbc87606c3672c8bde4b5df6d526cb6ea5d6cedf54c1f9fb9b0b832b7ae06d7eb23731bf5a95cade7d0a443e9ce11ea71a1578ce0591d49
|
7
|
+
data.tar.gz: 30fbe095d0e624ed126897ff1fccc229a03f4a0375d67e9718257900856e1587be7b406a510b61e8ea6574af9c7a1c46fd2ee0c15586819c20e90e452bfbbace
|
data/.husky/pre-commit
ADDED
data/.vscode/launch.json
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
{
|
2
|
+
// Use IntelliSense to learn about possible attributes.
|
3
|
+
// Hover to view descriptions of existing attributes.
|
4
|
+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
5
|
+
"version": "0.2.0",
|
6
|
+
"configurations": [
|
7
|
+
{
|
8
|
+
"type": "ruby_lsp",
|
9
|
+
"name": "Debug file",
|
10
|
+
"request": "launch",
|
11
|
+
"program": "ruby ${file}"
|
12
|
+
},
|
13
|
+
{
|
14
|
+
"type": "ruby_lsp",
|
15
|
+
"name": "Debug test",
|
16
|
+
"request": "launch",
|
17
|
+
"program": "ruby -Itest ${relativeFile}"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"type": "ruby_lsp",
|
21
|
+
"name": "Debug attach",
|
22
|
+
"request": "attach"
|
23
|
+
}
|
24
|
+
]
|
25
|
+
}
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,36 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.10.0] - 2023-08-20
|
10
|
+
|
11
|
+
- Changes how whitespace and newlines are handled.
|
12
|
+
- Supports syntax like:
|
13
|
+
|
14
|
+
```erb
|
15
|
+
<%= part %> / <%= total %> (<%= percentage %>%)
|
16
|
+
```
|
17
|
+
|
18
|
+
## [0.9.5] - 2023-07-02
|
19
|
+
|
20
|
+
- Fixes ruby comment in ERB-tag included VoidStatement
|
21
|
+
Example:
|
22
|
+
|
23
|
+
```erb
|
24
|
+
<% # this is a comment %>
|
25
|
+
```
|
26
|
+
|
27
|
+
Output:
|
28
|
+
|
29
|
+
```diff
|
30
|
+
-<%
|
31
|
+
-
|
32
|
+
- # this is a comment
|
33
|
+
-%>
|
34
|
+
+<% # this is a comment %>
|
35
|
+
```
|
36
|
+
|
37
|
+
- Updates versions in Bundler
|
38
|
+
|
9
39
|
## [0.9.4] - 2023-07-01
|
10
40
|
|
11
41
|
- Inline even more empty HTML-tags
|
@@ -40,5 +70,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
|
|
40
70
|
- Can format a lot of .html.erb-syntax and works as a plugin to syntax_tree.
|
41
71
|
- This is still early and there are a lot of different weird syntaxes out there.
|
42
72
|
|
43
|
-
[unreleased]: https://github.com/davidwessman/syntax_tree-erb/compare/v0.
|
73
|
+
[unreleased]: https://github.com/davidwessman/syntax_tree-erb/compare/v0.10.0...HEAD
|
74
|
+
[0.10.0]: https://github.com/davidwessman/syntax_tree-erb/compare/v0.9.5...v0.10.0
|
75
|
+
[0.9.5]: https://github.com/davidwessman/syntax_tree-erb/compare/v0.9.4...v0.9.5
|
76
|
+
[0.9.4]: https://github.com/davidwessman/syntax_tree-erb/compare/v0.9.3...v0.9.4
|
77
|
+
[0.9.3]: https://github.com/davidwessman/syntax_tree-erb/compare/v0.9.2...v0.9.3
|
78
|
+
[0.9.2]: https://github.com/davidwessman/syntax_tree-erb/compare/v0.9.1...v0.9.2
|
79
|
+
[0.9.1]: https://github.com/davidwessman/syntax_tree-erb/compare/v0.9.0...v0.9.1
|
44
80
|
[0.9.0]: https://github.com/davidwessman/syntax_tree-erb/compare/419727a73af94057ca0980733e69ac8b4d52fdf4...v0.9.0
|
data/Gemfile.lock
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
w_syntax_tree-erb (0.
|
5
|
-
prettier_print (>= 1.2.0)
|
6
|
-
syntax_tree (>= 6.1.1)
|
4
|
+
w_syntax_tree-erb (0.10.0)
|
5
|
+
prettier_print (~> 1.2, >= 1.2.0)
|
6
|
+
syntax_tree (~> 6.1, >= 6.1.1)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
11
|
docile (1.4.0)
|
12
|
-
minitest (5.
|
12
|
+
minitest (5.19.0)
|
13
13
|
prettier_print (1.2.1)
|
14
14
|
rake (13.0.6)
|
15
15
|
simplecov (0.22.0)
|
@@ -28,10 +28,10 @@ PLATFORMS
|
|
28
28
|
x86_64-linux
|
29
29
|
|
30
30
|
DEPENDENCIES
|
31
|
-
bundler
|
32
|
-
minitest
|
33
|
-
rake
|
34
|
-
simplecov
|
31
|
+
bundler (~> 2)
|
32
|
+
minitest (~> 5)
|
33
|
+
rake (~> 13)
|
34
|
+
simplecov (~> 0.22)
|
35
35
|
w_syntax_tree-erb!
|
36
36
|
|
37
37
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ Currently handles
|
|
30
30
|
Add this line to your application's Gemfile:
|
31
31
|
|
32
32
|
```ruby
|
33
|
-
gem "w_syntax_tree-erb", "~> 0.
|
33
|
+
gem "w_syntax_tree-erb", "~> 0.10", require: false
|
34
34
|
```
|
35
35
|
|
36
36
|
> I added the `w_` prefix to avoid conflicts if there will ever be an official `syntax_tree-erb` gem.
|
@@ -77,6 +77,21 @@ Dir
|
|
77
77
|
puts failures
|
78
78
|
```
|
79
79
|
|
80
|
+
## Development
|
81
|
+
|
82
|
+
Setup linting:
|
83
|
+
|
84
|
+
```sh
|
85
|
+
npm run prepare
|
86
|
+
```
|
87
|
+
|
88
|
+
Install dependencies and run tests:
|
89
|
+
|
90
|
+
```sh
|
91
|
+
bundle
|
92
|
+
bundle exec rake
|
93
|
+
```
|
94
|
+
|
80
95
|
## Contributing
|
81
96
|
|
82
97
|
Bug reports and pull requests are welcome on GitHub at https://github.com/davidwessman/syntax_tree-erb.
|
@@ -22,9 +22,7 @@ module SyntaxTree
|
|
22
22
|
def visit_document(node)
|
23
23
|
child_nodes = node.child_nodes.sort_by(&:location)
|
24
24
|
|
25
|
-
|
26
|
-
visit(child_node)
|
27
|
-
end
|
25
|
+
handle_child_nodes(child_nodes)
|
28
26
|
|
29
27
|
q.breakable(force: true)
|
30
28
|
end
|
@@ -32,31 +30,55 @@ module SyntaxTree
|
|
32
30
|
def visit_block(node)
|
33
31
|
visit(node.opening)
|
34
32
|
|
33
|
+
breakable = breakable_inside(node)
|
35
34
|
if node.elements.any?
|
36
35
|
q.indent do
|
37
|
-
q.breakable
|
38
|
-
|
39
|
-
node.elements,
|
40
|
-
-> { q.breakable(force: true) }
|
41
|
-
) { |child_node| visit(child_node) }
|
36
|
+
q.breakable if breakable
|
37
|
+
handle_child_nodes(node.elements)
|
42
38
|
end
|
43
39
|
end
|
44
40
|
|
45
41
|
if node.closing
|
46
|
-
q.breakable("")
|
42
|
+
q.breakable("") if breakable
|
47
43
|
visit(node.closing)
|
48
44
|
end
|
49
45
|
end
|
50
46
|
|
51
|
-
def
|
52
|
-
# Make sure to group the tags together if there is no child nodes.
|
47
|
+
def visit_html_groupable(node, group)
|
53
48
|
if node.elements.size == 0
|
54
|
-
|
55
|
-
|
56
|
-
|
49
|
+
visit(node.opening)
|
50
|
+
visit(node.closing)
|
51
|
+
else
|
52
|
+
visit(node.opening)
|
53
|
+
|
54
|
+
with_break = breakable_inside(node)
|
55
|
+
q.indent do
|
56
|
+
if with_break
|
57
|
+
group ? q.breakable("") : q.breakable
|
58
|
+
end
|
59
|
+
handle_child_nodes(node.elements)
|
60
|
+
end
|
61
|
+
|
62
|
+
if with_break
|
63
|
+
group ? q.breakable("") : q.breakable
|
57
64
|
end
|
65
|
+
visit(node.closing)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def visit_html(node)
|
70
|
+
# Make sure to group the tags together if there is no child nodes.
|
71
|
+
if node.elements.size == 0 ||
|
72
|
+
node.elements.any? { |node|
|
73
|
+
node.is_a?(SyntaxTree::ERB::CharData)
|
74
|
+
} ||
|
75
|
+
(
|
76
|
+
node.elements.size == 1 &&
|
77
|
+
node.elements.first.is_a?(SyntaxTree::ERB::ErbNode)
|
78
|
+
)
|
79
|
+
q.group { visit_html_groupable(node, true) }
|
58
80
|
else
|
59
|
-
|
81
|
+
visit_html_groupable(node, false)
|
60
82
|
end
|
61
83
|
end
|
62
84
|
|
@@ -118,18 +140,19 @@ module SyntaxTree
|
|
118
140
|
if node.value.is_a?(String)
|
119
141
|
output_rows(node.value.split("\n"))
|
120
142
|
else
|
121
|
-
|
143
|
+
nodes = node.value&.statements&.child_nodes || []
|
144
|
+
nodes = nodes.reject { |node| node.is_a?(SyntaxTree::VoidStmt) }
|
122
145
|
|
123
|
-
if
|
146
|
+
if nodes.size == 1
|
124
147
|
q.text(" ")
|
125
|
-
q.seplist(
|
148
|
+
q.seplist(nodes, -> { q.breakable("") }) do |child_node|
|
126
149
|
format_statement(child_node)
|
127
150
|
end
|
128
151
|
q.text(" ")
|
129
|
-
elsif
|
152
|
+
elsif nodes.size > 1
|
130
153
|
q.indent do
|
131
154
|
q.breakable("")
|
132
|
-
q.seplist(
|
155
|
+
q.seplist(nodes, -> { q.breakable("") }) do |child_node|
|
133
156
|
format_statement(child_node)
|
134
157
|
end
|
135
158
|
end
|
@@ -145,7 +168,7 @@ module SyntaxTree
|
|
145
168
|
formatter.flush
|
146
169
|
rows = formatter.output.join.split("\n")
|
147
170
|
|
148
|
-
output_rows(
|
171
|
+
output_rows(rows)
|
149
172
|
end
|
150
173
|
|
151
174
|
def output_rows(rows)
|
@@ -169,9 +192,14 @@ module SyntaxTree
|
|
169
192
|
visit(child_node)
|
170
193
|
end
|
171
194
|
end
|
195
|
+
|
196
|
+
# Only add breakable if we have attributes
|
197
|
+
q.breakable(node.closing.value == "/>" ? " " : "")
|
198
|
+
elsif node.closing.value == "/>"
|
199
|
+
# Need a space before end-tag for self-closing
|
200
|
+
q.text(" ")
|
172
201
|
end
|
173
202
|
|
174
|
-
q.breakable(node.closing.value == "/>" ? " " : "")
|
175
203
|
visit(node.closing)
|
176
204
|
end
|
177
205
|
end
|
@@ -207,15 +235,20 @@ module SyntaxTree
|
|
207
235
|
visit(node.token)
|
208
236
|
end
|
209
237
|
|
238
|
+
def visit_erb_comment(node)
|
239
|
+
visit(node.token)
|
240
|
+
end
|
241
|
+
|
210
242
|
# Visit a CharData node.
|
211
243
|
def visit_char_data(node)
|
212
|
-
|
244
|
+
return if node.value.value.strip.empty?
|
213
245
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
246
|
+
q.text(node.value.value)
|
247
|
+
end
|
248
|
+
|
249
|
+
def visit_new_line(node)
|
250
|
+
q.breakable(force: :skip_parent_break)
|
251
|
+
q.breakable(force: :skip_parent_break) if node.count > 1
|
219
252
|
end
|
220
253
|
|
221
254
|
# Visit a Doctype node.
|
@@ -229,6 +262,49 @@ module SyntaxTree
|
|
229
262
|
end
|
230
263
|
end
|
231
264
|
|
265
|
+
private
|
266
|
+
|
267
|
+
def breakable_inside(node)
|
268
|
+
if node.is_a?(SyntaxTree::ERB::HtmlNode)
|
269
|
+
node.elements.first.class != SyntaxTree::ERB::CharData ||
|
270
|
+
node_new_line_count(node.opening) > 0
|
271
|
+
elsif node.is_a?(SyntaxTree::ERB::Block)
|
272
|
+
true
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
def breakable_between(node, next_node)
|
277
|
+
new_lines = node_new_line_count(node)
|
278
|
+
|
279
|
+
if new_lines == 1
|
280
|
+
q.breakable
|
281
|
+
elsif new_lines > 1
|
282
|
+
q.breakable
|
283
|
+
q.breakable(force: :skip_parent_break)
|
284
|
+
elsif next_node && !node.is_a?(SyntaxTree::ERB::CharData) &&
|
285
|
+
!next_node.is_a?(SyntaxTree::ERB::CharData)
|
286
|
+
q.breakable
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
def breakable_between_group(node, next_node)
|
291
|
+
new_lines = node_new_line_count(node)
|
292
|
+
|
293
|
+
if new_lines == 1
|
294
|
+
q.breakable(force: true)
|
295
|
+
elsif new_lines > 1
|
296
|
+
q.breakable(force: true)
|
297
|
+
q.breakable(force: true)
|
298
|
+
elsif next_node && !node.is_a?(SyntaxTree::ERB::CharData) &&
|
299
|
+
!next_node.is_a?(SyntaxTree::ERB::CharData)
|
300
|
+
q.breakable("")
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
def node_new_line_count(node)
|
305
|
+
node.respond_to?(:new_line) ? node.new_line&.count || 0 : 0
|
306
|
+
end
|
307
|
+
|
232
308
|
def erb_print_width(node)
|
233
309
|
# Set the width to maximum if we have an IfNode or IfOp,
|
234
310
|
# we cannot format them purely with SyntaxTree because the ERB-syntax will be unparseable.
|
@@ -246,6 +322,60 @@ module SyntaxTree
|
|
246
322
|
check_for_if_statement(child_node)
|
247
323
|
end
|
248
324
|
end
|
325
|
+
|
326
|
+
def handle_child_nodes(child_nodes)
|
327
|
+
group = []
|
328
|
+
|
329
|
+
if child_nodes.size == 1
|
330
|
+
visit(child_nodes.first)
|
331
|
+
return
|
332
|
+
end
|
333
|
+
|
334
|
+
child_nodes.each_with_index do |child_node, index|
|
335
|
+
is_last = index == child_nodes.size - 1
|
336
|
+
|
337
|
+
# Last element should not have new lines
|
338
|
+
node = is_last ? child_node.without_new_line : child_node
|
339
|
+
|
340
|
+
if node_should_group(node)
|
341
|
+
group << node
|
342
|
+
next
|
343
|
+
end
|
344
|
+
|
345
|
+
# Render all group elements before the current node
|
346
|
+
handle_group(group, break_after: true)
|
347
|
+
group = []
|
348
|
+
|
349
|
+
# Render the current node
|
350
|
+
visit(node)
|
351
|
+
next_node = child_nodes[index + 1]
|
352
|
+
|
353
|
+
breakable_between(node, next_node)
|
354
|
+
end
|
355
|
+
|
356
|
+
# Handle group if we have any nodes left
|
357
|
+
handle_group(group, break_after: false)
|
358
|
+
end
|
359
|
+
|
360
|
+
def handle_group(nodes, break_after:)
|
361
|
+
return unless nodes.any?
|
362
|
+
|
363
|
+
q.group do
|
364
|
+
nodes.each_with_index do |node, group_index|
|
365
|
+
visit(node)
|
366
|
+
next_node = nodes[group_index + 1]
|
367
|
+
next if next_node.nil?
|
368
|
+
breakable_between_group(node, next_node)
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
breakable_between_group(nodes.last, nil) if break_after
|
373
|
+
end
|
374
|
+
|
375
|
+
def node_should_group(node)
|
376
|
+
node.is_a?(SyntaxTree::ERB::CharData) ||
|
377
|
+
node.is_a?(SyntaxTree::ERB::ErbNode)
|
378
|
+
end
|
249
379
|
end
|
250
380
|
end
|
251
381
|
end
|
@@ -53,6 +53,14 @@ module SyntaxTree
|
|
53
53
|
def pretty_print(q)
|
54
54
|
PrettyPrint.new(q).visit(self)
|
55
55
|
end
|
56
|
+
|
57
|
+
def without_new_line
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def skip?
|
62
|
+
false
|
63
|
+
end
|
56
64
|
end
|
57
65
|
|
58
66
|
# A Token is any kind of lexical token from the source. It has a type, a
|
@@ -110,6 +118,25 @@ module SyntaxTree
|
|
110
118
|
end
|
111
119
|
end
|
112
120
|
|
121
|
+
# This is a base class for a Node that can also hold an appended
|
122
|
+
# new line.
|
123
|
+
class Element < Node
|
124
|
+
attr_reader(:new_line, :location)
|
125
|
+
|
126
|
+
def initialize(new_line:, location:)
|
127
|
+
@new_line = new_line
|
128
|
+
@location = location
|
129
|
+
end
|
130
|
+
|
131
|
+
def without_new_line
|
132
|
+
self.class.new(**deconstruct_keys([]).merge(new_line: nil))
|
133
|
+
end
|
134
|
+
|
135
|
+
def deconstruct_keys(keys)
|
136
|
+
{ new_line: new_line, location: location }
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
113
140
|
# This is a base class for a block that contains:
|
114
141
|
# - an opening
|
115
142
|
# - optional elements
|
@@ -131,12 +158,22 @@ module SyntaxTree
|
|
131
158
|
[opening, *elements, closing].compact
|
132
159
|
end
|
133
160
|
|
161
|
+
def new_line
|
162
|
+
closing.new_line if closing.respond_to?(:new_line)
|
163
|
+
end
|
164
|
+
|
165
|
+
def without_new_line
|
166
|
+
self.class.new(
|
167
|
+
**deconstruct_keys([]).merge(closing: closing&.without_new_line)
|
168
|
+
)
|
169
|
+
end
|
170
|
+
|
134
171
|
alias deconstruct child_nodes
|
135
172
|
|
136
173
|
def deconstruct_keys(keys)
|
137
174
|
{
|
138
175
|
opening: opening,
|
139
|
-
|
176
|
+
elements: elements,
|
140
177
|
closing: closing,
|
141
178
|
location: location
|
142
179
|
}
|
@@ -151,15 +188,22 @@ module SyntaxTree
|
|
151
188
|
# The opening tag of an element. It contains the opening character (<),
|
152
189
|
# the name of the element, any optional attributes, and the closing
|
153
190
|
# token (either > or />).
|
154
|
-
class OpeningTag <
|
155
|
-
attr_reader :opening, :name, :attributes, :closing
|
156
|
-
|
157
|
-
def initialize(
|
191
|
+
class OpeningTag < Element
|
192
|
+
attr_reader :opening, :name, :attributes, :closing
|
193
|
+
|
194
|
+
def initialize(
|
195
|
+
opening:,
|
196
|
+
name:,
|
197
|
+
attributes:,
|
198
|
+
closing:,
|
199
|
+
new_line:,
|
200
|
+
location:
|
201
|
+
)
|
202
|
+
super(new_line: new_line, location: location)
|
158
203
|
@opening = opening
|
159
204
|
@name = name
|
160
205
|
@attributes = attributes
|
161
206
|
@closing = closing
|
162
|
-
@location = location
|
163
207
|
end
|
164
208
|
|
165
209
|
def accept(visitor)
|
@@ -173,26 +217,25 @@ module SyntaxTree
|
|
173
217
|
alias deconstruct child_nodes
|
174
218
|
|
175
219
|
def deconstruct_keys(keys)
|
176
|
-
|
220
|
+
super.merge(
|
177
221
|
opening: opening,
|
178
222
|
name: name,
|
179
223
|
attributes: attributes,
|
180
|
-
closing: closing
|
181
|
-
|
182
|
-
}
|
224
|
+
closing: closing
|
225
|
+
)
|
183
226
|
end
|
184
227
|
end
|
185
228
|
|
186
229
|
# The closing tag of an element. It contains the opening character (<),
|
187
230
|
# the name of the element, and the closing character (>).
|
188
|
-
class ClosingTag <
|
189
|
-
attr_reader :opening, :name, :closing
|
231
|
+
class ClosingTag < Element
|
232
|
+
attr_reader :opening, :name, :closing
|
190
233
|
|
191
|
-
def initialize(opening:, name:, closing:, location:)
|
234
|
+
def initialize(opening:, name:, closing:, location:, new_line:)
|
235
|
+
super(new_line: new_line, location: location)
|
192
236
|
@opening = opening
|
193
237
|
@name = name
|
194
238
|
@closing = closing
|
195
|
-
@location = location
|
196
239
|
end
|
197
240
|
|
198
241
|
def accept(visitor)
|
@@ -206,19 +249,41 @@ module SyntaxTree
|
|
206
249
|
alias deconstruct child_nodes
|
207
250
|
|
208
251
|
def deconstruct_keys(keys)
|
209
|
-
|
252
|
+
super.merge(opening: opening, name: name, closing: closing)
|
210
253
|
end
|
211
254
|
end
|
212
255
|
|
256
|
+
def without_new_line
|
257
|
+
self.class.new(
|
258
|
+
**deconstruct_keys([]).merge(
|
259
|
+
opening: closing.nil? ? opening.without_new_line : opening,
|
260
|
+
closing: closing&.without_new_line
|
261
|
+
)
|
262
|
+
)
|
263
|
+
end
|
264
|
+
|
265
|
+
# The HTML-closing tag is responsible for new lines after the node.
|
266
|
+
def new_line
|
267
|
+
closing.nil? ? opening.new_line : closing&.new_line
|
268
|
+
end
|
269
|
+
|
213
270
|
def accept(visitor)
|
214
271
|
visitor.visit_html(self)
|
215
272
|
end
|
216
273
|
end
|
217
274
|
|
218
|
-
class ErbNode <
|
219
|
-
attr_reader :opening_tag, :keyword, :content, :closing_tag
|
220
|
-
|
221
|
-
def initialize(
|
275
|
+
class ErbNode < Element
|
276
|
+
attr_reader :opening_tag, :keyword, :content, :closing_tag
|
277
|
+
|
278
|
+
def initialize(
|
279
|
+
opening_tag:,
|
280
|
+
keyword:,
|
281
|
+
content:,
|
282
|
+
closing_tag:,
|
283
|
+
new_line:,
|
284
|
+
location:
|
285
|
+
)
|
286
|
+
super(new_line: new_line, location: location)
|
222
287
|
@opening_tag = opening_tag
|
223
288
|
# prune whitespace from keyword
|
224
289
|
@keyword =
|
@@ -229,12 +294,18 @@ module SyntaxTree
|
|
229
294
|
location: keyword.location
|
230
295
|
)
|
231
296
|
end
|
232
|
-
|
233
|
-
content
|
234
|
-
|
235
|
-
|
297
|
+
|
298
|
+
@content =
|
299
|
+
if content.is_a?(ErbContent)
|
300
|
+
content
|
301
|
+
else
|
302
|
+
# Set content to nil if it is empty
|
303
|
+
content ||= []
|
304
|
+
content = content.map(&:value).join if content.is_a?(Array)
|
305
|
+
ErbContent.new(value: content) unless content.strip.empty?
|
306
|
+
end
|
307
|
+
|
236
308
|
@closing_tag = closing_tag
|
237
|
-
@location = location
|
238
309
|
end
|
239
310
|
|
240
311
|
def accept(visitor)
|
@@ -245,30 +316,50 @@ module SyntaxTree
|
|
245
316
|
[opening_tag, keyword, content, closing_tag].compact
|
246
317
|
end
|
247
318
|
|
319
|
+
def new_line
|
320
|
+
closing_tag&.new_line
|
321
|
+
end
|
322
|
+
|
323
|
+
def without_new_line
|
324
|
+
self.class.new(
|
325
|
+
**deconstruct_keys([]).merge(
|
326
|
+
closing_tag: closing_tag.without_new_line
|
327
|
+
)
|
328
|
+
)
|
329
|
+
end
|
330
|
+
|
248
331
|
alias deconstruct child_nodes
|
249
332
|
|
250
333
|
def deconstruct_keys(keys)
|
251
|
-
|
334
|
+
super.merge(
|
252
335
|
opening_tag: opening_tag,
|
253
336
|
keyword: keyword,
|
254
337
|
content: content,
|
255
|
-
closing_tag: closing_tag
|
256
|
-
|
257
|
-
}
|
338
|
+
closing_tag: closing_tag
|
339
|
+
)
|
258
340
|
end
|
259
341
|
end
|
260
342
|
|
261
343
|
class ErbBlock < Block
|
344
|
+
def initialize(opening:, location:, elements: nil, closing: nil)
|
345
|
+
super(
|
346
|
+
opening: opening,
|
347
|
+
location: location,
|
348
|
+
elements: elements,
|
349
|
+
closing: closing
|
350
|
+
)
|
351
|
+
end
|
352
|
+
|
262
353
|
def accept(visitor)
|
263
354
|
visitor.visit_erb_block(self)
|
264
355
|
end
|
265
356
|
end
|
266
357
|
|
267
|
-
class ErbClose <
|
268
|
-
attr_reader :
|
358
|
+
class ErbClose < Element
|
359
|
+
attr_reader :closing
|
269
360
|
|
270
|
-
def initialize(
|
271
|
-
|
361
|
+
def initialize(closing:, new_line:, location:)
|
362
|
+
super(new_line: new_line, location: location)
|
272
363
|
@closing = closing
|
273
364
|
end
|
274
365
|
|
@@ -283,7 +374,7 @@ module SyntaxTree
|
|
283
374
|
alias deconstruct child_nodes
|
284
375
|
|
285
376
|
def deconstruct_keys(keys)
|
286
|
-
|
377
|
+
super.merge(closing: closing)
|
287
378
|
end
|
288
379
|
end
|
289
380
|
|
@@ -442,12 +533,12 @@ module SyntaxTree
|
|
442
533
|
end
|
443
534
|
end
|
444
535
|
|
445
|
-
class HtmlComment <
|
446
|
-
attr_reader :token
|
536
|
+
class HtmlComment < Element
|
537
|
+
attr_reader :token
|
447
538
|
|
448
|
-
def initialize(token:, location:)
|
539
|
+
def initialize(token:, new_line:, location:)
|
540
|
+
super(new_line: new_line, location: location)
|
449
541
|
@token = token
|
450
|
-
@location = location
|
451
542
|
end
|
452
543
|
|
453
544
|
def accept(visitor)
|
@@ -461,18 +552,41 @@ module SyntaxTree
|
|
461
552
|
alias deconstruct child_nodes
|
462
553
|
|
463
554
|
def deconstruct_keys(keys)
|
464
|
-
|
555
|
+
super.merge(token: token)
|
556
|
+
end
|
557
|
+
end
|
558
|
+
|
559
|
+
class ErbComment < Element
|
560
|
+
attr_reader :token
|
561
|
+
|
562
|
+
def initialize(token:, new_line:, location:)
|
563
|
+
super(new_line: new_line, location: location)
|
564
|
+
@token = token
|
565
|
+
end
|
566
|
+
|
567
|
+
def accept(visitor)
|
568
|
+
visitor.visit_erb_comment(self)
|
569
|
+
end
|
570
|
+
|
571
|
+
def child_nodes
|
572
|
+
[]
|
573
|
+
end
|
574
|
+
|
575
|
+
alias deconstruct child_nodes
|
576
|
+
|
577
|
+
def deconstruct_keys(keys)
|
578
|
+
super.merge(token: token)
|
465
579
|
end
|
466
580
|
end
|
467
581
|
|
468
582
|
# A CharData contains either plain text or whitespace within an element.
|
469
583
|
# It wraps a single token value.
|
470
|
-
class CharData <
|
471
|
-
attr_reader :value
|
584
|
+
class CharData < Element
|
585
|
+
attr_reader :value
|
472
586
|
|
473
|
-
def initialize(value:, location:)
|
587
|
+
def initialize(value:, new_line:, location:)
|
588
|
+
super(new_line: new_line, location: location)
|
474
589
|
@value = value
|
475
|
-
@location = location
|
476
590
|
end
|
477
591
|
|
478
592
|
def accept(visitor)
|
@@ -486,7 +600,34 @@ module SyntaxTree
|
|
486
600
|
alias deconstruct child_nodes
|
487
601
|
|
488
602
|
def deconstruct_keys(keys)
|
489
|
-
|
603
|
+
super.merge(value: value)
|
604
|
+
end
|
605
|
+
|
606
|
+
def skip?
|
607
|
+
value.value.strip.empty?
|
608
|
+
end
|
609
|
+
end
|
610
|
+
|
611
|
+
class NewLine < Node
|
612
|
+
attr_reader :count, :location
|
613
|
+
|
614
|
+
def initialize(location:, count:)
|
615
|
+
@location = location
|
616
|
+
@count = count
|
617
|
+
end
|
618
|
+
|
619
|
+
def accept(visitor)
|
620
|
+
visitor.visit_new_line(self)
|
621
|
+
end
|
622
|
+
|
623
|
+
def child_nodes
|
624
|
+
[]
|
625
|
+
end
|
626
|
+
|
627
|
+
alias deconstruct child_nodes
|
628
|
+
|
629
|
+
def deconstruct_keys(keys)
|
630
|
+
{ location: location, count: count }
|
490
631
|
end
|
491
632
|
end
|
492
633
|
|
@@ -494,14 +635,14 @@ module SyntaxTree
|
|
494
635
|
# type of the document. It contains an opening declaration, the name of
|
495
636
|
# the document type, an optional external identifier, and a closing of the
|
496
637
|
# tag.
|
497
|
-
class Doctype <
|
498
|
-
attr_reader :opening, :name, :closing
|
638
|
+
class Doctype < Element
|
639
|
+
attr_reader :opening, :name, :closing
|
499
640
|
|
500
|
-
def initialize(opening:, name:, closing:, location:)
|
641
|
+
def initialize(opening:, name:, closing:, new_line:, location:)
|
642
|
+
super(new_line: new_line, location: location)
|
501
643
|
@opening = opening
|
502
644
|
@name = name
|
503
645
|
@closing = closing
|
504
|
-
@location = location
|
505
646
|
end
|
506
647
|
|
507
648
|
def accept(visitor)
|
@@ -515,7 +656,7 @@ module SyntaxTree
|
|
515
656
|
alias deconstruct child_nodes
|
516
657
|
|
517
658
|
def deconstruct_keys(keys)
|
518
|
-
|
659
|
+
super.merge(opening: opening, name: name, closing: closing)
|
519
660
|
end
|
520
661
|
end
|
521
662
|
end
|
@@ -41,10 +41,16 @@ module SyntaxTree
|
|
41
41
|
private
|
42
42
|
|
43
43
|
def parse_any_tag
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
loop do
|
45
|
+
tag =
|
46
|
+
atleast do
|
47
|
+
maybe { parse_html_comment } || maybe { parse_erb_tag } ||
|
48
|
+
maybe { parse_erb_comment } || maybe { parse_html_element } ||
|
49
|
+
maybe { parse_new_line } || maybe { parse_chardata }
|
50
|
+
end
|
51
|
+
|
52
|
+
# Allow skipping empty CharData
|
53
|
+
return tag unless tag.skip?
|
48
54
|
end
|
49
55
|
end
|
50
56
|
|
@@ -62,10 +68,10 @@ module SyntaxTree
|
|
62
68
|
# two or more newlines should be ONE blank line
|
63
69
|
enum.yield :blank_line, $&, index, line
|
64
70
|
line += $&.count("\n")
|
65
|
-
when /\A
|
66
|
-
#
|
67
|
-
|
68
|
-
line +=
|
71
|
+
when /\A\n/
|
72
|
+
# newlines
|
73
|
+
enum.yield :new_line, $&, index, line
|
74
|
+
line += 1
|
69
75
|
when /\A<!--(.|\r?\n)*?-->/m
|
70
76
|
# comments
|
71
77
|
# <!-- this is a comment -->
|
@@ -97,8 +103,11 @@ module SyntaxTree
|
|
97
103
|
# <
|
98
104
|
enum.yield :open, $&, index, line
|
99
105
|
state << :inside
|
100
|
-
when /\A
|
101
|
-
#
|
106
|
+
when /\A(?: |\t|\r)+/m
|
107
|
+
# whitespace
|
108
|
+
enum.yield :whitespace, $&, index, line
|
109
|
+
when /\A(?!\s+$)[^<\n]+/
|
110
|
+
# plain text content, but do not allow only white space
|
102
111
|
# abc
|
103
112
|
enum.yield :text, $&, index, line
|
104
113
|
else
|
@@ -178,7 +187,7 @@ module SyntaxTree
|
|
178
187
|
# the beginning of an ERB tag
|
179
188
|
# <%
|
180
189
|
enum.yield :erb_open, $&, index, line
|
181
|
-
state << :
|
190
|
+
state << :erb_start
|
182
191
|
when /\A[^<']+/
|
183
192
|
# plain text content
|
184
193
|
# abc
|
@@ -201,7 +210,7 @@ module SyntaxTree
|
|
201
210
|
# the beginning of an ERB tag
|
202
211
|
# <%
|
203
212
|
enum.yield :erb_open, $&, index, line
|
204
|
-
state << :
|
213
|
+
state << :erb_start
|
205
214
|
when /\A[^<"]+/
|
206
215
|
# plain text content
|
207
216
|
# abc
|
@@ -251,7 +260,7 @@ module SyntaxTree
|
|
251
260
|
# the beginning of an ERB tag
|
252
261
|
# <%
|
253
262
|
enum.yield :erb_open, $&, index, line
|
254
|
-
state << :
|
263
|
+
state << :erb_start
|
255
264
|
when /\A"/
|
256
265
|
# the beginning of a string
|
257
266
|
enum.yield :string_open_double_quote, $&, index, line
|
@@ -357,12 +366,18 @@ module SyntaxTree
|
|
357
366
|
maybe { consume(:close) } || maybe { consume(:slash_close) }
|
358
367
|
end
|
359
368
|
|
369
|
+
new_line = maybe { parse_new_line }
|
370
|
+
|
371
|
+
# Parse any whitespace after new lines
|
372
|
+
maybe { consume(:whitespace) }
|
373
|
+
|
360
374
|
HtmlNode::OpeningTag.new(
|
361
375
|
opening: opening,
|
362
376
|
name: name,
|
363
377
|
attributes: attributes,
|
364
378
|
closing: closing,
|
365
|
-
location: opening.location.to(closing.location)
|
379
|
+
location: opening.location.to(closing.location),
|
380
|
+
new_line: new_line
|
366
381
|
)
|
367
382
|
end
|
368
383
|
|
@@ -371,11 +386,14 @@ module SyntaxTree
|
|
371
386
|
name = consume(:name)
|
372
387
|
closing = consume(:close)
|
373
388
|
|
389
|
+
new_line = maybe { parse_new_line }
|
390
|
+
|
374
391
|
HtmlNode::ClosingTag.new(
|
375
392
|
opening: opening,
|
376
393
|
name: name,
|
377
394
|
closing: closing,
|
378
|
-
location: opening.location.to(closing.location)
|
395
|
+
location: opening.location.to(closing.location),
|
396
|
+
new_line: new_line
|
379
397
|
)
|
380
398
|
end
|
381
399
|
|
@@ -450,6 +468,9 @@ module SyntaxTree
|
|
450
468
|
end
|
451
469
|
|
452
470
|
def parse_erb_if(erb_node)
|
471
|
+
# Skip any leading whitespace
|
472
|
+
maybe { consume(:whitespace) }
|
473
|
+
|
453
474
|
elements =
|
454
475
|
maybe { parse_until_erb(classes: [ErbElsif, ErbElse, ErbEnd]) } || []
|
455
476
|
|
@@ -513,11 +534,14 @@ module SyntaxTree
|
|
513
534
|
end
|
514
535
|
|
515
536
|
def parse_erb_end(erb_node)
|
537
|
+
new_line = maybe { parse_new_line }
|
538
|
+
|
516
539
|
ErbEnd.new(
|
517
540
|
opening_tag: erb_node.opening_tag,
|
518
541
|
keyword: erb_node.keyword,
|
519
542
|
content: nil,
|
520
543
|
closing_tag: erb_node.closing_tag,
|
544
|
+
new_line: new_line,
|
521
545
|
location: erb_node.location
|
522
546
|
)
|
523
547
|
end
|
@@ -540,12 +564,15 @@ module SyntaxTree
|
|
540
564
|
)
|
541
565
|
end
|
542
566
|
|
567
|
+
new_line = maybe { parse_new_line }
|
568
|
+
|
543
569
|
erb_node =
|
544
570
|
ErbNode.new(
|
545
571
|
opening_tag: opening_tag,
|
546
572
|
keyword: keyword,
|
547
573
|
content: content,
|
548
574
|
closing_tag: closing_tag,
|
575
|
+
new_line: new_line,
|
549
576
|
location: opening_tag.location.to(closing_tag.location)
|
550
577
|
)
|
551
578
|
|
@@ -602,6 +629,7 @@ module SyntaxTree
|
|
602
629
|
maybe { parse_erb_do_close } || maybe { parse_erb_close } ||
|
603
630
|
maybe { consume(:erb_code) }
|
604
631
|
end
|
632
|
+
|
605
633
|
items << result
|
606
634
|
|
607
635
|
break if result.is_a?(ErbClose)
|
@@ -610,22 +638,46 @@ module SyntaxTree
|
|
610
638
|
items
|
611
639
|
end
|
612
640
|
|
613
|
-
|
614
|
-
|
641
|
+
# This method is called at the end of most tags, it fixes:
|
642
|
+
# 1. Parsing any new lines after the tag
|
643
|
+
# 2. Parsing any whitespace after the new lines
|
644
|
+
# The whitespace is just consumed
|
645
|
+
def parse_new_line
|
646
|
+
line_break =
|
647
|
+
atleast do
|
648
|
+
maybe { consume(:blank_line) } || maybe { consume(:new_line) }
|
649
|
+
end
|
650
|
+
|
651
|
+
maybe { consume(:whitespace) }
|
615
652
|
|
616
|
-
|
653
|
+
NewLine.new(
|
654
|
+
location: line_break.location,
|
655
|
+
count: line_break.value.count("\n")
|
656
|
+
)
|
617
657
|
end
|
618
658
|
|
619
659
|
def parse_erb_close
|
620
660
|
closing = consume(:erb_close)
|
621
661
|
|
622
|
-
|
662
|
+
new_line = maybe { parse_new_line }
|
663
|
+
|
664
|
+
ErbClose.new(
|
665
|
+
location: closing.location,
|
666
|
+
new_line: new_line,
|
667
|
+
closing: closing
|
668
|
+
)
|
623
669
|
end
|
624
670
|
|
625
671
|
def parse_erb_do_close
|
626
672
|
closing = consume(:erb_do_close)
|
627
673
|
|
628
|
-
|
674
|
+
new_line = maybe { parse_new_line }
|
675
|
+
|
676
|
+
ErbDoClose.new(
|
677
|
+
location: closing.location,
|
678
|
+
new_line: new_line,
|
679
|
+
closing: closing
|
680
|
+
)
|
629
681
|
end
|
630
682
|
|
631
683
|
def parse_html_string
|
@@ -715,7 +767,15 @@ module SyntaxTree
|
|
715
767
|
values.first
|
716
768
|
end
|
717
769
|
|
718
|
-
|
770
|
+
new_line = maybe { parse_new_line }
|
771
|
+
|
772
|
+
if token&.value
|
773
|
+
CharData.new(
|
774
|
+
value: token,
|
775
|
+
location: token.location,
|
776
|
+
new_line: new_line
|
777
|
+
)
|
778
|
+
end
|
719
779
|
end
|
720
780
|
|
721
781
|
def parse_doctype
|
@@ -723,10 +783,13 @@ module SyntaxTree
|
|
723
783
|
name = consume(:name)
|
724
784
|
closing = consume(:close)
|
725
785
|
|
786
|
+
new_line = maybe { parse_new_line }
|
787
|
+
|
726
788
|
Doctype.new(
|
727
789
|
opening: opening,
|
728
790
|
name: name,
|
729
791
|
closing: closing,
|
792
|
+
new_line: new_line,
|
730
793
|
location: opening.location.to(closing.location)
|
731
794
|
)
|
732
795
|
end
|
@@ -734,7 +797,25 @@ module SyntaxTree
|
|
734
797
|
def parse_html_comment
|
735
798
|
comment = consume(:html_comment)
|
736
799
|
|
737
|
-
|
800
|
+
new_line = maybe { parse_new_line }
|
801
|
+
|
802
|
+
HtmlComment.new(
|
803
|
+
token: comment,
|
804
|
+
new_line: new_line,
|
805
|
+
location: comment.location
|
806
|
+
)
|
807
|
+
end
|
808
|
+
|
809
|
+
def parse_erb_comment
|
810
|
+
comment = consume(:erb_comment)
|
811
|
+
|
812
|
+
new_line = maybe { parse_new_line }
|
813
|
+
|
814
|
+
ErbComment.new(
|
815
|
+
token: comment,
|
816
|
+
new_line: new_line,
|
817
|
+
location: comment.location
|
818
|
+
)
|
738
819
|
end
|
739
820
|
end
|
740
821
|
end
|
@@ -108,7 +108,7 @@ module SyntaxTree
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def visit_erb_end(node)
|
111
|
-
q.pp("erb_end")
|
111
|
+
q.pp("(erb_end)")
|
112
112
|
end
|
113
113
|
|
114
114
|
# Visit an ErbContent node.
|
@@ -131,6 +131,10 @@ module SyntaxTree
|
|
131
131
|
visit_node("char_data", node)
|
132
132
|
end
|
133
133
|
|
134
|
+
def visit_new_line(node)
|
135
|
+
node.count > 1 ? q.text("(new_line blank)") : q.text("(new_line)")
|
136
|
+
end
|
137
|
+
|
134
138
|
def visit_erb_close(node)
|
135
139
|
visit(node.closing)
|
136
140
|
end
|
@@ -148,6 +152,10 @@ module SyntaxTree
|
|
148
152
|
visit_node("html_comment", node)
|
149
153
|
end
|
150
154
|
|
155
|
+
def visit_erb_comment(node)
|
156
|
+
visit_node("erb_comment", node)
|
157
|
+
end
|
158
|
+
|
151
159
|
private
|
152
160
|
|
153
161
|
# A generic visit node function for how we pretty print nodes.
|
data/lib/syntax_tree/erb.rb
CHANGED
data/package.json
ADDED
data/syntax_tree-erb.gemspec
CHANGED
@@ -23,11 +23,11 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
24
|
spec.require_paths = %w[lib]
|
25
25
|
|
26
|
-
spec.
|
27
|
-
spec.
|
26
|
+
spec.add_runtime_dependency "prettier_print", "~> 1.2", ">= 1.2.0"
|
27
|
+
spec.add_runtime_dependency "syntax_tree", "~> 6.1", ">= 6.1.1"
|
28
28
|
|
29
|
-
spec.add_development_dependency "bundler"
|
30
|
-
spec.add_development_dependency "minitest"
|
31
|
-
spec.add_development_dependency "rake"
|
32
|
-
spec.add_development_dependency "simplecov"
|
29
|
+
spec.add_development_dependency "bundler", "~> 2"
|
30
|
+
spec.add_development_dependency "minitest", "~> 5"
|
31
|
+
spec.add_development_dependency "rake", "~> 13"
|
32
|
+
spec.add_development_dependency "simplecov", "~> 0.22"
|
33
33
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: w_syntax_tree-erb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Newton
|
@@ -9,12 +9,15 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-08-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: prettier_print
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.2'
|
18
21
|
- - ">="
|
19
22
|
- !ruby/object:Gem::Version
|
20
23
|
version: 1.2.0
|
@@ -22,6 +25,9 @@ dependencies:
|
|
22
25
|
prerelease: false
|
23
26
|
version_requirements: !ruby/object:Gem::Requirement
|
24
27
|
requirements:
|
28
|
+
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '1.2'
|
25
31
|
- - ">="
|
26
32
|
- !ruby/object:Gem::Version
|
27
33
|
version: 1.2.0
|
@@ -29,6 +35,9 @@ dependencies:
|
|
29
35
|
name: syntax_tree
|
30
36
|
requirement: !ruby/object:Gem::Requirement
|
31
37
|
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '6.1'
|
32
41
|
- - ">="
|
33
42
|
- !ruby/object:Gem::Version
|
34
43
|
version: 6.1.1
|
@@ -36,6 +45,9 @@ dependencies:
|
|
36
45
|
prerelease: false
|
37
46
|
version_requirements: !ruby/object:Gem::Requirement
|
38
47
|
requirements:
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '6.1'
|
39
51
|
- - ">="
|
40
52
|
- !ruby/object:Gem::Version
|
41
53
|
version: 6.1.1
|
@@ -43,58 +55,58 @@ dependencies:
|
|
43
55
|
name: bundler
|
44
56
|
requirement: !ruby/object:Gem::Requirement
|
45
57
|
requirements:
|
46
|
-
- - "
|
58
|
+
- - "~>"
|
47
59
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
60
|
+
version: '2'
|
49
61
|
type: :development
|
50
62
|
prerelease: false
|
51
63
|
version_requirements: !ruby/object:Gem::Requirement
|
52
64
|
requirements:
|
53
|
-
- - "
|
65
|
+
- - "~>"
|
54
66
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
67
|
+
version: '2'
|
56
68
|
- !ruby/object:Gem::Dependency
|
57
69
|
name: minitest
|
58
70
|
requirement: !ruby/object:Gem::Requirement
|
59
71
|
requirements:
|
60
|
-
- - "
|
72
|
+
- - "~>"
|
61
73
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
74
|
+
version: '5'
|
63
75
|
type: :development
|
64
76
|
prerelease: false
|
65
77
|
version_requirements: !ruby/object:Gem::Requirement
|
66
78
|
requirements:
|
67
|
-
- - "
|
79
|
+
- - "~>"
|
68
80
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
81
|
+
version: '5'
|
70
82
|
- !ruby/object:Gem::Dependency
|
71
83
|
name: rake
|
72
84
|
requirement: !ruby/object:Gem::Requirement
|
73
85
|
requirements:
|
74
|
-
- - "
|
86
|
+
- - "~>"
|
75
87
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
88
|
+
version: '13'
|
77
89
|
type: :development
|
78
90
|
prerelease: false
|
79
91
|
version_requirements: !ruby/object:Gem::Requirement
|
80
92
|
requirements:
|
81
|
-
- - "
|
93
|
+
- - "~>"
|
82
94
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
95
|
+
version: '13'
|
84
96
|
- !ruby/object:Gem::Dependency
|
85
97
|
name: simplecov
|
86
98
|
requirement: !ruby/object:Gem::Requirement
|
87
99
|
requirements:
|
88
|
-
- - "
|
100
|
+
- - "~>"
|
89
101
|
- !ruby/object:Gem::Version
|
90
|
-
version: '0'
|
102
|
+
version: '0.22'
|
91
103
|
type: :development
|
92
104
|
prerelease: false
|
93
105
|
version_requirements: !ruby/object:Gem::Requirement
|
94
106
|
requirements:
|
95
|
-
- - "
|
107
|
+
- - "~>"
|
96
108
|
- !ruby/object:Gem::Version
|
97
|
-
version: '0'
|
109
|
+
version: '0.22'
|
98
110
|
description:
|
99
111
|
email:
|
100
112
|
- kddnewton@gmail.com
|
@@ -109,6 +121,8 @@ files:
|
|
109
121
|
- ".github/workflows/auto-merge.yml"
|
110
122
|
- ".github/workflows/main.yml"
|
111
123
|
- ".gitignore"
|
124
|
+
- ".husky/pre-commit"
|
125
|
+
- ".vscode/launch.json"
|
112
126
|
- CHANGELOG.md
|
113
127
|
- Gemfile
|
114
128
|
- Gemfile.lock
|
@@ -123,6 +137,7 @@ files:
|
|
123
137
|
- lib/syntax_tree/erb/pretty_print.rb
|
124
138
|
- lib/syntax_tree/erb/version.rb
|
125
139
|
- lib/syntax_tree/erb/visitor.rb
|
140
|
+
- package.json
|
126
141
|
- syntax_tree-erb.gemspec
|
127
142
|
homepage: https://github.com/davidwessman/syntax_tree-erb
|
128
143
|
licenses:
|
@@ -144,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
159
|
- !ruby/object:Gem::Version
|
145
160
|
version: '0'
|
146
161
|
requirements: []
|
147
|
-
rubygems_version: 3.4.
|
162
|
+
rubygems_version: 3.4.19
|
148
163
|
signing_key:
|
149
164
|
specification_version: 4
|
150
165
|
summary: Syntax Tree support for ERB
|