forked from sinatra/sinatra-contrib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
capture.rb
46 lines (39 loc) · 1.13 KB
/
capture.rb
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
require 'sinatra/base'
module Sinatra
module Capture
DUMMIES = {
Tilt::HamlTemplate => "!= capture_haml(*args, &block)",
Tilt::ERBTemplate => "<% yield(*args) %>",
Tilt::ErubisTemplate => "<%= yield(*args) %>",
:slim => "== yield(*args)"
}
def call!(env)
@current_engine = :ruby
super
end
def capture(options = {}, &block)
opts = { :block => block, :args => [] }.merge options
engine = opts.delete(:engine) || @current_engine
block = opts[:block]
if engine == :ruby
block[*opts[:args]]
else
dummy = DUMMIES[Tilt[engine]] || DUMMIES.fetch(engine)
eval '_buf.clear if defined? _buf', block.binding
render(engine, dummy, {}, opts, &block)
end
end
def capture_later(options = {}, &block)
opts = { :block => block, :args => [], :engine => @current_engine }
opts.merge options
end
private
def render(engine, *)
@current_engine, engine_was = engine.to_sym, @current_engine
super
ensure
@current_engine = engine_was
end
end
helpers Capture
end