summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-05 12:31:26 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-05 12:38:34 -0500
commite8a83edb85216a9f6978a99c77cc196db5cb4c44 (patch)
tree2c59f9ef7ecdbf87919093812576ca9872e4520d
parent9191972488f91494a77025d27a2150a202dd0c1c (diff)
downloadtext-handlebars-e8a83edb85216a9f6978a99c77cc196db5cb4c44.tar.gz
text-handlebars-e8a83edb85216a9f6978a99c77cc196db5cb4c44.zip
implement {{^}} as an alias for {{else}}
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm4
-rw-r--r--t/block-helpers.t94
-rw-r--r--t/blocks.t45
3 files changed, 143 insertions, 0 deletions
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm
index ee4639c..c08cee9 100644
--- a/lib/Text/Xslate/Syntax/Handlebars.pm
+++ b/lib/Text/Xslate/Syntax/Handlebars.pm
@@ -64,6 +64,10 @@ sub split_tags {
$input =~ s/\A\Q$close_tag//
or die "Oops!";
+ # XXX this is ugly, but i don't know how to get the parsing
+ # right otherwise if we also need to support ^foo
+ $code = 'else' if $code eq '^';
+
my @extra;
my $autochomp = $code =~ m{^[!#^/=>]} || $code eq 'else';
diff --git a/t/block-helpers.t b/t/block-helpers.t
index 961b2dc..ac6f54f 100644
--- a/t/block-helpers.t
+++ b/t/block-helpers.t
@@ -375,4 +375,98 @@ RENDERED
);
}
+render_ok(
+ {
+ function => {
+ list => sub {
+ my ($context, $items, $options) = @_;
+
+ if (@$items) {
+ my $out = '<ul>';
+ for my $item (@$items) {
+ $out .= '<li>';
+ $out .= $options->{fn}->($item);
+ $out .= '</li>';
+ }
+ $out .= '</ul>';
+ return $out;
+ }
+ else {
+ return '<p>' . $options->{inverse}->($context) . '</p>';
+ }
+ },
+ },
+ },
+ q[{{#list people}}{{name}}{{^}}<em>Nobody's here</em>{{/list}}],
+ {
+ people => [
+ { name => 'Alan' },
+ { name => 'Yehuda' },
+ ],
+ },
+ q[<ul><li>Alan</li><li>Yehuda</li></ul>],
+ "helper with inverse"
+);
+
+render_ok(
+ {
+ function => {
+ list => sub {
+ my ($context, $items, $options) = @_;
+
+ if (@$items) {
+ my $out = '<ul>';
+ for my $item (@$items) {
+ $out .= '<li>';
+ $out .= $options->{fn}->($item);
+ $out .= '</li>';
+ }
+ $out .= '</ul>';
+ return $out;
+ }
+ else {
+ return '<p>' . $options->{inverse}->($context) . '</p>';
+ }
+ },
+ },
+ },
+ q[{{#list people}}{{name}}{{^}}<em>Nobody's here</em>{{/list}}],
+ {
+ people => [],
+ },
+ q[<p><em>Nobody's here</em></p>],
+ "helper with inverse (empty)"
+);
+
+render_ok(
+ {
+ function => {
+ list => sub {
+ my ($context, $items, $options) = @_;
+
+ if (@$items) {
+ my $out = '<ul>';
+ for my $item (@$items) {
+ $out .= '<li>';
+ $out .= $options->{fn}->($item);
+ $out .= '</li>';
+ }
+ $out .= '</ul>';
+ return $out;
+ }
+ else {
+ return '<p>' . $options->{inverse}->($context) . '</p>';
+ }
+ },
+ },
+ },
+ q[{{#list people}}Hello{{^}}{{message}}{{/list}}],
+ {
+ people => [],
+ message => "Nobody's here",
+ },
+ q[<p>Nobody&#39;s here</p>],
+ "helper with inverse (inverse has variables)"
+);
+
done_testing;
diff --git a/t/blocks.t b/t/blocks.t
index e34ef36..153a8a9 100644
--- a/t/blocks.t
+++ b/t/blocks.t
@@ -70,4 +70,49 @@ render_ok(
"empty block"
);
+{ local $TODO = "unimplemented";
+render_ok(
+ '{{#people}}{{name}}{{^}}{{none}}{{/people}}',
+ {
+ none => 'No people',
+ },
+ 'No people',
+ "inverted block shorthand"
+);
+
+render_ok(
+ '{{#people}}{{name}}{{^}}{{none}}{{/people}}',
+ {
+ none => 'No people',
+ people => [],
+ },
+ 'No people',
+ "inverted block shorthand (empty array)"
+);
+
+render_ok(
+ <<'TEMPLATE',
+{{#people}}
+{{name}}
+{{^}}
+{{none}}
+{{/people}}
+TEMPLATE
+ {
+ none => 'No people',
+ people => [
+ 'Jesse Luehrs',
+ 'Shawn Moore',
+ 'Stevan Little',
+ ],
+ },
+ <<'RENDERED',
+Jesse Luehrs
+Shawn Moore
+Stevan Little
+RENDERED
+ "inverted block shorthand (non-empty array)"
+);
+}
+
done_testing;