ember 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,12 +18,12 @@ module Ember
18
18
  ##
19
19
  # Number of this release of this project.
20
20
  #
21
- VERSION = "0.2.0"
21
+ VERSION = "0.3.0"
22
22
 
23
23
  ##
24
24
  # Date of this release of this project.
25
25
  #
26
- RELDATE = "2010-04-25"
26
+ RELDATE = "2010-04-26"
27
27
 
28
28
  ##
29
29
  # Description of this release of this project.
@@ -61,24 +61,14 @@ module Ember
61
61
  @compile
62
62
  end
63
63
 
64
- @@contexts = {}
65
-
66
64
  ##
67
65
  # Returns the result of executing the Ruby program for this template
68
66
  # (provided by the {#program} method) inside the given context binding.
69
67
  #
70
- def render context = nil, parent_context_id = nil
71
- context ||=
72
- @@contexts[parent_context_id] || # inherit parent context
73
- Object.new.instance_eval('binding') # create new context
74
- @@contexts[@render_context_id] = context # provide to children
75
-
76
- result = eval @compile, context,
68
+ def render context = Object.new.instance_eval('binding')
69
+ eval @compile, context,
77
70
  (@options[:source_file] || :SOURCE).to_s,
78
71
  (@options[:source_line] || 1).to_i
79
-
80
- @@contexts.delete @render_context_id # free the memory
81
- result
82
72
  end
83
73
 
84
74
  class << self
@@ -104,6 +94,69 @@ module Ember
104
94
  File.read resolve_path(path, options)
105
95
  end
106
96
 
97
+ ##
98
+ # Returns the template evaluation result buffer
99
+ # associated with the given content block.
100
+ #
101
+ def buffer_from_block content_block
102
+ context = content_block.binding
103
+ result_variable = eval(Program::RESULT_VARIABLE_BACKDOOR, context)
104
+ eval result_variable.to_s, context
105
+ end
106
+
107
+ ##
108
+ # Invokes the given block while passing the given arguments to
109
+ # it and then returns an Array of things that the given block
110
+ # tried to append to its template evaluation result buffer.
111
+ #
112
+ # If the given block did not try to append anything, then the
113
+ # result of invoking the given block is returned as an Array.
114
+ #
115
+ def content_from_block content_block, *content_block_args
116
+ context = content_block.binding
117
+
118
+ orig_result_variable = eval(Program::RESULT_VARIABLE_BACKDOOR, context)
119
+ temp_result_variable = "#{orig_result_variable}_#{context.object_id.abs}"
120
+ eval "#{temp_result_variable} = #{orig_result_variable}", context
121
+
122
+ begin
123
+ # the content block appends to the result buffer when invoked.
124
+ # so we temporarily replace the result buffer with an empty one,
125
+ # invoke the content block, and viola! we now have its content.
126
+ block_content = eval("#{orig_result_variable} = []", context)
127
+ return_value = content_block.call(*content_block_args)
128
+ ensure
129
+ eval "#{orig_result_variable} = #{temp_result_variable}", context
130
+ end
131
+
132
+ if block_content.empty?
133
+ # no content was appended to the result buffer when the content
134
+ # block was invoked because it did not contain any vocal directives.
135
+ # so we return the return value of content block invocation instead.
136
+ Array(return_value)
137
+ else
138
+ block_content
139
+ end
140
+ end
141
+
142
+ ##
143
+ # Passes the given content block's content (obtained by invoking
144
+ # the given content block with the given arguments) as an argument
145
+ # to given wrapper block. The result of the wrapper block is (1)
146
+ # appended to the template evaluation result buffer associated with
147
+ # the given content block and is (2) returned by this method.
148
+ #
149
+ def wrap_content_block content_block, *content_block_args, &wrapper
150
+ raise ArgumentError, 'wrapper block must be given' unless wrapper
151
+
152
+ buffer = buffer_from_block(content_block)
153
+ content = content_from_block(content_block, *content_block_args)
154
+
155
+ wrapped_content = wrapper.call(content)
156
+ buffer << wrapped_content
157
+ wrapped_content
158
+ end
159
+
107
160
  private
108
161
 
