ERb alternatyvos
RubyConfLT 2010
Vidmantas Kabošis
vidmantas.kabosis.lt
Kas yra kas (intro)
   Šablono variklis == template engine
   Greitis
   Saugumas
ERb
   Embedded Ruby
          <%= … %>
   ERB - kartu su standartiniu Ruby
   Autsaideris greičio ir saugumo atžvilgiu
   Turi realizacijų, sprendžiančių jo problemas
          eruby
          erubis
          Ember
          rbTenjin
                                                   3
eruby
   C




                4
erubis
   Ruby
   Greitesnis už ERB, eruby
   Keičiamas įterpimo šablonas
   Automatinis eskeipinimas
   Kešavimas (preprocessing)
          [%= link_to 'Create', :action=>'create'%]
   Priima vykdymo nurodymus (processing
     instructions) šablonuose
   Rails 3
                                                       5
erubis




 http://www.kuwata-lab.com/erubis/




                                     6
ember
   Ruby
   Gali automatiškai papildyti trūkstamais
     <% end %> pagal identaciją
   Klaidų pranešimuose naudoja teisingus eilučių
      numerius
   Papildomos instrukcijos
          <%+ "doc/example.erb" %>
   Ruby on Rails


                                                    7
rbTenjin (1/3)
   Lengvas, greitas (greičiausias?)
   Saugus ,,pagal nutylėjimą”
   Layouts, partials
   Konvertuoto kodo kešavimas
   …
   Savybėmis labai panašus į erubis




                                       8
rbTenjin (2/3)




      http://www.kuwata-lab.com/tenjin/
                                          9
rbTenjin (3/3)
###### layout
<html>
 <body>
  <h1>${@title}</h1>
  <div class="main-content">
#{@_content}
  </div>
 ...

###### template
<table>
  <?rb i = 0 ?>
  <?rb for item in @items ?>
  <?rb     i += 1 ?>
  <?rb     color = i % 2 == 0 ? '#FFCCCC' : '#CCCCFF' ?>
    <tr bgcolor="#{color}">
       <td>#{i}</td>
       <td>${item}</td>
    </tr>
  <?rb end ?>
</table>
                                                       10
Kitas požiūris
   TAL
   Smarty-like (Liquid)
   Ruby DSL
   wiki-style
   Kiti :-)




                                  11
TAL
   Template Attribute Language
   Elementai žymimi TAL aprašo atributais
   Validus XML/HTML dokumentas
   Parašytas ,,Zope”
   TALES, METAL
   Ruby realizacijos:
          Amrita/Amrita2
          Kwartz

                                             12
TAL: Amrita (1/3)




        http://amrita.sourceforge.jp/



                                        13
TAL: Amrita (2/3)
   ,,Pure XML/HTML document”
          <? … ?>, <%= … %>
   Išvestį kontroliuoja duomenys
   Gali būti sukompiliuotas į ruby
   Amrita 2




                                      14
TAL: Amrita (3/3)
<table border="1">
  <tr>
    <th>name</th><th>author</th>
  </tr>
  <tr id="table1">
    <td id="name">
    <td id="author">
  </tr>
</table>

# data
data = {
  :table1=>[
    { :name=>"Ruby", :author=>"matz" },
    { :name=>"perl", :author=>"Larry Wall" },
    { :name=>"python", :author=>"Guido van Rossum" },
  ]
}


                                                        15
TAL: Kwartz
   ,,Independence of Presentation Logic”
   Šablonas + šablono logika (plogic)
         #list1 {
           logic: {
             for member in @members
               _stag           # start tag
               _cont           # content
               _etag           # end tag
             end
           }
         }

         <tr id="list1">
           <td id="mark:item1">foo</td>
         </tr>
                                             16
TAL
DHH:
 The pursuit of "no code"-templates reminds
 me of the search for the holy grail of the MDA
 camp with "no code"-programs. It's mirage,
 but its also a play on words of the "a rose by
 any other name..." variety.
                      http://www.loudthinking.com/arc/000405.html




                                                             17
Smarty-like (Liquid)
   Atskira ,,kalba” šablonuose
   Ruby realizacijos:
          Liquid
          Ruty




                                     18
Liquid (1/2)
   Iš ,,Shopify”, naudojamas production'e
   Ruby on Rails
   Saugus
   Sintaksė panaši į Ruby
   Plečiama (tagai, filtrai, blokai)




                                             19
Liquid (2/2)
Hello {{ '*rubyconf*' | textilize | upcase }}


{% if user.name == 'bob' and user.age > 45 %}
  Hello old bob
{% endif %}


