From 4d5822eb83c5023351d688264443acd69a4a7324 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 2 Jul 2013 17:20:55 -0400 Subject: add some xslate macros, to make things a bit cleaner --- lib/Spreadsheet/Template/Helpers/Xslate.pm | 65 ++++++++++++++++++++++++++++ lib/Spreadsheet/Template/Processor/Xslate.pm | 3 +- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 lib/Spreadsheet/Template/Helpers/Xslate.pm diff --git a/lib/Spreadsheet/Template/Helpers/Xslate.pm b/lib/Spreadsheet/Template/Helpers/Xslate.pm new file mode 100644 index 0000000..9776a3b --- /dev/null +++ b/lib/Spreadsheet/Template/Helpers/Xslate.pm @@ -0,0 +1,65 @@ +package Spreadsheet::Template::Helpers::Xslate; +use strict; +use warnings; + +use JSON; + +my $JSON = JSON->new; + +use Sub::Exporter 'build_exporter'; + +my $import = build_exporter({ + exports => [ + map { $_ => \&_curry_package } qw(format c true false) + ], + groups => { + default => [qw(format c true false)], + }, +}); + +my %formats; + +sub import { + my $caller = caller; + $formats{$caller} = {}; + goto $import; +} + +sub format { + my ($package, $name, $format) = @_; + $formats{$package}{$name} = $format; + return ''; +} + +sub c { + my ($package, $contents, $format, $type, %args) = @_; + + $type = 'string' unless defined $type; + + return $JSON->encode({ + contents => "$contents", + format => _formats($package, $format), + type => $type, + (defined $args{formula} + ? (formula => $args{formula}) + : ()), + }); +} + +sub true { JSON::true } +sub false { JSON::false } + +sub _formats { + my ($package, $format) = @_; + + return $format if ref($format); + + return $formats{$package}{$format}; +} + +sub _curry_package { + my ($package, $name) = @_; + return sub { $package->$name(@_) }; +} + +1; diff --git a/lib/Spreadsheet/Template/Processor/Xslate.pm b/lib/Spreadsheet/Template/Processor/Xslate.pm index 1ae2454..9c62bb3 100644 --- a/lib/Spreadsheet/Template/Processor/Xslate.pm +++ b/lib/Spreadsheet/Template/Processor/Xslate.pm @@ -19,7 +19,8 @@ has xslate => ( my $self = shift; return Text::Xslate->new( type => 'text', - syntax => $self->syntax + syntax => $self->syntax, + module => ['Spreadsheet::Template::Helpers::Xslate'], ); }, ); -- cgit v1.2.3-54-g00ecf