53
テテテテテテテテテテテテテ Changing Template Engine YAPC::Asia 2010 Tokyo Takatsugu Shigeta

Changing Template Engine

Embed Size (px)

DESCRIPTION

YAPC::Asia Tokyo 2010 Day 1 テンプレートエンジンの移行

Citation preview

Page 1: Changing Template Engine

テンプレートエンジンの移行Changing Template Engine

YAPC::Asia 2010 TokyoTakatsugu Shigeta

Page 2: Changing Template Engine

@comewalk #sixapartkk #typepad

Page 3: Changing Template Engine

Q. Have you used any template engine?

Page 4: Changing Template Engine

Q. Which engine?

Page 5: Changing Template Engine

HTML::Template

Template 

Text::MicroTemplate

Tenjin

MENTA::Template

Mojo::Template

MTML

Text::ClearSilver

Text::Xslate

Page 6: Changing Template Engine

Migratingfrom HTML::Templateto Template Toolkit

Page 7: Changing Template Engine

HTML::Template

Page 8: Changing Template Engine

<TMPL_VAR NAME=foo>

TMPL_VAR, TMPL_IF, TMPL_UNLESS, TMPL_ELSE,

TMPL_LOOP, TMPL_INCLUDE

Page 9: Changing Template Engine

 

use HTML::Template;

my $tmpl = HTML::Template->new(filename => 'sample_html_template.tmpl');$tmpl->param('home', '/home/shigeta');$tmpl->param('path', 'path/to');say $tmpl->output;

Page 10: Changing Template Engine

 

<body>My Home Directory is <TMPL_VAR NAME=HOME><br />My Path is set to <TMPL_VAR NAME=PATH></body>

Page 11: Changing Template Engine

Template Toolkit

Page 12: Changing Template Engine

[% foo %]

GET, IF, UNLESS, ELSE, FOR, INCLUDE(and others )

Page 13: Changing Template Engine

 use Template;

my $tmpl = Template->new;my $vars = {    'home' => '/home/shigeta',    'path' => 'path/to',};

my $output;$tmpl->process('sample_template_toolkit.tt', $vars, \$output);say $output;

Page 14: Changing Template Engine

 

<body>My Home Directory is [% home %]<br />My Path is set to [% path %]</body>

Page 15: Changing Template Engine

History

Page 16: Changing Template Engine
Page 17: Changing Template Engine

Motivation

Page 18: Changing Template Engine

* borrow their templates

* unnecessary code on handler

Page 19: Changing Template Engine

borrow their templates

Page 20: Changing Template Engine

unnecessary code on handler

sub handler {    $param->{'user_id'} = $user->id;    $param->{'blog_id'} = $blog->id;    $app->build_page("foobar.tmpl", $param);}

Page 21: Changing Template Engine

unnecessary code on handler

sub handler {    $param->{'user_id'} = $user->id;    $param->{'blog_id'} = $blog->id;    $param->{'user_name'} = $user->name;    $param->{'blog_url'} = $blog->url;    $app->build_page("foobar.tmpl", $param);}

Page 22: Changing Template Engine

schedule

Page 23: Changing Template Engine

This graph is rough estimates :)

Page 24: Changing Template Engine

operations

Page 25: Changing Template Engine

run convert script

Page 26: Changing Template Engine

TMPL_VAR -> [% foo %]TMPL_IF -> [% IF %]

TMPL_UNLESS -> [% UNLESS %]

TMPL_ELSE ->[%  ELSE %]TMPL_LOOP -> [% FOR %]

TMPL_INCLUDE -> [% INCLUDE%]

MT_TRANS -> [% |loc %]foo[% END %]

Page 27: Changing Template Engine

 

$ converter <filename><html>     :     :</html>

Page 28: Changing Template Engine

$data =~ s!(<(/?)TMPL_([^\s>]+)([^>]*)>)!munge($1, $2, $3, $4)!ge;

$data =~ s!<MT_TRANS ([^>]+)>!munge_locale($1)!ge;

Page 29: Changing Template Engine

Tips

Page 30: Changing Template Engine

* Don't use reserved keywords* Don't use camel case variable name* Don't use underscore at first letter like _foo* MT_TRANS multi params

Page 31: Changing Template Engine

Don't use reserved keywords

<TMPL_VAR NAME=TAGS>

[% tags %]

Page 32: Changing Template Engine

Don't use reserved keywords

<TMPL_VAR NAME=TAGS>

[% tags %]          # NG[% GET tags %] # OK

Page 33: Changing Template Engine

Don't use camel case variable name

<TMPL_VAR NAME=USERNAME>

[% username %]

  # Syntax is OK. But didn't see user name :(

Page 34: Changing Template Engine

Don't use camel case variable name

<TMPL_VAR NAME=USERNAME>

[% username %]

# see the handler code$param->{UserName} = $user->name;

Page 35: Changing Template Engine

Don't use camel case variable name

<TMPL_VAR NAME=USERNAME>

[% username %]  # NG

$param->{UserName} = $user->name;

[% UserName %]    # OK :)

Page 36: Changing Template Engine

Don't use underscore at first letter like _foo

Any key in a hash which starts with a '_' or '.' character will be considered private and cannot be evaluated or updated from within a template.

via Template::Manual::Variables

Page 37: Changing Template Engine

MT_TRANS multi params 

[error] processing openid_login.tt: file error - parse error - openid_login.tt line 312: unexpected end of input

Page 38: Changing Template Engine

MT_TRANS multi params 

<MT_TRANSphrase="<a href="[_1]">[_2]</a> is the next category." params="<$MTCategoryArchiveLink$>%%<$MTCategoryLabel$>">

Page 39: Changing Template Engine

sequence

Page 40: Changing Template Engine
Page 41: Changing Template Engine

TypePad::View::TT

A wrapper class for TTwhich  bridges the gap

between HTML::Template and Template Toolkit

Page 42: Changing Template Engine

 use Template;

my $tmpl = Template->new;my $vars = {    'home' => '/home/shigeta',    'path' => 'path/to',};

my $output;$tmpl->process('sample_template_toolkit.tt', $vars, \$output);say $output;

Page 43: Changing Template Engine

 

use HTML::Template;

my $tmpl = HTML::Template->new(filename => 'sample_html_template.tmpl');$tmpl->param('home', '/home/shigeta');$tmpl->param('path', 'path/to');say $tmpl->output;

Page 44: Changing Template Engine

 

use TypePad::View::TT;

my $tmpl = TypePad::View:TT->new(filename => 'sample_html_template.tmpl');$tmpl->param('home', '/home/shigeta');$tmpl->param('path', 'path/to');say $tmpl->output;

Page 45: Changing Template Engine

 package TypePad::View::TT;

sub new {    $self->{engine} = Template->new; }sub param {    my ($key, $val) = @_;    $self->{var}->{$key} = $val;   }sub process {    $self->{engine}->process;}

*output = \&process;

Page 46: Changing Template Engine

sequence [after]

Page 47: Changing Template Engine
Page 48: Changing Template Engine

Benchmark

Page 49: Changing Template Engine

compare processing speed

Template:           0.0173818HTML::Template: 0.0157874 using Time::HiRes

CentOS 4.6 (64bit), Perl v5.8.9,$Template::VERSION 2.15

$HTML::Template::VERSION 2.8

Page 50: Changing Template Engine

in near future,Text::Xslate

Page 51: Changing Template Engine

 

Embrace Change

- Extreme Programming

Page 52: Changing Template Engine

Questions?

Page 53: Changing Template Engine

Thank you for your attention!