From 350dde80bbe03ebf2f2d1168e259106c0e4a6f18 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 5 Oct 2012 13:55:56 -0500 Subject: implement {{^}} in normal blocks also, greatly simplify the logic for blocks in general --- lib/Text/Handlebars.pm | 9 ++- lib/Text/Xslate/Syntax/Handlebars.pm | 111 ++++++++++++++--------------------- t/blocks.t | 4 +- 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; -- cgit v1.2.3