109
162
  def resolve_path path, options = {}
@@ -368,7 +421,7 @@ module Ember
368
421
  nest_template_with = lambda do |meth|
369
422
  @program.emit_code "#{template_class_name}.#{meth}(#{
370
423
  nested_template_args
371
- }.merge!(:continue_result => true)).render(nil, #{@render_context_id.inspect})"
424
+ }.merge!(:continue_result => true)).render(::Kernel.binding)"
372
425
  end
373
426
 
374
427
  case operation
@@ -425,6 +478,13 @@ module Ember
425
478
  end
426
479
 
427
480
  class Program #:nodoc:
481
+ ##
482
+ # Name of a variable whose value is the
483
+ # name of the result variable in the
484
+ # Ruby code produced by this program.
485
+ #
486
+ RESULT_VARIABLE_BACKDOOR = 'e08afdfb_62c7_485f_87a0_80914e1b4703' # UUID
487
+
428
488
  ##
429
489
  # Transforms this program into Ruby code which uses
430
490
  # the given variable name as the evaluation buffer.
@@ -527,7 +587,10 @@ module Ember
527
587
  # Transforms this program into executable Ruby source code.
528
588
  #
529
589
  def compile
530
- '(%s %s []; %s; %s.join)' % [
590
+ '(%s = %s; %s %s []; %s; %s.join)' % [
591
+ RESULT_VARIABLE_BACKDOOR,
592
+ @result_variable.inspect,
593
+
531
594
  @result_variable,
532
595
  @continue_result ? '||=' : '=',
533
596
 
data/man.html CHANGED
@@ -2,7 +2,7 @@
2
2
  <html>
3
3
  <head>
4
4
  <meta http-equiv='content-type' value='text/html;charset=utf8'>
5
- <meta name='generator' value='Ronn/v0.5'>
5
+ <meta name='generator' value='Ronn/v0.5 (http://github.com/rtomayko/ronn)'>
6
6
  <title>ember(1) - eRuby template processor</title>
7
7
  <style type='text/css'>
8
8
  body {margin:0}
@@ -73,13 +73,26 @@
73
73
  <body>
74
74
  <div id='man'>
75
75
 
76
- <div class='man-navigation'><a href='#NAME'>NAME</a> <a href='#ABOUT'>ABOUT</a> <a href='#SYNOPSIS'>SYNOPSIS</a> <a href='#DESCRIPTION'>DESCRIPTION</a> <a href='#OPTIONS'>OPTIONS</a> <a href='#SYNTAX'>SYNTAX</a> <a href='#EXAMPLES'>EXAMPLES</a> <a href='#HACKING'>HACKING</a> <a href='#VERSIONS'>VERSIONS</a> <a href='#CREDITS'>CREDITS</a> <a href='#LICENSE'>LICENSE</a> <a href='#SEE-ALSO'>SEE ALSO</a></div>
76
+ <div class='man-navigation'>
77
+ <a href="#NAME">NAME</a>
78
+ <a href="#ABOUT">ABOUT</a>
79
+ <a href="#SYNOPSIS">SYNOPSIS</a>
80
+ <a href="#DESCRIPTION">DESCRIPTION</a>
81
+ <a href="#OPTIONS">OPTIONS</a>
82
+ <a href="#SYNTAX">SYNTAX</a>
83
+ <a href="#EXAMPLES">EXAMPLES</a>
84
+ <a href="#HACKING">HACKING</a>
85
+ <a href="#VERSIONS">VERSIONS</a>
86
+ <a href="#CREDITS">CREDITS</a>
87
+ <a href="#LICENSE">LICENSE</a>
88
+ <a href="#SEE-ALSO">SEE ALSO</a>
89
+ </div>
77
90
 
78
91
  <h1 class='man-title'>ember(1)</h1>
79
92
 
80
93
  <ol class='head man'>
81
94
  <li class='tl'>ember(1)</li>
82
- <li class='tc'>Version 0.2.0</li>
95
+ <li class='tc'>Version 0.3.0</li>
83
96
  <li class='tr'>ember(1)</li>
84
97
  </ol>
85
98
 
@@ -98,7 +111,7 @@ debugging, reduces markup, and improves composability of eRuby templates.</p>
98
111
  <li><p>Omits newlines trailing code-only <code>&lt;% ... %&gt;</code> directives.</p></li>
99
112
  <li><p>Can infer missing <code>&lt;% end %></code> directives based on indentation.</p></li>
100
113
  <li><p>Can unindent eRuby block bodies hierarchically.</p></li>
101
- <li><p>Written in 335 lines of pure
114
+ <li><p>Written in 361 lines of pure
102
115
  Ruby.</p></li>
103
116
  </ul>
104
117
 
@@ -261,50 +274,37 @@ template processor to evaluate the eRuby template given as input:</p>
261
274
 
262
275
  <h3 id="An-empty-template">An empty template</h3>
263
276
 
264
- <p>Begin with an empty template:</p>
277
+ <pre></pre>
265
278
 
266
- <pre>
267
- </pre>
268
279
 
280
+ <p>The above template compiles into:</p>
269
281
 
270
- <p>The
271
- above template compiles into:</p>
272
-
273
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
274
- ; _erbout.join)
282
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; ; _erbout.join)
275
283
  </code></pre>
