Report abuse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
diff --git a/lib/nanoc3/helpers/render.rb b/lib/nanoc3/helpers/render.rb
--- a/lib/nanoc3/helpers/render.rb
+++ b/lib/nanoc3/helpers/render.rb
@@ -3,16 +3,18 @@
 module Nanoc3::Helpers
 
   # Nanoc3::Helpers::Render provides functionality for rendering layouts as
   # partials.
   #
   # This helper is activated automatically.
   module Render
 
+    include Nanoc3::Helpers::Capturing
+
     # Returns a string containing the rendered given layout.
     #
     # +identifier+:: the identifier of the layout that should be rendered.
     #
     # +other_assigns+:: a hash containing assigns that will be made available
     #                   as instance variables.
     #
     # Example 1: a layout 'head' with content "HEAD" and a layout 'foot' with
@@ -20,23 +22,27 @@ module Nanoc3::Helpers
     #
     #   <%= render 'head' %> - MIDDLE - <%= render 'foot' %>
     #   # => "HEAD - MIDDLE - FOOT" 
     #
     # Example 2: a layout named 'head' with content "<h1><%= @title %></h1>":
     #
     #   <%= render 'head', :title => 'Foo' %>
     #   # => "<h1>Foo</h1>"
-    def render(identifier, other_assigns={})
+    def render(identifier, other_assigns={}, &block)
       # Find layout
       layout = @site.layouts.find { |l| l.identifier == identifier.cleaned_identifier }
       raise Nanoc3::Errors::UnknownLayout.new(identifier.cleaned_identifier) if layout.nil?
 
+      # Capture content, if any
+      captured_content = block_given? ? capture(&block) : nil
+
       # Get assigns
       assigns = {
+        :content    => captured_content,
         :item       => @item,
         :item_rep   => @item_rep,
         :items      => @items,
         :layout     => layout,
         :layouts    => @layouts,
         :config     => @config,
         :site       => @site
       }.merge(other_assigns)
@@ -51,14 +57,20 @@ module Nanoc3::Helpers
 
       # Create filter
       filter = filter_class.new(assigns)
 
       # Layout
       @site.compiler.stack.push(layout)
       result = filter.run(layout.raw_content, filter_args)
       @site.compiler.stack.pop
+
+      # Append to erbout if we have a block
+      erbout = eval('_erbout', block.binding)
+      erbout << result
+
+      # Done
       result
     end
 
   end
 
 end