packwerk_slim_template 0.1.0 → 0.1.1
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/lib/packwerk_slim_template/slim_converter.rb +52 -12
- data/lib/packwerk_slim_template/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 00a4fd46c3921a7e8ce8bd0cf4e786a5c8d479fd0e6e76a49aef7c227e568d17
|
|
4
|
+
data.tar.gz: 1d89273f3c8b6d9cb1046da8fc36b77150625d36c19543d40d85d4b3072d4789
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 35072c9f4f9ff1f357ce7fac335f90ec538cbad39a54246cbc9b77327de95e9a87551eddbaf87c8cac98c3d59bde859f4b2bef2d195d8aa968685dffdb44c7d7
|
|
7
|
+
data.tar.gz: 2dc8c71cff07ffc49a46801e6831c38a9f3884063f28c38b756ab0bdd8c3633414f82660135a682e1bf217417efcfd1bac93b230939074b679ba6d3aba75bd86
|
|
@@ -27,6 +27,8 @@ module PackwerkSlimTemplate
|
|
|
27
27
|
class SlimConverter
|
|
28
28
|
ConversionResult = Struct.new(:ruby_code, :line_mapper, :ruby_snippets)
|
|
29
29
|
|
|
30
|
+
CONTROL_FLOW_CONTINUATIONS = %w[elsif else when rescue ensure].freeze
|
|
31
|
+
|
|
30
32
|
def self.convert(slim_content, file_path:)
|
|
31
33
|
new(slim_content, file_path).convert
|
|
32
34
|
end
|
|
@@ -66,20 +68,20 @@ module PackwerkSlimTemplate
|
|
|
66
68
|
Slim::Parser.new.call(content)
|
|
67
69
|
end
|
|
68
70
|
|
|
69
|
-
def extract_ruby_nodes(node, slim_line = 1)
|
|
71
|
+
def extract_ruby_nodes(node, slim_line = 1, next_node: nil)
|
|
70
72
|
return unless node.is_a?(Array)
|
|
71
73
|
|
|
72
74
|
case node.first
|
|
73
75
|
when :multi
|
|
74
|
-
node[1..]
|
|
76
|
+
process_sequence(node[1..], slim_line)
|
|
75
77
|
when :slim
|
|
76
|
-
handle_slim_node(node, slim_line)
|
|
78
|
+
handle_slim_node(node, slim_line, next_node: next_node)
|
|
77
79
|
when :html
|
|
78
|
-
node[1..]
|
|
80
|
+
process_sequence(node[1..], slim_line)
|
|
79
81
|
end
|
|
80
82
|
end
|
|
81
83
|
|
|
82
|
-
def handle_slim_node(node, slim_line)
|
|
84
|
+
def handle_slim_node(node, slim_line, next_node: nil)
|
|
83
85
|
case node[1]
|
|
84
86
|
when :output
|
|
85
87
|
# [:slim, :output, escape, code, content]
|
|
@@ -90,11 +92,7 @@ module PackwerkSlimTemplate
|
|
|
90
92
|
has_block_content = nested_nodes&.any? { |child| significant_child_node?(child) }
|
|
91
93
|
|
|
92
94
|
# Process nested content if present
|
|
93
|
-
if nested_nodes
|
|
94
|
-
nested_nodes.each_with_index do |child, idx|
|
|
95
|
-
extract_ruby_nodes(child, slim_line + idx + 1)
|
|
96
|
-
end
|
|
97
|
-
end
|
|
95
|
+
process_sequence(nested_nodes, slim_line + 1) if nested_nodes
|
|
98
96
|
|
|
99
97
|
add_ruby_snippet("end", slim_line + (nested_nodes&.length || 0)) if has_block_content
|
|
100
98
|
when :control
|
|
@@ -105,11 +103,53 @@ module PackwerkSlimTemplate
|
|
|
105
103
|
# Process nested content (at index 3)
|
|
106
104
|
if node[3]
|
|
107
105
|
extract_ruby_nodes(node[3], slim_line + 1)
|
|
106
|
+
|
|
107
|
+
if should_close_control_block?(code, next_node)
|
|
108
|
+
add_ruby_snippet("end", slim_line)
|
|
109
|
+
end
|
|
108
110
|
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def process_sequence(nodes, base_line)
|
|
115
|
+
return unless nodes
|
|
116
|
+
|
|
117
|
+
nodes.each_with_index do |child, idx|
|
|
118
|
+
next_node = next_significant_node(nodes, idx)
|
|
119
|
+
extract_ruby_nodes(child, base_line + idx, next_node: next_node)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def next_significant_node(nodes, current_index)
|
|
124
|
+
return nil unless nodes
|
|
109
125
|
|
|
110
|
-
|
|
111
|
-
|
|
126
|
+
(current_index + 1).upto(nodes.length - 1) do |idx|
|
|
127
|
+
node = nodes[idx]
|
|
128
|
+
return node unless newline_node?(node)
|
|
112
129
|
end
|
|
130
|
+
nil
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def newline_node?(node)
|
|
134
|
+
node.is_a?(Array) && node.first == :newline
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def should_close_control_block?(code, next_node)
|
|
138
|
+
return false if code.nil? || code.empty?
|
|
139
|
+
|
|
140
|
+
!control_flow_continuation?(next_node)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def control_flow_continuation?(node)
|
|
144
|
+
return false unless node.is_a?(Array)
|
|
145
|
+
return false unless node.first == :slim && node[1] == :control
|
|
146
|
+
|
|
147
|
+
keyword = leading_keyword(node[2])
|
|
148
|
+
CONTROL_FLOW_CONTINUATIONS.include?(keyword)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def leading_keyword(code)
|
|
152
|
+
code.to_s.strip.split(/\s+/, 2).first
|
|
113
153
|
end
|
|
114
154
|
|
|
115
155
|
def add_ruby_snippet(code, slim_line)
|