276
284
 
277
285
  <p>And renders as:</p>
278
286
 
279
- <pre>
280
- </pre>
287
+ <pre></pre>
281
288
 
282
289
 
283
290
  <h3 id="Comment-directives">Comment directives</h3>
284
291
 
285
- <p>Add comment directives:</p>
286
-
287
292
  <pre><code>&lt;%# this is a comment %>
288
293
  %# this is also a comment
289
-
290
294
  &lt;%# this
291
295
  is
292
296
  a
293
297
  multi-line comment %>
294
298
  </code></pre>
295
299
 
296
- <p>With <code>{:shorthand=&gt;true}</code> options, the
297
- above template compiles into:</p>
300
+ <p>With <code>{:shorthand=&gt;true}</code> options, the above template compiles into:</p>
298
301
 
299
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
300
- _erbout &lt;&lt; "\n"
301
- _erbout &lt;&lt; "\n"
302
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; _erbout &lt;&lt; "\n"
302
303
  _erbout &lt;&lt; "\n"
303
304
 
304
305
 
305
306
 
306
307
 
307
- _erbout &lt;&lt; " \n"
308
308
  ; _erbout.join)
309
309
  </code></pre>
310
310
 
@@ -312,27 +312,19 @@ _erbout &lt;&lt; " \n"
312
312
 
313
313
  <pre>
314
314
 
315
-
316
-
317
-
318
315
  </pre>
319
316
 
320
317
 
321
318
  <h3 id="Escaped-directives">Escaped directives</h3>
322
319
 
323
- <p>Add escaped directives:</p>
324
-
325
320
  <pre><code>&lt;%% this is an escaped directive %>
326
321
  %% this is an escaped directive
327
322
  </code></pre>
328
323
 
329
- <p>With <code>{:shorthand=&gt;true}</code> options, the
330
- above template compiles into:</p>
324
+ <p>With <code>{:shorthand=&gt;true}</code> options, the above template compiles into:</p>
331
325
 
332
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
333
- _erbout &lt;&lt; "&lt;% this is an escaped directive %>\n"
326
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; _erbout &lt;&lt; "&lt;% this is an escaped directive %>\n"
334
327
  _erbout &lt;&lt; "% this is an escaped directive\n"
335
- _erbout &lt;&lt; " \n"
336
328
  ; _erbout.join)
337
329
  </code></pre>
338
330
 
@@ -344,20 +336,14 @@ _erbout &lt;&lt; " \n"
344
336
 
345
337
  <h3 id="Vocal-directives">Vocal directives</h3>
346
338
 
347
- <p>Add vocal directives, which produce output:</p>
348
-
349
339
  <pre><code>&lt;%= "hello" %>
350
340
  %= "world"
351
341
  </code></pre>
352
342
 
353
- <p>With <code>{:shorthand=&gt;true}</code> options, the
354
- above template compiles into:</p>
343
+ <p>With <code>{:shorthand=&gt;true}</code> options, the above template compiles into:</p>
355
344
 