# array = [1,2,3,4,5,6]
{% for item in array limit:2 offset:2 %}
  {{ item }}
{% endfor %}
# results in 3,4
                                                20
Ruty
   Ištakos: Django / Jinja Template Engine
   Šablonų paveldėjimas
   Sintaksė visiškai analogiška Liquid (?)
   Papildomos saugumo priemonės
   Lėtesnis už ERB, bet greitesnis už Liquid




                                                21
Ruby DSL
   Priešingai nei ERB/TAL/Liquid, aprašo
     šablonus su ,,pure Ruby”
   Pagrindinis žaidėjas - ,,Markaby”
          ,,Maline” - miręs
          Builder::XmlMarkup – tik XML dokumentams




                                                      22
Ruby DSL: Markaby
   ,,Markup as Ruby”
   Naudojamas ,,Camping” microframework'e
           Lengvai integruojamas į Rails
   Susidūrusiems su DSL, lengvai perprantamas
    html do
      head do
        title 'Products: ' + action_name
        stylesheet_link_tag 'scaffold'
      end
      body do
        p flash[:notice], :style => "color: green"
        self << yield
      end
    end
                                                     23
wiki-style
   Nėra tikrosios ,,šablonų kalbos”
   Skirtos vartotojų įvesčiai apdoroti
   Markdown:
          BlueCloth, Maruku, Kramdown, RDiscount
   Textile:
          RedCloth, ?




                                                    24
Kiti
   HAML
   Radius




                    25
Kiti: HAML (1/2)
   ,,Markup haiku”
   Principai:
          Markup should be DRY
          Markup should be well-intended
          HTML structure should be clear
          Markup should be meaningful
   HAML sesutė CSS'ui: SASS



                                            26
Kiti: HAML (2/2)
   Klasė žymima ., id - #, atributai - (), tag'as - %
    #content
     .left.column
        %h2 Welcome to rubyconf!
        %p= print_information
      .right.column
        = render :partial => "sidebar"


                                                         27
Kiti: Radius
   Šablonų kūrimui
   Leidžia patogiai apibrėžti savo tag'us ir juos
     parsinti
   Šablonas – beveik XML (namespace)
context.define_tag "hello" do |tag|
  "Hello #{tag.attr['name'] || 'World'}!"
end

parser = Radius::Parser.new(context)
parser.parse('<p><radius:hello name="RubyConf" /></p>')




                                                     28
Pabaigai
   Svarbiausia – produktyvumas
   Naudojami:
          ERB plačiąja prasme
          HAML
          Liquid




                                  29
end

?




      30

