SlideShare une entreprise Scribd logo
1  sur  64
Télécharger pour lire hors ligne
RubyKaigi2009



 Erubis

makoto kuwata <kwa@kuwata-lab.com>
     http://www.kuwata-lab.com/




    copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                            1
‣

‣




    copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                            2
Agenda

  ‣ Part 1.   Erubis
  ‣ Part 2.   eRuby
  ‣ Part 3.




              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                      3
Part 1. Erubis



     copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                             4
Erubis

   ‣ pure Ruby             eRuby
   ‣
       • http://jp.rubyist.net/magazine/?0022-FasterThanC
   ‣
       •                  HTML
       •
       • PHP, Java, JS, C, Perl, Scheme
       • ...
               copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                       5
Ruby program:
 require 'rubygems' #
 require 'erubis'
 str = File.read('template.eruby')
 eruby = Erubis::Eruby.new(str)
 print eruby.result(binding())
command-line:
 $ erubis template.eruby #
 $ erubis -x template.eruby # Ruby
 $ erubis -z template.eruby #

           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                   6
HTML
str =<<END           <%= %>
<%= var %>           <%== %>
<%== var %>
END
eruby = Erubis::Eruby.new(str, :escape=>true)
puts eruby.result(:var=>"<B&B>")

output:
 &lt;B&am;&gt;
 <B&B>
                                                    (choosability)

            copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                     7
‣       <% %>                                      [% %]
[% for x in @list %]
 <li>[%= x %]</li>
[% end %]                                                          !
## Ruby
Erubis::Eruby.new(str, :pattern=>'[% %]')
## command-line
$ erubis -p '[% %]' file.eruby

           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                       8
Binding                                 Hash Object
Hash                                       Object
hash = {                                   @title = "Example"
  :title => "Example",                     @items = [1, 2, 3]
  :items => [1, 2, 3], }                   erubis =
erubis =                                     Erubis::Eruby.new(str)
  Erubis::Eruby.new(str)                   puts erubis.evaluate(self)
puts erubis.result(hash)

<h1><%= title%></h1>                        <h1><%= @title%></h1>
<% for x in items %>                        <% for x in @items %>
<% end %>                                   <% end %>
              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                        9
Enhancer
   ‣ Erubis                                             module
   ## <%= %> HTML
   module EscapeEnhancer
     def add_expr(src, code, indicator)
       if indicator == '='
          src << " _buf<<escapeXml(#{code})"
       elsif indicator == '=='
          src << " _buf<<(#{code}).to_s;"
       end
     end          Erubis
   end

              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                      10
