summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-07-17 13:53:49 -0400
committerJesse Luehrs <doy@tozt.net>2013-07-17 14:07:06 -0400
commit042e017575b3fa696f9bd63b7171088c842407c4 (patch)
tree14b3b337a1fe5e7d2ed0260a963978ca859bcd38
parentb8659ef749df53d8cb291fdcb09828d1d6de792b (diff)
downloadspreadsheet-template-042e017575b3fa696f9bd63b7171088c842407c4.tar.gz
spreadsheet-template-042e017575b3fa696f9bd63b7171088c842407c4.zip
stop guessing file type, and refactor a bit
-rw-r--r--lib/Spreadsheet/Template/Generator.pm36
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser.pm6
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser/Excel.pm39
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser/XLS.pm5
-rw-r--r--lib/Spreadsheet/Template/Generator/Parser/XLSX.pm7
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;