ERb alternatyvos

  • 1.
    ERb alternatyvos RubyConfLT 2010 VidmantasKabošis vidmantas.kabosis.lt
  • 2.
    Kas yra kas(intro)  Šablono variklis == template engine  Greitis  Saugumas
  • 3.
    ERb  Embedded Ruby  <%= … %>  ERB - kartu su standartiniu Ruby  Autsaideris greičio ir saugumo atžvilgiu  Turi realizacijų, sprendžiančių jo problemas  eruby  erubis  Ember  rbTenjin 3
  • 4.
  • 5.
    erubis  Ruby  Greitesnis už ERB, eruby  Keičiamas įterpimo šablonas  Automatinis eskeipinimas  Kešavimas (preprocessing)  [%= link_to 'Create', :action=>'create'%]  Priima vykdymo nurodymus (processing instructions) šablonuose  Rails 3 5
  • 6.
  • 7.
    ember  Ruby  Gali automatiškai papildyti trūkstamais <% end %> pagal identaciją  Klaidų pranešimuose naudoja teisingus eilučių numerius  Papildomos instrukcijos  <%+ "doc/example.erb" %>  Ruby on Rails 7
  • 8.
    rbTenjin (1/3)  Lengvas, greitas (greičiausias?)  Saugus ,,pagal nutylėjimą”  Layouts, partials  Konvertuoto kodo kešavimas  …  Savybėmis labai panašus į erubis 8
  • 9.
    rbTenjin (2/3) http://www.kuwata-lab.com/tenjin/ 9
  • 10.
    rbTenjin (3/3) ###### layout <html> <body> <h1>${@title}</h1> <div class="main-content"> #{@_content} </div> ... ###### template <table> <?rb i = 0 ?> <?rb for item in @items ?> <?rb i += 1 ?> <?rb color = i % 2 == 0 ? '#FFCCCC' : '#CCCCFF' ?> <tr bgcolor="#{color}"> <td>#{i}</td> <td>${item}</td> </tr> <?rb end ?> </table> 10
  • 11.
    Kitas požiūris  TAL  Smarty-like (Liquid)  Ruby DSL  wiki-style  Kiti :-) 11
  • 12.
    TAL  Template Attribute Language  Elementai žymimi TAL aprašo atributais  Validus XML/HTML dokumentas  Parašytas ,,Zope”  TALES, METAL  Ruby realizacijos:  Amrita/Amrita2  Kwartz 12
  • 13.
    TAL: Amrita (1/3) http://amrita.sourceforge.jp/ 13
  • 14.
    TAL: Amrita (2/3)  ,,Pure XML/HTML document”  <? … ?>, <%= … %>  Išvestį kontroliuoja duomenys  Gali būti sukompiliuotas į ruby  Amrita 2 14
  • 15.
    TAL: Amrita (3/3) <tableborder="1"> <tr> <th>name</th><th>author</th> </tr> <tr id="table1"> <td id="name"> <td id="author"> </tr> </table> # data data = { :table1=>[ { :name=>"Ruby", :author=>"matz" }, { :name=>"perl", :author=>"Larry Wall" }, { :name=>"python", :author=>"Guido van Rossum" }, ] } 15
  • 16.
    TAL: Kwartz  ,,Independence of Presentation Logic”  Šablonas + šablono logika (plogic) #list1 { logic: { for member in @members _stag # start tag _cont # content _etag # end tag end } } <tr id="list1"> <td id="mark:item1">foo</td> </tr> 16
  • 17.
    TAL DHH: The pursuitof "no code"-templates reminds me of the search for the holy grail of the MDA camp with "no code"-programs. It's mirage, but its also a play on words of the "a rose by any other name..." variety. http://www.loudthinking.com/arc/000405.html 17
  • 18.
    Smarty-like (Liquid)  Atskira ,,kalba” šablonuose  Ruby realizacijos:  Liquid  Ruty 18
  • 19.
    Liquid (1/2)  Iš ,,Shopify”, naudojamas production'e  Ruby on Rails  Saugus  Sintaksė panaši į Ruby  Plečiama (tagai, filtrai, blokai) 19
  • 20.
    Liquid (2/2) Hello {{'*rubyconf*' | textilize | upcase }} {% if user.name == 'bob' and user.age > 45 %} Hello old bob {% endif %} # array = [1,2,3,4,5,6] {% for item in array limit:2 offset:2 %} {{ item }} {% endfor %} # results in 3,4 20
  • 21.
    Ruty  Ištakos: Django / Jinja Template Engine  Šablonų paveldėjimas  Sintaksė visiškai analogiška Liquid (?)  Papildomos saugumo priemonės  Lėtesnis už ERB, bet greitesnis už Liquid 21
  • 22.
    Ruby DSL  Priešingai nei ERB/TAL/Liquid, aprašo šablonus su ,,pure Ruby”  Pagrindinis žaidėjas - ,,Markaby”  ,,Maline” - miręs  Builder::XmlMarkup – tik XML dokumentams 22
  • 23.
    Ruby DSL: Markaby  ,,Markup as Ruby”  Naudojamas ,,Camping” microframework'e  Lengvai integruojamas į Rails  Susidūrusiems su DSL, lengvai perprantamas html do head do title 'Products: ' + action_name stylesheet_link_tag 'scaffold' end body do p flash[:notice], :style => "color: green" self << yield end end 23
  • 24.
    wiki-style  Nėra tikrosios ,,šablonų kalbos”  Skirtos vartotojų įvesčiai apdoroti  Markdown:  BlueCloth, Maruku, Kramdown, RDiscount  Textile:  RedCloth, ? 24
  • 25.
    Kiti  HAML  Radius 25
  • 26.
    Kiti: HAML (1/2)  ,,Markup haiku”  Principai:  Markup should be DRY  Markup should be well-intended  HTML structure should be clear  Markup should be meaningful  HAML sesutė CSS'ui: SASS 26
  • 27.
    Kiti: HAML (2/2)  Klasė žymima ., id - #, atributai - (), tag'as - % #content .left.column %h2 Welcome to rubyconf! %p= print_information .right.column = render :partial => "sidebar" 27
  • 28.
    Kiti: Radius  Šablonų kūrimui  Leidžia patogiai apibrėžti savo tag'us ir juos parsinti  Šablonas – beveik XML (namespace) context.define_tag "hello" do |tag| "Hello #{tag.attr['name'] || 'World'}!" end parser = Radius::Parser.new(context) parser.parse('<p><radius:hello name="RubyConf" /></p>') 28
  • 29.
    Pabaigai  Svarbiausia – produktyvumas  Naudojami:  ERB plačiąja prasme  HAML  Liquid 29
  • 30.