356
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
357
- _erbout &lt;&lt; ("hello") &lt;&lt; "\n"
345
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; _erbout &lt;&lt; ("hello") &lt;&lt; "\n"
358
346
  _erbout &lt;&lt; ("world") &lt;&lt; "\n"
359
- _erbout &lt;&lt; "\n"
360
- _erbout &lt;&lt; " \n"
361
347
  ; _erbout.join)
362
348
  </code></pre>
363
349
 
@@ -369,8 +355,6 @@ world
369
355
 
370
356
  <h3 id="Silent-directives">Silent directives</h3>
371
357
 
372
- <p>Add silent directives, which do not produce output:</p>
373
-
374
358
  <pre><code>&lt;% a = "hello" %>
375
359
  % b = "world"
376
360
 
@@ -378,17 +362,13 @@ world
378
362
  %= b
379
363
  </code></pre>
380
364
 
381
- <p>With <code>{:shorthand=&gt;true}</code> options, the
382
- above template compiles into:</p>
365
+ <p>With <code>{:shorthand=&gt;true}</code> options, the above template compiles into:</p>
383
366
 
384
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
385
- a = "hello"
367
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; a = "hello"
386
368
  b = "world"
387
369
  _erbout &lt;&lt; "\n"
388
370
  _erbout &lt;&lt; (a) &lt;&lt; "\n"
389
371
  _erbout &lt;&lt; (b) &lt;&lt; "\n"
390
- _erbout &lt;&lt; "\n"
391
- _erbout &lt;&lt; " \n"
392
372
  ; _erbout.join)
393
373
  </code></pre>
394
374
 
@@ -400,8 +380,6 @@ world
400
380
 
401
381
  <h3 id="Block-directives">Block directives</h3>
402
382
 
403
- <p>Add some Ruby blocks:</p>
404
-
405
383
  <pre><code>% words = %w[hello world]
406
384
 
407
385
  &lt;% words.each do |w| %&gt;
@@ -417,11 +395,9 @@ world
417
395
  % end
418
396
  </code></pre>
419
397
 
420
- <p>With <code>{:shorthand=&gt;true}</code> options, the
421
- above template compiles into:</p>
398
+ <p>With <code>{:shorthand=&gt;true}</code> options, the above template compiles into:</p>
422
399
 
423
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
424
- words = %w[hello world]
400
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; words = %w[hello world]
425
401
  _erbout &lt;&lt; "\n"
426
402
  words.each do |w|
427
403
  _erbout &lt;&lt; " " &lt;&lt; (w) &lt;&lt; "\n"
@@ -434,8 +410,6 @@ _erbout &lt;&lt; "\n"
434
410
  words.each do |w|
435
411
  _erbout &lt;&lt; " " &lt;&lt; (w) &lt;&lt; "\n"
436
412
  end
437
- _erbout &lt;&lt; "\n"
438
- _erbout &lt;&lt; " \n"
439
413
  ; _erbout.join)
440
414
  </code></pre>
441
415
 
@@ -451,6 +425,212 @@ _erbout &lt;&lt; " \n"
451
425
  world
452
426
  </code></pre>
453
427
 
