summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-05 13:55:56 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-05 13:55:56 -0500
commit350dde80bbe03ebf2f2d1168e259106c0e4a6f18 (patch)
treef70c1ba2a6849887adf75b1027c1667959f10542
parentab64f8c31f63d5be9fb109fb062bb562064553b9 (diff)
downloadtext-handlebars-350dde80bbe03ebf2f2d1168e259106c0e4a6f18.tar.gz
text-handlebars-350dde80bbe03ebf2f2d1168e259106c0e4a6f18.zip
implement {{^}} in normal blocks
also, greatly simplify the logic for blocks in general
-rw-r--r--lib/Text/Handlebars.pm9
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm111
-rw-r--r--t/blocks.t4
3 files changed, 53 insertions, 71 deletions
diff --git a/lib/Text/Handlebars.pm b/lib/Text/Handlebars.pm
index 7316ce8..cb5c6b5 100644
--- a/lib/Text/Handlebars.pm
+++ b/lib/Text/Handlebars.pm
@@ -15,9 +15,14 @@ sub default_functions {
my ($val) = @_;
return ref($val) && ref($val) eq 'ARRAY';
},
- '(is_empty_array)' => sub {
+ '(is_falsy)' => sub {
my ($val) = @_;
- return @$val == 0;
+ if (ref($val) && ref($val) eq 'ARRAY') {
+ return @$val == 0;
+ }
+ else {
+ return !$val;
+ }
},
'(make_array)' => sub {
my ($length) = @_;
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm
index 940d30d..7a8c3d6 100644
--- a/lib/Text/Xslate/Syntax/Handlebars.pm
+++ b/lib/Text/Xslate/Syntax/Handlebars.pm
@@ -438,82 +438,55 @@ sub std_block {
$block{if}{raw_text}->clone,
($block{else}
? $block{else}{raw_text}->clone
- : $self->symbol('(literal)')->clone(id => '')),
+ : $self->literal('')),
$self->vars,
@{ $name->second },
),
);
}
- if ($block{else}) {
- $self->_error("else block unsupported except with a block helper, "
- . "and $name_string is not a block helper");
+ if ($inverted) {
+ ($block{if}, $block{else}) = ($block{else}, $block{if});
+ if (!$block{if}) {
+ $block{if}{body} = $self->literal('');
+ $block{if}{raw_text} = $self->literal('');
+ $block{if}{open_tag} = $block{else}{open_tag};
+ $block{if}{close_tag} = $block{else}{close_tag};
+ }
}
- my $body = $block{if}{body};
- my $raw_text = $block{if}{raw_text};
- my $open_tag = $block{if}{open_tag};
- my $close_tag = $block{if}{close_tag};
-
- my $iterations = $inverted
- ? ($self->make_ternary(
- $self->call('(is_array)', $name->clone),
- $self->make_ternary(
- $self->call('(is_empty_array)', $name->clone),
- $self->call(
- '(make_array)',
- $self->symbol('(literal)')->clone(id => 1),
- ),
- $self->call(
- '(make_array)',
- $self->symbol('(literal)')->clone(id => 0),
- ),
- ),
- $self->make_ternary(
- $name->clone,
- $self->call(
- '(make_array)',
- $self->symbol('(literal)')->clone(id => 0),
- ),
- $self->call(
- '(make_array)',
- $self->symbol('(literal)')->clone(id => 1),
- ),
- ),
- ))
- : ($self->make_ternary(
- $self->call('(is_array)', $name->clone),
- $name->clone,
- $self->make_ternary(
- $name->clone,
- $self->call(
- '(make_array)',
- $self->symbol('(literal)')->clone(id => 1),
- ),
- $self->call(
- '(make_array)',
- $self->symbol('(literal)')->clone(id => 0),
- ),
- ),
- ));
+ my $iterations = $self->make_ternary(
+ $self->call('(is_falsy)', $name->clone),
+ $self->call('(make_array)', $self->literal(1)),
+ $self->make_ternary(
+ $self->call('(is_array)', $name->clone),
+ $name->clone,
+ $self->call('(make_array)', $self->literal(1)),
+ ),
+ );
my $loop_var = $self->symbol('(block)')->clone(arity => 'variable');
my $body_block = [
- $symbol->clone(
- arity => 'block',
- first => ($inverted
- ? (undef)
- : ([
- $self->call(
- '(new_vars_for)',
- $self->vars,
- $name->clone,
- $self->iterator_index,
- ),
- ])
+ $self->make_ternary(
+ $self->call('(is_falsy)', $name->clone),
+ $symbol->clone(
+ arity => 'block',
+ first => undef,
+ second => [ $block{else}{body} ],
+ ),
+ $symbol->clone(
+ arity => 'block',
+ first => [
+ $self->call(
+ '(new_vars_for)',
+ $self->vars,
+ $name->clone,
+ $self->iterator_index,
+ ),
+ ],
+ second => [ $block{if}{body} ],
),
- second => $body,
),
];
@@ -524,9 +497,9 @@ sub std_block {
'(run_code)',
$name->clone,
$self->vars,
- $open_tag->clone,
- $close_tag->clone,
- $raw_text->clone,
+ $block{if}{open_tag}->clone,
+ $block{if}{close_tag}->clone,
+ $block{if}{raw_text}->clone,
),
),
$self->symbol('(for)')->clone(
@@ -677,6 +650,12 @@ sub vars {
return $self->symbol('(vars)')->clone(arity => 'vars');
}
+sub literal {
+ my $self = shift;
+ my ($value) = @_;
+ return $self->symbol('(literal)')->clone(id => $value);
+}
+
sub iterator_index {
my $self = shift;
diff --git a/t/blocks.t b/t/blocks.t
index 153a8a9..cde7665 100644
--- a/t/blocks.t
+++ b/t/blocks.t
@@ -70,7 +70,6 @@ render_ok(
"empty block"
);
-{ local $TODO = "unimplemented";
render_ok(
'{{#people}}{{name}}{{^}}{{none}}{{/people}}',
{
@@ -93,7 +92,7 @@ render_ok(
render_ok(
<<'TEMPLATE',
{{#people}}
-{{name}}
+{{.}}
{{^}}
{{none}}
{{/people}}
@@ -113,6 +112,5 @@ Stevan Little
RENDERED
"inverted block shorthand (non-empty array)"
);
-}
done_testing;