erubi 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f8b0f4d493253c58c5927887ba2193ef6a2e0d4e
4
- data.tar.gz: 2946005fbabe579a5679f10758fa4d0bfae224f6
3
+ metadata.gz: 33a3418c5b03e4cbef20234176d4b4d92308fa2a
4
+ data.tar.gz: eba2a09e387237585fb664206eb917b6b19838a3
5
5
  SHA512:
6
- metadata.gz: 29a9d08172af4320a6adb1c2c3645b57061da28d43b94621ee2fae921c213e99167a15b4e6b3f44a3eedcca5d2e87b809152fd9d9be1cd6e0e9f6e8b2afead45
7
- data.tar.gz: 48ab8f3a18eb6e6257374d02b6db229ee03f48a459f5ea9ba66461c7e4d5eff8cec76515c675e709dc4410f954ef1487de09d58ccd1959fc7311a427238a4d50
6
+ metadata.gz: 2cb262e67db9196ce7a1b894dd611fdd62e9662d327ad6e68e95eb7226ca225c0dae98afa5d7edbda0ebb51d4711b8c0871d502876d3865e976965c0f853b1a2
7
+ data.tar.gz: f85eda1b8942c038a4261dbad958cba7aeb7c72423fa7cf06101dd5b15a6420e4301e4a3cb84168b429f177f853f3775b146d815c5e87478f6f89c9cc6b98049
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ === 1.3.0 (2016-12-29)
2
+
3
+ * Support :capture=>:explicit option in tilt support to use Erubi::CaptureEndEngine (jeremyevans)
4
+
5
+ * Add erubi/capture_end containing Erubi::CaptureEndEngine, allowing <%|= and <%|== for opening capture tags, and <%| for closing capture tags (jeremyevans)
6
+
1
7
  === 1.2.1 (2016-11-21)
2
8
 
