From 70d3df4d85c9a8fb3ac2c2a3cdb4c579e8ee5efc Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 5 Oct 2012 14:57:53 -0500 Subject: special case {{{.}}} (not dealing with {{foo . bar}} in general) --- lib/Text/Xslate/Syntax/Handlebars.pm | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'lib/Text/Xslate') diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index 7a8c3d6..bf10ab5 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -231,12 +231,18 @@ sub init_symbols { $symbol->lbp(10); } + for my $this (qw(. this)) { + my $symbol = $self->symbol($this); + $symbol->arity('variable'); + $symbol->id('.'); + $symbol->lbp(10); + $symbol->set_nud($self->can('nud_variable')); + $symbol->set_led($self->can('led_variable')); + } + $self->infix('.', 256, $self->can('led_dot')); $self->infix('/', 256, $self->can('led_dot')); - $self->symbol('.')->set_nud($self->can('nud_dot')); - $self->symbol('this')->set_nud($self->can('nud_dot')); - $self->symbol('#')->set_std($self->can('std_block')); $self->symbol('^')->set_std($self->can('std_block')); $self->prefix('/', 0)->is_block_end(1); @@ -354,6 +360,13 @@ sub led_dot { my $self = shift; my ($symbol, $left) = @_; + # XXX hack to make {{{.}}} work, but in general this syntax is ambiguous + # and i'm not going to deal with it + if ($left->arity eq 'call' && $left->first->id eq 'mark_raw') { + push @{ $left->second }, $symbol->nud($self); + return $left; + } + my $dot = $self->make_field_lookup($left, $self->token, $symbol); $self->advance; @@ -361,13 +374,6 @@ sub led_dot { return $self->check_lambda($dot); } -sub nud_dot { - my $self = shift; - my ($symbol) = @_; - - return $symbol->clone(arity => 'variable', id => '.'); -} - sub std_block { my $self = shift; my ($symbol) = @_; -- cgit v1.2.3-54-g00ecf