From 08e2e1e9adc9d1de0a2e5e7b74cc7c8553f3672c Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 25 Apr 2013 14:21:51 -0500 Subject: outline of the renderer part --- lib/Spreadsheet/Template.pm | 58 ++++++++++++++++++++++++++ lib/Spreadsheet/Template/Processor.pm | 8 ++++ lib/Spreadsheet/Template/Processor/Identity.pm | 15 +++++++ lib/Spreadsheet/Template/Processor/Xslate.pm | 24 +++++++++++ lib/Spreadsheet/Template/Writer.pm | 8 ++++ lib/Spreadsheet/Template/Writer/Excel.pm | 50 ++++++++++++++++++++++ lib/Spreadsheet/Template/Writer/XLS.pm | 11 +++++ lib/Spreadsheet/Template/Writer/XLSX.pm | 11 +++++ 8 files changed, 185 insertions(+) create mode 100644 lib/Spreadsheet/Template/Processor.pm create mode 100644 lib/Spreadsheet/Template/Processor/Identity.pm create mode 100644 lib/Spreadsheet/Template/Processor/Xslate.pm create mode 100644 lib/Spreadsheet/Template/Writer.pm create mode 100644 lib/Spreadsheet/Template/Writer/Excel.pm create mode 100644 lib/Spreadsheet/Template/Writer/XLS.pm create mode 100644 lib/Spreadsheet/Template/Writer/XLSX.pm diff --git a/lib/Spreadsheet/Template.pm b/lib/Spreadsheet/Template.pm index e69de29..8d8dcc4 100644 --- a/lib/Spreadsheet/Template.pm +++ b/lib/Spreadsheet/Template.pm @@ -0,0 +1,58 @@ +package Spreadsheet::Template; +use Moose; + +use Class::Load 'load_class'; +use JSON; + +has processor_class => ( + is => 'ro', + isa => 'Str', + default => 'Spreadsheet::Template::Processor::Xslate', +); + +has writer_class => ( + is => 'ro', + isa => 'Str', + default => 'Spreadsheet::Template::Writer::XLSX', +); + +has processor => ( + is => 'ro', + does => 'Spreadsheet::Template::Processor', + handles => 'Spreadsheet::Template::Processor', + lazy => 1, + default => sub { + my $self = shift; + my $class = $self->processor_class; + load_class($class); + return $class->new; + }, +); + +has writer => ( + is => 'ro', + does => 'Spreadsheet::Template::Renderer', + handles => 'Spreadsheet::Template::Renderer', + lazy => 1, + default => sub { + my $self = shift; + my $class = $self->writer_class; + load_class($class); + return $class->new; + }, +); + +sub render { + my $self = shift; + my ($template, $vars) = @_; + my $contents = $self->process($template, $vars); + # not decode_json, since we expect that we are already being handed a + # character string (decode_json also decodes utf8) + my $data = from_json($contents); + return $self->write($data); +} + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/lib/Spreadsheet/Template/Processor.pm b/lib/Spreadsheet/Template/Processor.pm new file mode 100644 index 0000000..6aab54a --- /dev/null +++ b/lib/Spreadsheet/Template/Processor.pm @@ -0,0 +1,8 @@ +package Spreadsheet::Template::Processor; +use Moose::Role; + +requires 'process'; + +no Moose::Role; + +1; diff --git a/lib/Spreadsheet/Template/Processor/Identity.pm b/lib/Spreadsheet/Template/Processor/Identity.pm new file mode 100644 index 0000000..313beb7 --- /dev/null +++ b/lib/Spreadsheet/Template/Processor/Identity.pm @@ -0,0 +1,15 @@ +package Spreadsheet::Template::Processor::Identity; +use Moose; + +does 'Spreadsheet::Template::Processor'; + +sub process { + my $self = shift; + my ($contents, $vars) = @_ + return $contents; +} + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/lib/Spreadsheet/Template/Processor/Xslate.pm b/lib/Spreadsheet/Template/Processor/Xslate.pm new file mode 100644 index 0000000..6086f0f --- /dev/null +++ b/lib/Spreadsheet/Template/Processor/Xslate.pm @@ -0,0 +1,24 @@ +package Spreadsheet::Template::Processor::Xslate; +use Moose; + +use Text::Xslate; + +with 'Spreadsheet::Template::Processor'; + +has xslate => ( + is => 'ro', + isa => 'Text::Xslate', + lazy => 1, + default => sub { Text::Xslate->new }, +); + +sub process { + my $self = shift; + my ($contents, $vars) = @_; + return $self->xslate->render_string($contents, $vars); +} + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/lib/Spreadsheet/Template/Writer.pm b/lib/Spreadsheet/Template/Writer.pm new file mode 100644 index 0000000..f22faac --- /dev/null +++ b/lib/Spreadsheet/Template/Writer.pm @@ -0,0 +1,8 @@ +package Spreadsheet::Template::Writer; +use Moose::Role; + +requires 'write'; + +no Moose::Role; + +1; diff --git a/lib/Spreadsheet/Template/Writer/Excel.pm b/lib/Spreadsheet/Template/Writer/Excel.pm new file mode 100644 index 0000000..c2c6028 --- /dev/null +++ b/lib/Spreadsheet/Template/Writer/Excel.pm @@ -0,0 +1,50 @@ +package Spreadsheet::Template::Writer::Excel; +use Moose::Role; + +use Class::Load; + +with 'Spreadsheet::Template::Writer'; + +requires 'excel_class'; + +has excel => ( + is => 'ro', + isa => 'Object', + lazy => 1, + default => sub { + my $self = shift; + load_class($self->excel_class); + $self->excel_class->new($self->_fh); + }, +); + +has _fh => ( + is => 'ro', + isa => 'FileHandle', + lazy => 1, + default => sub { + open my $fh, '>', $self->_output + or die "Failed to open filehandle: $!"; + binmode $fh; + return $fh; + }, +); + +has _output => ( + is => 'ro', + isa => 'ScalarRef[Str]', + lazy => 1, + default => sub { \(my $str) }, +); + +sub write { + my $self = shift; + + # ... + + return ${ $self->_output }; +} + +no Moose::Role; + +1; diff --git a/lib/Spreadsheet/Template/Writer/XLS.pm b/lib/Spreadsheet/Template/Writer/XLS.pm new file mode 100644 index 0000000..3e40b10 --- /dev/null +++ b/lib/Spreadsheet/Template/Writer/XLS.pm @@ -0,0 +1,11 @@ +package Spreadsheet::Template::Writer::XLS; +use Moose; + +with 'Spreadsheet::Template::Writer::Excel'; + +sub excel_class { 'Spreadsheet::WriteExcel' } + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; diff --git a/lib/Spreadsheet/Template/Writer/XLSX.pm b/lib/Spreadsheet/Template/Writer/XLSX.pm new file mode 100644 index 0000000..9c4fe10 --- /dev/null +++ b/lib/Spreadsheet/Template/Writer/XLSX.pm @@ -0,0 +1,11 @@ +package Spreadsheet::Template::Writer::XLSX; +use Moose; + +with 'Spreadsheet::Template::Writer::Excel'; + +sub excel_class { 'Excel::Writer::XLSX' } + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; -- cgit v1.2.3-54-g00ecf