diff options
author | Jesse Luehrs <doy@tozt.net> | 2012-10-03 15:05:25 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2012-10-03 15:08:29 -0500 |
commit | b6b1bd1936ea207c74ecf0993bd3b7c55c71ec57 (patch) | |
tree | 6c67d41ca8ceedb1daeecce1fec877a46108e7e1 /lib/Text/Xslate | |
parent | bbec479a424eda0bc48250c118aaad85ddb6ee00 (diff) | |
download | text-handlebars-b6b1bd1936ea207c74ecf0993bd3b7c55c71ec57.tar.gz text-handlebars-b6b1bd1936ea207c74ecf0993bd3b7c55c71ec57.zip |
make basic lambdas work (not block lambdas yet)
Diffstat (limited to 'lib/Text/Xslate')
-rw-r--r-- | lib/Text/Xslate/Syntax/Handlebars.pm | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index d8f2f9a..70e6506 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -181,6 +181,23 @@ sub nud_name { } } +sub nud_variable { + my $self = shift; + my ($symbol) = @_; + + my $var = $self->SUPER::nud_variable(@_); + + return $self->make_ternary( + $self->call('(is_code)', $var->clone), + $self->call( + '(run_code)', + $var->clone, + $self->symbol('(vars)')->clone(arity => 'vars'), + ), + $var, + ); +} + sub led_dot { my $self = shift; my ($symbol, $left) = @_; @@ -206,7 +223,8 @@ sub std_block { my $inverted = $symbol->id eq '^'; my $name = $self->expression(0); - if ($name->arity ne 'variable' && $name->arity ne 'field') { + # variable lookups are parsed into a ternary expression, hence arity 'if' + if ($name->arity ne 'if' && $name->arity ne 'field') { $self->_unexpected("opening block name", $self->token); } $self->advance(';'); @@ -216,7 +234,7 @@ sub std_block { $self->advance('/'); my $closing_name = $self->expression(0); - if ($closing_name->arity ne 'variable' && $closing_name->arity ne 'field') { + if ($closing_name->arity ne 'if' && $closing_name->arity ne 'field') { $self->_unexpected("closing block name", $self->token); } if ($closing_name->id ne $name->id) { # XXX |