File Coverage

blib/lib/Mojolicious/Plugin/EPRenderer.pm
Criterion Covered Total %
statement 40 40 100.0
branch 5 6 83.3
condition 11 15 73.3
subroutine 88 88 100.0
pod 1 1 100.0
total 145 150 96.6


line stmt bran cond sub pod time code
1             package Mojolicious::Plugin::EPRenderer;
2 52     206   423 use Mojo::Base 'Mojolicious::Plugin::EPLRenderer';
  52         133  
  52         417  
3              
4 52     182   382 use Mojo::Template;
  52         155  
  52         370  
5 52     182   292 use Mojo::Util qw(encode md5_sum monkey_patch);
  52         118  
  52         23727  
6              
7 38     168   7183 sub DESTROY { Mojo::Util::_teardown(shift->{namespace}) }
8              
9             sub register {
10 110     240 1 392 my ($self, $app, $conf) = @_;
11              
12             # Auto escape by default to prevent XSS attacks
13 110   100     270 my $ep = {auto_escape => 1, %{$conf->{template} // {}}, vars => 1};
  110         1144  
14 110   66     1854 my $ns = $self->{namespace} = $ep->{namespace} //= 'Mojo::Template::Sandbox::' . md5_sum "$self";
15              
16             # Make "$self" and "$c" available in templates
17 110   100     778 $ep->{prepend} = 'my $self = my $c = _C;' . ($ep->{prepend} // '');
18              
19             # Add "ep" handler and make it the default
20             $app->renderer->default_handler('ep')->add_handler(
21             $conf->{name} || 'ep' => sub {
22 512     642   1473 my ($renderer, $c, $output, $options) = @_;
23              
24 512   66     2454 my $name = $options->{inline} // $renderer->template_name($options);
25 512 50       1558 return unless defined $name;
26 512         2208 my $key = md5_sum encode 'UTF-8', $name;
27              
28 512         2323 my $cache = $renderer->cache;
29 512         2053 my $mt = $cache->get($key);
30 512 100       3263 $cache->set($key => $mt = Mojo::Template->new($ep)) unless $mt;
31              
32             # Export helpers only once
33 512 100 33     2471 ++$self->{helpers} and _helpers($ns, $renderer->helpers) unless $self->{helpers};
34              
35             # Make current controller available and render with "epl" handler
36 52     182   455 no strict 'refs';
  52         164  
  52         2860  
37 52     182   340 no warnings 'redefine';
  52         116  
  52         30848  
38 512         3200 local *{"${ns}::_C"} = sub {$c};
  512         4238  
  2596         11527  
39 512         2325 Mojolicious::Plugin::EPLRenderer::_render($renderer, $c, $output, $options, $mt, $c->stash);
40             }
41 110   100     565 );
42             }
43              
44             sub _helpers {
45 40     170   153 my ($class, $helpers) = @_;
46 40         1438 for my $method (grep {/^\w+$/} keys %$helpers) {
  3506         7603  
47 2705         5174 my $sub = $helpers->{$method};
48 2705     2405   10763 monkey_patch $class, $method, sub { $class->_C->$sub(@_) };
  2275     2244   24768  
        2244      
        2398      
        2528      
        2658      
        2788      
        2918      
        3048      
        3178      
        3308      
        3438      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3598      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3568      
        3698      
        3698      
        3568      
        3568      
        3568      
        3568      
        3568      
        3746      
        3746      
        3724      
        3698      
        3698      
        3698      
        3698      
        3568      
        3568      
        3568      
        3568      
        3568      
        1354      
        1170      
        1040      
        910      
        780      
        650      
        520      
        390      
        260      
        130      
        893      
49             }
50             }
51              
52             1;
53              
54             =encoding utf8
55              
56             =head1 NAME
57              
58             Mojolicious::Plugin::EPRenderer - Embedded Perl renderer plugin
59              
60             =head1 SYNOPSIS
61              
62             # Mojolicious
63             $app->plugin('EPRenderer');
64             $app->plugin(EPRenderer => {name => 'foo'});
65             $app->plugin(EPRenderer => {name => 'bar', template => {line_start => '.'}});
66              
67             # Mojolicious::Lite
68             plugin 'EPRenderer';
69             plugin EPRenderer => {name => 'foo'};
70             plugin EPRenderer => {name => 'bar', template => {line_start => '.'}};
71              
72             =head1 DESCRIPTION
73              
74             L is a renderer for Embedded Perl templates. For more information see
75             L.
76              
77             This is a core plugin, that means it is always enabled and its code a good example for learning to build new plugins,
78             you're welcome to fork it.
79              
80             See L for a list of plugins that are available by default.
81              
82             =head1 OPTIONS
83              
84             L supports the following options.
85              
86             =head2 name
87              
88             # Mojolicious::Lite
89             plugin EPRenderer => {name => 'foo'};
90              
91             Handler name, defaults to C.
92              
93             =head2 template
94              
95             # Mojolicious::Lite
96             plugin EPRenderer => {template => {line_start => '.'}};
97              
98             Attribute values passed to L objects used to render templates.
99              
100             =head1 METHODS
101              
102             L inherits all methods from L and implements the
103             following new ones.
104              
105             =head2 register
106              
107             $plugin->register(Mojolicious->new);
108             $plugin->register(Mojolicious->new, {name => 'foo'});
109              
110             Register renderer in L application.
111              
112             =head1 SEE ALSO
113              
114             L, L, L.
115              
116             =cut