package Mojolicious::Plugin::EPRenderer; use Mojo::Base 'Mojolicious::Plugin::EPLRenderer'; use Mojo::Template; use Mojo::Util qw(encode md5_sum monkey_patch); sub DESTROY { Mojo::Util::_teardown(shift->{namespace}) } sub register { my ($self, $app, $conf) = @_; # Auto escape by default to prevent XSS attacks my $ep = {auto_escape => 1, %{$conf->{template} // {}}, vars => 1}; my $ns = $self->{namespace} = $ep->{namespace} //= 'Mojo::Template::Sandbox::' . md5_sum "$self"; # Make "$self" and "$c" available in templates $ep->{prepend} = 'my $self = my $c = _C;' . ($ep->{prepend} // ''); # Add "ep" handler and make it the default $app->renderer->default_handler('ep')->add_handler( $conf->{name} || 'ep' => sub { my ($renderer, $c, $output, $options) = @_; my $name = $options->{inline} // $renderer->template_name($options); return unless defined $name; my $key = md5_sum encode 'UTF-8', $name; my $cache = $renderer->cache; my $mt = $cache->get($key); $cache->set($key => $mt = Mojo::Template->new($ep)) unless $mt; # Export helpers only once ++$self->{helpers} and _helpers($ns, $renderer->helpers) unless $self->{helpers}; # Make current controller available and render with "epl" handler no strict 'refs'; no warnings 'redefine'; local *{"${ns}::_C"} = sub {$c}; Mojolicious::Plugin::EPLRenderer::_render($renderer, $c, $output, $options, $mt, $c->stash); } ); } sub _helpers { my ($class, $helpers) = @_; for my $method (grep {/^\w+$/} keys %$helpers) { my $sub = $helpers->{$method}; monkey_patch $class, $method, sub { $class->_C->$sub(@_) }; } } 1; =encoding utf8 =head1 NAME Mojolicious::Plugin::EPRenderer - Embedded Perl renderer plugin =head1 SYNOPSIS # Mojolicious $app->plugin('EPRenderer'); $app->plugin(EPRenderer => {name => 'foo'}); $app->plugin(EPRenderer => {name => 'bar', template => {line_start => '.'}}); # Mojolicious::Lite plugin 'EPRenderer'; plugin EPRenderer => {name => 'foo'}; plugin EPRenderer => {name => 'bar', template => {line_start => '.'}}; =head1 DESCRIPTION L is a renderer for Embedded Perl templates. For more information see L. This is a core plugin, that means it is always enabled and its code a good example for learning to build new plugins, you're welcome to fork it. See L for a list of plugins that are available by default. =head1 OPTIONS L supports the following options. =head2 name # Mojolicious::Lite plugin EPRenderer => {name => 'foo'}; Handler name, defaults to C. =head2 template # Mojolicious::Lite plugin EPRenderer => {template => {line_start => '.'}}; Attribute values passed to L objects used to render templates. =head1 METHODS L inherits all methods from L and implements the following new ones. =head2 register $plugin->register(Mojolicious->new); $plugin->register(Mojolicious->new, {name => 'foo'}); Register renderer in L application. =head1 SEE ALSO L, L, L. =cut