erubis 2.4.0 → 2.4.1

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.
Files changed (78) hide show
  1. data/CHANGES +55 -2
  2. data/README.txt +1 -1
  3. data/benchmark/bench.rb +1 -1
  4. data/bin/erubis +1 -1
  5. data/contrib/erubis +57 -34
  6. data/contrib/inline-require +1 -1
  7. data/doc-api/classes/Erubis.html +6 -1
  8. data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +1 -1
  9. data/doc-api/classes/Erubis/Evaluator.html +3 -3
  10. data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +2 -2
  11. data/doc-api/classes/Erubis/InterpolationEnhancer.html +5 -5
  12. data/doc-api/classes/Erubis/JavascriptGenerator.html +16 -11
  13. data/doc-api/classes/Erubis/PI/Ejavascript.html +1 -1
  14. data/doc-api/classes/Erubis/PercentLineEnhancer.html +22 -18
  15. data/doc-api/classes/Erubis/RubyEvaluator.html +4 -4
  16. data/doc-api/created.rid +1 -1
  17. data/doc-api/files/README_txt.html +2 -2
  18. data/doc-api/files/erubis/context_rb.html +1 -1
  19. data/doc-api/files/erubis/converter_rb.html +1 -1
  20. data/doc-api/files/erubis/engine/ec_rb.html +1 -1
  21. data/doc-api/files/erubis/engine/ejava_rb.html +1 -1
  22. data/doc-api/files/erubis/engine/ejavascript_rb.html +2 -2
  23. data/doc-api/files/erubis/engine/enhanced_rb.html +1 -1
  24. data/doc-api/files/erubis/engine/eperl_rb.html +1 -1
  25. data/doc-api/files/erubis/engine/ephp_rb.html +1 -1
  26. data/doc-api/files/erubis/engine/eruby_rb.html +1 -1
  27. data/doc-api/files/erubis/engine/escheme_rb.html +1 -1
  28. data/doc-api/files/erubis/engine/optimized_rb.html +1 -1
  29. data/doc-api/files/erubis/engine_rb.html +1 -1
  30. data/doc-api/files/erubis/enhancer_rb.html +2 -2
  31. data/doc-api/files/erubis/error_rb.html +1 -1
  32. data/doc-api/files/erubis/evaluator_rb.html +2 -2
  33. data/doc-api/files/erubis/generator_rb.html +1 -1
  34. data/doc-api/files/erubis/helper_rb.html +1 -1
  35. data/doc-api/files/erubis/helpers/rails_helper_rb.html +1 -1
  36. data/doc-api/files/erubis/local-setting_rb.html +1 -1
  37. data/doc-api/files/erubis/main_rb.html +1 -1
  38. data/doc-api/files/erubis/tiny_rb.html +1 -1
  39. data/doc-api/files/erubis_rb.html +1 -1
  40. data/doc/users-guide.html +126 -14
  41. data/lib/erubis.rb +2 -2
  42. data/lib/erubis/context.rb +1 -1
  43. data/lib/erubis/converter.rb +1 -1
  44. data/lib/erubis/engine.rb +1 -1
  45. data/lib/erubis/engine/ec.rb +1 -1
  46. data/lib/erubis/engine/ejava.rb +1 -1
  47. data/lib/erubis/engine/ejavascript.rb +9 -3
  48. data/lib/erubis/engine/enhanced.rb +1 -1
  49. data/lib/erubis/engine/eperl.rb +1 -1
  50. data/lib/erubis/engine/ephp.rb +1 -1
  51. data/lib/erubis/engine/eruby.rb +1 -1
  52. data/lib/erubis/engine/escheme.rb +1 -1
  53. data/lib/erubis/engine/optimized.rb +1 -1
  54. data/lib/erubis/enhancer.rb +23 -8
  55. data/lib/erubis/error.rb +1 -1
  56. data/lib/erubis/evaluator.rb +5 -3
  57. data/lib/erubis/generator.rb +1 -1
  58. data/lib/erubis/helper.rb +1 -1
  59. data/lib/erubis/helpers/rails_helper.rb +1 -1
  60. data/lib/erubis/local-setting.rb +1 -1
  61. data/lib/erubis/main.rb +1 -1
  62. data/lib/erubis/tiny.rb +1 -1
  63. data/test/assert-text-equal.rb +1 -1
  64. data/test/data/users-guide/main_program1.rb +8 -0
  65. data/test/data/users-guide/main_program1.result +6 -0
  66. data/test/data/users-guide/main_program2.rb +8 -0
  67. data/test/data/users-guide/main_program2.result +6 -0
  68. data/test/data/users-guide/stderr.log +3 -0
  69. data/test/data/users-guide/template1.rhtml +4 -0
  70. data/test/data/users-guide/template2.rhtml +4 -0
  71. data/test/test-engines.rb +29 -4
  72. data/test/test-enhancers.rb +4 -4
  73. data/test/test-erubis.rb +17 -2
  74. data/test/test-main.rb +2 -2
  75. data/test/test-users-guide.rb +1 -1
  76. data/test/test.rb +1 -1
  77. data/test/testutil.rb +1 -1
  78. metadata +9 -2
