Catalyst-View-Xslate
view release on metacpan or search on metacpan
lib/Catalyst/View/Xslate.pm view on Meta::CPAN
package Catalyst::View::Xslate;
use Moose;
use Moose::Util::TypeConstraints qw(coerce from where via subtype);
use Encode;
use Text::Xslate;
use namespace::autoclean;
use Scalar::Util qw/blessed weaken/;
use File::Find ();
our $VERSION = '0.00019';
extends 'Catalyst::View';
with 'Catalyst::Component::ApplicationAttribute';
has catalyst_var => (
is => 'rw',
isa => 'Str',
default => 'c'
);
has template_extension => (
is => 'rw',
isa => 'Str',
default => '.tx'
);
has content_charset => (
is => 'rw',
isa => 'Str',
default => 'UTF-8'
);
has encode_body => (
is => 'rw',
isa => 'Bool',
default => 1,
);
my $clearer = sub { $_[0]->clear_xslate };
has path => (
is => 'rw',
isa => 'ArrayRef',
trigger => $clearer,
lazy => 1, builder => '_build_path',
);
sub _build_path { return [ shift->_app->path_to('root') ] }
has cache_dir => (
is => 'rw',
isa => 'Str',
trigger => $clearer,
);
has cache => (
is => 'rw',
isa => 'Int',
default => 1,
trigger => $clearer,
);
has function => (
is => 'rw',
isa => 'HashRef',
default => sub { +{} },
lib/Catalyst/View/Xslate.pm view on Meta::CPAN
}
sub BUILD {
my $self = shift;
if ($self->preload) {
$self->preload_templates();
}
}
sub preload_templates {
my $self = shift;
my ( $paths, $suffix ) = ( $self->path, $self->suffix );
my $xslate = $self->xslate;
foreach my $path (@$paths) {
File::Find::find( sub {
if (/\Q$suffix\E$/) {
my $file = $File::Find::name;
$file =~ s/\Q$path\E .//xsm;
$xslate->load_file($file);
}
}, $path);
}
}
sub process {
my ($self, $c) = @_;
my $stash = $c->stash;
my $template = $stash->{template} || $c->action . $self->template_extension;
if (! defined $template) {
$c->log->debug('No template specified for rendering') if $c->debug;
return 0;
}
my $output = eval {
$self->render( $c, $template, $stash );
};
if (my $err = $@) {
return $self->_rendering_error($c, $err);
}
my $res = $c->response;
if (! $res->content_type) {
$res->content_type('text/html; charset=' . $self->content_charset);
}
if ( $self->encode_body ) {
$res->body( encode($self->content_charset, $output) );
}
else {
$res->body( $output );
}
return 1;
}
sub build_exposed_method {
my ( $self, $ctx, $code ) = @_;
my $weak_ctx = $ctx;
weaken $weak_ctx;
return sub { $self->$code($weak_ctx, @_) };
}
sub render {
my ($self, $c, $template, $vars) = @_;
$vars = $vars ? $vars : $c->stash;
if ($self->has_expose_methods) {
foreach my $exposed_method( keys %{$self->expose_methods} ) {
if(my $code = $self->can( $self->expose_methods->{$exposed_method} )) {
$vars->{$exposed_method} = $self->build_exposed_method($c, $code);
} else {
Catalyst::Exception->throw( "$exposed_method not found in Xslate view" );
}
}
}
local $vars->{ $self->catalyst_var } =
$vars->{ $self->catalyst_var } || $c;
if(ref $template eq 'SCALAR') {
return $self->xslate->render_string( $$template, $vars );
} else {
return $self->xslate->render($template, $vars );
}
}
sub _rendering_error {
my ($self, $c, $err) = @_;
my $error = qq/Couldn't render template "$err"/;
$c->log->error($error);
$c->error($error);
return 0;
}
__PACKAGE__->meta->make_immutable();
1;
__END__
=head1 NAME
Catalyst::View::Xslate - Text::Xslate View Class
=head1 SYNOPSIS
package MyApp::View::Xslate;
use Moose;
extends 'Catalyst::View::Xslate';
1;
=head1 VIEW CONFIGURATION
You may specify the following configuration items in from your config file
or directly on the view object.
( run in 1.503 second using v1.01-cache-2.11-cpan-98e64b0badf )