diff options
author | Jesse Luehrs <doy@tozt.net> | 2012-10-05 13:55:56 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2012-10-05 13:55:56 -0500 |
commit | 350dde80bbe03ebf2f2d1168e259106c0e4a6f18 (patch) | |
tree | f70c1ba2a6849887adf75b1027c1667959f10542 /lib/Text/Xslate/Syntax | |
parent | ab64f8c31f63d5be9fb109fb062bb562064553b9 (diff) | |
download | text-handlebars-350dde80bbe03ebf2f2d1168e259106c0e4a6f18.tar.gz text-handlebars-350dde80bbe03ebf2f2d1168e259106c0e4a6f18.zip |
implement {{^}} in normal blocks
also, greatly simplify the logic for blocks in general
Diffstat (limited to 'lib/Text/Xslate/Syntax')
-rw-r--r-- | lib/Text/Xslate/Syntax/Handlebars.pm | 111 |
1 files changed, 45 insertions, 66 deletions
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; |