Skip to content

Commit

Permalink
\#4 Mojo::Template renderer is almost over
Browse files Browse the repository at this point in the history
  • Loading branch information
Artie Kh committed Jan 24, 2013
1 parent dacb927 commit ece7ad7
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 45 deletions.
12 changes: 12 additions & 0 deletions examples/base/fwapp.pl
Expand Up @@ -113,6 +113,18 @@
$self->render(text => "Get cookie: $p1/$p2");
};

get '/render/mojo' => sub {
my $self = shift;

$self->stash(
title => 'Test',
head => 'Head',
p => 'Paragraph',
);

$self->render(template => 'mojo.ep');
};

app->secret('verysecret');
app->start;

Expand Down
10 changes: 10 additions & 0 deletions examples/base/templates/mojo.ep
@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<title><%= $title %></title>
</head>
<body>
<h1><%= $head %></h1>
<p><%= $p %></p>
</body>
</html>
35 changes: 23 additions & 12 deletions lib/Kompot/Config.pm
Expand Up @@ -7,49 +7,60 @@ use utf8;
use v5.12;

use FindBin qw($Bin);
#use YAML::XS qw(LoadFile);

use base 'Kompot::Base';

sub init {
my $self = shift;

my $root = $self->{app_root} = $Bin;
$self->{app_root} = $Bin;

my $config_file = '';
my $config = '';#LoadFile();
$self->{_config} = $config;
# default template paths
$self->renderer_paths('/templates');
}

sub cache_ttl { 5 }

#
# Paths
#
sub root { shift->{app_root} }
sub static { shift->{app_root} . '/static' }

#
# Templates
# Renderer
#
sub renderer {
my ($self, $renderer) = @_;
$self->{renderer} = $renderer if $renderer;
return $self->{renderer} || 'Kompot::Renderer::MojoTemplate';
}

sub renderer_paths {
my ($self, $path) = @_;
push(@{ $self->{template_paths} }, $self->root . $path) if $path;
return $self->{template_paths};
}

#
# Cookie
#
sub secret {
my ($self, $secret) = @_;
$self->{_secret} = $secret if $secret;
return $self->{_secret};
$self->{secret} = $secret if $secret;
return $self->{secret};
}

sub cookie_name {
my ($self, $name) = @_;
$self->{_cookie_name} = $name if $name;
return $self->{_cookie_name} || 'kompot';
$self->{cookie_name} = $name if $name;
return $self->{cookie_name} || 'kompot';
}

sub cookie_expires {
my ($self, $expires) = @_;
$self->{_cookie_expires} = $expires if $expires;
return $self->{_cookie_expires} || 60 * 60; # one hour by default
$self->{cookie_expires} = $expires if $expires;
return $self->{cookie_expires} || 60 * 60; # one hour by default
}

1;
Expand Down
11 changes: 5 additions & 6 deletions lib/Kompot/Renderer.pm
Expand Up @@ -12,6 +12,7 @@ use Carp;
use base 'Kompot::Base';

use Kompot::Renderer::JSON;
use Kompot::Renderer::MojoTemplate;
use Kompot::Renderer::Static;
use Kompot::Renderer::Text;
use Kompot::Response;
Expand All @@ -37,16 +38,14 @@ sub dynamic {
if (defined($json)) {
$r = Kompot::Renderer::JSON->new->render(json => $json);
}
elsif (defined($template)) {
# Xslate
# TT2
# Mojo::Template
croak 'renderer not defined';
}
# Text
elsif (defined($text)) {
$r = Kompot::Renderer::Text->new->render(text => $text, params => $p);
}
elsif (defined($template)) {
my $renderer = $self->app->conf->renderer;
$r = $renderer->new->render($template, %$p);
}
else {
$r = $self->internal_error('No renderer');
}
Expand Down
49 changes: 22 additions & 27 deletions lib/Kompot/Renderer/MojoTemplate.pm
Expand Up @@ -7,42 +7,36 @@ use utf8;
use v5.12;

use Carp;
use DDP { output => 'stdout' };
use File::Spec::Functions 'catfile';
use Mojo::Template;

use base 'Kompot::Base';

use Kompot::Response;

sub init {
my $self = shift;

my $conf = $self->app->conf;

my $cache_dir = $conf->cache_dir;
my @paths = $conf->template_paths;

$self->{mt} = Mojo::Template->new(encoding => 'UTF-8');

return 1;
# TODO update stash code or think of something else
sub stash {
my ($self, $key) = @_;
return $key ? $self->{stash}{$key} : $self->{stash};
}

sub stash {die}
sub helpers {die}
sub register_default_helpers {die}
sub add_helper {die}
sub paths {die}

sub helpers {}
sub register_default_helpers {}
sub add_helper {}

sub render {
my ($self, %p) = @_;
my ($self, $name, %p) = @_;

my $name = delete($p{template});
my $tmpl = $self->_template_path($name) or return;
# set stash
$self->{stash} = \%p;

my $tmpl = $self->_template_path($name) or return;
my $out = $self->_process($tmpl) or return;

while (my $extends = $self->_extends($self)) {
my $self->stash(content => $out);
$self->stash(content => $out);
$tmpl = $self->_template_path($extends) or return;
$out = $self->_process($tmpl) or return;
}
Expand All @@ -60,7 +54,9 @@ sub _template_path {

return if not $name;

for my $path (@{ $self->{paths} }) {
my $paths = $self->app->conf->renderer_paths;

for my $path (@$paths) {
my $file = catfile($path, split('/', $name));
return $file if -r $file;
}
Expand All @@ -75,7 +71,7 @@ sub _extends {
my $stash = $self->stash;
my $layout = delete $stash->{layout};

$stash->{extends} ||= join('/', 'layouts', $layout);
$stash->{extends} ||= join('/', 'layouts', $layout) if $layout;

return delete $stash->{extends};
}
Expand Down Expand Up @@ -109,15 +105,14 @@ my $_H = $self->helpers;

$prepend =~ s/\R//gs;

my $mt = $self->{mt};
my $mt = Mojo::Template->new(encoding => 'UTF-8');
$mt->prepend($prepend);

my $out = $mt->name($tmpl)->render_file($tmpl, $self);

if (ref $out) {
carp 'Rendering file failed: ' . $out->to_string;
return;
}
# TODO: Detect fails
# if rendering failed Mojo::Template does not tell us about it anything
# and just returns an error as a plain text, the same as it do in success

return $out;
}
Expand Down

0 comments on commit ece7ad7

Please sign in to comment.