From c4ec8e689764348f2e6d56e46b192209187033a2 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 27 Sep 2012 13:55:35 -0500 Subject: basic implementation of raw strings --- lib/Text/Xslate/Syntax/Handlebars.pm | 49 ++++++++++++++++++++++++++++++++++-- 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( '

{{title}}

{{{body}}}

', - { title => 'All about

Tags', body => 'This is a post about <p> tags' }, + { title => 'All About

Tags', body => 'This is a post about <p> tags' }, ), '

All About <p> Tags

This is a post about <p> tags

', ); -# 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( '

{{title}}

{{{body}}}

', - { title => Handlebars::SafeString->new('All about <p> Tags'), body => 'This is a post about <p> tags' }, + { title => mark_raw('All About <p> Tags'), body => 'This is a post about <p> tags' }, ), '

All About <p> Tags

This is a post about <p> tags

', ); -- cgit v1.2.3-54-g00ecf