123456789_123456789_123456789_123456789_123456789_

Module: Sinatra::Capture

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Defined in: sinatra-contrib/lib/sinatra/capture.rb

Overview

Extension that enables blocks inside other extensions. It currently works for erb, slim and haml. Enables mixing of different template languages.

Example:

# in hello_world.erb

Say <% a = capture do %>World<% end %> Hello <%= a %>!

# in hello_world.slim

| Say

  • a = capture do | World | Hello #a!

# in hello_world.haml

Say

  • a = capture do World Hello #a.strip!

You can also use nested blocks.

Example

# in hello_world.erb

Say
<% a = capture do %>
  <% b = capture do %>World<% end %>
    <%= b %>!
<% end %>
Hello <%= a.strip %>

The main advantage of capture is mixing of different template engines.

Example

# in mix_me_up.slim

  • two = capture do
    • erb "<%= 1 + 1 %>" | 1 + 1 = #two

Usage

Classic Application

In a classic application simply require the helpers, and start using them:

require "sinatra"
require "sinatra/capture"

# The rest of your classic application code goes here...

Modular Application

In a modular application you need to require the helpers, and then tell the application you will use them:

require "sinatra/base"
require "sinatra/capture"

class MyApp < Sinatra::Base
  helpers Sinatra::Capture

  # The rest of your modular application code goes here...
end

Instance Attribute Summary

EngineTracking - Included

#builder?, #current_engine, #erb?,
#erubi?

Returns true if the current engine is :erubi, or Tilt[:erb] is set to Tilt::ErubiTemplate.

#haml?, #liquid?, #markaby?, #markdown?, #nokogiri?, #rdoc?, #ruby?, #sass?, #scss?, #slim?

Instance Method Summary

Instance Method Details

#capture(*args, &block)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/capture.rb', line 87

def capture(*args, &block)
  return block[*args] if ruby?

  if haml? && Tilt[:haml] == Tilt::HamlTemplate && defined?(Haml::Buffer)
    buffer = Haml::Buffer.new(nil, Haml::Options.new.for_buffer)
    with_haml_buffer(buffer) { capture_haml(*args, &block) }
  else
    buf_was = @_out_buf
    @_out_buf = ''
    begin
      raw = block[*args]
      captured = block.binding.eval('@_out_buf')
      captured.empty? ? raw : captured
    ensure
      @_out_buf = buf_was
    end
  end
end

#capture_later(&block)

[ GitHub ]

  
# File 'sinatra-contrib/lib/sinatra/capture.rb', line 106

def capture_later(&block)
  engine = current_engine
  proc { |*a| with_engine(engine) { @capture = capture(*a, &block) } }
end