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 )