@@ -70,7 +70,7 @@
70
70
 
71
71
  <div id="description">
72
72
  <p>
73
- $Rev: 89 $ $Release: 2.4.0 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
73
+ $Rev: 89 $ $Release: 2.4.1 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
74
74
  </p>
75
75
 
76
76
  </div>
@@ -70,7 +70,7 @@
70
70
 
71
71
  <div id="description">
72
72
  <p>
73
- $Rev: 90 $ $Release: 2.4.0 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
73
+ $Rev: 90 $ $Release: 2.4.1 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
74
74
  </p>
75
75
 
76
76
  </div>
@@ -70,7 +70,7 @@
70
70
 
71
71
  <div id="description">
72
72
  <p>
73
- $Rev: 77 $ $Release: 2.4.0 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
73
+ $Rev: 77 $ $Release: 2.4.1 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
74
74
  </p>
75
75
 
76
76
  </div>
@@ -70,7 +70,7 @@
70
70
 
71
71
  <div id="description">
72
72
  <p>
73
- $Rev: 91 $ $Release: 2.4.0 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
73
+ $Rev: 91 $ $Release: 2.4.1 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
74
74
  </p>
75
75
 
76
76
  </div>
@@ -70,7 +70,7 @@
70
70
 
71
71
  <div id="description">
72
72
  <p>
73
- $Rev: 77 $ $Release: 2.4.0 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
73
+ $Rev: 77 $ $Release: 2.4.1 $ copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
74
74
  </p>
75
75
 
76
76
  </div>
@@ -70,7 +70,7 @@
70
70
 
71
71
  <div id="description">
72
72
  <p>
73
- $Rev: 59 $ 2.4.0 copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
73
+ $Rev: 59 $ 2.4.1 copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
74
74
  </p>
75
75
 
76
76
  </div>
@@ -14,10 +14,10 @@
14
14
 
15
15
  <div align="left"><h1>Erubis Users' Guide</h1></div>
16
16
  <div align="left">
17
- last update: $Date: 2007-07-19 13:13:21 +0900 (Thu, 19 Jul 2007) $<br>
17
+ last update: $Date: 2007-09-24 23:04:21 +0900 (Mon, 24 Sep 2007) $<br>
18
18
  </div>
19
19
 
20
- <p>release: 2.4.0
20
+ <p>release: 2.4.1
21
21
  </p>
22
22
  <a name="preface"></a>
23
23
  <h2 class="section1">Preface</h2>
@@ -151,6 +151,8 @@ It has the following features.
151
151
  </li>
152
152
  <li><a href="#topics">Other Topics</a>
153
153
  <ul>
154
+ <li><a href="#topics-context-vs-binding">evaluate(context) v.s. result(binding)</a>
155
+ </li>
154
156
  <li><a href="#topics-fasteruby">Class Erubis::FastEruby</a>
155
157
  </li>
156
158
  <li><a href="#topics-syntax">Syntax Checking</a>
@@ -661,6 +663,9 @@ output</div>
661
663
  &lt;li&gt;ccc&lt;/li&gt;
662
664
  &lt;/ul&gt;
663
665
  </pre>
666
+ <p>It is recommended to use 'Erubis::Eruby#evaluate(context)' rather than 'Erubis::Eruby#result(binding())' because the latter has some problems.
667
+ See <a href="#topics-context-vs-binding">evaluate(context) v.s. result(binding)</a> section for details.
668
+ </p>
664
669
  <br>
665
670
 
666
671
 
@@ -1817,24 +1822,30 @@ It deletes indentations even if they are in &lt;PRE&gt;&lt;/PRE&gt;.
1817
1822
 
1818
1823
  <a name="lang"></a>
1819
1824
  <h2 class="section1">Multi-Language Support</h2>
1820
- <p>Erubis supports the following language currently:
1825
+ <p>Erubis supports the following languages<sup>(<a href="#fnref:2" name="fnlink:2">*2</a>)</sup>:
1821
1826
  </p>
1822
1827
  <ul type="disc">
1823
1828
  <li>Ruby
1824
1829
  </li>
