summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm27
-rw-r--r--t/mustache-spec.t5
-rw-r--r--t/mustache.t2
3 files changed, 22 insertions, 12 deletions
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm
index 6f48f1b..d8f2f9a 100644
--- a/lib/Text/Xslate/Syntax/Handlebars.pm
+++ b/lib/Text/Xslate/Syntax/Handlebars.pm
@@ -24,10 +24,6 @@ sub split_tags {
my $tag_start = $self->tag_start;
my $tag_end = $self->tag_end;
- # 'text' is a something without newlines
- # follwoing a newline, $tag_start, or end of the input
- my $lex_text = qr/\A ( [^\n]*? (?: \n | (?= \Q$tag_start\E ) | \z ) ) /xms;
-
my $lex_comment = $self->comment_pattern;
my $lex_code = qr/(?: $lex_comment | (?: $STRING | [^'"] ) )/xms;
@@ -53,7 +49,16 @@ sub split_tags {
$input =~ s/\A\Q$close_tag//
or die "Oops!";
- if ($code =~ m{^[!#^/]} && $standalone) {
+ my $autochomp = $code =~ m{^[!#^/=]};
+
+ if ($code =~ s/^=\s*([^\s]+)\s+([^\s]+)\s*=$//) {
+ ($tag_start, $tag_end) = ($1, $2);
+ }
+ elsif ($code =~ /^=/) {
+ die "Invalid delimiter tag: $code";
+ }
+
+ if ($autochomp && $standalone) {
if ($input =~ /\A\s*(?:\n|\z)/) {
$input =~ s/\A$nl//;
if (@chunks > 0 && $chunks[-1][0] eq 'text') {
@@ -62,10 +67,12 @@ sub split_tags {
}
}
- push @chunks, [
- ($close_tag eq '}}}' ? 'raw_code' : 'code'),
- $code
- ];
+ if (length($code)) {
+ push @chunks, [
+ ($close_tag eq '}}}' ? 'raw_code' : 'code'),
+ $code
+ ];
+ }
undef $close_tag;
}
@@ -81,7 +88,7 @@ sub split_tags {
$close_tag = $tag_end;
}
}
- elsif ($input =~ s/\A$lex_text//) {
+ elsif ($input =~ s/\A([^\n]*?(?:\n|(?=\Q$tag_start\E)|\z))//) {
my $text = $1;
if (length($text)) {
push @chunks, [ text => $text ];
diff --git a/t/mustache-spec.t b/t/mustache-spec.t
index e97848d..9829b04 100644
--- a/t/mustache-spec.t
+++ b/t/mustache-spec.t
@@ -11,10 +11,13 @@ for my $file (dir('t', 'mustache-spec', 'specs')->children) {
next unless $file =~ /\.json$/;
next if $file->basename =~ /^~/; # for now
next if $file->basename =~ /partials/;
- local $TODO = "unimplemented" if $file->basename =~ /delimiters/;
my $tests = decode_json($file->slurp);
diag("running " . $file->basename . " tests");
for my $test (@{ $tests->{tests} }) {
+ local $TODO = "unimplemented"
+ if $file->basename eq 'delimiters.json'
+ && $test->{name} =~ /partial/i;
+
render_ok(
$test->{template},
$test->{data},
diff --git a/t/mustache.t b/t/mustache.t
index d1b98d2..6da8dd8 100644
--- a/t/mustache.t
+++ b/t/mustache.t
@@ -176,6 +176,7 @@ render_file_ok(
EXPECTED
"partials"
);
+}
render_ok(
<<'TEMPLATE',
@@ -197,6 +198,5 @@ TEMPLATE
RENDERED
"set delimiter"
);
-}
done_testing;