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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9fd735a5469d37ee86529f99a8e2878ae65cc2615c7902842de944ea38bfe752
4
- data.tar.gz: '049d75aa416b08b1750982f4770dd9e82757620c612788c70c9f4a66d0a8ff6d'
3
+ metadata.gz: 00a4fd46c3921a7e8ce8bd0cf4e786a5c8d479fd0e6e76a49aef7c227e568d17
4
+ data.tar.gz: 1d89273f3c8b6d9cb1046da8fc36b77150625d36c19543d40d85d4b3072d4789
5
5
  SHA512:
6
- metadata.gz: 68f13e9594755d317676ecca7d96c96414d4c8d1fdf0ce089b8ec3ee5e2f6939ee9a690673b78aad709817ce54f1ede9e409e6b17ad20f95ab812007a56e8ecb
7
- data.tar.gz: d12cc1b600eeb02b06c294013a9512d5af5b7518354be7c02ca1e4539f303c429a6173b6961967b50f4fe818cce8ecfdda0d189d1024a69fd03d517124423721
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..].each_with_index { |child, idx| extract_ruby_nodes(child, slim_line + idx) }
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..].each_with_index { |child, idx| extract_ruby_nodes(child, slim_line + idx) }
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
- # Add closing 'end' for control structures
111
- add_ruby_snippet("end", slim_line)
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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PackwerkSlimTemplate
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: packwerk_slim_template
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuji Yaginuma