Enhancer (cont')

  ###                         Enhancer
  ### (     : print()       )
  module StdoutEnhancer            _buf=""
    def add_preamble(src)             _buf=$stdout
      src << "_buf = $stdout;"
    end
    def add_postamble(src)
      src << "n""n"
    end                    _buf.to_s
  end                           "" (        )

              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                      11
Enhancer

                                               include/extend
  ### Ruby
  class MyEruby < Erubis::Eruby
     include Erubis::EscapeEnhancer
     include Erubis::PercentLineEnhancer
  end
  puts MyEruby.new(str).result(:items=>[1,2,3])

                                                  ,
  ### command-line
  $ erubis -E Escape,Percent file.eruby

             copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                     12
Enhancer

‣ EscapeEnhancer :               HTML

‣ PercentLineEnhancer :        '%'

‣ InterporationEnhancer : _buf<<"#{ }"
‣ DeleteIndentEnhancer : HTML
‣ StdoutEnhancer : _buf=""           _buf=$stdout

‣ ...      (erubis -h                   )

            copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                    13
‣                                                            (
                  )

### command-line
$ erubis -c '{arr: [A, B, C]}' template.eruby # YAML
$ erubis -c '@arr=%w[A B C]' template.eruby # Ruby

<% for x in @arr %>                                  <li>A</li>
<li><%= x %></li>                                    <li>B</li>
<% end %>                                            <li>C</li>

             copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                     14
‣    *.yaml                              *.rb

$ erubis -f data.yaml template.eruby # YAML
$ erubis -f data.rb template.eruby # Ruby
data.yaml                            data.rb
 title: Example                       @title = "Example"
 items:                               @items =
   - name: Foo                         [ {"name"=>"Foo"},
   - name: Bar                           {"name"=>"Bar"}, ]

            copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                    15
‣ <%===           %>

<%=== @var %>                                                      2

### Ruby
$stderr.puts("*** debug: @var=#{@var.inspect}")

###
*** debug: @var=["A", "B", "C"]


           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                       16
‣ PHP, Java, JS, C, Perl,Scheme                                      (       )

 <% for (i=0; i<n; i++) { %>                                    (C       )
 <li><%= "%d", i %>        printf()
 <% } %>

#line 1 "file.ec"          (erubis -xl c file.ec                           )
 for (i=0; i<n; i++) {
fputs("<li>", stdout); fprintf(stdout, "%d", i);
fputs("n", stdout); }

             copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                                 17
‣ Erubis
  •                       HTML
  •
  • Enhancer
  •                                     /
  •
  • PHP, Java, JS, C, Perl, Scheme
           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                   18
Part 2. eRuby



     copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                             19
‣ binding()

      •
i=0                                                  ### file.erb
str = File.read('file.erb')                           <% for i in 1..3 %>
ERB.new(str).result(binding)                         <li><%= i %></li>
p i #=> 3                                            <% end %>
                                       !

             copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                           20
‣ binding()

  •
  •

 b = Bingind.new
 b[:title] = "Example"                                            …
 b[:items] = [1, 2, 3]

          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                      21
ERB

‣(                )
‣ Struct
  • http://d.hatena.ne.jp/m_seki/20080528/1211909590

  Foo = Struct.new(:title, :items)
  class Foo
   def env; binding(); end
  end
  ctx = Foo.new("Example", [1,2,3])
  ERB.new(str).result(ctx.env)
           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                   22
Erubis

  ‣ Binding                               Hash

erubis.result(:items=>[1, 2, 3])

def result(b=TOPLEVEL_BINDING)
  if b.is_a?(Hash)
     s = b.collect{|k,v| "#{k}=b[#{k.inspect}];"}.join
     b = binding()
     eval s, b                  Binding
  end
  return eval(@src, b)
end
              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                      23
Erubis

‣ Binding                      Object
@items = [1, 2, 3];              <% for x in @items %>
erubis.evaluate(self)            <% end %>

def evaluate(ctx)                               Hash
  if ctx.is_a?(Hash)
     hash = ctx; ctx = Object.new
     hash.each {|k,v|
       ctx.instance_variable_set("@#{k}", v) }
  end
  return ctx.instance_eval(@src)
end       copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                  24
ERB
1. 8.6   Erubis::Eruby

                  ERB
1. 8.7   Erubis::Eruby

                  ERB
1.9.1    Erubis::Eruby
                           0                   10                   20          30
                                                                                (sec)


                                                                             (by eval)
                                                                         (eRuby→Ruby)
                copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                                         25
ERB

‣
‣
    •
class Foo
   extend ERB::DefMethod
   def_erb_method('render', 'template.erb')
end
print Foo.new.render

          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                  26
Erubis

‣
    •                         Ruby                          *.cache
    •2                 *.cache


eruby = Erubis::Eruby.load_file("file.eruby")
print eruby.result()
                        CGI


          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                      27
Erubis

‣                         Proc
    •
    •

                                                 instance_eval
def evaluate(ctx)                                 Proc
  @proc ||= eval(@src)
  ctx.instance_eval(@proc)
end

         copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                 28
‣
       •   HTML

                                                   <ul>
<ul>
<% for x in @list %>                                  <li>AAA</li>
 <li><%= x %></li>
<% end %>                                             <li>BBB</li>
</ul>
                                                   </ul>
             copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                     29
ERB

‣                       trim mode
    • ">" :         "%>"
    • "<>" :        "<%"                               "%>"
    • "-" : "<%-" "-%>"
    • "%" : "%"
    • "%>", "%<>", "-" : "%"                    ">"/"<>"/"-"

    ERB.new(str, nil, "%<>")

            copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                    30
Erubis

‣
    • <%     %>
    • <%=      %>

<ul>                                                     <ul>
<% for x in @list %>                                       AAA
  <%= x %>                                                 BBB
<% end %>                                                  CCC
</ul>                                                    </ul>

            copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                    31
ERB                               Erubis
eRuby
                                ×                     (                  )
                      (                         )

                                ×
                  (                                 ) (                  )

                                ×                     (                  )
                          (                 )

        copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                             32
‣

    • [ruby-list:18894] eRuby                                      (?)

‣

    • <% %>        <%= %>
    •

           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                         33
‣       <%=          %>                                               HTML
                                                                !
    • eRuby                                                           HTML


    •
‣                                                                            ?


              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                                 34
ERB

‣(                     )
‣
     •
         String
     • http://www2a.biglobe.ne.jp/~seki/ruby/erbquote.html



                  copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                          35
Erubis

‣                              Erubis
    •
eruby = Erubis::Eruby.new(str, :escape=>true)
# or eruby = Erubis::EscapedEruby.new(str)
puts eruby.evaluate(ctx)

Hi <%= @name %>! #
Hi <%== @name %>! #

         copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                 36
<% unless @items.blank? %>
<table>
 <tbody>
   <% @items.each do |item| %>
   <tr class="item" id="item-<%=item.id%>">
     <td class="item-id"><%= item.id %></td>
     <td class="item-name">
       <% if item.url && !item.url.empty? %>
       <a href="<%= item.url %>"><%=item.name%></a>
       <% else %>
       <span><%=item.name%></span>
       <% end %>
     </td>
   </tr>                            HTML Ruby
   <% end %>
 </tbody>                           end
</table>                            (do     end 100                    )
<% end %>


               copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                           37
ERB

‣               (                         erb -x                 )

$ erb -x foo.eruby
_erbout = ''; unless @items.blank? ;
_erbout.concat "n"
_erbout.concat "<table>n"
_erbout.concat " <tr class="record">n"

$ erb -x foo.eruby | ruby -wc
Syntax OK
         copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                     38
Erubis

‣
    • -x : Ruby
    • -X : HTML
    • -N :                      (number)
    • -U :                               1           (unique)
    • -C :                                         (compact)
    • -z :
             copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                     39
$ cat foo.eruby
<% unless @items.blank? %>
<table>
 <% @items.each_with_index do|x, i| %>
 <tr class="record">
   <td><%= i +1 %></td>
   <td><%=h x %></td>
 </tr>
 <% end %>
</table>
<% end %>


         copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                 40
-x       Ruby
$ erubis -x foo.eruby
_buf = ''; unless @items.blank?
 _buf << '<table>
'; @items.each_with_index do|x, i|
 _buf << ' <tr class="record">
    <td>'; _buf << ( i +1 ).to_s; _buf << '</td>
    <td>'; _buf << (h x ).to_s; _buf << '</td>
  </tr>
'; end
 _buf << '</table>
'; end
_buf.to_s

           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                   41
-X
$ erubis -X foo.eruby
_buf = ''; unless @items.blank?

 @items.each_with_index do|x, i|

       _buf << ( i +1 ).to_s;
       _buf << (h x ).to_s;

 end

 end
_buf.to_s

            copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                    42
-N                  (number)
$ erubis -XN foo.eruby
   1: _buf = ''; unless @items.blank?
   2:
   3: @items.each_with_index do|x, i|
   4:
   5:       _buf << ( i +1 ).to_s;
   6:       _buf << (h x ).to_s;
   7:
   8: end
   9:
  10: end
  11: _buf.to_s

          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                             43
-U                     (uniq)
$ erubis -XNU foo.eruby
   1: _buf = ''; unless @items.blank?

  3:   @items.each_with_index do|x, i|

  5:         _buf << ( i +1 ).to_s;
  6:         _buf << (h x ).to_s;

  8:   end

 10: end
 11: _buf.to_s

          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                       44
-C                   (compact)
$ erubis -XNC foo.eruby
   1: _buf = ''; unless @items.blank?
   3: @items.each_with_index do|x, i|
   5:       _buf << ( i +1 ).to_s;
   6:       _buf << (h x ).to_s;
   8: end
  10: end
  11: _buf.to_s




          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                              45
<%= %>


<%= form_for :user do %>
 <div>
  <%= text_field :name %>
 </div>
<% end %>                eRuby


         copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                 46
<%=             %>

<%= 10.times do %>
Hello
<% end %>


                                                                   !
_buf = "";
_buf << ( 10.times do ).to_s;
_buf << " Hellon";
 end
          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                       47
ERB+Rails

   ‣                                                    (_erbout)
                                                                    !


                                                form_for()
             …                                  _erbout

<% form_for do %>                        _erbout = ""
Hello                                    form_for do
<% end %>                                 _erbout.concat("Hello")
                                         end

           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                        48
Erubis+Merb

   ‣ Erubis

<%= form_for do %>                            @_buf << (form_for do;
Hello                                         @_buf << "Hellon"
<% end =%>                                    end);




              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                       49
‣ eRuby
‣                                                  (kool!)
‣
    •                                                             @_buf


‣

          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                          50
‣ eRuby
            eRuby
  •
  •
  •
  •
  •                     HTML
  •
  •

          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                  51
Part 3.



          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                  52
‣
<ul>                                            print "<ul>n"
<% for x in @a %>                               for x in @a
 <li><%=x%></li>                                print "<li>#{x}</li>n"
<% end %>                                       end
</ul>                                           print "</u>n"




            copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                          53
<ul>                                s = File.read('foo.eruby')
<li><%=x%></li>                     e = Erubis::Eruby.new(s)
</ul>                               puts e.evaluate(:x=>1)




          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                  54
‣                                                               ?


<%#ARGS: items, name='guest' %>
Hello <%= name %>!
<% for x in items %>
<li><%=x%></li>
<% end %>



          copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                      55
‣ HTML
      •
<html>                                            <html>
<body>
                                                  <body>              !(   )
                                                  </body>
 <h1><%=@title%></h1>                             </html>
 <ul id="menulist">
  <% for x in @items %>                           <h1><%=@title%></h1>
  <li><%=x%></li>                                 <ul id="menulist">
                                                  </ul>
  <% end %>
 </ul>                                            <% for x in @items %>
</body>                                            <li><%= x %></li>
</html>                                           <% end %>
              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                               56
‣ Django

....
{% block pagetitle %}
<h1>{{title}}</h1>
{% endblock %}
....                                                 (method override)


             copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                         57
AOP

  ‣ AOP : Aspect Oriented Programming
    •                                                              /

<table>
           "for x in @a"                            •HTML
 <tr>
  <td>     "print x"
 </tr>                                              •
           "end"
</table>
                                                           (           )

           copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                           58
‣ HTML                              View
  •                                                                  …

‣ HTML     String
 (http://www.oiwa.jp/~yutaka/tdiary/20051229.html)
 •                       /
 •                                          Python str unicode
 •   HTML+String
 •             HTML                                          (SQL    )

             copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                         59
‣
‣

    •                                                           AOP …

‣


        copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                        60
‣
    • http://jp.rubyist.net/magazine/?0024-TemplateSystem
‣
   • http://jp.rubyist.net/magazine/?0024-TemplateSystem2
‣ Erubis
   • http://www.kuwata-lab.com/erubis/
‣
    • http://www.kuwata-lab.com/tenjin/

               copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                       61
one more thing

   copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                           62
Tenjin - template engine replacing eRuby

 ‣ ERB    Erubis
   • eRuby
   •
 ‣ Tenjin :
   •                                                                   /
   •
     -                                                                ...
   • http://www.kuwata-lab.com/tenjin/
              copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                                            63
thank you

 copyright(c) 2009 kuwata-lab.com all rights reserved.
                                                         64

Contenu connexe

Tendances

Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
Lin Yo-An
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
Kang-min Liu
 
Perl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaPerl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim Perlchina
guestcf9240
 
AnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webAnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time web
clkao
 
Perl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaPerl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim Perlchina
Lin Yo-An
 

Tendances (20)

Python高级编程(二)
Python高级编程(二)Python高级编程(二)
Python高级编程(二)
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in Perl
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
 
Just-In-Time Compiler in PHP 8
Just-In-Time Compiler in PHP 8Just-In-Time Compiler in PHP 8
Just-In-Time Compiler in PHP 8
 
Puppet Camp Paris 2015: Power of Puppet 4 (Beginner)
Puppet Camp Paris 2015: Power of Puppet 4 (Beginner) Puppet Camp Paris 2015: Power of Puppet 4 (Beginner)
Puppet Camp Paris 2015: Power of Puppet 4 (Beginner)
 
PL/Perl - New Features in PostgreSQL 9.0
PL/Perl - New Features in PostgreSQL 9.0PL/Perl - New Features in PostgreSQL 9.0
PL/Perl - New Features in PostgreSQL 9.0
 
Letswift19-clean-architecture
Letswift19-clean-architectureLetswift19-clean-architecture
Letswift19-clean-architecture
 
A Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP GeneratorsA Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP Generators
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
 
lldb – Debugger auf Abwegen
lldb – Debugger auf Abwegenlldb – Debugger auf Abwegen
lldb – Debugger auf Abwegen
 
Perl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaPerl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim Perlchina
 
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalInterceptors: Into the Core of Pedestal
Interceptors: Into the Core of Pedestal
 
Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)
 
AnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webAnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time web
 
Advanced Python, Part 2
Advanced Python, Part 2Advanced Python, Part 2
Advanced Python, Part 2
 
Ruby 2.0
Ruby 2.0Ruby 2.0
Ruby 2.0
 
Perl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim PerlchinaPerl.Hacks.On.Vim Perlchina
Perl.Hacks.On.Vim Perlchina
 
Imugi: Compiler made with Python
Imugi: Compiler made with PythonImugi: Compiler made with Python
Imugi: Compiler made with Python
 
Introdução ao Perl 6
Introdução ao Perl 6Introdução ao Perl 6
Introdução ao Perl 6
 
Being functional in PHP (PHPDay Italy 2016)
Being functional in PHP (PHPDay Italy 2016)Being functional in PHP (PHPDay Italy 2016)
Being functional in PHP (PHPDay Italy 2016)
 

Similaire à Erubis徹底解説

JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
Nick Sieger
 
Socket applications
Socket applicationsSocket applications
Socket applications
João Moura
 
Your own (little) gem: building an online business with Ruby
Your own (little) gem: building an online business with RubyYour own (little) gem: building an online business with Ruby
Your own (little) gem: building an online business with Ruby
Lindsay Holmwood
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
Dmitry Buzdin
 

Similaire à Erubis徹底解説 (20)

BioMake PAG 2017
BioMake PAG 2017 BioMake PAG 2017
BioMake PAG 2017
 
Hacking with ruby2ruby
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2ruby
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
 
Gun make
Gun makeGun make
Gun make
 
The secret of programming language development and future
The secret of programming  language development and futureThe secret of programming  language development and future
The secret of programming language development and future
 
Ruby on Rails 3.1: Let's bring the fun back into web programing
Ruby on Rails 3.1: Let's bring the fun back into web programingRuby on Rails 3.1: Let's bring the fun back into web programing
Ruby on Rails 3.1: Let's bring the fun back into web programing
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo Web
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRuby
 
Practical Testing of Ruby Core
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby Core
 
Socket applications
Socket applicationsSocket applications
Socket applications
 
Your own (little) gem: building an online business with Ruby
Your own (little) gem: building an online business with RubyYour own (little) gem: building an online business with Ruby
Your own (little) gem: building an online business with Ruby
 
Minicurso Ruby e Rails
Minicurso Ruby e RailsMinicurso Ruby e Rails
Minicurso Ruby e Rails
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
Debugging of (C)Python applications
Debugging of (C)Python applicationsDebugging of (C)Python applications
Debugging of (C)Python applications
 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret Sauce
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
How to Begin Developing Ruby Core
How to Begin Developing Ruby CoreHow to Begin Developing Ruby Core
How to Begin Developing Ruby Core
 
Distributed, Incremental Dataflow Processing on AWS with GRAIL's Reflow (CMP3...
Distributed, Incremental Dataflow Processing on AWS with GRAIL's Reflow (CMP3...Distributed, Incremental Dataflow Processing on AWS with GRAIL's Reflow (CMP3...
Distributed, Incremental Dataflow Processing on AWS with GRAIL's Reflow (CMP3...
 
Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end Framework
 

Plus de kwatch

文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた
kwatch
 
I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"
kwatch
 

Plus de kwatch (20)

How to make the fastest Router in Python
How to make the fastest Router in PythonHow to make the fastest Router in Python
How to make the fastest Router in Python
 
Migr8.rb チュートリアル
Migr8.rb チュートリアルMigr8.rb チュートリアル
Migr8.rb チュートリアル
 
なんでもID
なんでもIDなんでもID
なんでもID
 
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
 
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
 
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較する
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
Pretty Good Branch Strategy for Git/Mercurial
Pretty Good Branch Strategy for Git/MercurialPretty Good Branch Strategy for Git/Mercurial
Pretty Good Branch Strategy for Git/Mercurial
 
Oktest - a new style testing library for Python -
Oktest - a new style testing library for Python -Oktest - a new style testing library for Python -
Oktest - a new style testing library for Python -
 
文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた文字列結合のベンチマークをいろんな処理系でやってみた
文字列結合のベンチマークをいろんな処理系でやってみた
 
I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"I have something to say about the buzz word "From Java to Ruby"
I have something to say about the buzz word "From Java to Ruby"
 
Javaより速いLL用テンプレートエンジン
Javaより速いLL用テンプレートエンジンJavaより速いLL用テンプレートエンジン
Javaより速いLL用テンプレートエンジン
 
Underlaying Technology of Modern O/R Mapper
Underlaying Technology of Modern O/R MapperUnderlaying Technology of Modern O/R Mapper
Underlaying Technology of Modern O/R Mapper
 

Dernier

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Dernier (20)

AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 

Erubis徹底解説

  • 1. RubyKaigi2009 Erubis makoto kuwata <kwa@kuwata-lab.com> http://www.kuwata-lab.com/ copyright(c) 2009 kuwata-lab.com all rights reserved. 1
  • 2. ‣ ‣ copyright(c) 2009 kuwata-lab.com all rights reserved. 2
  • 3. Agenda ‣ Part 1. Erubis ‣ Part 2. eRuby ‣ Part 3. copyright(c) 2009 kuwata-lab.com all rights reserved. 3
  • 4. Part 1. Erubis copyright(c) 2009 kuwata-lab.com all rights reserved. 4
  • 5. Erubis ‣ pure Ruby eRuby ‣ • http://jp.rubyist.net/magazine/?0022-FasterThanC ‣ • HTML • • PHP, Java, JS, C, Perl, Scheme • ... copyright(c) 2009 kuwata-lab.com all rights reserved. 5
  • 6. Ruby program: require 'rubygems' # require 'erubis' str = File.read('template.eruby') eruby = Erubis::Eruby.new(str) print eruby.result(binding()) command-line: $ erubis template.eruby # $ erubis -x template.eruby # Ruby $ erubis -z template.eruby # copyright(c) 2009 kuwata-lab.com all rights reserved. 6
  • 7. HTML str =<<END <%= %> <%= var %> <%== %> <%== var %> END eruby = Erubis::Eruby.new(str, :escape=>true) puts eruby.result(:var=>"<B&B>") output: &lt;B&am;&gt; <B&B> (choosability) copyright(c) 2009 kuwata-lab.com all rights reserved. 7
  • 8. <% %> [% %] [% for x in @list %] <li>[%= x %]</li> [% end %] ! ## Ruby Erubis::Eruby.new(str, :pattern=>'[% %]') ## command-line $ erubis -p '[% %]' file.eruby copyright(c) 2009 kuwata-lab.com all rights reserved. 8
  • 9. Binding Hash Object Hash Object hash = { @title = "Example" :title => "Example", @items = [1, 2, 3] :items => [1, 2, 3], } erubis = erubis = Erubis::Eruby.new(str) Erubis::Eruby.new(str) puts erubis.evaluate(self) puts erubis.result(hash) <h1><%= title%></h1> <h1><%= @title%></h1> <% for x in items %> <% for x in @items %> <% end %> <% end %> copyright(c) 2009 kuwata-lab.com all rights reserved. 9
  • 10. Enhancer ‣ Erubis module ## <%= %> HTML module EscapeEnhancer def add_expr(src, code, indicator) if indicator == '=' src << " _buf<<escapeXml(#{code})" elsif indicator == '==' src << " _buf<<(#{code}).to_s;" end end Erubis end copyright(c) 2009 kuwata-lab.com all rights reserved. 10
  • 11. Enhancer (cont') ### Enhancer ### ( : print() ) module StdoutEnhancer _buf="" def add_preamble(src) _buf=$stdout src << "_buf = $stdout;" end def add_postamble(src) src << "n""n" end _buf.to_s end "" ( ) copyright(c) 2009 kuwata-lab.com all rights reserved. 11
  • 12. Enhancer include/extend ### Ruby class MyEruby < Erubis::Eruby include Erubis::EscapeEnhancer include Erubis::PercentLineEnhancer end puts MyEruby.new(str).result(:items=>[1,2,3]) , ### command-line $ erubis -E Escape,Percent file.eruby copyright(c) 2009 kuwata-lab.com all rights reserved. 12
  • 13. Enhancer ‣ EscapeEnhancer : HTML ‣ PercentLineEnhancer : '%' ‣ InterporationEnhancer : _buf<<"#{ }" ‣ DeleteIndentEnhancer : HTML ‣ StdoutEnhancer : _buf="" _buf=$stdout ‣ ... (erubis -h ) copyright(c) 2009 kuwata-lab.com all rights reserved. 13
  • 14. ( ) ### command-line $ erubis -c '{arr: [A, B, C]}' template.eruby # YAML $ erubis -c '@arr=%w[A B C]' template.eruby # Ruby <% for x in @arr %> <li>A</li> <li><%= x %></li> <li>B</li> <% end %> <li>C</li> copyright(c) 2009 kuwata-lab.com all rights reserved. 14
  • 15. *.yaml *.rb $ erubis -f data.yaml template.eruby # YAML $ erubis -f data.rb template.eruby # Ruby data.yaml data.rb title: Example @title = "Example" items: @items = - name: Foo [ {"name"=>"Foo"}, - name: Bar {"name"=>"Bar"}, ] copyright(c) 2009 kuwata-lab.com all rights reserved. 15
  • 16. ‣ <%=== %> <%=== @var %> 2 ### Ruby $stderr.puts("*** debug: @var=#{@var.inspect}") ### *** debug: @var=["A", "B", "C"] copyright(c) 2009 kuwata-lab.com all rights reserved. 16
  • 17. ‣ PHP, Java, JS, C, Perl,Scheme ( ) <% for (i=0; i<n; i++) { %> (C ) <li><%= "%d", i %> printf() <% } %> #line 1 "file.ec" (erubis -xl c file.ec ) for (i=0; i<n; i++) { fputs("<li>", stdout); fprintf(stdout, "%d", i); fputs("n", stdout); } copyright(c) 2009 kuwata-lab.com all rights reserved. 17
  • 18. ‣ Erubis • HTML • • Enhancer • / • • PHP, Java, JS, C, Perl, Scheme copyright(c) 2009 kuwata-lab.com all rights reserved. 18
  • 19. Part 2. eRuby copyright(c) 2009 kuwata-lab.com all rights reserved. 19
  • 20. ‣ binding() • i=0 ### file.erb str = File.read('file.erb') <% for i in 1..3 %> ERB.new(str).result(binding) <li><%= i %></li> p i #=> 3 <% end %> ! copyright(c) 2009 kuwata-lab.com all rights reserved. 20
  • 21. ‣ binding() • • b = Bingind.new b[:title] = "Example" … b[:items] = [1, 2, 3] copyright(c) 2009 kuwata-lab.com all rights reserved. 21
  • 22. ERB ‣( ) ‣ Struct • http://d.hatena.ne.jp/m_seki/20080528/1211909590 Foo = Struct.new(:title, :items) class Foo def env; binding(); end end ctx = Foo.new("Example", [1,2,3]) ERB.new(str).result(ctx.env) copyright(c) 2009 kuwata-lab.com all rights reserved. 22
  • 23. Erubis ‣ Binding Hash erubis.result(:items=>[1, 2, 3]) def result(b=TOPLEVEL_BINDING) if b.is_a?(Hash) s = b.collect{|k,v| "#{k}=b[#{k.inspect}];"}.join b = binding() eval s, b Binding end return eval(@src, b) end copyright(c) 2009 kuwata-lab.com all rights reserved. 23
  • 24. Erubis ‣ Binding Object @items = [1, 2, 3]; <% for x in @items %> erubis.evaluate(self) <% end %> def evaluate(ctx) Hash if ctx.is_a?(Hash) hash = ctx; ctx = Object.new hash.each {|k,v| ctx.instance_variable_set("@#{k}", v) } end return ctx.instance_eval(@src) end copyright(c) 2009 kuwata-lab.com all rights reserved. 24
  • 25. ERB 1. 8.6 Erubis::Eruby ERB 1. 8.7 Erubis::Eruby ERB 1.9.1 Erubis::Eruby 0 10 20 30 (sec) (by eval) (eRuby→Ruby) copyright(c) 2009 kuwata-lab.com all rights reserved. 25
  • 26. ERB ‣ ‣ • class Foo extend ERB::DefMethod def_erb_method('render', 'template.erb') end print Foo.new.render copyright(c) 2009 kuwata-lab.com all rights reserved. 26
  • 27. Erubis ‣ • Ruby *.cache •2 *.cache eruby = Erubis::Eruby.load_file("file.eruby") print eruby.result() CGI copyright(c) 2009 kuwata-lab.com all rights reserved. 27
  • 28. Erubis ‣ Proc • • instance_eval def evaluate(ctx) Proc @proc ||= eval(@src) ctx.instance_eval(@proc) end copyright(c) 2009 kuwata-lab.com all rights reserved. 28
  • 29. • HTML <ul> <ul> <% for x in @list %> <li>AAA</li> <li><%= x %></li> <% end %> <li>BBB</li> </ul> </ul> copyright(c) 2009 kuwata-lab.com all rights reserved. 29
  • 30. ERB ‣ trim mode • ">" : "%>" • "<>" : "<%" "%>" • "-" : "<%-" "-%>" • "%" : "%" • "%>", "%<>", "-" : "%" ">"/"<>"/"-" ERB.new(str, nil, "%<>") copyright(c) 2009 kuwata-lab.com all rights reserved. 30
  • 31. Erubis ‣ • <% %> • <%= %> <ul> <ul> <% for x in @list %> AAA <%= x %> BBB <% end %> CCC </ul> </ul> copyright(c) 2009 kuwata-lab.com all rights reserved. 31
  • 32. ERB Erubis eRuby × ( ) ( ) × ( ) ( ) × ( ) ( ) copyright(c) 2009 kuwata-lab.com all rights reserved. 32
  • 33. • [ruby-list:18894] eRuby (?) ‣ • <% %> <%= %> • copyright(c) 2009 kuwata-lab.com all rights reserved. 33
  • 34. <%= %> HTML ! • eRuby HTML • ‣ ? copyright(c) 2009 kuwata-lab.com all rights reserved. 34
  • 35. ERB ‣( ) ‣ • String • http://www2a.biglobe.ne.jp/~seki/ruby/erbquote.html copyright(c) 2009 kuwata-lab.com all rights reserved. 35
  • 36. Erubis ‣ Erubis • eruby = Erubis::Eruby.new(str, :escape=>true) # or eruby = Erubis::EscapedEruby.new(str) puts eruby.evaluate(ctx) Hi <%= @name %>! # Hi <%== @name %>! # copyright(c) 2009 kuwata-lab.com all rights reserved. 36
  • 37. <% unless @items.blank? %> <table> <tbody> <% @items.each do |item| %> <tr class="item" id="item-<%=item.id%>"> <td class="item-id"><%= item.id %></td> <td class="item-name"> <% if item.url && !item.url.empty? %> <a href="<%= item.url %>"><%=item.name%></a> <% else %> <span><%=item.name%></span> <% end %> </td> </tr> HTML Ruby <% end %> </tbody> end </table> (do end 100 ) <% end %> copyright(c) 2009 kuwata-lab.com all rights reserved. 37
  • 38. ERB ‣ ( erb -x ) $ erb -x foo.eruby _erbout = ''; unless @items.blank? ; _erbout.concat "n" _erbout.concat "<table>n" _erbout.concat " <tr class="record">n" $ erb -x foo.eruby | ruby -wc Syntax OK copyright(c) 2009 kuwata-lab.com all rights reserved. 38
  • 39. Erubis ‣ • -x : Ruby • -X : HTML • -N : (number) • -U : 1 (unique) • -C : (compact) • -z : copyright(c) 2009 kuwata-lab.com all rights reserved. 39
  • 40. $ cat foo.eruby <% unless @items.blank? %> <table> <% @items.each_with_index do|x, i| %> <tr class="record"> <td><%= i +1 %></td> <td><%=h x %></td> </tr> <% end %> </table> <% end %> copyright(c) 2009 kuwata-lab.com all rights reserved. 40
  • 41. -x Ruby $ erubis -x foo.eruby _buf = ''; unless @items.blank? _buf << '<table> '; @items.each_with_index do|x, i| _buf << ' <tr class="record"> <td>'; _buf << ( i +1 ).to_s; _buf << '</td> <td>'; _buf << (h x ).to_s; _buf << '</td> </tr> '; end _buf << '</table> '; end _buf.to_s copyright(c) 2009 kuwata-lab.com all rights reserved. 41
  • 42. -X $ erubis -X foo.eruby _buf = ''; unless @items.blank? @items.each_with_index do|x, i| _buf << ( i +1 ).to_s; _buf << (h x ).to_s; end end _buf.to_s copyright(c) 2009 kuwata-lab.com all rights reserved. 42
  • 43. -N (number) $ erubis -XN foo.eruby 1: _buf = ''; unless @items.blank? 2: 3: @items.each_with_index do|x, i| 4: 5: _buf << ( i +1 ).to_s; 6: _buf << (h x ).to_s; 7: 8: end 9: 10: end 11: _buf.to_s copyright(c) 2009 kuwata-lab.com all rights reserved. 43
  • 44. -U (uniq) $ erubis -XNU foo.eruby 1: _buf = ''; unless @items.blank? 3: @items.each_with_index do|x, i| 5: _buf << ( i +1 ).to_s; 6: _buf << (h x ).to_s; 8: end 10: end 11: _buf.to_s copyright(c) 2009 kuwata-lab.com all rights reserved. 44
  • 45. -C (compact) $ erubis -XNC foo.eruby 1: _buf = ''; unless @items.blank? 3: @items.each_with_index do|x, i| 5: _buf << ( i +1 ).to_s; 6: _buf << (h x ).to_s; 8: end 10: end 11: _buf.to_s copyright(c) 2009 kuwata-lab.com all rights reserved. 45
  • 46. <%= %> <%= form_for :user do %> <div> <%= text_field :name %> </div> <% end %> eRuby copyright(c) 2009 kuwata-lab.com all rights reserved. 46
  • 47. <%= %> <%= 10.times do %> Hello <% end %> ! _buf = ""; _buf << ( 10.times do ).to_s; _buf << " Hellon"; end copyright(c) 2009 kuwata-lab.com all rights reserved. 47
  • 48. ERB+Rails ‣ (_erbout) ! form_for() … _erbout <% form_for do %> _erbout = "" Hello form_for do <% end %> _erbout.concat("Hello") end copyright(c) 2009 kuwata-lab.com all rights reserved. 48
  • 49. Erubis+Merb ‣ Erubis <%= form_for do %> @_buf << (form_for do; Hello @_buf << "Hellon" <% end =%> end); copyright(c) 2009 kuwata-lab.com all rights reserved. 49
  • 50. ‣ eRuby ‣ (kool!) ‣ • @_buf ‣ copyright(c) 2009 kuwata-lab.com all rights reserved. 50
  • 51. ‣ eRuby eRuby • • • • • HTML • • copyright(c) 2009 kuwata-lab.com all rights reserved. 51
  • 52. Part 3. copyright(c) 2009 kuwata-lab.com all rights reserved. 52
  • 53. ‣ <ul> print "<ul>n" <% for x in @a %> for x in @a <li><%=x%></li> print "<li>#{x}</li>n" <% end %> end </ul> print "</u>n" copyright(c) 2009 kuwata-lab.com all rights reserved. 53
  • 54. <ul> s = File.read('foo.eruby') <li><%=x%></li> e = Erubis::Eruby.new(s) </ul> puts e.evaluate(:x=>1) copyright(c) 2009 kuwata-lab.com all rights reserved. 54
  • 55. ? <%#ARGS: items, name='guest' %> Hello <%= name %>! <% for x in items %> <li><%=x%></li> <% end %> copyright(c) 2009 kuwata-lab.com all rights reserved. 55
  • 56. ‣ HTML • <html> <html> <body> <body> !( ) </body> <h1><%=@title%></h1> </html> <ul id="menulist"> <% for x in @items %> <h1><%=@title%></h1> <li><%=x%></li> <ul id="menulist"> </ul> <% end %> </ul> <% for x in @items %> </body> <li><%= x %></li> </html> <% end %> copyright(c) 2009 kuwata-lab.com all rights reserved. 56
  • 57. ‣ Django .... {% block pagetitle %} <h1>{{title}}</h1> {% endblock %} .... (method override) copyright(c) 2009 kuwata-lab.com all rights reserved. 57
  • 58. AOP ‣ AOP : Aspect Oriented Programming • / <table> "for x in @a" •HTML <tr> <td> "print x" </tr> • "end" </table> ( ) copyright(c) 2009 kuwata-lab.com all rights reserved. 58
  • 59. ‣ HTML View • … ‣ HTML String (http://www.oiwa.jp/~yutaka/tdiary/20051229.html) • / • Python str unicode • HTML+String • HTML (SQL ) copyright(c) 2009 kuwata-lab.com all rights reserved. 59
  • 60. ‣ ‣ • AOP … ‣ copyright(c) 2009 kuwata-lab.com all rights reserved. 60
  • 61. • http://jp.rubyist.net/magazine/?0024-TemplateSystem ‣ • http://jp.rubyist.net/magazine/?0024-TemplateSystem2 ‣ Erubis • http://www.kuwata-lab.com/erubis/ ‣ • http://www.kuwata-lab.com/tenjin/ copyright(c) 2009 kuwata-lab.com all rights reserved. 61
  • 62. one more thing copyright(c) 2009 kuwata-lab.com all rights reserved. 62
  • 63. Tenjin - template engine replacing eRuby ‣ ERB Erubis • eRuby • ‣ Tenjin : • / • - ... • http://www.kuwata-lab.com/tenjin/ copyright(c) 2009 kuwata-lab.com all rights reserved. 63
  • 64. thank you copyright(c) 2009 kuwata-lab.com all rights reserved. 64