summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-05 14:57:53 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-05 14:57:53 -0500
commit70d3df4d85c9a8fb3ac2c2a3cdb4c579e8ee5efc (patch)
treeff52abd3d62c651743c7b65961b6459f43712a70
parent350dde80bbe03ebf2f2d1168e259106c0e4a6f18 (diff)
downloadtext-handlebars-70d3df4d85c9a8fb3ac2c2a3cdb4c579e8ee5efc.tar.gz
text-handlebars-70d3df4d85c9a8fb3ac2c2a3cdb4c579e8ee5efc.zip
special case {{{.}}} (not dealing with {{foo . bar}} in general)
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm26
-rw-r--r--t/expressions.t2
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(
"<foo> <foo>",
"{{{.}}}"
);
-}
render_ok(
'{{foo-bar}}',