erubi 1.2.1 → 1.3.0

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 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