From 9182f9a9db2c347549bd7557b042f41f41d22619 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 15 Oct 2012 00:21:53 -0500 Subject: reimplement run_code in terms of render_string --- lib/Text/Handlebars.pm | 7 ++-- lib/Text/Handlebars/Compiler.pm | 78 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 74 insertions(+), 11 deletions(-) diff --git a/lib/Text/Handlebars.pm b/lib/Text/Handlebars.pm index fbc0976..68c8d1f 100644 --- a/lib/Text/Handlebars.pm +++ b/lib/Text/Handlebars.pm @@ -164,11 +164,8 @@ sub _register_builtin_methods { my ($funcs) = @_; weaken(my $weakself = $self); - $funcs->{'(run_code)'} = sub { - my ($code, $vars, $open_tag, $close_tag, @args) = @_; - my $to_render = $code->(@args); - $to_render = "{{= $open_tag $close_tag =}}$to_render" - if defined($open_tag) && defined($close_tag) && $close_tag ne '}}'; + $funcs->{'(render_string)'} = sub { + my ($to_render, $vars) = @_; return $weakself->render_string($to_render, $vars); }; $funcs->{'(find_file)'} = sub { diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm index d2d6865..cf4ad39 100644 --- a/lib/Text/Handlebars/Compiler.pm +++ b/lib/Text/Handlebars/Compiler.pm @@ -165,14 +165,11 @@ sub _generate_block { return $self->compile_ast( $self->make_ternary( $self->is_code_ref($var->clone), - $self->call( - $node, - '(run_code)', + $self->run_code( $var->clone, - $self->vars, + $block{if}{raw_text}->clone, $block{if}{open_tag}->clone, $block{if}{close_tag}->clone, - $block{if}{raw_text}->clone, ), $self->parser->symbol('(for)')->clone( arity => 'for', @@ -234,6 +231,62 @@ sub _generate_array_length { ); } +sub _generate_run_code { + my $self = shift; + my ($node) = @_; + + my $to_render = $node->clone(arity => 'call'); + + if ($node->third) { + my ($open_tag, $close_tag) = @{ $node->third }; + $to_render = $self->make_ternary( + $self->parser->symbol('==')->clone( + arity => 'binary', + first => $close_tag->clone, + second => $self->parser->literal('}}'), + ), + $to_render, + $self->join('{{= ', $open_tag, ' ', $close_tag, ' =}}', $to_render) + ); + } + + # XXX turn this into an opcode + my $render_string = $self->call( + $node, + '(render_string)', + $to_render, + $self->vars, + ); + + return $self->compile_ast($render_string); +} + +sub join { + my $self = shift; + my (@args) = @_; + + @args = map { $self->literalize($_) } @args; + + my $joined = shift @args; + for my $arg (@args) { + $joined = $self->parser->symbol('~')->clone( + arity => 'binary', + first => $joined, + second => $arg, + ); + } + + return $joined; +} + +sub literalize { + my $self = shift; + my ($val) = @_; + + return $val->clone if blessed($val); + return $self->parser->literal($val); +} + sub call { my $self = shift; my ($node, $name, @args) = @_; @@ -279,7 +332,7 @@ sub check_lambda { return $self->make_ternary( $self->is_code_ref($var->clone), - $self->call($var, '(run_code)', $var->clone, $self->vars), + $self->run_code($var->clone), $var, ); } @@ -359,6 +412,19 @@ sub array_length { ); } +sub run_code { + my $self = shift; + my ($code, $raw_text, $open_tag, $close_tag) = @_; + + return $self->parser->symbol('(run_code)')->clone( + arity => 'run_code', + first => $code, + (@_ > 1 + ? (second => [ $raw_text ], third => [ $open_tag, $close_tag ]) + : (second => [])), + ); +} + __PACKAGE__->meta->make_immutable; no Any::Moose; -- cgit v1.2.3