From b7e75b21e640ccd8aa7ee1e9827b8b4121e1a2d1 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 2 Jan 2013 18:32:10 -0600 Subject: implement passing new context to partials --- lib/Text/Handlebars/Compiler.pm | 75 ++++++++++++++++++++++++------------ lib/Text/Xslate/Syntax/Handlebars.pm | 10 ++++- t/partials.t | 2 - 3 files changed, 58 insertions(+), 29 deletions(-) diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm index 30aca1a..ada8065 100644 --- a/lib/Text/Handlebars/Compiler.pm +++ b/lib/Text/Handlebars/Compiler.pm @@ -87,14 +87,20 @@ sub _generate_partial { ); } + my $args = $node->second; + if ($args) { + $args = [ $self->new_vars($args) ]; + } + return ( $self->compile_ast( $self->make_ternary( $self->find_file($file->clone), $node->clone( - arity => 'include', - id => 'include', - first => $file->clone, + arity => 'include', + id => 'include', + first => $file->clone, + second => $args, ), $self->literal(''), ), @@ -297,12 +303,6 @@ sub _generate_new_vars { my ($vars, $value, $i) = ($node->first, $node->second, $node->third); - my $value_at_index = $value->clone( - arity => 'field', - first => $value->clone, - second => $i->clone, - ); - my $lvar_id = $self->lvar_id; local $self->{lvar_id} = $self->lvar_use(1); @@ -312,28 +312,50 @@ sub _generate_new_vars { push @code, $self->opcode('save_to_lvar', $lvar_id); my $lvar_value = $value->clone(arity => 'lvar', id => $lvar_id); - push @code, $self->compile_ast( - $self->make_ternary( - $self->is_array_ref($lvar_value->clone), - $self->save_lvar( - $lvar_id, - $self->make_ternary( - $self->is_hash_ref($value_at_index->clone), - $self->merge_hash( + if ($i) { + my $value_at_index = $value->clone( + arity => 'field', + first => $value->clone, + second => $i->clone, + ); + + push @code, $self->compile_ast( + $self->make_ternary( + $self->is_array_ref($lvar_value->clone), + $self->save_lvar( + $lvar_id, + $self->make_ternary( + $self->is_hash_ref($value_at_index->clone), + $self->merge_hash( + $self->make_hash( + $self->literal('.'), + $value_at_index->clone, + ), + $value_at_index->clone, + ), $self->make_hash( $self->literal('.'), $value_at_index->clone, ), - $value_at_index->clone, ), + ), + ), + ); + } + else { + push @code, $self->compile_ast( + $self->make_ternary( + $self->is_array_ref($lvar_value->clone), + $self->save_lvar( + $lvar_id, $self->make_hash( $self->literal('.'), - $value_at_index->clone, + $value->clone, ), ), ), - ), - ); + ); + } push @code, $self->compile_ast( $self->save_lvar( @@ -341,10 +363,13 @@ sub _generate_new_vars { $self->make_ternary( $self->is_hash_ref($lvar_value->clone), $self->merge_hash( - $self->make_hash( - $self->literal('@index'), - $i->clone, - ), + ($i + ? ( + $self->make_hash( + $self->literal('@index'), $i->clone + ) + ) + : ()), $vars->clone, $lvar_value->clone, $self->make_hash( diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index b8854ea..164c03f 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -435,10 +435,16 @@ sub std_partial { my $partial = $self->token->clone(arity => 'literal'); $self->advance; + my $args; + if ($self->token->id ne ';') { + $args = $self->expression(0); + } + $self->advance(';'); return $symbol->clone( - arity => 'partial', - first => ($partial->id =~ /\./ ? $partial : [ $partial ]), + arity => 'partial', + first => ($partial->id =~ /\./ ? $partial : [ $partial ]), + second => $args, ); } diff --git a/t/partials.t b/t/partials.t index ad7f7d9..84ebe58 100644 --- a/t/partials.t +++ b/t/partials.t @@ -5,7 +5,6 @@ use lib 't/lib'; use Test::More; use Test::Handlebars; -{ local $TODO = "unimplemented"; render_ok( { path => [ { 'dude.tx' => '{{#this}}{{name}} ({{url}}) {{/this}}' } ], @@ -20,7 +19,6 @@ render_ok( 'Dudes: Yehuda (http://yehuda) Alan (http://alan) ', "passing a context to partials" ); -} render_ok( { -- cgit v1.2.3