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 ++++++++++++++++---------- t/expressions.t | 2 -- 2 files changed, 16 insertions(+), 12 deletions(-) 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) = @_; diff --git a/t/expressions.t b/t/expressions.t index 55c2a5d..fae632c 100644 --- a/t/expressions.t +++ b/t/expressions.t @@ -136,7 +136,6 @@ render_ok( "'this' with paths" ); -{ local $TODO = "unimplemented"; render_ok( '{{#thing}}{{{.}}} {{{this}}}{{/thing}}', { @@ -145,7 +144,6 @@ render_ok( " ", "{{{.}}}" ); -} render_ok( '{{foo-bar}}', -- cgit v1.2.3