428
+ <h3 id="Unindent-block-content">Unindent block content</h3>
429
+
430
+ <pre><code>&lt;% [1].each do |i| %&gt;
431
+ &lt;%= i %>
432
+ % [2].each do |j|
433
+ %= j
434
+ %|[3].each |k|
435
+ %= k
436
+ % end
437
+ % end
438
+ &lt;% end %>
439
+ </code></pre>
440
+
441
+ <p>With <code>{:shorthand=&gt;true, :unindent=&gt;true}</code> options, the above template compiles into:</p>
442
+
443
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; [1].each do |i|
444
+ _erbout &lt;&lt; (i) &lt;&lt; "\n"
445
+ [2].each do |j|
446
+ _erbout &lt;&lt; (j) &lt;&lt; "\n"
447
+ [3].each do |k|
448
+ _erbout &lt;&lt; (k) &lt;&lt; "\n"
449
+ end
450
+ end
451
+ end
452
+ ; _erbout.join)
453
+ </code></pre>
454
+
455
+ <p>And renders as:</p>
456
+
457
+ <pre><code>1
458
+ 2
459
+ 3
460
+ </code></pre>
461
+
462
+ <h3 id="Wrap-block-content">Wrap block content</h3>
463
+
464
+ <p>In this manner, you can create domain specific languages in eRuby.</p>
465
+
466
+ <pre><code>&lt;%
467
+ def introducing(subject, &amp;block)
468
+ Ember::Template.wrap_content_block(block, rand(10)) do |content|
469
+ "And now I would like to introduce #{subject}:\n\n#{content.join}"
470
+ end
471
+ end
472
+
473
+ def coin_toss(pronoun, &amp;block)
474
+ Ember::Template.wrap_content_block(block) do |content|
475
+ "#{pronoun} favorite side of a coin toss is #{content.join}."
476
+ end
477
+ end
478
+ %&gt;
479
+
480
+ % introducing "Matz" do |number|
481
+ Father of the Ruby programming language,
482
+ and also a jolly and well mannered fellow.
483
+
484
+ % coin_toss("His") { number % 2 == 0 ? "heads" : "tails" }
485
+ % end
486
+ </code></pre>
487
+
488
+ <p>With <code>{:shorthand=&gt;true, :unindent=&gt;true}</code> options, the above template compiles into:</p>
489
+
490
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = [];
491
+ def introducing(subject, &amp;block)
492
+ Ember::Template.wrap_content_block(block, rand(10)) do |content|
493
+ "And now I would like to introduce #{subject}:\n\n#{content.join}"
494
+ end
495
+ end
496
+
497
+ def coin_toss(pronoun, &amp;block)
498
+ Ember::Template.wrap_content_block(block) do |content|
499
+ "#{pronoun} favorite side of a coin toss is #{content.join}."
500
+ end
501
+ end
502
+
503
+ _erbout &lt;&lt; "\n"
504
+ introducing "Matz" do |number|
505
+ _erbout &lt;&lt; "Father of the Ruby programming language,\n"
506
+ _erbout &lt;&lt; "and also a jolly and well mannered fellow.\n"
507
+ _erbout &lt;&lt; "\n"
508
+ coin_toss("His") { number % 2 == 0 ? "heads" : "tails" }
509
+ end
510
+ ; _erbout.join)
511
+ </code></pre>
512
+
513
+ <p>And renders as:</p>
514
+
515
+ <pre><code>And now I would like to introduce Matz:
516
+
517
+ Father of the Ruby programming language,
518
+ and also a jolly and well mannered fellow.
519
+
520
+ His favorite side of a coin toss is tails.
521
+ </code></pre>
522
+
523
+ <h3 id="Capture-block-content">Capture block content</h3>
524
+
525
+ <p>In this manner, you can create domain specific languages in eRuby.</p>
526
+
527
+ <pre><code>&lt;%
528
+ def introducing(subject, &amp;block)
529
+ content = Ember::Template.content_from_block(block, rand(2))
530
+
531
+ buffer = Ember::Template.buffer_from_block(block)
532
+ buffer &lt;&lt; "introducing(#{subject.inspect}):\n\n#{content.join}"
533
+ end
534
+
535
+ def coin_toss(pronoun, &amp;block)
536
+ content = Ember::Template.content_from_block(block)
537
+
538
+ buffer = Ember::Template.buffer_from_block(block)
539
+ buffer &lt;&lt; "coin_toss(#{pronoun.inspect}): #{content.join}"
540
+ end
541
+ %&gt;
542
+
543
+ % introducing "Matz" do |number|
544
+ Father of the Ruby programming language,
545
+ and also a jolly and well mannered fellow.
546
+
547
+ % coin_toss("His") { number % 2 == 0 ? "heads" : "tails" }
548
+ % end
549
+ </code></pre>
550
+
551
+ <p>With <code>{:shorthand=&gt;true, :unindent=&gt;true}</code> options, the above template compiles into:</p>
552
+
553
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = [];
554
+ def introducing(subject, &amp;block)
555
+ content = Ember::Template.content_from_block(block, rand(2))
556
+
557
+ buffer = Ember::Template.buffer_from_block(block)
558
+ buffer &lt;&lt; "introducing(#{subject.inspect}):\n\n#{content.join}"
559
+ end
560
+
561
+ def coin_toss(pronoun, &amp;block)
562
+ content = Ember::Template.content_from_block(block)
563
+
564
+ buffer = Ember::Template.buffer_from_block(block)
565
+ buffer &lt;&lt; "coin_toss(#{pronoun.inspect}): #{content.join}"
566
+ end
567
+
568
+ _erbout &lt;&lt; "\n"
569
+ introducing "Matz" do |number|
570
+ _erbout &lt;&lt; "Father of the Ruby programming language,\n"
571
+ _erbout &lt;&lt; "and also a jolly and well mannered fellow.\n"
572
+ _erbout &lt;&lt; "\n"
573
+ coin_toss("His") { number % 2 == 0 ? "heads" : "tails" }
574
+ end
575
+ ; _erbout.join)
576
+ </code></pre>
577
+
578
+ <p>And renders as:</p>
579
+
580
+ <pre><code>introducing("Matz"):
581
+
582
+ Father of the Ruby programming language,
583
+ and also a jolly and well mannered fellow.
584
+
585
+ coin_toss("His"): heads
586
+ </code></pre>
587
+
588
+ <h3 id="Template-evaluation-result-buffer">Template evaluation result buffer</h3>
589
+
590
+ <p>In this manner, you can create domain specific languages in eRuby.</p>
591
+
592
+ <pre><code>&lt;%
593
+ def introducing(subject, &amp;block)
594
+ buffer = Ember::Template.buffer_from_block(block)
595
+ #
596
+ # you can do whatever you want with buffer,
597
+ # now that you have a reference to it! &gt;:-)
598
+ #
599
+ buffer &lt;&lt; "introducing(#{subject.inspect})"
600
+ end
601
+ %&gt;
602
+
603
+ % introducing "Matz" do |number|
604
+ Father of the Ruby programming language,
605
+ and also a jolly and well mannered fellow.
606
+ % end
607
+ </code></pre>
608
+
609
+ <p>With <code>{:shorthand=&gt;true, :unindent=&gt;true}</code> options, the above template compiles into:</p>
610
+
611
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = [];
612
+ def introducing(subject, &amp;block)
613
+ buffer = Ember::Template.buffer_from_block(block)
614
+ #
615
+ # you can do whatever you want with buffer,
616
+ # now that you have a reference to it! &gt;:-)
617
+ #
618
+ buffer &lt;&lt; "introducing(#{subject.inspect})"
619
+ end
620
+
621
+ _erbout &lt;&lt; "\n"
622
+ introducing "Matz" do |number|
623
+ _erbout &lt;&lt; "Father of the Ruby programming language,\n"
624
+ _erbout &lt;&lt; "and also a jolly and well mannered fellow.\n"
625
+ end
626
+ ; _erbout.join)
627
+ </code></pre>
628
+
629
+ <p>And renders as:</p>
630
+
631
+ <pre><code>introducing("Matz")
632
+ </code></pre>
633
+
454
634
  <h3 id="Infer-block-endings">Infer block endings</h3>
