tenjin - the fastest template engine in the world
DESCRIPTION
Tenjin is a very fast and compact template engine. It is similar to eRuby or PHP, but it has many features such as layout template, caching, preprocessing, and so on. In addition, Tenjin is available in Perl, Python, Ruby, PHP, and JavaScript.TRANSCRIPT
![Page 1: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/1.jpg)
The Fastest Template Engine in the World
Makoto Kuwatahttp://www.kuwata-lab.com/
Tenjin
YAPC::ASIA 20081
![Page 2: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/2.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Agenda
‣ Introduction
‣ Features
‣ Preprocessing
‣ Conclusion
2
![Page 3: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/3.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Introduction
YAPC::ASIA 20083
![Page 4: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/4.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Tenjin - a template engine‣ Very fast•About x5 faster than Template-Toolkit
‣ Full-featured•Layout, partial, capturing, ...
‣ Easy to use•You can get all power of Perl
‣ Multi-language•Perl, Python, Ruby, PHP, JavaScript
4
![Page 5: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/5.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Example (html template)
<table> <?pl my $i = 0; ?> <?pl for my $item (@$items) { ?> <?pl $i++; ?> <tr> <td>[==$i=]</td> <td>[=$item=]</td> </tr> <?pl } ?> </table>
Perl statements
Perl expression
Perl expression(with html escape)
5
![Page 6: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/6.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Example (converted script)
my @_buf = (); push(@_buf, q`<table>`, ); my $i = 0;for my $item (@$items) { $i++;push(@_buf, q` <tr> <td>`, $i, q`</td> <td>`, escape($item), q`</td> </tr>`, ); }push(@_buf, q`</table>`, ); join('', @_buf);
Returns joined String
Escape function is changeable
Temporary list
6
![Page 7: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/7.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Example (main program)
## create engineuse Tenjin;$Tenjin::USE_STRICT=1; # optionalmy $engine = new Tenjin::Engine();
## render template with context datamy $context = { 'items' => ['<AAA>','B&B','"CCC"'] };my $output = $engine->render('ex.plhtml', $context);print $output;
Choosable to use strict or not
7
![Page 8: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/8.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Example (output)<table> <tr> <td>1</td> <td><AAA></td> </tr> <tr> <td>2</td> <td>B&B</td> </tr> <tr> <td>3</td> <td>"CCC"</td> </tr> </table>
Spaces around '<?pl .. ?>' are trimmed
[=expression=] is html escaped
8
![Page 9: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/9.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Benchmark
Tenjin 10.4 5.7Template::Toolkit (XS) 103.6 26.3
HTM::Template 46.7 30.2Velocity 1.5 (Java) 20.8 8.4
Template Engine Test#1 Test#2
(sec)• Generates a 400-line HTML page 10,000 times• Test#1 generates template objects for each time (like CGI)• Test#2 uses the same template object for each time (like modperl)• Environment: MacOS X 10.4, Intel CoreDuo 1.83GHz
9
![Page 10: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/10.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Benchmark
0
500
1,000
1,500
2,000
Tenjin TT H::T Velocity
Test#1 Test#2Pages/sec
10
![Page 11: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/11.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Why so fast?
‣ Tenjin uses Perl as the template lang
•Perl is fast, rich, and easy to learn (because you already know it!)
‣ Other template engines have their own template languages
•Slow, poor, and you have to learn them
11
![Page 12: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/12.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Impact to app speed (1)
after
before
0 25 50 75 100
M&C V
• Assume that the view-layer costs 25%.• Making view-layer 5 times faster results in a 25% speed increase.
25% faster!
75 25
75 5
12
![Page 13: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/13.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Impact to app speed (2)
after
before
0 25 50 75 100
M&C V
• Assume the view-layer costs 60%.• Making the view-layer 6 times faster results in a 100% speed increase.
100% faster!
40 60
40 10
13
![Page 14: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/14.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Features
YAPC::ASIA 200814
![Page 15: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/15.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Features‣ Nestable layout
templates
‣ Include partial templates
‣ Capture a part of output
‣ Override a part of layout template
‣ Script cache into file & memory
‣ Template arguments
‣ Retrieve only code from template
‣ Syntax checking
15
![Page 16: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/16.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Nestable layout template
<html> <body>[==$_content=] </body></html>
<div>[==$_content=]</div>
Parent layout Child layout Content
<p>Hello [=$user=]!</p>
• Nestable to any depth• Able to specify parent name in child
(useful to change the layout for a specific page)
16
![Page 17: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/17.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Include partial template
<?pl $_context->{val}='Create'; ?><form action="create"><?pl include('form.plhtml'); ?></form>
create.plhtml
<?pl $_context->{val}='Update'; ?><form action="update"><?pl include('form.plhtml'); ?></form>
update.plhtml<input><select><textarea>
form.plhtml
17
![Page 18: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/18.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Capture & overwrite
<?pl if (!captured_as('head')) { ?><h1>[=$title=]</h1><?pl } ?>
Layout
<?pl start_capture('head'); ?><h1 class="h1">[=$title=]</h1><?pl stop_capture(); ?>
Content
Capturing
Overwritten if captured in child template
18
![Page 19: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/19.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Script cache
Template
Script(Perl,Ruby,JS,...)
Closure, Proc
Cache script into file(minimize cost of conversion)
Cache script into memory(as fast as function/method)
19
![Page 20: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/20.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Template arguments
<?xml version="1.0" ?><?pl #@ARGS title, items ?><h1>[=$title=]</h1>
my @_buf=(); push(@_buf, ...);my $title = $_context->{title}; my $items = $_context->{items}; push(@_buf, ...);
Script
Template
20
![Page 21: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/21.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Retrieve code
<table><?pl my $i = 0; ?><?pl for my $item in (@$items) { ?><?pl $i += 1; ?> <tr> <td>[==$i=]</td> <td>[=$item=]</td> </tr><?pl } ?></table>
$ cat file.plhtml
21
![Page 22: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/22.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Retrieve code
my $i = 0; for my $item in (@$items) { $i += 1;
$i; escape($item);
}
$ pltenjin -bS file.plhtml
Retrieve only Perl code
22
![Page 23: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/23.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Retrieve code
my $i = 0; for my $item in (@$items) { $i += 1;
}
$ pltenjin -bX file.plhtml
Retrieve only statements
23
![Page 24: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/24.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Retrieve code
1: 2: my $i = 0; 3: for my $item in (@$items) { 4: $i += 1; 5: 6: 7: 8: 9: }10:
$ pltenjin -bXN file.plhtml
Add line numbers
24
![Page 25: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/25.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Retrieve code
1: 2: my $i = 0; 3: for my $item in (@$items) { 4: $i += 1;
9: }
$ pltenjin -bXU file.plhtml
Compress empty lines
25
![Page 26: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/26.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Preprocessing
YAPC::ASIA 200826
![Page 27: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/27.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
What is Preprocessing?
Template
Script(Perl,Ruby,JS,...)
Output(html)
convert
render
Logics are executedwhen rendering
Execute some logicswhen conversion(preprocessing)
27
![Page 28: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/28.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Stages
<p>[=$DOMAIN=]</p> <p>[*=$DOMAIN=*]</p>
preprocess
convert
<p>example.com</p>
push(@_buf, q`<p>`, $DOMAIN, q`</p>`, );
render
<p>example.com</p>
convert
push(@_buf, q`<p>example.com</p>`, );
preprocessing disabled preprocessing enabled
render
<p>example.com</p>
28
![Page 29: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/29.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Merits & Demerits
‣ Merits
• Makes view-layer much faster
• Removes costs of I18N/L10N, helper functions, and so on.
‣ Demerits
• Complex
• Hard to debug (line number will be changed)
• Expensive learning cost
29
![Page 30: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/30.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Notation
‣ <?PL ...statements... ?>
‣ [*== ...expression... =*]
‣ [*= ...expr (with html escape)... =*]
‣ _p("expression"), _P("expression")•returns "[=expression=]", "[==expression=]"
30
![Page 31: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/31.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
I18N & L10NTemplate
Preprocessed
[=i18n('Hello')=] [=$name=]![*=i18n('Hello')=*] [=$name=]!
[=i18n('Hello')=] [=$name=]!こんにちは [=$name=]!
push(@_buf, i18n('Hello'), ' ', $name, '!こんにちは ', $name, '!', ); ...
Converted Script
Remove I18N overhead
preprocess
convert
31
![Page 32: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/32.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Helper functions[*= link_to(_P('$item->{name}'), { action=>'show', id=>_p('$item->{id}') }) =*]
<a href="/items/show/[==$item->{id}=]"> [=$item->{name}=]</a>
Eliminates cost of helper funcions
_p('x') <=> [=x=], _P('x') <=> [==x=]
Template
Preprocessedpreprocess
32
![Page 33: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/33.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Loop expansionTemplate
Preprocessed
<select><?PL my $i = 0; ?><?PL for my $m (@$months) { ?> <option value="[[==++$i=]]">[[=$m=]]</option><?PL } ?></select>
<select> <option value="1">January</option> <option value="2">February</option> <option value="3">March</option> ...</select> Expanded BEFORE rendering
preprocessExecuted at conversion statge
33
![Page 34: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/34.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Mixed preprocessing(1)Template
<select><?pl my %h = ($params->{month} => ' selected'); ?><?PL my $i = 0; ?><?PL for my $m (@$months) { ?> <option value="[*==++$i=*]"[==$h{[*==$i=*]}=]>[*=$m=*]</option><?PL } ?></select> Mixed preprocessing
34
![Page 35: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/35.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Mixed preprocessing(2)Preprocessed
<select><?pl my %h = ($params->{month} => ' selected'); ?> <option value="1"[==$h{1}=]>January</option> <option value="2"[==$h{2}=]>February</option> <option value="3"[==$h{3}=]>March</option> ...</select>
Non-preprocessing code is leaved
35
![Page 36: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/36.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Conclusion
YAPC::ASIA 200836
![Page 37: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/37.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Conclusion (1)
‣ Tenjin - a fast template engine•Very fast & lightweight
•Full-featured
•Easy to use
•Preprocessing
•Available in multi-language
•http://www.kuwata-lab.com/tenjin/
37
![Page 38: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/38.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Conclusion (2)
‣ Template-original lang is bad idea•Slow, poor, complicated
•High cost to learn
‣ Perl itself is the best template lang
•Fast, rich, simple
•You already know it very well!
38
![Page 39: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/39.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Any questions?
39
![Page 40: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/40.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
One more minute...
40
![Page 41: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/41.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Kwartz - Designer Friendly Template System
<?xml ver="1.0" ?><html><body><table> <tr id="mark:list1"> <td id="mark:item1">foo</td> </tr></table></body></html>
#list1 { logic: { for my $item (@$items) { _stag; # start tag _cont; # content _etag; # end tag } }}
#item1 { value: $item; # print value}
template file presentation logic file
Plain Old HTML CSS-like Syntax
Interested?Go http://www.kuwata-lab.com/kwartz/
41
![Page 42: Tenjin - the fastest template engine in the world](https://reader034.vdocuments.mx/reader034/viewer/2022052522/554b0607b4c905fa6d8b4756/html5/thumbnails/42.jpg)
copyright(c) 2008 kuwata-lab.com all rights reserved.
Thank You
42