summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-09-27 13:55:35 -0500
committerJesse Luehrs <doy@tozt.net>2012-09-27 13:55:35 -0500
commitc4ec8e689764348f2e6d56e46b192209187033a2 (patch)
treed09077aafb4dbe8d4e810423f0ed642fd4d89c29
parenta96361ab84452a83bdca37e37c5438f41c5e2be1 (diff)
downloadtext-handlebars-c4ec8e689764348f2e6d56e46b192209187033a2.tar.gz
text-handlebars-c4ec8e689764348f2e6d56e46b192209187033a2.zip
basic implementation of raw strings
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm49
-rw-r--r--t/003-safestring.t9
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 &lt;p&gt; tags</i>' },
+ { title => 'All About <p> Tags', body => '<i>This is a post about &lt;p&gt; tags</i>' },
),
'<h1>All About &lt;p&gt; Tags</h1><p><i>This is a post about &lt;p&gt; 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 &lt;p&gt; Tags'), body => '<i>This is a post about &lt;p&gt; tags</i>' },
+ { title => mark_raw('All About &lt;p&gt; Tags'), body => '<i>This is a post about &lt;p&gt; tags</i>' },
),
'<h1>All About &lt;p&gt; Tags</h1><p><i>This is a post about &lt;p&gt; tags</i></p>',
);