1825
- <li>PHP
1830
+ <li><a href="#lang-php">PHP</a>
1826
1831
  </li>
1827
- <li>C
1832
+ <li><a href="#lang-c">C</a>
1828
1833
  </li>
1829
- <li>Java
1834
+ <li><a href="#lang-java">Java</a>
1830
1835
  </li>
1831
- <li>Scheme
1836
+ <li><a href="#lang-scheme">Scheme</a>
1832
1837
  </li>
1833
- <li>Perl
1838
+ <li><a href="#lang-perl">Perl</a>
1834
1839
  </li>
1835
- <li>JavaScript
1840
+ <li><a href="#lang-javascript">JavaScript</a>
1836
1841
  </li>
1837
1842
  </ul>
1843
+ <div class="footnote">
1844
+ <dl compact>
1845
+ <dt>(<a name="fnref:2" href="#fnlink:2">*2</a>)</dt>
1846
+ <dd>If you need template engine in pure PHP/Perl/JavaScript, try <a href="http://www.kuwata-lab.com/tenjin/">Tenjin</a> (<a href="http://www.kuwata-lab.com/tenjin/">http://www.kuwata-lab.com/tenjin/</a>). Tenjin is a very fast and full-featured template engine implemented in pure PHP/Perl/JavaScript.</dd>
1847
+ </dl>
1848
+ </div>
1838
1849
  <a name="lang-php"></a>
1839
1850
  <h3 class="section2">PHP</h3>
1840
1851
  <a name="example.ephp"></a>
@@ -2148,7 +2159,7 @@ compiled source code</div>
2148
2159
  </pre>
2149
2160
  <a name="example_scheme_display.result"></a>
2150
2161
  <div class="terminal_caption">
2151
- compiled source code (with --func=display property)</div>
2162
+ compiled source code (with <code>--func=display</code> property)</div>
2152
2163
  <pre class="terminal">$ erubis -l scheme --func=display example.escheme
2153
2164
  (display "&lt;html&gt;
2154
2165
  &lt;body&gt;\n")
@@ -2285,6 +2296,19 @@ _buf.push(" &lt;/tbody&gt;\n\
2285
2296
  &lt;/html&gt;\n");
2286
2297
  document.write(_buf.join(""));
2287
2298
  </pre>
2299
+ <p>If command-line option '<code>--docwrite=false</code>' is specified,
2300
+ '<code>_buf.join("");</code>' is used instead of '<code>document.write(_buf.join(""));</code>'.
2301
+ This is useful when passing converted source code to eval() function in JavaScript.
2302
+ </p>
2303
+ <p>You can pass <code>:docwrite=&gt;false</code> to Erubis::Ejavascript.new() in your Ruby script.
2304
+ </p>
2305
+ <pre class="program">s = File.read('example.jshtml')
2306
+ engine = Erubis::Ejavascript.new(s, <code>:docwrite=&gt;false</code>)
2307
+ </pre>
2308
+ <p>If you want to specify any JavaScript code, use '--postamble=...'.
2309
+ </p>
2310
+ <p>Notice that default value of 'docwrite' property will be false in the future release.
2311
+ </p>
2288
2312
  <br>
2289
2313
 
2290
2314
 
@@ -2487,6 +2511,94 @@ because tag helpers generate different html code when form parameter has errors
2487
2511
 
2488
2512
  <a name="topics"></a>
2489
2513
  <h2 class="section1">Other Topics</h2>
2514
+ <a name="topics-context-vs-binding"></a>
2515
+ <h3 class="section2">evaluate(context) v.s. result(binding)</h3>
2516
+ <p>It is recommended to use 'Erubis::Eruby#evaluate(context)' instead of 'Erubis::Eruby#result(binding)' because Ruby's Binding object has some problems.
2517
+ </p>
2518
+ <ul type="disc">
2519
+ <li>It is not able to specify variables to use.
2520
+ Using binding() method, all of local variables are passed to templates.
2521
+ </li>
2522
+ <li>Changing local variables in templates may affect to varialbes in main program.
2523
+ If you assign '10' to local variable 'x' in templates, it may change variable 'x' in main program unintendedly.
2524
+ </li>
2525
+ </ul>
2526
+ <p>The following example shows that assignment of some values into variable 'x' in templates affect to local variable 'x' in main program unintendedly.
2527
+ </p>
2528
+ <a name="template1.rhtml"></a>
2529
+ <div class="program_caption">
2530
+ template1.rhtml (intended to be passed 'items' from main program)</div>
2531
+ <pre class="program">&lt;% for <strong>x</strong> in <strong>items</strong> %&gt;
2532
+ item = &lt;%= x %&gt;
2533
+ &lt;% end %&gt;
2534
+ ** debug: local variables=&lt;%= local_variables().inspect() %&gt;
2535
+ </pre>
2536
+ <a name="main_program1.rb"></a>
2537
+ <div class="program_caption">
2538
+ main_program1.rb (intended to pass 'items' to template)</div>
2539
+ <pre class="program">require 'erubis'
2540
+ eruby = Erubis::Eruby.new(File.read('template1.rhtml'))
2541
+ items = ['foo', 'bar', 'baz']
2542
+ x = 1
2543
+ ## local variable 'x' and 'eruby' are passed to template as well as 'items'!
2544
+ print <strong>eruby.result(binding())</strong>
2545
+ ## local variable 'x' is changed unintendedly because it is changed in template!
2546
+ puts "** debug: x=#{x.inspect}" #=&gt; "baz"
2547
+ </pre>
2548
+ <a name="main_program1.result"></a>
2549
+ <div class="terminal_caption">
2550
+ Result:</div>
2551
+ <pre class="terminal">$ ruby main_program1.rb
2552
+ item = foo
2553
+ item = bar
2554
+ item = baz
2555
+ ** debug: local variables=["eruby", "items", "x", "_buf"]
2556
+ ** debug: x="baz"
2557
+ </pre>
2558
+ <p>This problem is caused because Ruby's Binding class is poor to use in template engine.
2559
+ Binding class should support the following features.
2560
+ </p>
2561
+ <pre class="program">b = Binding.new # create empty Binding object
2562
+ b['x'] = 1 # set local variables using binding object
2563
+ </pre>
2564
+ <p>But the above features are not implemented in Ruby.
2565
+ </p>
2566
+ <p>A pragmatic solution is to use 'Erubis::Eruby#evaluate(context)' instead of 'Erubis::Eruby#result(binding)'.
2567
+ 'evaluate(context)' uses Erubis::Context object and instance variables instead of Binding object and local variables.
2568
+ </p>
2569
+ <a name="template2.rhtml"></a>
2570
+ <div class="program_caption">
2571
+ template2.rhtml (intended to be passed '@items' from main program)</div>
2572
+ <pre class="program">&lt;% for <strong>x</strong> in <strong>@items</strong> %&gt;
2573
+ item = &lt;%= x %&gt;
2574
+ &lt;% end %&gt;
2575
+ ** debug: local variables=&lt;%= local_variables().inspect() %&gt;
2576
+ </pre>
2577
+ <a name="main_program2.rb"></a>
2578
+ <div class="program_caption">
2579
+ main_program2.rb (intended to pass '@items' to template)</div>
2580
+ <pre class="program">require 'erubis'
2581
+ eruby = Erubis::Eruby.new(File.read('template2.rhtml'))
2582
+ items = ['foo', 'bar', 'baz']
2583
+ x = 1
2584
+ ## only 'items' are passed to template
2585
+ print <strong>eruby.evaluate(:items=&gt;items)</strong>
2586
+ ## local variable 'x' is not changed!
2587
+ puts "** debug: x=#{x.inspect}" #=&gt; 1
2588
+ </pre>
2589
+ <a name="main_program2.result"></a>
2590
+ <div class="terminal_caption">
2591
+ Result:</div>
2592
+ <pre class="terminal">$ ruby main_program2.rb
2593
+ item = foo
2594
+ item = bar
2595
+ item = baz
2596
+ ** debug: local variables=["x", "_buf"]
2597
+ ** debug: x=1
2598
+ </pre>
2599
+ <br>
2600
+
2601
+
2490
2602
  <a name="topics-fasteruby"></a>
2491
2603
  <h3 class="section2">Class Erubis::FastEruby</h3>
2492
2604
  <p>[experimental]
@@ -2708,8 +2820,8 @@ example of using NoCodeEnhancer with PHP file</div>
2708
2820
  <p>Thanks Andrew R Jackson, he developed 'erubis-run.rb' which enables you to use Erubis with mod_ruby.
2709
2821
  </p>
2710
2822
  <ol type="1">
2711
- <li>Copy 'erubis-2.4.0/contrib/erubis-run.rb' to the 'RUBYLIBDIR/apache' directory (for example '/usr/local/lib/ruby/1.8/apache') which contains 'ruby-run.rb', 'eruby-run.rb', and so on.
2712
- <pre class="terminal">$ cd erubis-2.4.0/
2823
+ <li>Copy 'erubis-2.4.1/contrib/erubis-run.rb' to the 'RUBYLIBDIR/apache' directory (for example '/usr/local/lib/ruby/1.8/apache') which contains 'ruby-run.rb', 'eruby-run.rb', and so on.
2824
+ <pre class="terminal">$ cd erubis-2.4.1/
2713
2825
  $ sudo copy contrib/erubis-run.rb /usr/local/lib/ruby/1.8/apache/
2714
2826
  </pre>
2715
2827
  </li>
@@ -2785,12 +2897,12 @@ p obj.render('world') #=&gt; "hello world"
2785
2897
 
2786
2898
  <a name="topics-benchmark"></a>
2787
2899
  <h3 class="section2">Benchmark</h3>
2788
- <p>A benchmark script is included in Erubis package at 'erubis-2.4.0/benchark/' directory.
2900
+ <p>A benchmark script is included in Erubis package at 'erubis-2.4.1/benchark/' directory.
2789
2901
  Here is an example result of benchmark.
2790
2902
  </p>
2791
2903
  <div class="terminal_caption">
2792
2904
  MacOS X 10.4 Tiger, Intel CoreDuo 1.83GHz, Ruby1.8.6, eruby1.0.5, gcc4.0.1</div>
2793
- <pre class="terminal">$ cd erubis-2.4.0/benchmark/
2905
+ <pre class="terminal">$ cd erubis-2.4.1/benchmark/
2794
2906
  $ ruby bench.rb -n 10000 -m execute
2795
2907
  *** ntimes=10000, testmode=execute
2796
2908
  user system total real
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 59 $
3
- ## 2.4.0
3
+ ## 2.4.1
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -48,7 +48,7 @@
48
48
 
49
49
 
50
50
  module Erubis
51
- VERSION = ('$Release: 2.4.0 $' =~ /([.\d]+)/) && $1
51
+ VERSION = ('$Release: 2.4.1 $' =~ /([.\d]+)/) && $1
52
52
  end
53
53
 
54
54
  require 'erubis/engine'
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 89 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
2
+ ## $Rev: 95 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -18,6 +18,7 @@ module Erubis
18
18
  list = []
19
19
  #list << [:indent, '', "indent spaces (ex. ' ')"]
20
20
  #list << [:buf, '_buf', "output buffer name"]
21
+ list << [:docwrite, true, "use 'document.write()' when true"]
21
22
  return list
22
23
  end
23
24
 
@@ -26,6 +27,7 @@ module Erubis
26
27
  @escapefunc ||= 'escape'
27
28
  @indent = properties[:indent] || ''
28
29
  @buf = properties[:out] || '_buf'
30
+ @docwrite = properties[:docwrite] != false # '!= false' will be removed in the next release
29
31
  end
30
32
 
31
33
  def add_preamble(src)
@@ -76,7 +78,11 @@ module Erubis
76
78
 
77
79
  def add_postamble(src)
78
80
  src << "\n" if src[-1] == ?;
79
- src << @indent << 'document.write(' << @buf << ".join(\"\"));\n"
81
+ if @docwrite
82
+ src << @indent << 'document.write(' << @buf << ".join(\"\"));\n"
83
+ else
84
+ src << @indent << @buf << ".join(\"\");\n"
85
+ end
80
86
  end
81
87
 
82
88
  end
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Rev: 77 $
3
- ## $Release: 2.4.0 $
2
+ ## $Rev: 93 $
3
+ ## $Release: 2.4.1 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -443,18 +443,33 @@ module Erubis
443
443
  "regard lines starting with '%' as program code"
444
444
  end
445
445
 
446
- PERCENT_LINE_PATTERN = /(.*?)^\%(.*?\r?\n)/m
447
-
448
446
  def add_text(src, text)
449
- text.scan(PERCENT_LINE_PATTERN) do |txt, line|
450
- super(src, txt)
447
+ pos = 0
448
+ text2 = ''
449
+ text.scan(/^\%(.*?\r?\n)/) do
450
+ line = $1
451
+ match = Regexp.last_match
452
+ len = match.begin(0) - pos
453
+ str = text[pos, len]
454
+ pos = match.end(0)
455
+ if text2.empty?
456
+ text2 = str
457
+ else
458
+ text2 << str
459
+ end
451
460
  if line[0] == ?%
452
- super(src, line)
461
+ text2 << line
453
462
  else
463
+ super(src, text2)
464
+ text2 = ''
454
465
  add_stmt(src, line)
455
466
  end
456
467
  end
457
- rest = $' || text
468
+ rest = pos == 0 ? text : $' # or $' || text
469
+ unless text2.empty?
470
+ text2 << rest if rest
471
+ rest = text2
472
+ end
458
473
  super(src, rest)
459
474
  end
460
475