455
635
 
456
636
  <p>Omit <code>&lt;% end %></code> directives from the template:</p>
@@ -467,11 +647,9 @@ _erbout &lt;&lt; " \n"
467
647
  %= w
468
648
  </code></pre>
469
649
 
470
- <p>With <code>{:shorthand=&gt;true, :infer_end=&gt;true}</code> options, the
471
- above template compiles into:</p>
650
+ <p>With <code>{:shorthand=&gt;true, :infer_end=&gt;true}</code> options, the above template compiles into:</p>
472
651
 
473
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
474
- words = %w[hello world]
652
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; words = %w[hello world]
475
653
  _erbout &lt;&lt; "\n"
476
654
  words.each do |w|
477
655
  _erbout &lt;&lt; " " &lt;&lt; (w) &lt;&lt; "\n"
@@ -481,9 +659,7 @@ _erbout &lt;&lt; " " &lt;&lt; (w) &lt;&lt; "\n"
481
659
  end; _erbout &lt;&lt; "\n"
482
660
  words.each do |w|
483
661
  _erbout &lt;&lt; " " &lt;&lt; (w) &lt;&lt; "\n"
484
- end; _erbout &lt;&lt; "\n"
485
- _erbout &lt;&lt; " \n"
486
- ; _erbout.join)
662
+ end; _erbout.join)
487
663
  </code></pre>
