Your SlideShare is downloading. ×

Erubis徹底解説

7,413
views

Published on

(RubyKaigi 2009 発表資料) …

(RubyKaigi 2009 発表資料)
Erubisとは、高速かつ高機能なeRubyライブラリです。本発表では、Erubisの機能と拡張性の高さについて、またeRubyにまつわる諸問題とErubisによる解決策について説明します。またこれらに関連して、テンプレートシステムの将来について私見を披露します。eRubyごときでこんなに考えなきゃいけないことがあるんだと知っていただければ幸いです。

Published in: Technology

0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,413
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
30
Comments
0
Likes
13
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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