temple 0.6.4 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +7 -0
- data/lib/temple.rb +12 -2
- data/lib/temple/filters/code_merger.rb +30 -0
- data/lib/temple/filters/encoding.rb +24 -0
- data/lib/temple/filters/remove_bom.rb +20 -0
- data/lib/temple/generator.rb +62 -0
- data/lib/temple/generators/array.rb +21 -0
- data/lib/temple/generators/array_buffer.rb +28 -0
- data/lib/temple/generators/erb.rb +36 -0
- data/lib/temple/generators/rails_output_buffer.rb +35 -0
- data/lib/temple/generators/string_buffer.rb +25 -0
- data/lib/temple/version.rb +1 -1
- data/test/filters/test_code_merger.rb +38 -0
- data/test/test_generator.rb +12 -0
- metadata +13 -3
- data/lib/temple/generators.rb +0 -163
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef295d25d34ef11abf1640d7240eedb8643e8107
|
4
|
+
data.tar.gz: a721340521044f953fec55f2b75b0d467b2bdab4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e99dbeb234856873da69adb1460a123876f219e7c34d3c12bba379ee86fd60017cd56d17b5e5da6d2eff7d3e825135cfa57002232dc3e50d3676c59745b85dc9
|
7
|
+
data.tar.gz: 22c4e6d503c7a3272ba39a153b3e7cf0ea92cb0a4937c5e6e05121ac5fe1efdd3d0ca7e3650d4a6633358542bcf4322ea27e0638e119f991db44bf58cf779810
|
data/CHANGES
CHANGED
data/lib/temple.rb
CHANGED
@@ -3,8 +3,7 @@ require 'temple/version'
|
|
3
3
|
module Temple
|
4
4
|
autoload :InvalidExpression, 'temple/exceptions'
|
5
5
|
autoload :FilterError, 'temple/exceptions'
|
6
|
-
autoload :Generator, 'temple/
|
7
|
-
autoload :Generators, 'temple/generators'
|
6
|
+
autoload :Generator, 'temple/generator'
|
8
7
|
autoload :Parser, 'temple/parser'
|
9
8
|
autoload :Engine, 'temple/engine'
|
10
9
|
autoload :Utils, 'temple/utils'
|
@@ -32,7 +31,16 @@ module Temple
|
|
32
31
|
autoload :Template, 'temple/erb/template'
|
33
32
|
end
|
34
33
|
|
34
|
+
module Generators
|
35
|
+
autoload :ERB, 'temple/generators/erb'
|
36
|
+
autoload :Array, 'temple/generators/array'
|
37
|
+
autoload :ArrayBuffer, 'temple/generators/array_buffer'
|
38
|
+
autoload :StringBuffer, 'temple/generators/string_buffer'
|
39
|
+
autoload :RailsOutputBuffer, 'temple/generators/rails_output_buffer'
|
40
|
+
end
|
41
|
+
|
35
42
|
module Filters
|
43
|
+
autoload :CodeMerger, 'temple/filters/code_merger'
|
36
44
|
autoload :ControlFlow, 'temple/filters/control_flow'
|
37
45
|
autoload :MultiFlattener, 'temple/filters/multi_flattener'
|
38
46
|
autoload :StaticMerger, 'temple/filters/static_merger'
|
@@ -40,6 +48,8 @@ module Temple
|
|
40
48
|
autoload :Escapable, 'temple/filters/escapable'
|
41
49
|
autoload :Eraser, 'temple/filters/eraser'
|
42
50
|
autoload :Validator, 'temple/filters/validator'
|
51
|
+
autoload :Encoding, 'temple/filters/encoding'
|
52
|
+
autoload :RemoveBOM, 'temple/filters/remove_bom'
|
43
53
|
end
|
44
54
|
|
45
55
|
module HTML
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Temple
|
2
|
+
module Filters
|
3
|
+
# @api public
|
4
|
+
class CodeMerger < Filter
|
5
|
+
def on_multi(*exps)
|
6
|
+
result = [:multi]
|
7
|
+
code = nil
|
8
|
+
|
9
|
+
exps.each do |exp|
|
10
|
+
if exp.first == :code
|
11
|
+
if code
|
12
|
+
code << '; ' unless code =~ /\n\Z/
|
13
|
+
code << exp.last
|
14
|
+
else
|
15
|
+
code = exp.last.dup
|
16
|
+
result << [:code, code]
|
17
|
+
end
|
18
|
+
elsif code && exp.first == :newline
|
19
|
+
code << "\n"
|
20
|
+
else
|
21
|
+
result << compile(exp)
|
22
|
+
code = nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
result.size == 2 ? result[1] : result
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Temple
|
2
|
+
module Filters
|
3
|
+
# Try to encode input string
|
4
|
+
#
|
5
|
+
# @api public
|
6
|
+
class Encoding < Parser
|
7
|
+
define_options :encoding
|
8
|
+
|
9
|
+
def call(s)
|
10
|
+
if options[:encoding] && s.respond_to?(:encoding)
|
11
|
+
old_enc = s.encoding
|
12
|
+
s = s.dup if s.frozen?
|
13
|
+
s.force_encoding(options[:encoding])
|
14
|
+
# Fall back to old encoding if new encoding is invalid
|
15
|
+
unless s.valid_encoding?
|
16
|
+
s.force_encoding(old_enc)
|
17
|
+
s.force_encoding(::Encoding::BINARY) unless s.valid_encoding?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
s
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Temple
|
2
|
+
module Filters
|
3
|
+
# Remove BOM from input string
|
4
|
+
#
|
5
|
+
# @api public
|
6
|
+
class RemoveBOM < Parser
|
7
|
+
def call(s)
|
8
|
+
if s.respond_to?(:encoding)
|
9
|
+
if s.encoding.name =~ /^UTF-(8|16|32)(BE|LE)?/
|
10
|
+
s.gsub(Regexp.new("\\A\uFEFF".encode(s.encoding.name)), '')
|
11
|
+
else
|
12
|
+
s
|
13
|
+
end
|
14
|
+
else
|
15
|
+
s.gsub(/\A\xEF\xBB\xBF/, '')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Temple
|
2
|
+
# Abstract generator base class
|
3
|
+
# Generators should inherit this class and
|
4
|
+
# compile the Core Abstraction to ruby code.
|
5
|
+
#
|
6
|
+
# @api public
|
7
|
+
class Generator
|
8
|
+
include Mixins::CompiledDispatcher
|
9
|
+
include Mixins::Options
|
10
|
+
|
11
|
+
define_options :capture_generator => 'StringBuffer',
|
12
|
+
:buffer => '_buf'
|
13
|
+
|
14
|
+
def call(exp)
|
15
|
+
[preamble, compile(exp), postamble].join('; ')
|
16
|
+
end
|
17
|
+
|
18
|
+
def on(*exp)
|
19
|
+
raise InvalidExpression, "Generator supports only core expressions - found #{exp.inspect}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def on_multi(*exp)
|
23
|
+
exp.map {|e| compile(e) }.join('; ')
|
24
|
+
end
|
25
|
+
|
26
|
+
def on_newline
|
27
|
+
"\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_capture(name, exp)
|
31
|
+
capture_generator.new(:buffer => name).call(exp)
|
32
|
+
end
|
33
|
+
|
34
|
+
def on_static(text)
|
35
|
+
concat(text.inspect)
|
36
|
+
end
|
37
|
+
|
38
|
+
def on_dynamic(code)
|
39
|
+
concat(code)
|
40
|
+
end
|
41
|
+
|
42
|
+
def on_code(code)
|
43
|
+
code
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
def buffer
|
49
|
+
options[:buffer]
|
50
|
+
end
|
51
|
+
|
52
|
+
def capture_generator
|
53
|
+
@capture_generator ||= Class === options[:capture_generator] ?
|
54
|
+
options[:capture_generator] :
|
55
|
+
Generators.const_get(options[:capture_generator])
|
56
|
+
end
|
57
|
+
|
58
|
+
def concat(str)
|
59
|
+
"#{buffer} << (#{str})"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Temple
|
2
|
+
module Generators
|
3
|
+
# Implements an array buffer.
|
4
|
+
#
|
5
|
+
# _buf = []
|
6
|
+
# _buf << "static"
|
7
|
+
# _buf << dynamic
|
8
|
+
# _buf
|
9
|
+
#
|
10
|
+
# @api public
|
11
|
+
class Array < Generator
|
12
|
+
def preamble
|
13
|
+
"#{buffer} = []"
|
14
|
+
end
|
15
|
+
|
16
|
+
def postamble
|
17
|
+
buffer
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Temple
|
2
|
+
module Generators
|
3
|
+
# Just like Array, but calls #join on the array.
|
4
|
+
#
|
5
|
+
# _buf = []
|
6
|
+
# _buf << "static"
|
7
|
+
# _buf << dynamic
|
8
|
+
# _buf.join
|
9
|
+
#
|
10
|
+
# @api public
|
11
|
+
class ArrayBuffer < Array
|
12
|
+
def call(exp)
|
13
|
+
case exp.first
|
14
|
+
when :static
|
15
|
+
"#{buffer} = #{exp.last.inspect}"
|
16
|
+
when :dynamic
|
17
|
+
"#{buffer} = (#{exp.last}).to_s"
|
18
|
+
else
|
19
|
+
super
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def postamble
|
24
|
+
"#{buffer} = #{buffer}.join"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Temple
|
2
|
+
module Generators
|
3
|
+
# Implements an ERB generator.
|
4
|
+
#
|
5
|
+
# @api public
|
6
|
+
class ERB < Generator
|
7
|
+
def call(exp)
|
8
|
+
compile(exp)
|
9
|
+
end
|
10
|
+
|
11
|
+
def on_multi(*exp)
|
12
|
+
exp.map {|e| compile(e) }.join
|
13
|
+
end
|
14
|
+
|
15
|
+
def on_capture(name, exp)
|
16
|
+
on_code(super)
|
17
|
+
end
|
18
|
+
|
19
|
+
def on_static(text)
|
20
|
+
text
|
21
|
+
end
|
22
|
+
|
23
|
+
def on_newline
|
24
|
+
"<%\n%>"
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_dynamic(code)
|
28
|
+
"<%= #{code} %>"
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_code(code)
|
32
|
+
"<% #{code} %>"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Temple
|
2
|
+
module Generators
|
3
|
+
# Implements a rails output buffer.
|
4
|
+
#
|
5
|
+
# @output_buffer = ActiveSupport::SafeBuffer
|
6
|
+
# @output_buffer.safe_concat "static"
|
7
|
+
# @output_buffer.safe_concat dynamic.to_s
|
8
|
+
# @output_buffer
|
9
|
+
#
|
10
|
+
# @api public
|
11
|
+
class RailsOutputBuffer < StringBuffer
|
12
|
+
define_options :streaming,
|
13
|
+
:buffer_class => 'ActiveSupport::SafeBuffer',
|
14
|
+
:buffer => '@output_buffer',
|
15
|
+
# output_buffer is needed for Rails 3.1 Streaming support
|
16
|
+
:capture_generator => RailsOutputBuffer
|
17
|
+
|
18
|
+
def call(exp)
|
19
|
+
[preamble, compile(exp), postamble].join('; ')
|
20
|
+
end
|
21
|
+
|
22
|
+
def preamble
|
23
|
+
if options[:streaming] && options[:buffer] == '@output_buffer'
|
24
|
+
"#{buffer} = output_buffer || #{options[:buffer_class]}.new"
|
25
|
+
else
|
26
|
+
"#{buffer} = #{options[:buffer_class]}.new"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def concat(str)
|
31
|
+
"#{buffer}.safe_concat((#{str}))"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Temple
|
2
|
+
module Generators
|
3
|
+
# Implements a string buffer.
|
4
|
+
#
|
5
|
+
# _buf = ''
|
6
|
+
# _buf << "static"
|
7
|
+
# _buf << dynamic.to_s
|
8
|
+
# _buf
|
9
|
+
#
|
10
|
+
# @api public
|
11
|
+
class StringBuffer < ArrayBuffer
|
12
|
+
def preamble
|
13
|
+
"#{buffer} = ''"
|
14
|
+
end
|
15
|
+
|
16
|
+
def postamble
|
17
|
+
buffer
|
18
|
+
end
|
19
|
+
|
20
|
+
def on_dynamic(code)
|
21
|
+
concat("(#{code}).to_s")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/temple/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Temple::Filters::CodeMerger do
|
4
|
+
before do
|
5
|
+
@filter = Temple::Filters::CodeMerger.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should merge serveral codes' do
|
9
|
+
@filter.call([:multi,
|
10
|
+
[:code, "a"],
|
11
|
+
[:code, "b"],
|
12
|
+
[:code, "c"]
|
13
|
+
]).should.equal [:code, "a; b; c"]
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should merge serveral codes around static' do
|
17
|
+
@filter.call([:multi,
|
18
|
+
[:code, "a"],
|
19
|
+
[:code, "b"],
|
20
|
+
[:static, "123"],
|
21
|
+
[:code, "a"],
|
22
|
+
[:code, "b"]
|
23
|
+
]).should.equal [:multi,
|
24
|
+
[:code, "a; b"],
|
25
|
+
[:static, "123"],
|
26
|
+
[:code, "a; b"]
|
27
|
+
]
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should merge serveral codes with newlines' do
|
31
|
+
@filter.call([:multi,
|
32
|
+
[:code, "a"],
|
33
|
+
[:code, "b"],
|
34
|
+
[:newline],
|
35
|
+
[:code, "c"]
|
36
|
+
]).should.equal [:code, "a; b\nc"]
|
37
|
+
end
|
38
|
+
end
|
data/test/test_generator.rb
CHANGED
@@ -111,6 +111,18 @@ describe Temple::Generators::StringBuffer do
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
+
describe Temple::Generators::ERB do
|
115
|
+
it 'should compile simple expressions' do
|
116
|
+
gen = Temple::Generators::ERB.new
|
117
|
+
gen.call([:static, 'test']).should.equal 'test'
|
118
|
+
gen.call([:dynamic, 'test']).should.equal '<%= test %>'
|
119
|
+
gen.call([:code, 'test']).should.equal '<% test %>'
|
120
|
+
|
121
|
+
gen.call([:multi, [:static, 'a'], [:static, 'b']]).should.equal 'ab'
|
122
|
+
gen.call([:multi, [:static, 'a'], [:dynamic, 'b']]).should.equal 'a<%= b %>'
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
114
126
|
describe Temple::Generators::RailsOutputBuffer do
|
115
127
|
it 'should compile simple expressions' do
|
116
128
|
gen = Temple::Generators::RailsOutputBuffer.new
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: temple
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Magnus Holm
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: tilt
|
@@ -79,14 +79,22 @@ files:
|
|
79
79
|
- lib/temple/erb/trimming.rb
|
80
80
|
- lib/temple/exceptions.rb
|
81
81
|
- lib/temple/filter.rb
|
82
|
+
- lib/temple/filters/code_merger.rb
|
82
83
|
- lib/temple/filters/control_flow.rb
|
83
84
|
- lib/temple/filters/dynamic_inliner.rb
|
85
|
+
- lib/temple/filters/encoding.rb
|
84
86
|
- lib/temple/filters/eraser.rb
|
85
87
|
- lib/temple/filters/escapable.rb
|
86
88
|
- lib/temple/filters/multi_flattener.rb
|
89
|
+
- lib/temple/filters/remove_bom.rb
|
87
90
|
- lib/temple/filters/static_merger.rb
|
88
91
|
- lib/temple/filters/validator.rb
|
89
|
-
- lib/temple/
|
92
|
+
- lib/temple/generator.rb
|
93
|
+
- lib/temple/generators/array.rb
|
94
|
+
- lib/temple/generators/array_buffer.rb
|
95
|
+
- lib/temple/generators/erb.rb
|
96
|
+
- lib/temple/generators/rails_output_buffer.rb
|
97
|
+
- lib/temple/generators/string_buffer.rb
|
90
98
|
- lib/temple/grammar.rb
|
91
99
|
- lib/temple/hash.rb
|
92
100
|
- lib/temple/html/attribute_merger.rb
|
@@ -108,6 +116,7 @@ files:
|
|
108
116
|
- lib/temple/utils.rb
|
109
117
|
- lib/temple/version.rb
|
110
118
|
- temple.gemspec
|
119
|
+
- test/filters/test_code_merger.rb
|
111
120
|
- test/filters/test_control_flow.rb
|
112
121
|
- test/filters/test_dynamic_inliner.rb
|
113
122
|
- test/filters/test_eraser.rb
|
@@ -153,6 +162,7 @@ signing_key:
|
|
153
162
|
specification_version: 4
|
154
163
|
summary: Template compilation framework in Ruby
|
155
164
|
test_files:
|
165
|
+
- test/filters/test_code_merger.rb
|
156
166
|
- test/filters/test_control_flow.rb
|
157
167
|
- test/filters/test_dynamic_inliner.rb
|
158
168
|
- test/filters/test_eraser.rb
|
data/lib/temple/generators.rb
DELETED
@@ -1,163 +0,0 @@
|
|
1
|
-
module Temple
|
2
|
-
# Exception raised if invalid temple expression is found
|
3
|
-
#
|
4
|
-
# @api public
|
5
|
-
class InvalidExpression < RuntimeError
|
6
|
-
end
|
7
|
-
|
8
|
-
# Abstract generator base class
|
9
|
-
# Generators should inherit this class and
|
10
|
-
# compile the Core Abstraction to ruby code.
|
11
|
-
#
|
12
|
-
# @api public
|
13
|
-
class Generator
|
14
|
-
include Mixins::CompiledDispatcher
|
15
|
-
include Mixins::Options
|
16
|
-
|
17
|
-
define_options :capture_generator,
|
18
|
-
:buffer => '_buf'
|
19
|
-
|
20
|
-
def call(exp)
|
21
|
-
[preamble, compile(exp), postamble].join('; ')
|
22
|
-
end
|
23
|
-
|
24
|
-
def on(*exp)
|
25
|
-
raise InvalidExpression, "Generator supports only core expressions - found #{exp.inspect}"
|
26
|
-
end
|
27
|
-
|
28
|
-
def on_multi(*exp)
|
29
|
-
exp.map {|e| compile(e) }.join('; ')
|
30
|
-
end
|
31
|
-
|
32
|
-
def on_newline
|
33
|
-
"\n"
|
34
|
-
end
|
35
|
-
|
36
|
-
def on_capture(name, exp)
|
37
|
-
options[:capture_generator].new(:buffer => name).call(exp)
|
38
|
-
end
|
39
|
-
|
40
|
-
def on_static(text)
|
41
|
-
concat(text.inspect)
|
42
|
-
end
|
43
|
-
|
44
|
-
def on_dynamic(code)
|
45
|
-
concat(code)
|
46
|
-
end
|
47
|
-
|
48
|
-
def on_code(code)
|
49
|
-
code
|
50
|
-
end
|
51
|
-
|
52
|
-
protected
|
53
|
-
|
54
|
-
def buffer
|
55
|
-
options[:buffer]
|
56
|
-
end
|
57
|
-
|
58
|
-
def concat(str)
|
59
|
-
"#{buffer} << (#{str})"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
module Generators
|
64
|
-
# Implements an array buffer.
|
65
|
-
#
|
66
|
-
# _buf = []
|
67
|
-
# _buf << "static"
|
68
|
-
# _buf << dynamic
|
69
|
-
# _buf
|
70
|
-
#
|
71
|
-
# @api public
|
72
|
-
class Array < Generator
|
73
|
-
def preamble
|
74
|
-
"#{buffer} = []"
|
75
|
-
end
|
76
|
-
|
77
|
-
def postamble
|
78
|
-
buffer
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
# Just like Array, but calls #join on the array.
|
83
|
-
#
|
84
|
-
# _buf = []
|
85
|
-
# _buf << "static"
|
86
|
-
# _buf << dynamic
|
87
|
-
# _buf.join
|
88
|
-
#
|
89
|
-
# @api public
|
90
|
-
class ArrayBuffer < Array
|
91
|
-
def call(exp)
|
92
|
-
case exp.first
|
93
|
-
when :static
|
94
|
-
"#{buffer} = #{exp.last.inspect}"
|
95
|
-
when :dynamic
|
96
|
-
"#{buffer} = (#{exp.last}).to_s"
|
97
|
-
else
|
98
|
-
super
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def postamble
|
103
|
-
"#{buffer} = #{buffer}.join"
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
# Implements a string buffer.
|
108
|
-
#
|
109
|
-
# _buf = ''
|
110
|
-
# _buf << "static"
|
111
|
-
# _buf << dynamic.to_s
|
112
|
-
# _buf
|
113
|
-
#
|
114
|
-
# @api public
|
115
|
-
class StringBuffer < ArrayBuffer
|
116
|
-
def preamble
|
117
|
-
"#{buffer} = ''"
|
118
|
-
end
|
119
|
-
|
120
|
-
def postamble
|
121
|
-
buffer
|
122
|
-
end
|
123
|
-
|
124
|
-
def on_dynamic(code)
|
125
|
-
concat("(#{code}).to_s")
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
# Implements a rails output buffer.
|
130
|
-
#
|
131
|
-
# @output_buffer = ActiveSupport::SafeBuffer
|
132
|
-
# @output_buffer.safe_concat "static"
|
133
|
-
# @output_buffer.safe_concat dynamic.to_s
|
134
|
-
# @output_buffer
|
135
|
-
#
|
136
|
-
# @api public
|
137
|
-
class RailsOutputBuffer < StringBuffer
|
138
|
-
define_options :streaming,
|
139
|
-
:buffer_class => 'ActiveSupport::SafeBuffer',
|
140
|
-
:buffer => '@output_buffer',
|
141
|
-
# output_buffer is needed for Rails 3.1 Streaming support
|
142
|
-
:capture_generator => RailsOutputBuffer
|
143
|
-
|
144
|
-
def call(exp)
|
145
|
-
[preamble, compile(exp), postamble].join('; ')
|
146
|
-
end
|
147
|
-
|
148
|
-
def preamble
|
149
|
-
if options[:streaming] && options[:buffer] == '@output_buffer'
|
150
|
-
"#{buffer} = output_buffer || #{options[:buffer_class]}.new"
|
151
|
-
else
|
152
|
-
"#{buffer} = #{options[:buffer_class]}.new"
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def concat(str)
|
157
|
-
"#{buffer}.safe_concat((#{str}))"
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
Generator.default_options[:capture_generator] = Generators::StringBuffer
|
163
|
-
end
|