diff --git a/lib/phlex/context.rb b/lib/phlex/context.rb index 07c8ada7..7bdacda0 100644 --- a/lib/phlex/context.rb +++ b/lib/phlex/context.rb @@ -46,14 +46,17 @@ def end_target def capturing_into(new_buffer) original_buffer = @buffer original_capturing = @capturing + original_fragments = @fragments begin @buffer = new_buffer @capturing = true + @fragments = nil yield ensure @buffer = original_buffer @capturing = original_capturing + @fragments = original_fragments end new_buffer diff --git a/lib/phlex/sgml.rb b/lib/phlex/sgml.rb index daf82b8f..cc423546 100644 --- a/lib/phlex/sgml.rb +++ b/lib/phlex/sgml.rb @@ -219,7 +219,10 @@ def unsafe_raw(content = nil) def capture(&block) return "" unless block - @_context.capturing_into(+"") { yield_content(&block) } + context = @_context + return if context.fragments && !context.in_target_fragment + + context.capturing_into(+"") { yield_content(&block) } end private diff --git a/test/phlex/selective_rendering.rb b/test/phlex/selective_rendering.rb index e7456f80..74d195b3 100644 --- a/test/phlex/selective_rendering.rb +++ b/test/phlex/selective_rendering.rb @@ -53,6 +53,18 @@ def view_template end end +class WithCaptureBlock < Phlex::HTML + def view_template + h1(id: "before") { "Before" } + div(id: "around") do + capture do + h1(id: "inside") { "Inside" } + end + end + h1(id: "after") { "After" } + end +end + describe Phlex::HTML do it "renders the just the target fragment" do expect( @@ -78,4 +90,24 @@ def view_template StandardElementExample.new(checker).call(fragments: ["target"]) expect(called).to be == false end + + describe "with a capture block" do + it "doesn't render the capture block" do + expect( + WithCaptureBlock.new.call(fragments: ["after"]) + ).to be == %(

After

) + end + + it "renders the capture block when selected" do + expect( + WithCaptureBlock.new.call(fragments: ["around"]) + ).to be == %(
<h1 id="inside">Inside</h1>
) + end + + it "doesn't select from the capture block" do + expect( + WithCaptureBlock.new.call(fragments: ["inside"]) + ).to be == "" + end + end end