@@ -14,10 +14,16 @@ def compile(node)
1414 result . body &.body &.unshift (
1515 proc do |f |
1616 f . statement do
17- f . push "__phlex_buffer__ = @_state.buffer; nil "
17+ f . push "__phlex_state__ = @_state"
1818 end
1919 f . statement do
20- f . push "__phlex_me__ = self; nil"
20+ f . push "__phlex_buffer__ = __phlex_state__.buffer"
21+ end
22+ f . statement do
23+ f . push "__phlex_me__ = self"
24+ end
25+ f . statement do
26+ f . push "__phlex_should_render__ = __phlex_state__.should_render?; nil"
2127 end
2228 end
2329 )
@@ -38,6 +44,8 @@ def visit_call_node(node)
3844 return compile_doctype_helper ( node )
3945 elsif plain_helper? ( node )
4046 return compile_plain_helper ( node )
47+ elsif fragment_helper? ( node )
48+ return compile_fragment_helper ( node )
4149 end
4250 end
4351
@@ -110,16 +118,20 @@ def visit_phlex_block(node)
110118
111119 def visit_block_node ( node )
112120 node . copy (
113- body : [
114- statement ( "if __phlex_me__ == self" ) ,
115- visit ( node . body ) ,
116- statement ( "else" ) ,
117- [ [ node . body ] ] ,
118- statement ( "end" ) ,
119- ]
121+ body : compile_block_body_node ( node . body )
120122 )
121123 end
122124
125+ def compile_block_body_node ( node )
126+ [
127+ statement ( "if __phlex_me__ == self;" ) ,
128+ visit ( node ) ,
129+ statement ( "else;" ) ,
130+ [ [ node ] ] ,
131+ statement ( "end;" ) ,
132+ ]
133+ end
134+
123135 def compile_void_element ( node , tag )
124136 [
125137 [
@@ -165,6 +177,23 @@ def compile_plain_helper(node)
165177 end
166178 end
167179
180+ def compile_fragment_helper ( node )
181+ node . copy (
182+ block : compile_fragment_helper_block ( node . block )
183+ )
184+ end
185+
186+ def compile_fragment_helper_block ( node )
187+ node . copy (
188+ body : [
189+ statement ( "__phlex_original_should_render__ = __phlex_should_render__" ) ,
190+ statement ( "__phlex_should_render__ = __phlex_state__.should_render?;" ) ,
191+ visit ( node . body ) ,
192+ statement ( "__phlex_should_render__ = __phlex_original_should_render__" ) ,
193+ ]
194+ )
195+ end
196+
168197 private def ensure_new_line
169198 proc ( &:ensure_new_line )
170199 end
@@ -204,7 +233,7 @@ def compile_plain_helper(node)
204233
205234 proc do |f |
206235 f . statement do
207- f . push "__phlex_buffer__ << \" #{ new_buffer . gsub ( '"' , '\\"' ) } \" ; nil"
236+ f . push "__phlex_buffer__ << \" #{ new_buffer . gsub ( '"' , '\\"' ) } \" if __phlex_should_render__ ; nil; "
208237 end
209238 end
210239 end
@@ -260,6 +289,10 @@ def compile_plain_helper(node)
260289 node . name == :plain && own_method_without_scope? ( node )
261290 end
262291
292+ private def fragment_helper? ( node )
293+ node . name == :fragment && own_method_without_scope? ( node )
294+ end
295+
263296 ALLOWED_OWNERS = [ Phlex ::SGML , Phlex ::HTML , Phlex ::SVG ]
264297 private def own_method_without_scope? ( node )
265298 ALLOWED_OWNERS . include? ( @component . instance_method ( node . name ) . owner )
0 commit comments