3
9
  * Don't automatically freeze template text strings on ruby 1.9 or 2.0 (jeremyevans)
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erubi'
4
+
5
+ module Erubi
6
+ # An engine class that supports capturing blocks via the <%|= and <%|== tags,
7
+ # explicitly ending the captures using <%| end %> blocks.
8
+ class CaptureEndEngine < Engine
9
+ # Initializes the engine. Accepts the same arguments as ::Erubi::Engine, and these
10
+ # additional options:
11
+ # :escape_capture :: Whether to make <%|= escape by default, and <%|== not escape by default,
12
+ # defaults to the same value as :escape.
13
+ def initialize(input, properties={})
14
+ properties = Hash[properties]
15
+ escape = properties.fetch(:escape){properties.fetch(:escape_html, false)}
16
+ @escape_capture = properties.fetch(:escape_capture, escape)
17
+ @bufval = properties[:bufval] ||= 'String.new'
18
+ @bufstack = '__erubi_stack'
19
+ properties[:regexp] ||= /<%(\|?={1,2}|-|\#|%|\|)?(.*?)([-=])?%>([ \t]*\r?\n)?/m
20
+ super
21
+ end
22
+
23
+ private
24
+
25
+ # Handle the <%|= and <%|== tags
26
+ def handle(indicator, code, tailch, rspace, lspace)
27
+ case indicator
28
+ when '|=', '|=='
29
+ rspace = nil if tailch && !tailch.empty?
30
+ add_text(lspace) if lspace
31
+ escape_capture = ((indicator == '|=') ^ @escape_capture)
32
+ src << "begin; (#{@bufstack} ||= []) << #{@bufvar}; #{@bufvar} = #{@bufval}; #{@bufstack}.last << #{@escapefunc if escape_capture}((" << code
33
+ add_text(rspace) if rspace
34
+ when '|'
35
+ rspace = nil if tailch && !tailch.empty?
36
+ add_text(lspace) if lspace
37
+ src << code << ")).to_s; ensure; #{@bufvar} = #{@bufstack}.pop; end;"
38
+ add_text(rspace) if rspace
39
+ else
40
+ super
41
+ end
42
+ end
43
+ end
44
+ end
@@ -10,8 +10,12 @@ module Tilt
10
10
 
11
11
  engine_class = if @options[:engine_class]
12
12
  @options[:engine_class]
13
- elsif @options[:capture]
14
- Erubi::CaptureEngine
13
+ elsif capture = @options[:capture]
14
+ if capture == :explicit
15
+ Erubi::CaptureEndEngine
16
+ else
17
+ Erubi::CaptureEngine
18
+ end
15
19
  else
16
20
  Erubi::Engine
17
21
  end
@@ -23,6 +23,7 @@ end
23
23
 
24
24
  require 'erubi'
25
25
  require 'erubi/capture'
26
+ require 'erubi/capture_end'
26
27
  require 'tilt/erubi'
27
28
  require 'minitest/spec'
28
29
  require 'minitest/autorun'
@@ -34,8 +35,8 @@ describe Erubi::Engine do
34
35
 
35
36
  def check_output(input, src, result, &block)
36
37
  t = (@options[:engine] || Erubi::Engine).new(input, @options)
37
- eval(t.src, block.binding).must_equal result
38
38
  tsrc = t.src
39
+ eval(tsrc, block.binding).must_equal result
39
40
  tsrc = tsrc.gsub("'.freeze;", "';") if RUBY_VERSION >= '2.1'
40
41
  tsrc.must_equal src
41
42
  end
@@ -52,6 +53,21 @@ describe Erubi::Engine do
52
53
  end
53
54
  end
54
55
 
56
+ def setup_bar
57
+ def self.bar
58
+ @a << "a"
59
+ yield
60
+ @a << 'b'
61
+ @a.upcase
62
+ end
63
+ def self.baz
64
+ @a << "c"
65
+ yield
66
+ @a << 'd'
67
+ @a * 2
68
+ end
69
+ end
70
+
55
71
  it "should handle no options" do
56
72
  list = ['&\'<>"2']
57
73
  check_output(<<END1, <<END2, <<END3){}
@@ -146,7 +162,7 @@ END3
146
162
  end
147
163
 
148
164
  [['', false], ['=', true]].each do |ind, escape|
149
- it "should allow <%|=#{ind} for capturing without escaping when :escape_capture => #{escape}" do
165
+ it "should allow <%|=#{ind} for capturing with CaptureEngine with :escape_capture => #{escape} and :escape => #{escape}" do
150
166
  @options[:bufvar] = '@a'
151
167
  @options[:capture] = true
152
168
  @options[:escape_capture] = escape
@@ -192,7 +208,7 @@ END3
192
208
  end
193
209
 
194
210
  [['', true], ['=', false]].each do |ind, escape|
195
- it "should allow <%|=#{ind} for capturing with escaping when :escape => #{escape}" do
211
+ it "should allow <%|=#{ind} for capturing with CaptureEngine with :escape => #{escape}" do
196
212
  @options[:bufvar] = '@a'
197
213
  @options[:capture] = true
198
214
  @options[:escape] = escape
@@ -227,6 +243,119 @@ END3
227
243
  end
228
244
  end
229
245
 
246
+ [['', false], ['=', true]].each do |ind, escape|
247
+ it "should allow <%|=#{ind} and <%| for capturing with CaptureEndEngine with :escape_capture => #{escape} and :escape => #{!escape}" do
248
+ @options[:bufvar] = '@a'
249
+ @options[:capture] = true
250
+ @options[:escape_capture] = escape
251
+ @options[:escape] = !escape
252
+ @options[:engine] = ::Erubi::CaptureEndEngine
253
+ setup_bar
254
+ check_output(<<END1, <<END2, <<END3){}
255
+ <table>
256
+ <tbody>
257
+ <%|=#{ind} bar do %>
258
+ <b><%=#{ind} '&' %></b>
259
+ <%| end %>
260
+ </tbody>
261
+ </table>
262
+ END1
263
+ #{'__erubi = ::Erubi;' unless escape}@a = String.new; @a << '<table>
264
+ <tbody>
265
+ '; @a << ' ';begin; (__erubi_stack ||= []) << @a; @a = String.new; __erubi_stack.last << #{!escape ? '__erubi' : '::Erubi'}.h(( bar do @a << '
266
+ '; @a << ' <b>'; @a << #{!escape ? '__erubi' : '::Erubi'}.h(( '&' )); @a << '</b>
267
+ '; @a << ' '; end )).to_s; ensure; @a = __erubi_stack.pop; end; @a << '
268
+ '; @a << ' </tbody>
269
+ </table>
270
+ ';
271
+ @a.to_s
272
+ END2
273
+ <table>
274
+ <tbody>
275
+ A
276
+ &lt;B&gt;&amp;AMP;&lt;/B&gt;
277
+ B
278
+ </tbody>
279
+ </table>
280
+ END3
281
+ end
282
+ end
283
+
284
+ [['', true], ['=', false]].each do |ind, escape|
285
+ it "should allow <%|=#{ind} and <%| for capturing with CaptureEndEngine when with :escape => #{escape}" do
286
+ @options[:bufvar] = '@a'
287
+ @options[:capture] = true
288
+ @options[:escape] = escape
289
+ @options[:engine] = ::Erubi::CaptureEndEngine
290
+ setup_bar
291
+ check_output(<<END1, <<END2, <<END3){}
292
+ <table>
293
+ <tbody>
294
+ <%|=#{ind} bar do %>
295
+ <b><%=#{ind} '&' %></b>
296
+ <%| end %>
297
+ </tbody>
298
+ </table>
299
+ END1
300
+ #{'__erubi = ::Erubi;' if escape}@a = String.new; @a << '<table>
301
+ <tbody>
302
+ '; @a << ' ';begin; (__erubi_stack ||= []) << @a; @a = String.new; __erubi_stack.last << (( bar do @a << '
303
+ '; @a << ' <b>'; @a << #{escape ? '__erubi' : '::Erubi'}.h(( '&' )); @a << '</b>
304
+ '; @a << ' '; end )).to_s; ensure; @a = __erubi_stack.pop; end; @a << '
305
+ '; @a << ' </tbody>
306
+ </table>
307
+ ';
308
+ @a.to_s
309
+ END2
310
+ <table>
311
+ <tbody>
312
+ A
313
+ <B>&AMP;</B>
314
+ B
315
+ </tbody>
316
+ </table>
317
+ END3
318
+ end
319
+
320
+ it "should allow <%|=#{ind} and <%| for nested capturing with CaptureEndEngine when with :escape => #{escape}" do
321
+ @options[:bufvar] = '@a'
322
+ @options[:capture] = true
323
+ @options[:escape] = escape
324
+ @options[:engine] = ::Erubi::CaptureEndEngine
325
+ setup_bar
326
+ check_output(<<END1, <<END2, <<END3){}
327
+ <table>
328
+ <tbody>
329
+ <%|=#{ind} bar do %>
330
+ <b><%=#{ind} '&' %></b>
331
+ <%|=#{ind} baz do %>e<%| end %>
332
+ <%| end %>
333
+ </tbody>
334
+ </table>
335
+ END1
336
+ #{'__erubi = ::Erubi;' if escape}@a = String.new; @a << '<table>
337
+ <tbody>
338
+ '; @a << ' ';begin; (__erubi_stack ||= []) << @a; @a = String.new; __erubi_stack.last << (( bar do @a << '
339
+ '; @a << ' <b>'; @a << #{escape ? '__erubi' : '::Erubi'}.h(( '&' )); @a << '</b>
340
+ '; @a << ' ';begin; (__erubi_stack ||= []) << @a; @a = String.new; __erubi_stack.last << (( baz do @a << 'e'; end )).to_s; ensure; @a = __erubi_stack.pop; end; @a << '
341
+ '; @a << ' '; end )).to_s; ensure; @a = __erubi_stack.pop; end; @a << '
342
+ '; @a << ' </tbody>
343
+ </table>
344
+ ';
345
+ @a.to_s
346
+ END2
347
+ <table>
348
+ <tbody>
349
+ A
350
+ <B>&AMP;</B>
351
+ CEDCED
352
+ B
353
+ </tbody>
354
+ </table>
355
+ END3
356
+ end
357
+ end
358
+
230
359
  [:outvar, :bufvar].each do |var|
231
360
  it "should handle :#{var} and :freeze options" do
232
361
  @options[var] = "@_out_buf"
@@ -533,6 +662,15 @@ END1
533
662
  END2
534
663
  end
535
664
 
665
+ it "should have working tilt support for explicit capturing" do
666
+ setup_bar
667
+ Tilt::ErubiTemplate.new(:capture=>:explicit, :outvar=>'@a'){<<END1}.render(self).must_equal(<<END2)
668
+ 1<%|= bar do %>b<%|= baz do %>e<%| end %>ar<%| end %>2
669
+ END1
670
+ 1ABCEDCEDARB2
671
+ END2
672
+ end
673
+
536
674
  it "should have working tilt support for specifying engine class" do
537
675
  setup_foo
538
676
  @a = 1
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erubi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-11-21 00:00:00.000000000 Z
12
+ date: 2016-12-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: tilt
@@ -54,6 +54,7 @@ files:
54
54
  - Rakefile
55
55
  - lib/erubi.rb
56
56
  - lib/erubi/capture.rb
57
+ - lib/erubi/capture_end.rb
57
58
  - lib/tilt/erubi.rb
58
59
  - test/test.rb
59
60
  homepage: https://github.com/jeremyevans/erubi