From 38a6e0cdd97f780764c6bff548c185dae2d18dcf Mon Sep 17 00:00:00 2001
From: makoto kuwata Erubis has command 'erubis'. Command-line option '-s' shows the compiled source code of eRuby script.
+
-
+
@@ -178,9 +190,7 @@ $ contrib/inline-require -I lib bin/erubis > contrib/erubis
example1.eruby
<ul>
<% for item in list %>
- <li>
- <%= item %>
- </li>
+ <li><%= item %></li>
<% end %>
<%# here is ignored because starting with '#' %>
</ul>
@@ -205,27 +215,33 @@ output
---------- script source ---
_out = []; _out << '<ul>
'; for item in list
-; _out << ' <li>
-'; _out << ' '; _out << ( item ).to_s; _out << '
-'; _out << ' </li>
+ _out << ' <li>'; _out << ( item ).to_s; _out << '</li>
'; end
-;
-; _out << '</ul>
+
+ _out << '</ul>
';
_out.join
---------- result ----------
<ul>
- <li>
- aaa
- </li>
- <li>
- bbb
- </li>
- <li>
- ccc
- </li>
+ <li>aaa</li>
+ <li>bbb</li>
+ <li>ccc</li>
</ul>
+$ erubis -s example1.eruby
+_out = []; _out << '<ul>
+'; for item in list
+ _out << ' <li>'; _out << ( item ).to_s; _out << '</li>
+'; end
+
+ _out << '</ul>
+';
+_out.join
+
@@ -340,12 +356,11 @@ output
$ ruby example3.rb 2> stderr.log
---------- script source ---
_out = []; for item in list
-; _out << ' <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p>
- <p>'; _out << ( item ).to_s; _out << '</p>
- <p>'; $stderr.puts("*** debug: item=#{(item).inspect}"); _out << '</p>
+ _out << ' <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p>
+ <p>'; _out << ( item ).to_s; _out << '</p>
+ <p>'; $stderr.puts("*** debug: item=#{(item).inspect}"); _out << '</p>
'; end
-;
_out.join
---------- result ----------
<p><aaa></p>
@@ -370,12 +385,11 @@ This is available in any language.
$ erubis -l ruby -e Escape example3.eruby _out = []; for item in list -; _out << ' <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p> + _out << ' <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p> <p>'; _out << ( item ).to_s; _out << '</p> <p>'; $stderr.puts("*** debug: item=#{(item).inspect}"); _out << '</p> '; end -; _out.join
Escaping function (default 'Erubis::XmlHelper.escape_xml()') can be changed by command-line property '--escape=xxx' or by overriding Erubis::Eruby#escaped_expr() in subclass. @@ -383,14 +397,14 @@ _out.join
class CGIEruby < Erubis::Eruby - def escaped_expr(code) + def escaped_expr(code) return "CGI.escapeHTML((#{code.strip}).to_s)" #return "h(#{code.strip})" end end class LatexEruby < Erubi::Eruby - def escaped_expr(code) + def escaped_expr(code) return "(#{code}).gsub(/[%\\]/,'\\\\\&')" end end @@ -435,9 +449,8 @@ output$ ruby example4.rb ---------- script source --- _out = []; for item in list -; _out << ' <p>'; _out << ( item ).to_s; _out << '</p> + _out << ' <p>'; _out << ( item ).to_s; _out << '</p> '; end -; _out.join ---------- result ---------- <p>aaa</p> @@ -535,6 +548,7 @@ example6.rb attr_accessor :val, :list end +## any object can be a context object mydata = MyData.new mydata.val = 'Erubis Example' mydata.list = ['aaa', 'bbb', 'ccc'] @@ -543,9 +557,9 @@ require 'erubis' eruby = Erubis::Eruby.new(File.read('example5.eruby')) puts eruby.evaluate(mydata)-$ ruby example8.rb _out = []; for item in @list -; _out << ' <b>'; _out << ( item ).to_s; _out << '</b> + _out << ' <b>'; _out << ( item ).to_s; _out << '</b> '; end -; _out.join -------------- for item in @list -; _out << ' <b>'; _out << ( item ).to_s; _out << '</b> + _out << ' <b>'; _out << ( item ).to_s; _out << '</b> '; end -;The command-line option '-b' specify both :preamble and :postamble to false.
@@ -703,63 +715,68 @@ endYou can specify enhancers in command-line with option '-e'. The following is an example to use some enhancers in command-line.
-$ erubis -l ruby -e Escape,PercentLine,BiPattern example.eruby +$ erubis -se Escape,PercentLine,BiPattern example.erubyThe following is the list of enhancers.
If you required 'erubis/engine/enhanced', Eruby subclasses which include each enhancers are defined. For example, class BiPatternEruby includes BiPatternEnhancer.
- +EscapeEnhancer switches '<%= ... %>' to escaped and '<%== ... %>' to unescaped.
-<% for item in list %> - <b><%= item %></b> - <b><%== item %></b> +<div> +<% for item in list %> + <p><%= item %></p> + <p><%== item %></p> <% end %> -- - -require 'erubis' -class EscapedEruby < Erubis::Eruby - include Erubis::EscapeEnhancer -end -eruby = EscapedEruby.new(File.read('example.eruby')) -print eruby.src +</div>-$ ruby escape-enhancer-test.rb -_out = []; for item in list -; _out << ' <b>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</b> - <b>'; _out << ( item ).to_s; _out << '</b> +$ erubis -se Escape example.eruby +_out = []; _out << '<div> +'; for item in list + _out << ' <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p> + <p>'; _out << ( item ).to_s; _out << '</p> '; end -; + _out << '</div> +'; _out.joinEscapeEnhancer is language-independent. @@ -809,24 +820,16 @@ _out.join
StdoutEnhancer use $sdtdout instead of array buffer. Therefore, you can use 'print' statement in embedded ruby code.
- - -require 'erubis' -class StdoutEruby < Erubis::Eruby - include Erubis::StdoutEnhancer -end -eruby = StdoutEruby.new(File.read('example.eruby')) -print eruby.src --$ ruby stdout-enhancer-test.rb -_out = $stdout; for item in list -; _out << ' <b>'; _out << ( item ).to_s; _out << '</b> - <b>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</b> +$ erubis -se Stdout example.eruby +_out = $stdout; _out << '<div> +'; for item in list + _out << ' <p>'; _out << ( item ).to_s; _out << '</p> + <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p> '; end -; + _out << '</div> +'; ''StdoutEnhancer is only for Eruby. @@ -838,24 +841,16 @@ _out = $stdout; for item in list
PrintOutEnhancer
PrintOutEnhancer makes compiled source code to use 'print(...)' instead of '_out << ...'.
- - -require 'erubis' -class PrintOutEruby < Erubis::Eruby - include Erubis::PrintOutEnhancer -end -eruby = PrintOutEruby.new(File.read('example.eruby')) -print eruby.src --$ ruby printstatement-enhancer-test.rb - for item in list -; print ' <b>'; print(( item ).to_s); print '</b> - <b>'; print Erubis::XmlHelper.escape_xml( item ); print '</b> +$ erubis -se PrintOut example.eruby + print '<div> +'; for item in list + print ' <p>'; print(( item ).to_s); print '</p> + <p>'; print Erubis::XmlHelper.escape_xml( item ); print '</p> '; end -; + print '</div> +';PrintOutEnhancer is only for Eruby.
@@ -866,31 +861,31 @@ compiled source codePrintEnabledEnhancer
PrintEnabledEnhancer enables you to use print() method in '<% ... %>'.
- + +printenabled-example.eruby<% for item in @list %> <b><% print item %></b> <% end %>- + +printenabled-example.rbrequire 'erubis' class PrintEnabledEruby < Erubis::Eruby include Erubis::PrintEnabledEnhancer end -input = File.read('printenabled-enhancer-test.eruby') +input = File.read('printenabled-example.eruby') eruby = PrintEnabledEruby.new(input) list = ['aaa', 'bbb', 'ccc'] print eruby.evaluate(:list=>list)-$ ruby printenabled-enhancer-test.rb -aaabbbccc <b></b> - <b></b> - <b></b> +$ ruby printenabled-example.rb + <b>aaa</b> + <b>bbb</b> + <b>ccc</b>Notice to use Eruby#evaluate() and not to use Eruby#result(), because print() method in '<% ... %>' invokes not Kernel#print() but PrintEnabledEnhancer#print(). @@ -904,25 +899,16 @@ because print() method in '<% ... %>' invokes not Kernel#print() but Print
ArrayEnhancer
ArrayEnhancer makes Eruby to return an array of strings.
- - -require 'erubis' -class ArrayEruby < Erubis::Eruby - include Erubis::ArrayEnhancer -end -eruby = ArrayEruby.new(File.read('example.eruby')) -print eruby.src --$ ruby array-enhancer-test.rb -_out = []; for item in list -; _out << ' <b>'; _out << ( item ).to_s; _out << '</b> - <b>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</b> +_out = []; _out << '<div> +'; for item in list + _out << ' <p>'; _out << ( item ).to_s; _out << '</p> + <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p> '; end -; -_out + _out << '</div> +'; +_outArrayEnhancer is only for Eruby.
@@ -944,26 +930,65 @@ Erubis::Eruby includes this enhancer by default.StringBufferEnhancer
StringBufferEnhancer makes Eruby to use string buffer.
- +$ erubis -se StringBuffer example.eruby +_out = ''; _out << '<div> +'; for item in list + _out << ' <p>'; _out << ( item ).to_s; _out << '</p> + <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p> +'; end + _out << '</div> +'; +_out ++StringBufferEnhancer is only for Eruby. +
+
+ + + +NoTextEnhancer
+NoTextEnhancer suppress output of text and prints only embedded code. +This is useful especially when debugging a complex eRuby script. +
+ -require 'erubis' -class StringBufferEruby < Erubis::Eruby - include Erubis::StringBufferEnhancer -end -eruby = StringBufferEruby.new(File.read('example.eruby')) -print eruby.src +notext-example.eruby +<h3>List</h3> +<% if !@list || @list.empty? %> +<p>not found.</p> +<% else %> +<table> + <tbody> + <% @list.each_with_index do |item, i| %> + <tr bgcolor="<%= i%2 == 0 ? '#FFCCCC' : '#CCCCFF' %>"> + <td><%= item %></td> + </tr> + <% end %> + </tbody> +</table> +<% end %>-$ ruby stringbuffer-enhancer-test.rb -_out = ''; for item in list -; _out << ' <b>'; _out << ( item ).to_s; _out << '</b> - <b>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</b> -'; end -; -_out +output example of NoTextEnhancer +$ erubis -se NoText notext-example.eruby +_out = []; + if !@list || @list.empty? + + else + + + @list.each_with_index do |item, i| + _out << ( i%2 == 0 ? '#FFCCCC' : '#CCCCFF' ).to_s; + _out << ( item ).to_s; + + end + + + end +_out.join+NoTextEnhancer is language-independent. It is useful even if you are PHP user, see this section. +
@@ -971,26 +996,20 @@ _outSimplifyEnhancer
SimplifyEnhancer makes compiling a little faster but don't trim spaces around '<% %>'.
- - -require 'erubis' -class SimplifiedEruby < Erubis::Eruby - include Erubis::SimplifyEnhancer -end -eruby = SimplifiedEruby.new(File.read('example.eruby')) -print eruby.src --$ ruby simplify-enhancer-test.rb -_out = []; for item in list ; _out << ' - <b>'; _out << ( item ).to_s; _out << '</b> - <b>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</b> +$ erubis -se Simplify example.euby +_out = []; _out << '<div> +'; for item in list ; _out << ' + <p>'; _out << ( item ).to_s; _out << '</p> + <p>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</p> '; end ; _out << ' +</div> '; _out.join+SimplifyEnhancer is language-independent. +
@@ -1000,21 +1019,9 @@ _out.join By Default, '[= ... =]' is available for expression. You can specify pattern by :bipattern property. - + -require 'erubis' -class BiPatternEruby < Erubis::Eruby - include Erubis::BiPatternEnhancer -end - -input = File.read('bipattern-enhancer-test.rhtml') -eruby = BiPatternEruby.new(input) -print eruby.src -- - +bipattern-example.rhtml<% for item in list %> <b>[= item =]</b> <b>[== item =]</b> @@ -1022,12 +1029,11 @@ bipattern-enhancer-test.rhtml-$ ruby bipattern-enhancer-test.rb +$ erubis -se BiPattern bipattern-example.rhtml _out = []; for item in list -; _out << ' <b>'; _out << ( item ).to_s; _out << '</b> - <b>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</b> + _out << ' <b>'; _out << ( item ).to_s; _out << '</b> + <b>'; _out << Erubis::XmlHelper.escape_xml( item ); _out << '</b> '; end -; _out.joinBiPatternEnhancer is language-independent. @@ -1040,21 +1046,9 @@ _out.join
PercentLineEnhancer regards lines starting with '%' as Ruby code. This is for compatibility with eruby and ERB.
- - -require 'erubis' -class PercentLineEruby < Erubis::Eruby - include Erubis::PercentLineEnhancer -end - -input = File.read('percentline-enhancer-test.rhtml') -eruby = PercentLineEruby.new(input) -print eruby.src -- + +percentline-example.rhtml% for item in list <b><%= item %></b> % end @@ -1062,11 +1056,11 @@ percentline-enhancer-test.rhtml-$ ruby percentline-enhancer-test.rb -_out = []; for item in list -; _out << ' <b>'; _out << ( item ).to_s; _out << '</b> -'; end -; _out << '% lines with \'%%\' +$ erubis -se PercentLine percentline-example.rhtml +_out = []; for item in list + _out << ' <b>'; _out << ( item ).to_s; _out << '</b> +'; end + _out << '% lines with \'%%\' '; _out.join@@ -1081,21 +1075,9 @@ _out.joinHeaderFooterEnhancer enables you to add header and footer in eRuby script.
- + -require 'erubis' -class HeaderFooterEruby < Erubis::Eruby - include Erubis::HeaderFooterEnhancer -end - -input = File.read('headerfooter-enhancer-test.eruby') -eruby = HeaderFooterEruby.new(input) -print eruby.src -- - +headerfooter-example.eruby<!--#header: def list_items(items) #--> @@ -1108,17 +1090,16 @@ headerfooter-enhancer-test.eruby-$ ruby headerfooter-enhancer-test.rb +-$ erubis -se HeaderFooter headerfooter-example.eruby -def list_items(items) +def list_items(items) _out = []; for item in items -; _out << ' <b>'; _out << ( item ).to_s; _out << '</b> + _out << ' <b>'; _out << ( item ).to_s; _out << '</b> '; end -; _out.join -end +endCompare to the following: @@ -1140,23 +1121,22 @@ normal-eruby-test.eruby compiled source code
$ erubis -s normal-eruby-test.eruby _out = []; -def list_items(items) +def list_items(items) -; for item in items -; _out << '<li>'; _out << ( item ).to_s; _out << '</li> + for item in items + _out << '<li>'; _out << ( item ).to_s; _out << '</li> '; end -; -end -; +end + _out.joinHeader and footer can be in any position in eRuby script, that is, header is no need to be in the head of eRuby script.
- + +headerfooter-example2.rhtml<?xml version="1.0"?> <html> <!--#header: @@ -1170,9 +1150,9 @@ headerfooter-enhancer-test2.rhtml-$ ruby headerfooter-enhancer-test2.rb ++$ erubis -se HeaderFooter headerfooter-example2.rhtml -def page(list) +def page(list) _out = []; _out << '<?xml version="1.0"?> <html> @@ -1181,7 +1161,7 @@ _out = []; _out << '<?xml version="1.0"?> '; _out.join -end +endHeaderFooterEnhancer is experimental and is language-independent. @@ -1223,7 +1203,7 @@ example.ephp <p>Hello <%= $user %>!</p> <table> <tbody> - <% $i = 0 %> + <% $i = 0; %> <% foreach ($list as $item) { %> <% $i++; %> <tr bgcolor="<%= $i % 2 == 0 ? '#FFCCCC' : '#CCCCFF' %>"> @@ -1245,7 +1225,7 @@ compiled source code <p>Hello <?php echo $user; ?>!</p> <table> <tbody> -<?php $i = 0 ?> +<?php $i = 0; ?> <?php foreach ($list as $item) { ?> <?php $i++; ?> <tr bgcolor="<?php echo $i % 2 == 0 ? '#FFCCCC' : '#CCCCFF'; ?>"> @@ -1326,6 +1306,11 @@ fputs(" </tbody>\n" }
+ + + +Java
@@ -1341,6 +1326,7 @@ public class Example { } public String view() { + StringBuffer _out = new StringBuffer(); %> <html> <body> @@ -1358,6 +1344,7 @@ public class Example { <body> </html> <% + return _out.toString(); } public static void main(String[] args) { @@ -1385,7 +1372,7 @@ public class Example {$ erubis -l java example.ejava +$ erubis -b -l java example.ejava StringBuffer _out = new StringBuffer(); import java.util.*; @@ -1398,6 +1385,7 @@ public class Example { } public String view() { + StringBuffer _out = new StringBuffer(); _out.append("<html>\n" + " <body>\n" @@ -1415,6 +1403,7 @@ _out.append(" </tbody>\n" + " <body>\n" + "</html>\n"); + return _out.toString(); } public static void main(String[] args) { @@ -1625,7 +1614,7 @@ print(' </table>$ erubis -l js example.ejs -_out = []; +var _out = []; var user = 'Erubis'; var list = ['<aaa>', 'b&b', '"ccc"']; @@ -1653,8 +1642,73 @@ document.write(_out.join(""));@@ -1684,11 +1735,8 @@ Erubis::StringBufferEruby 47.270000 1.980000 49.250000 ( 73.867537) Erubis::SimplifiedEruby 34.310000 1.600000 35.910000 ( 51.762841) Erubis::StdoutEruby 26.240000 1.490000 27.730000 ( 41.840430) Erubis::StdoutSimplifiedEruby 25.380000 1.340000 26.720000 ( 37.231918) -Erubis::PrintOutEruby 26.850000 1.260000 28.110000 ( 38.378227) -Erubis::PrintOutSimplifiedEruby 24.160000 1.280000 25.440000 ( 40.048199) Erubis::TinyEruby 31.690000 1.590000 33.280000 ( 49.862091) Erubis::TinyStdoutEruby 22.550000 1.230000 23.780000 ( 33.316978) -Erubis::TinyPrintEruby 22.340000 1.150000 23.490000 ( 33.577150)
- -Benchmark
+ +Other Topics
+ +TinyEruby class
+TinyEruby class in 'erubis/tiny.rb' is the smallest implementation of eRuby. +If you don't need any enhancements of Erubis and only require simple eRuby implementation, +try TinyEruby class. +
+
+ + + +NoTextEnhancer in PHP
+NoTextEnhancer is quite useful not only for eRuby but also for PHP. +It can "drop" HTML text and show up embedded Ruby/PHP code. +
+For example, see the following PHP script. +
+ + +<html> + <body> + <h3>List</h3> + <?php if (!$list || count($list) == 0) { ?> + <p>not found.</p> + <?php } else { ?> + <table> + <tbody> + <?php $i = 0; ?> + <?php foreach ($list as $item) { ?> + <tr bgcolor="<?php echo ++$i % 2 == 1 ? '#FFCCCC' : '#CCCCFF'; ?>"> + <td><?php echo $item; ?></td> + </tr> + <?php } ?> + </tbody> + </table> + <?php } ?> + </body> +</html> ++This is complex because PHP code and HTML document are mixed. +NoTextEnhancer can separate PHP code from HTML document. +
+ +$ erubis -l php -e NoText -p '<\?php \?>' notext-example.php | uniq + +<?php if (!$list || count($list) == 0) { ?> + +<?php } else { ?> + +<?php $i = 0; ?> +<?php foreach ($list as $item) { ?> +<?php echo ++$i % 2 == 1 ? '#FFCCCC' : '#CCCCFF'; ?> +<?php echo $item; ?> + +<?php } ?> + +<?php } ?> + ++
+ + + +Benchmark
A benchmark script is included in Erubis package at erubis-X.X.X/benchark directory. Here is an example result of benchmark.
@@ -1668,11 +1722,8 @@ Erubis::StringBufferEruby 186.130000 2.600000 188.730000 (190.374098) Erubis::SimplifiedEruby 130.100000 2.210000 132.310000 (133.426010) Erubis::StdoutEruby 106.010000 2.130000 108.140000 (108.999193) Erubis::StdoutSimplifiedEruby 97.130000 2.180000 99.310000 (100.104433) -Erubis::PrintOutEruby 109.900000 2.090000 111.990000 (112.854442) -Erubis::PrintOutSimplifiedEruby 93.120000 2.140000 95.260000 ( 96.002970) Erubis::TinyEruby 118.740000 2.360000 121.100000 (122.141380) Erubis::TinyStdoutEruby 86.140000 1.840000 87.980000 ( 88.679196) -Erubis::TinyPrintEruby 86.540000 1.970000 88.510000 ( 89.208078)This shows that:
@@ -1709,6 +1757,9 @@ Erubis::TinyPrintEruby 22.340000 1.150000 23.490000 ( 33.577150)
+
+ +Command Reference
diff --git a/doc/users-guide.txt b/doc/users-guide.txt index 2549f22..ebe64c6 100644 --- a/doc/users-guide.txt +++ b/doc/users-guide.txt @@ -69,15 +69,13 @@ Erubis is implemented in pure Ruby. It requires Ruby 1.8 or higher. .$$ Basic Example | tut-basic -Here is a most basic example of Erubis. +Here is a basic example of Erubis. .? example1.eruby .-------------------- example1.eruby
<%= item %>
+<%== item %>
<% end %> +not found.
+<% else %> +<%= item %> | +