summary refs log tree commit diff
path: root/lib/Dancer/Template
diff options
context:
space:
mode:
authorRichard Simões <rsimoes@cpan.org>2011-12-09 10:09:17 -0600
committerRichard Simões <rsimoes@cpan.org>2011-12-09 10:09:17 -0600
commit495c00a71e8937eb9fd6f85657c8b7d097f1dfba (patch)
tree0fa7c861f34880858b42b9f61c09684bb137c656 /lib/Dancer/Template
parentMerge pull request #4 from fayland/master (diff)
downloaddancer-template-xslate-495c00a71e8937eb9fd6f85657c8b7d097f1dfba.tar.gz
add dzil plugins, use File::Spec exclusively instead of regular expressions
Diffstat (limited to 'lib/Dancer/Template')
-rw-r--r--lib/Dancer/Template/Xslate.pm64
1 files changed, 32 insertions, 32 deletions
diff --git a/lib/Dancer/Template/Xslate.pm b/lib/Dancer/Template/Xslate.pm
index d3b062b..203089d 100644
--- a/lib/Dancer/Template/Xslate.pm
+++ b/lib/Dancer/Template/Xslate.pm
@@ -1,57 +1,57 @@
 package Dancer::Template::Xslate;
 
-# ABSTRACT: Text::Xslate wrapper for Dancer
 
 use strict;
 use warnings;
 
-use Text::Xslate;
+use Carp;
 use Dancer::App;
-use File::Spec;
+use File::Spec::Functions qw(splitpath);
+use Text::Xslate;
 
 use base 'Dancer::Template::Abstract';
 
-my $_engine;
+# VERSION
+# ABSTRACT: Text::Xslate wrapper for Dancer
 
-sub default_tmpl_ext { "tx" }
+# Note: The standard Xslate template extension is
+# "tx" but kept to "tt" for backward compatibility.
 
 sub init {
-    my $self = shift;
-
-    my %args = (
-        %{$self->config},
-    );
+    my ($self) = @_;
+    my $config = $self->config;
+    my $app    = Dancer::App->current;
+    my %xslate_args = %{$config};
 
     ## set default path for header/footer etc.
-    $args{path} ||= [];
-    my $view_dir = Dancer::App->current->setting('views');
-    push @{$args{path}}, $view_dir unless grep { $_ eq $view_dir } @{$args{path}};
-    
-    ## for those people read Text::Xslate instead of Dancer::Template::Abstract
-    $self->config->{extension} = $args{suffix} if exists $args{suffix};
-    # avoid 'Text::Xslate: Unknown option(s): extension'
-    $args{suffix} = delete $args{extension}    if exists $args{extension};
-    
-    $_engine = Text::Xslate->new(%args);
+    $xslate_args{path} ||= [];
+    my $views_dir = $config->{views_dir} = $app->setting('views');
+    push @{$xslate_args{path}}, $views_dir
+        if not grep { $_ eq $views_dir } @{$xslate_args{path}};
+
+    ## for those who read Text::Xslate instead of Dancer::Template::Abstract
+    $config->{extension} = $xslate_args{suffix}
+        if exists $xslate_args{suffix};
+
+    ## avoid 'Text::Xslate: Unknown option(s): extension'
+    $xslate_args{suffix} = delete $xslate_args{extension}
+        if exists $xslate_args{extension};
+
+    $self->{driver} = Text::Xslate->new(%xslate_args);
+    return;
 }
 
 sub render {
     my ($self, $template, $tokens) = @_;
-    
-    # absolute filename will never work under Windows even we hard set path as ['/']
-    my $view_dir = Dancer::App->current->setting('views');
-    if ( $view_dir ) {
-        $view_dir = File::Spec->catdir( File::Spec->splitdir($view_dir) ) if $^O eq 'MSWin32'; # dirty Win32 fixes for / \
-        $template =~ s/^\Q$view_dir\E//;
-    }
+    my $config = $self->config;
 
-    my $content = eval {
-        $_engine->render($template, $tokens)
-    };
+    my $views_dir = $self->config->{views_dir};
+    (undef, undef, $template) = splitpath $template if $views_dir;
+    my $xslate = $self->{driver};
+    my $content = $xslate->render($template, $tokens);
 
     if (my $err = $@) {
-        my $error = qq/Couldn't render template "$err"/;
-        die $error;
+        croak qq[Couldn't render template "$err"];
     }
 
     return $content;