summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2012-10-05 18:30:32 -0500
committerJesse Luehrs <doy@tozt.net>2012-10-05 18:30:32 -0500
commit6ff12b877afbda62ad2cb6d748487e7674e5c396 (patch)
tree74fa460cfbb35ff23603a8ee4e3a84c7d2dda52b
parentf805baad91b66f47885160afaed141a4e4c5fa67 (diff)
downloadtext-handlebars-6ff12b877afbda62ad2cb6d748487e7674e5c396.tar.gz
text-handlebars-6ff12b877afbda62ad2cb6d748487e7674e5c396.zip
change back to defining helpers and functions separately
helpers are different from functions because they implicitly receive the current context as the first argument, so they need to be declared differently. they work identically to functions in all other respects.
-rw-r--r--lib/Text/Handlebars.pm18
-rw-r--r--lib/Text/Handlebars/Compiler.pm2
-rw-r--r--lib/Text/Xslate/Syntax/Handlebars.pm17
-rw-r--r--t/block-helpers.t26
-rw-r--r--t/helpers-examples.t4
-rw-r--r--t/helpers.t6
6 files changed, 55 insertions, 18 deletions
diff --git a/lib/Text/Handlebars.pm b/lib/Text/Handlebars.pm
index 25075b1..a040504 100644
--- a/lib/Text/Handlebars.pm
+++ b/lib/Text/Handlebars.pm
@@ -90,6 +90,7 @@ sub options {
my $options = $class->SUPER::options(@_);
$options->{compiler} = 'Text::Handlebars::Compiler';
+ $options->{helpers} = {};
return $options;
}
@@ -128,6 +129,23 @@ sub _register_builtin_methods {
return $code->($vars, @args, $options);
};
+
+ for my $helper (keys %{ $self->{helpers} }) {
+ $funcs->{$helper} = $self->{helpers}{$helper};
+ }
+}
+
+sub _compiler {
+ my $self = shift;
+
+ if (!ref($self->{compiler})) {
+ my $compiler = $self->SUPER::_compiler(@_);
+ $compiler->define_helper(keys %{ $self->{helpers} });
+ return $compiler;
+ }
+ else {
+ return $self->SUPER::_compiler(@_);
+ }
}
sub render_string {
diff --git a/lib/Text/Handlebars/Compiler.pm b/lib/Text/Handlebars/Compiler.pm
index ae1738b..184b9b6 100644
--- a/lib/Text/Handlebars/Compiler.pm
+++ b/lib/Text/Handlebars/Compiler.pm
@@ -9,6 +9,8 @@ has '+syntax' => (
default => 'Handlebars',
);
+sub define_helper { shift->parser->define_helper(@_) }
+
sub _generate_block {
my $self = shift;
my ($node) = @_;
diff --git a/lib/Text/Xslate/Syntax/Handlebars.pm b/lib/Text/Xslate/Syntax/Handlebars.pm
index 252b4c9..a24fa00 100644
--- a/lib/Text/Xslate/Syntax/Handlebars.pm
+++ b/lib/Text/Xslate/Syntax/Handlebars.pm
@@ -5,6 +5,8 @@ use Any::Moose;
use Carp 'confess';
use Text::Xslate::Util qw($DEBUG $NUMBER neat p);
+use Text::Handlebars::Symbol;
+
extends 'Text::Xslate::Parser';
use constant _DUMP_PROTO => scalar($DEBUG =~ /\b dump=proto \b/xmsi);
@@ -29,6 +31,8 @@ sub _build_tag_end { '}}' }
sub _build_shortcut_table { +{} }
+sub symbol_class { 'Text::Handlebars::Symbol' }
+
sub split_tags {
my $self = shift;
my ($input) = @_;
@@ -584,6 +588,19 @@ sub define_function {
return;
}
+sub define_helper {
+ my $self = shift;
+ my (@names) = @_;
+
+ $self->define_function(@names);
+ for my $name (@names) {
+ my $symbol = $self->symbol($name);
+ $symbol->is_helper(1);
+ }
+
+ return;
+}
+
sub parse_literal {
my $self = shift;
my ($literal) = @_;
diff --git a/t/block-helpers.t b/t/block-helpers.t
index 5ca009a..4b68d1e 100644
--- a/t/block-helpers.t
+++ b/t/block-helpers.t
@@ -7,7 +7,7 @@ use Test::Handlebars;
render_ok(
{
- function => {
+ helpers => {
noop => sub {
my ($context, $options) = @_;
return $options->{fn}->($context);
@@ -36,7 +36,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
with => sub {
my ($context, $new_context, $options) = @_;
return $options->{fn}->($new_context);
@@ -71,7 +71,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
with => sub {
my ($context, $new_context, $options) = @_;
return $options->{fn}->($new_context);
@@ -138,7 +138,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
list => sub {
my ($context, $items, $options) = @_;
my $out = "<ul>";
@@ -178,7 +178,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
if => sub {
my ($context, $conditional, $options) = @_;
if ($conditional) {
@@ -204,7 +204,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
if => sub {
my ($context, $conditional, $options) = @_;
if ($conditional) {
@@ -229,7 +229,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
if => sub {
my ($context, $conditional, $options) = @_;
if ($conditional) {
@@ -259,7 +259,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
if => sub {
my ($context, $conditional, $options) = @_;
if ($conditional) {
@@ -290,7 +290,7 @@ RENDERED
{ local $TODO = "unimplemented"; local $SIG{__WARN__} = sub { };
render_ok(
{
- function => {
+ helpers => {
list => sub {
my ($context, $items, $options) = @_;
@@ -336,7 +336,7 @@ RENDERED
# more reasonable. feedback welcome!
render_ok(
{
- function => {
+ helpers => {
list => sub {
my ($context, $items, $options) = @_;
@@ -380,7 +380,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
list => sub {
my ($context, $items, $options) = @_;
@@ -413,7 +413,7 @@ render_ok(
render_ok(
{
- function => {
+ helpers => {
list => sub {
my ($context, $items, $options) = @_;
@@ -443,7 +443,7 @@ render_ok(
render_ok(
{
- function => {
+ helpers => {
list => sub {
my ($context, $items, $options) = @_;
diff --git a/t/helpers-examples.t b/t/helpers-examples.t
index 1df8e99..8f5a2fc 100644
--- a/t/helpers-examples.t
+++ b/t/helpers-examples.t
@@ -9,7 +9,7 @@ use Text::Xslate 'mark_raw';
render_ok(
{
- function => {
+ helpers => {
fullName => sub {
my ($context, $person) = @_;
return $person->{firstName} . ' ' . $person->{lastName};
@@ -55,7 +55,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
agree_button => sub {
my ($context) = @_;
return mark_raw(
diff --git a/t/helpers.t b/t/helpers.t
index 98a72ba..51ab9ac 100644
--- a/t/helpers.t
+++ b/t/helpers.t
@@ -9,7 +9,7 @@ use Text::Xslate 'mark_raw';
render_ok(
{
- function => {
+ helpers => {
link => sub {
my ($context, $object) = @_;
return mark_raw(
@@ -37,7 +37,7 @@ RENDERED
render_ok(
{
- function => {
+ helpers => {
link => sub {
my ($context, $text, $url) = @_;
return mark_raw(
@@ -63,7 +63,7 @@ RENDERED
{ local $TODO = "unimplemented";
render_ok(
{
- function => {
+ helpers => {
link => sub {
my ($context, $text, $options) = @_;