summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-01-02 18:32:10 -0600
committerJesse Luehrs <doy@tozt.net>2013-01-02 18:32:10 -0600
commitb7e75b21e640ccd8aa7ee1e9827b8b4121e1a2d1 (patch)
treec859ef6a565cbb9ed47026cb0fe82ec7fc3b87e0
parente84a7c1f51e84f26b0edd611c122c6ed92939261 (diff)
downloadtext-handlebars-b7e75b21e640ccd8aa7ee1e9827b8b4121e1a2d1.tar.gz
text-handlebars-b7e75b21e640ccd8aa7ee1e9827b8b4121e1a2d1.zip
implement passing new context to partials
-rw-r--r--lib/Text/Handlebars/Compiler.pm75
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm10
-rw-r--r--t/partials.t2
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(
{