package Dancer::Template::TemplateToolkit; our $AUTHORITY = 'cpan:SUKRIA'; #ABSTRACT: Template Toolkit wrapper for Dancer $Dancer::Template::TemplateToolkit::VERSION = '1.3521'; use strict; use warnings; use Carp; use Dancer::Config 'setting'; use Dancer::ModuleLoader; use Dancer::Exception qw(:all); use base 'Dancer::Template::Abstract'; my $_engine; sub init { my ($self) = @_; my $class = $self->config->{subclass} || "Template"; raise core_template => "$class is needed by Dancer::Template::TemplateToolkit" if !$class->can("process") and !Dancer::ModuleLoader->load($class); my $charset = setting('charset') || ''; my @encoding = length($charset) ? ( ENCODING => $charset ) : (); my $is_subclass = $class ne 'Template'; my @anycase = $is_subclass ? () : ( ANYCASE => 1 ); my @absolute = $is_subclass ? () : ( ABSOLUTE => 1 ); my @inc_path = $is_subclass ? () : ( INCLUDE_PATH => $self->config->{INCLUDE_PATH} || setting('views') ); my $start_tag = $is_subclass ? $self->config->{start_tag} : $self->config->{start_tag} || '<%'; my $stop_tag = $is_subclass ? $self->config->{stop_tag} || $self->config->{end_tag} : $self->config->{stop_tag} || $self->config->{end_tag} || '%>'; # TT expects quotemeta()'ed values here to be used as-is within # its regexp-based tokenizer. To support existing Dancer users who # prefer the default TT tags and who've already figured this out, # let's skip this if the tags are already ok. # Just FYI: TT hardcodes '\[%' and '%\]' as default. # my @start = (); if (defined $start_tag) { @start = ( START_TAG => $start_tag eq '\[%' || $start_tag eq '\[\%' ? $start_tag : quotemeta($start_tag) ); } my @stop = (); if (defined $stop_tag) { @stop = ( END_TAG => $stop_tag eq '%\]' || $stop_tag eq '\%\]' ? $stop_tag : quotemeta($stop_tag) ); } my @embedded = (); if ($self->config->{embedded_templates}) { Dancer::ModuleLoader->load('Template::Provider::FromDATA') or croak "The Package Template::Provider::FromDATA must be installed to use embedded_templates"; @embedded = ( LOAD_TEMPLATES => [Template::Provider::FromDATA->new()] ); } my $tt_config = { @anycase, @absolute, @encoding, @inc_path, @start, @stop, @embedded, %{$self->config}, }; $_engine = $class->new(%$tt_config); } sub set_wrapper { my ($self, $when, $file) = @_; my $wrappers = $_engine->{SERVICE}->{WRAPPER}; unless (defined $file) { $file = $when; my @orig = @$wrappers; $self->{orig_wrappers} = \@orig; @$wrappers = ($file); return; } if ($when eq 'outer') { unshift @$wrappers => $file; } elsif ($when eq 'inner') { push @$wrappers => $file; } else { raise core_template => "'$when' isn't a valid identifier"; } } sub reset_wrapper { my ($self) = @_; my $wrappers = $_engine->{SERVICE}->{WRAPPER}; my $orig = $self->{orig_wrappers} || []; my @old = @$wrappers; @$wrappers = @$orig; return @old; } sub unset_wrapper { my ($self, $when) = @_; my $wrappers = $_engine->{SERVICE}->{WRAPPER}; if ($when eq 'outer') { return shift @$wrappers; } elsif ($when eq 'inner') { return pop @$wrappers; } else { raise core_template => "'$when' isn't a valid identifier"; } } sub render { my ($self, $template, $tokens) = @_; $self->view_exists($template) or raise core_template => "'$template' doesn't exist or not a regular file"; my $content = ""; my $charset = setting('charset') || ''; my @options = length($charset) ? ( binmode => ":encoding($charset)" ) : (); $_engine->process($template, $tokens, \$content, @options) or raise core_template => $_engine->error; return $content; } sub view_exists { my ($self, $view) = @_; return 1 if ref $view; if ($self->config->{embedded_templates}) { eval { $_engine->context->template($view); }; return ! $@; } return -f $view; } sub view { my ($self, $view) = @_; if ($self->config->{embedded_templates}) { return $view; } else { $self->SUPER::view($view); } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Dancer::Template::TemplateToolkit - Template Toolkit wrapper for Dancer =head1 VERSION version 1.3521 =head1 DESCRIPTION This class is an interface between Dancer's template engine abstraction layer and the L