diff options
-rw-r--r-- | lib/Text/Xslate/Syntax/Handlebars.pm | 49 | ||||
-rw-r--r-- | t/003-safestring.t | 9 |
2 files changed, 50 insertions, 8 deletions
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index 357faca..4fb230c 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -107,7 +107,7 @@ sub preprocess { $code .= qq{$content;\n}; } elsif ($type eq 'raw_code') { - $code .= qq{& $content;\n}; + $code .= qq{mark_raw $content;\n}; } else { $self->_error("Oops: Unknown token: $content ($type)"); @@ -123,11 +123,56 @@ sub preprocess { sub init_symbols { my $self = shift; + my $name = $self->symbol('(name)'); + $name->set_led($self->can('led_name')); + $name->lbp(1); + + $self->infix('.', 256, $self->can('led_dot')); + $self->infix('/', 256, $self->can('led_dot')); } sub nud_name { my $self = shift; - return $self->nud_variable(@_); + my ($symbol) = @_; + + if ($symbol->is_defined) { + return $self->SUPER::nud_name(@_); + } + else { + return $self->nud_variable(@_); + } +} + +sub led_name { + my $self = shift; + my ($symbol, $left) = @_; + + if ($left->arity eq 'name') { + return $self->call($left, $symbol->nud($self)); + } + else { + ... + } +} + +sub led_dot { + my $self = shift; + my ($symbol, $left) = @_; + + my $token = $self->token; + if (!$self->is_valid_field($token)) { + $self->_unexpected("a field name", $token); + } + + my $dot = $symbol->clone( + arity => 'field', + first => $left, + second => $token->clone(arity => 'literal'), + ); + + $self->advance; + + return $dot; } __PACKAGE__->meta->make_immutable; diff --git a/t/003-safestring.t b/t/003-safestring.t index 77aa7de..8e095ea 100644 --- a/t/003-safestring.t +++ b/t/003-safestring.t @@ -1,7 +1,7 @@ use strict; use warnings; use Test::More; -use Text::Xslate; +use Text::Xslate 'mark_raw'; my $tx = Text::Xslate->new(syntax => 'Handlebars'); @@ -16,18 +16,15 @@ is( is( $tx->render_string( '<h1>{{title}}</h1><p>{{{body}}}</p>', - { title => 'All about <p> Tags', body => '<i>This is a post about <p> tags</i>' }, + { title => 'All About <p> Tags', body => '<i>This is a post about <p> tags</i>' }, ), '<h1>All About <p> Tags</h1><p><i>This is a post about <p> tags</i></p>', ); -# XXX I'm not sure what the safestring constructor should be called -# it's effectively Handlebars::SafeString->new($str) in JS -# maybe we can just use Text::Xslate's mark_raw directly is( $tx->render_string( '<h1>{{title}}</h1><p>{{{body}}}</p>', - { title => Handlebars::SafeString->new('All about <p> Tags'), body => '<i>This is a post about <p> tags</i>' }, + { title => mark_raw('All About <p> Tags'), body => '<i>This is a post about <p> tags</i>' }, ), '<h1>All About <p> Tags</h1><p><i>This is a post about <p> tags</i></p>', ); |