From 3c19ea0a5a6868510d163420278d28c7eb46610c Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 3 Oct 2012 10:47:21 -0500 Subject: make comments.json spectest pass --- lib/Text/Xslate/Syntax/Handlebars.pm | 27 ++++++++++++++++++++------- t/expressions.t | 2 -- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm index 9bd1366..831ad7b 100644 --- a/lib/Text/Xslate/Syntax/Handlebars.pm +++ b/lib/Text/Xslate/Syntax/Handlebars.pm @@ -6,6 +6,8 @@ use Text::Xslate::Util qw($STRING neat p); extends 'Text::Xslate::Parser'; +my $nl = qr/\x0d?\x0a/; + sub _build_identity_pattern { qr/[A-Za-z_][A-Za-z0-9_?]*/ } sub _build_comment_pattern { qr/\![^;]*/ } @@ -32,6 +34,7 @@ sub split_tags { my @chunks; my $close_tag; + my $standalone = 1; while ($input) { if ($close_tag) { my $start = 0; @@ -50,6 +53,13 @@ sub split_tags { $input =~ s/\A\Q$close_tag// or die "Oops!"; + if ($code =~ m{^[!#^/]} && $standalone) { + $input =~ s/\A$nl//; + if (@chunks > 0 && $chunks[-1][0] eq 'text') { + $chunks[-1][1] =~ s/^(?:(?!\n)\s)*\z//m; + } + } + push @chunks, [ ($close_tag eq '}}}' ? 'raw_code' : 'code'), $code @@ -70,7 +80,16 @@ sub split_tags { } } elsif ($input =~ s/\A$lex_text//) { - push @chunks, [ text => $1 ]; + my $text = $1; + if (length($text)) { + push @chunks, [ text => $text ]; + if ($standalone) { + $standalone = $text =~ /(?:^|\n)\s*$/; + } + else { + $standalone = $text =~ /\n\s*$/; + } + } } else { confess "Oops: unreached code, near " . p($input); @@ -97,21 +116,15 @@ sub preprocess { my @chunks = $self->split_tags($input); my $code = ''; - my $suppress_newline; for my $chunk (@chunks) { my ($type, $content) = @$chunk; if ($type eq 'text') { $content =~ s/(["\\])/\\$1/g; - $content =~ s/^\n// - if $suppress_newline; $code .= qq{print_raw "$content";\n} if length($content); - $suppress_newline = 0; } elsif ($type eq 'code') { $code .= qq{$content;\n}; - $suppress_newline = 1 - if $content =~ m{^[#^/]}; } elsif ($type eq 'raw_code') { $code .= qq{mark_raw $content;\n}; diff --git a/t/expressions.t b/t/expressions.t index c2e928c..4cdc403 100644 --- a/t/expressions.t +++ b/t/expressions.t @@ -45,7 +45,6 @@ render_ok( "backtracking with ../" ); -{ local $TODO = "autochomping issues"; render_ok( <<'TEMPLATE', {{#page}} @@ -63,7 +62,6 @@ TEMPLATE RENDERED "multilevel backtracking with ../" ); -} render_ok( '{{#article}}

{{title}}

- {{../metadata.date}}{{/article}}', -- cgit v1.2.3-54-g00ecf