From 042e017575b3fa696f9bd63b7171088c842407c4 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 17 Jul 2013 13:53:49 -0400 Subject: stop guessing file type, and refactor a bit --- lib/Spreadsheet/Template/Generator.pm | 36 +++++++++++--------- lib/Spreadsheet/Template/Generator/Parser.pm | 6 ---- lib/Spreadsheet/Template/Generator/Parser/Excel.pm | 39 ++++++++++------------ lib/Spreadsheet/Template/Generator/Parser/XLS.pm | 5 +-- lib/Spreadsheet/Template/Generator/Parser/XLSX.pm | 7 ++-- 5 files changed, 45 insertions(+), 48 deletions(-) diff --git a/lib/Spreadsheet/Template/Generator.pm b/lib/Spreadsheet/Template/Generator.pm index 526964c..c751e99 100644 --- a/lib/Spreadsheet/Template/Generator.pm +++ b/lib/Spreadsheet/Template/Generator.pm @@ -5,33 +5,39 @@ use Moose; use Class::Load 'load_class'; use JSON; +has parser_class => ( + is => 'ro', + isa => 'Str', + default => 'Spreadsheet::Template::Generator::Parser::XLSX', +); + has parser_options => ( is => 'ro', isa => 'HashRef', default => sub { {} }, ); +has parser => ( + is => 'ro', + does => 'Spreadsheet::Template::Generator::Parser', + lazy => 1, + default => sub { + my $self = shift; + my $class = $self->parser_class; + load_class($class); + return $class->new( + %{ $self->parser_options } + ); + }, +); + sub generate { my $self = shift; my ($filename) = @_; - (my $ext = $filename) =~ s/.*\.//; - my $class = $self->parser_classes->{$ext}; - load_class($class); - my $parser = $class->new( - filename => $filename, - %{ $self->parser_options } - ); - my $data = $parser->parse; + my $data = $self->parser->parse($filename); return JSON->new->pretty->canonical->encode($data); } -sub parser_classes { - +{ - 'xls' => 'Spreadsheet::Template::Generator::Parser::XLS', - 'xlsx' => 'Spreadsheet::Template::Generator::Parser::XLSX', - } -} - __PACKAGE__->meta->make_immutable; no Moose; diff --git a/lib/Spreadsheet/Template/Generator/Parser.pm b/lib/Spreadsheet/Template/Generator/Parser.pm index 02df809..d1d7735 100644 --- a/lib/Spreadsheet/Template/Generator/Parser.pm +++ b/lib/Spreadsheet/Template/Generator/Parser.pm @@ -4,12 +4,6 @@ use Moose::Role; requires 'parse'; -has filename => ( - is => 'ro', - isa => 'Str', - required => 1, -); - no Moose::Role; 1; diff --git a/lib/Spreadsheet/Template/Generator/Parser/Excel.pm b/lib/Spreadsheet/Template/Generator/Parser/Excel.pm index 217fd4a..a91b381 100644 --- a/lib/Spreadsheet/Template/Generator/Parser/Excel.pm +++ b/lib/Spreadsheet/Template/Generator/Parser/Excel.pm @@ -5,16 +5,9 @@ use DateTime::Format::Excel; with 'Spreadsheet::Template::Generator::Parser'; -requires '_build_excel'; +requires '_create_workbook'; -has excel => ( - is => 'ro', - isa => 'Object', - lazy => 1, - builder => '_build_excel', -); - -has excel_dt => ( +has _excel_dt => ( is => 'ro', isa => 'DateTime::Format::Excel', lazy => 1, @@ -23,23 +16,26 @@ has excel_dt => ( sub parse { my $self = shift; - return $self->_parse_workbook; + my ($filename) = @_; + my $book = $self->_create_workbook($filename); + return $self->_parse_workbook($book); } sub _parse_workbook { my $self = shift; + my ($book) = @_; my $data = { - selection => $self->excel->{SelectedSheet}, # XXX + selection => $book->{SelectedSheet}, # XXX worksheets => [], }; - if ($self->excel->using_1904_date) { - $self->excel_dt->epoch_mac; + if ($book->using_1904_date) { + $self->_excel_dt->epoch_mac; } - for my $sheet ($self->excel->worksheets) { - push @{ $data->{worksheets} }, $self->_parse_worksheet($sheet); + for my $sheet ($book->worksheets) { + push @{ $data->{worksheets} }, $self->_parse_worksheet($book, $sheet); } return $data; @@ -47,7 +43,7 @@ sub _parse_workbook { sub _parse_worksheet { my $self = shift; - my ($sheet) = @_; + my ($book, $sheet) = @_; my $data = { name => $sheet->get_name, @@ -74,7 +70,7 @@ sub _parse_worksheet { } for my $col ($cmin..$cmax) { if (my $cell = $sheet->get_cell($row, $col)) { - push @$row_data, $self->_parse_cell($cell); + push @$row_data, $self->_parse_cell($book, $cell); } else { push @$row_data, {}; @@ -88,7 +84,7 @@ sub _parse_worksheet { sub _parse_cell { my $self = shift; - my ($cell) = @_; + my ($book, $cell) = @_; my $contents = $cell->unformatted; my $type = $cell->type; @@ -103,7 +99,7 @@ sub _parse_cell { } elsif ($type eq 'Date') { $type = 'date_time'; - $contents = $self->excel_dt->parse_datetime($contents)->iso8601 + $contents = $self->_excel_dt->parse_datetime($contents)->iso8601 if defined $contents && length $contents; } else { @@ -212,9 +208,8 @@ sub _parse_cell { if $format->{Wrap}; } if (!$format->{IgnoreNumberFormat}) { - my $wb = $self->excel; - $format_data->{num_format} = $wb->{FormatStr}{$format->{FmtIdx}} - unless $wb->{FormatStr}{$format->{FmtIdx}} eq 'GENERAL'; + $format_data->{num_format} = $book->{FormatStr}{$format->{FmtIdx}} + unless $book->{FormatStr}{$format->{FmtIdx}} eq 'GENERAL'; } } diff --git a/lib/Spreadsheet/Template/Generator/Parser/XLS.pm b/lib/Spreadsheet/Template/Generator/Parser/XLS.pm index b871ae4..608c3b0 100644 --- a/lib/Spreadsheet/Template/Generator/Parser/XLS.pm +++ b/lib/Spreadsheet/Template/Generator/Parser/XLS.pm @@ -5,11 +5,12 @@ use Spreadsheet::ParseExcel; with 'Spreadsheet::Template::Generator::Parser::Excel'; -sub _build_excel { +sub _create_workbook { my $self = shift; + my ($filename) = @_; my $parser = Spreadsheet::ParseExcel->new; - my $excel = $parser->parse($self->filename); + my $excel = $parser->parse($filename); die $parser->error unless $excel; $self->_fixup_excel($excel); diff --git a/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm b/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm index 5aeff6f..17a6c4c 100644 --- a/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm +++ b/lib/Spreadsheet/Template/Generator/Parser/XLSX.pm @@ -6,11 +6,12 @@ use Spreadsheet::ParseXLSX; with 'Spreadsheet::Template::Generator::Parser::Excel'; -sub _build_excel { +sub _create_workbook { my $self = shift; + my ($filename) = @_; - my $parser = Spreadsheet::ParseXLSX->new($self->filename); - return $parser->parse($self->filename); + my $parser = Spreadsheet::ParseXLSX->new($filename); + return $parser->parse($filename); } __PACKAGE__->meta->make_immutable; -- cgit v1.2.3-54-g00ecf