From ea9eea98c6772ad528b9902dfd97ffe48f6bed22 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 3 Oct 2012 13:12:56 -0500 Subject: implement custom delimiters --- lib/Text/Xslate/Syntax/Handlebars.pm | 27 +++++++++++++++++---------- t/mustache-spec.t | 5 ++++- t/mustache.t | 2 +- 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; -- cgit v1.2.3