Skip to content

Commit

Permalink
Add an inline_layout stash keyword, based on the mojo.js inlineLayout…
Browse files Browse the repository at this point in the history
… one.
  • Loading branch information
mkende committed Dec 5, 2021
1 parent c05b4ea commit 2c65608
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 4 deletions.
4 changes: 4 additions & 0 deletions lib/Mojolicious/Guides/Rendering.pod
Expand Up @@ -530,6 +530,10 @@ as a render argument (not a stash value).

my $html = $c->render_to_string('reminder', layout => 'mail');

Layouts can also be passed inline, using the C<inline_layout> value.

my $text = $c->render(inline => 'text', inline_layout => '<%== content %>');

=head2 Partial templates

You can break up bigger templates into smaller, more manageable chunks. These partial templates can also be shared with
Expand Down
19 changes: 15 additions & 4 deletions lib/Mojolicious/Renderer.pm
Expand Up @@ -108,11 +108,13 @@ sub render {
# Inheritance
my $content = $stash->{'mojo.content'} //= {};
local $content->{content} = $output =~ /\S/ ? $output : undef if $stash->{extends} || $stash->{layout};
if ($stash->{inline_layout}) {
$options->{inline} = delete $stash->{inline_layout};
local $stash->{handler} = $options->{handler};
$self->_render_content($c, undef, $options, \$output);
}
while ((my $next = _next($stash)) && !defined $inline) {
@$options{qw(handler template)} = ($stash->{handler}, $next);
$options->{format} = $stash->{format} || $self->default_format;
if ($self->_render_template($c, \my $tmp, $options)) { $output = $tmp }
$content->{content} //= $output if $output =~ /\S/;
$self->_render_content($c, $next, $options, \$output);
}

return $output if $stash->{'mojo.string'};
Expand Down Expand Up @@ -214,6 +216,15 @@ sub _next {
return join '/', 'layouts', $layout;
}

sub _render_content {
my ($self, $c, $next, $options, $output) = @_;
my $stash = $c->stash;
@$options{qw(handler template)} = ($stash->{handler}, $next);
$options->{format} = $stash->{format} || $self->default_format;
if ($self->_render_template($c, \my $tmp, $options)) { $$output = $tmp }
$stash->{'mojo.content'}->{content} //= $$output if $$output =~ /\S/;
}

sub _render_template {
my ($self, $c, $output, $options) = @_;

Expand Down
10 changes: 10 additions & 0 deletions t/mojolicious/layouted_lite_app.t
Expand Up @@ -97,6 +97,11 @@ get '/content_with';

get '/inline' => {inline => '<%= "inline!" %>'};

get '/inline/inline_layout' => sub {
my $c = shift;
$c->render(inline => '<%= "inline!" %>', inline_layout => 'layouted_inline <%== content %>');
};

get '/inline/again' => {inline => 0};

get '/data' => {data => 0};
Expand Down Expand Up @@ -254,6 +259,11 @@ subtest 'Inline template' => sub {
$t->get_ok('/inline')->status_is(200)->header_is(Server => 'Mojolicious (Perl)')->content_is("inline!\n");
};

subtest 'Inline with layout' => sub {
$t->get_ok('/inline/inline_layout')->status_is(200)->header_is(Server => 'Mojolicious (Perl)')
->content_is("layouted_inline inline!\n\n");
};

subtest '"0" inline template' => sub {
$t->get_ok('/inline/again')->status_is(200)->header_is(Server => 'Mojolicious (Perl)')->content_is("0\n");
};
Expand Down

0 comments on commit 2c65608

Please sign in to comment.