488
664
 
489
665
  <p>And renders as:</p>
@@ -513,15 +689,11 @@ _erbout &lt;&lt; " \n"
513
689
  %&lt; "doc/example.txt"
514
690
  </code></pre>
515
691
 
516
- <p>With <code>{:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"}</code> options, the
517
- above template compiles into:</p>
692
+ <p>With <code>{:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"}</code> options, the above template compiles into:</p>
518
693
 
519
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
520
- _erbout &lt;&lt; (::Ember::Template.read_file(("doc/example.txt"), {:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"})) &lt;&lt; "\n"
694
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; _erbout &lt;&lt; (::Ember::Template.read_file(("doc/example.txt"), {:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"})) &lt;&lt; "\n"
521
695
  _erbout &lt;&lt; "\n"
522
696
  _erbout &lt;&lt; (::Ember::Template.read_file(("doc/example.txt"), {:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"})) &lt;&lt; "\n"
523
- _erbout &lt;&lt; "\n"
524
- _erbout &lt;&lt; " \n"
525
697
  ; _erbout.join)
526
698
  </code></pre>
527
699
 
@@ -549,15 +721,11 @@ This is a plain-text file. Notice that &lt;%=
549
721
  %+ "doc/example.erb"
550
722
  </code></pre>
551
723
 
552
- <p>With <code>{:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"}</code> options, the
553
- above template compiles into:</p>
724
+ <p>With <code>{:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"}</code> options, the above template compiles into:</p>
554
725
 
555
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
556
- ::Ember::Template.load_file(("doc/example.erb"), {:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"}.merge!(:continue_result =&gt; true)).render(nil, 78416100); _erbout &lt;&lt; "\n"
557
- _erbout &lt;&lt; "\n"
558
- ::Ember::Template.load_file(("doc/example.erb"), {:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"}.merge!(:continue_result =&gt; true)).render(nil, 78416100); _erbout &lt;&lt; "\n"
726
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; ::Ember::Template.load_file(("doc/example.erb"), {:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"}.merge!(:continue_result =&gt; true)).render(::Kernel.binding); _erbout &lt;&lt; "\n"
559
727
  _erbout &lt;&lt; "\n"
560
- _erbout &lt;&lt; " \n"
728
+ ::Ember::Template.load_file(("doc/example.erb"), {:shorthand=&gt;true, :source_file=&gt;"./EXAMPLES"}.merge!(:continue_result =&gt; true)).render(::Kernel.binding); _erbout &lt;&lt; "\n"
561
729
  ; _erbout.join)
562
730
  </code></pre>
563
731
 
@@ -575,15 +743,11 @@ This is an eRuby template. Notice that eRuby directives do take effect here!
575
743
  %~ "%= 2 + 2"
576
744
  </code></pre>
577
745
 
578
- <p>With <code>{:shorthand=&gt;true}</code> options, the
579
- above template compiles into:</p>
746
+ <p>With <code>{:shorthand=&gt;true}</code> options, the above template compiles into:</p>
580
747
 
581
- <pre><code>(_erbout = []; _erbout &lt;&lt; "\n"
582
- ::Ember::Template.new(("%= 2 + 2"), {:shorthand=&gt;true}.merge!(:continue_result =&gt; true)).render(nil, 77958272); _erbout &lt;&lt; "\n"
748
+ <pre><code>(e08afdfb_62c7_485f_87a0_80914e1b4703 = :_erbout; _erbout = []; ::Ember::Template.new(("%= 2 + 2"), {:shorthand=&gt;true}.merge!(:continue_result =&gt; true)).render(::Kernel.binding); _erbout &lt;&lt; "\n"
583
749
  _erbout &lt;&lt; "\n"
584
- ::Ember::Template.new(("%= 2 + 2"), {:shorthand=&gt;true}.merge!(:continue_result =&gt; true)).render(nil, 77958272); _erbout &lt;&lt; "\n"
585
- _erbout &lt;&lt; "\n"
586
- _erbout &lt;&lt; " \n"
750
+ ::Ember::Template.new(("%= 2 + 2"), {:shorthand=&gt;true}.merge!(:continue_result =&gt; true)).render(::Kernel.binding); _erbout &lt;&lt; "\n"
587
751
  ; _erbout.join)
588
752
  </code></pre>
589
753
 
@@ -679,6 +843,37 @@ in the <code>test/test_helper.rb</code> file.</p>
679
843
 
680
844
  <p>This section contains release notes of current and past releases.</p>
681
845
 
846
+ <h3 id="Version-0-3-0-2010-04-26-">Version 0.3.0 (2010-04-26)</h3>
847
+
848
+ <p>This release adds <em>class methods</em> that let you (portably and more easily)
849
+ create your own domain specific languages in eRuby; adds more usage
850
+ <strong>EXAMPLES</strong> in the help manual; and removes a binding inheritance hack.</p>
851
+
852
+ <p>New features:</p>
853
+
854
+ <dl>
855
+ <dt><code>Ember::Template::wrap_content_block()</code></dt><dd><p>Wraps eRuby block content appending.</p></dd>
856
+ <dt><code>Ember::Template::content_from_block()</code></dt><dd><p>Extracts content from eRuby blocks.</p></dd>
857
+ <dt><code>Ember::Template::buffer_from_block()</code></dt><dd><p>Gives access to template evalutaion result buffer.</p></dd>
858
+ </dl>
859
+
860
+
861
+ <p>Bug fixes:</p>
862
+
863
+ <ul>
864
+ <li>Remove hack for inheriting parent template binding.</li>
865
+ </ul>
866
+
867
+
868
+ <p>Housekeeping:</p>
869
+
870
+ <ul>
871
+ <li><p>Add example on unindenting node content and eRuby DSL examples that use
872
+ the new content block methods.</p></li>
873
+ <li><p>Simplify code examples using the new wrap_content_block() method.</p></li>
874
+ </ul>
875
+
876
+
682
877
  <h3 id="Version-0-2-0-2010-04-25-">Version 0.2.0 (2010-04-25)</h3>
683
878
 
684
879
  <p>This release adds <a href="http://rubyonrails.org">Ruby on Rails</a> integration.</p>
@@ -806,7 +1001,7 @@ Kamil Kukura</p>
806
1001
 
807
1002
  <p>(the ISC license)</p>
808
1003
 
809
- <p>Copyright 2009 Suraj N. Kurapati <a href="&#x6d;&#97;&#x69;&#108;&#116;&#111;&#x3a;&#x73;&#117;&#x6e;&#x61;&#x6b;&#x75;&#64;&#103;&#x6d;&#97;&#105;&#x6c;&#x2e;&#99;&#x6f;&#x6d;" data-bare-link="true">&#115;&#117;&#x6e;&#97;&#x6b;&#117;&#x40;&#x67;&#x6d;&#x61;&#105;&#108;&#46;&#99;&#x6f;&#x6d;</a></p>
1004
+ <p>Copyright 2009 Suraj N. Kurapati <a href="&#x6d;&#97;&#x69;&#108;&#116;&#x6f;&#x3a;&#115;&#117;&#x6e;&#x61;&#107;&#x75;&#64;&#103;&#109;&#x61;&#x69;&#x6c;&#x2e;&#99;&#111;&#109;" data-bare-link="true">&#x73;&#117;&#110;&#97;&#x6b;&#x75;&#64;&#x67;&#109;&#97;&#105;&#108;&#x2e;&#x63;&#x6f;&#x6d;</a></p>
810
1005
 
811
1006
  <p>Permission to use, copy, modify, and/or distribute this software for any
812
1007
  purpose with or without fee is hereby granted, provided that the above
Binary file
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
7
+ - 3
8
8
  - 0
9
- version: 0.2.0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Suraj N. Kurapati
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-04-25 00:00:00 -07:00
18
+ date: 2010-04-26 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency