From 71a5add2e54c2cddf61db1af59c0653c2b763290 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 19 Oct 2012 03:32:22 -0500 Subject: move most of find_file into the compiler --- lib/Text/Handlebars.pm | 8 ++++---- lib/Text/Handlebars/Compiler.pm | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/lib/Text/Handlebars.pm b/lib/Text/Handlebars.pm index 9e3f93c..947a336 100644 --- a/lib/Text/Handlebars.pm +++ b/lib/Text/Handlebars.pm @@ -143,12 +143,12 @@ sub _register_builtin_methods { my ($funcs) = @_; weaken(my $weakself = $self); + $funcs->{'(suffix)'} = sub { + return $weakself->{suffix}; + }; $funcs->{'(find_file)'} = sub { my ($filename) = @_; - return $filename if try { $weakself->find_file($filename); 1 }; - $filename .= $weakself->{suffix}; - return $filename if try { $weakself->find_file($filename); 1 }; - return 0; + return try { $weakself->find_file($filename); 1 }; }; $funcs->{'(make_block_helper)'} = sub { my ($code, $raw_text, $else_raw_text, $hash) = @_; diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm index 57a746a..4681d30 100644 --- a/lib/Text/Handlebars/Compiler.pm +++ b/lib/Text/Handlebars/Compiler.pm @@ -83,10 +83,7 @@ sub _generate_partial { return ( $self->compile_ast( - $self->save_lvar( - $lvar_id, - $self->call($node, '(find_file)', $node->first->clone) - ), + $self->save_lvar($lvar_id, $self->find_file($node->first->clone)), ), $self->compile_ast( $self->make_ternary( @@ -102,6 +99,42 @@ sub _generate_partial { ); } +sub find_file { + my $self = shift; + my ($filename) = @_; + + return $filename->clone( + arity => 'find_file', + first => $filename, + ); +} + +sub _generate_find_file { + my $self = shift; + my ($node) = @_; + + my $filename = $node->first; + my $with_suffix = $self->parser->symbol('~')->clone( + arity => 'binary', + first => $filename->clone, + second => $self->call($node, '(suffix)'), + ); + + return ( + $self->compile_ast( + $self->make_ternary( + $self->call($node, '(find_file)', $filename->clone), + $filename->clone, + $self->make_ternary( + $self->call($node, '(find_file)', $with_suffix->clone), + $with_suffix->clone, + $self->literal(''), + ), + ), + ), + ); +} + sub _generate_for { my $self = shift; my ($node) = @_; -- cgit v1.2.3