diff options
Diffstat (limited to 'LedgerSMB/Template/ODS.pm')
-rw-r--r-- | LedgerSMB/Template/ODS.pm | 132 |
1 files changed, 70 insertions, 62 deletions
diff --git a/LedgerSMB/Template/ODS.pm b/LedgerSMB/Template/ODS.pm index a1402042..2b82ea1f 100644 --- a/LedgerSMB/Template/ODS.pm +++ b/LedgerSMB/Template/ODS.pm @@ -39,10 +39,14 @@ It is released under the GNU General Public License Version 2 or, at your option, any later version. See COPYRIGHT file for details. For a full list including contact information of contributors, maintainers, and copyright holders, see the CONTRIBUTORS file. + =cut package LedgerSMB::Template::ODS; +use strict; +use warnings; + use Error qw(:try); use Data::Dumper; use CGI::Simple::Standard qw(:html); @@ -51,6 +55,65 @@ use XML::Twig; use OpenOffice::OODoc; use LedgerSMB::Template::TTI18N; +# SC: The ODS handlers need these vars in common +my $ods; +my $rowcount; +my $currcol; +my %celltype; + +# SC: The elements of the style table for regular styles and stack are +# arrays where the stack name is the first element and the style +# properties are the second. The name is used for setting styles, +# while the properties are used in handling nested styles. +my @style_stack; # stack of styles, 0 is active style +my %style_table; # hash table for created styles + +# SC: Subtract 8 from the attribute to get the index +# http://search.cpan.org/src/JMCNAMARA/Spreadsheet-WriteExcel-2.11/doc/palette.html +my @colour = (odfColor(0, 0, 0), odfColor(255, 255, 255), + odfColor(255, 0, 0), odfColor(0, 255, 0), + odfColor(0, 0, 255), odfColor(255, 255, 0), + odfColor(255, 0, 255), odfColor(0, 255, 255), + odfColor(128, 0, 0), odfColor(0, 128, 0), + odfColor(0, 0, 128), odfColor(128, 128, 0), + odfColor(128, 0, 128), odfColor(0, 128, 128), + odfColor(192, 192, 192), odfColor(128, 128, 128), + odfColor(153, 153, 255), odfColor(153, 51, 102), + odfColor(255, 255, 204), odfColor(204, 255, 255), + odfColor(102, 0, 102), odfColor(255, 128, 128), + odfColor(0, 102, 204), odfColor(204, 204, 255), + odfColor(0, 0, 128), odfColor(255, 0, 255), + odfColor(255, 255, 0), odfColor(0, 255, 255), + odfColor(128, 0, 128), odfColor(120, 0, 0), + odfColor(0, 128, 128), odfColor(0, 0, 255), + odfColor(0, 204, 255), odfColor(204, 255, 255), + odfColor(204, 255, 204), odfColor(255, 255, 153), + odfColor(153, 204, 255), odfColor(255, 153, 204), + odfColor(204, 153, 255), odfColor(192, 192, 192), + odfColor(51, 102, 255), odfColor(51, 204, 204), + odfColor(153, 204, 0), odfColor(255, 204, 0), + odfColor(255, 153, 0), odfColor(255, 102, 0), + odfColor(102, 102, 153), odfColor(150, 150, 150), + odfColor(0, 51, 102), odfColor(51, 153, 102), + odfColor(0, 51, 0), odfColor(51, 51, 0), + odfColor(153, 51, 0), odfColor(153, 51, 102), + odfColor(51, 51, 153), odfColor(51, 51, 51), + ); +my %colour_name = ('black' => $colour[0], 'white' => $colour[1], + 'red' => $colour[2], 'lime' => $colour[3], + 'blue' => $colour[4], 'yellow' => $colour[5], + 'magenta' => $colour[6], 'cyan' => $colour[7], + 'brown' => $colour[8], 'green' => $colour[9], + 'navy' => $colour[10], 'purple' => $colour[12], + 'silver' => $colour[14], 'gray' => $colour[15], + 'grey' => $colour[15], 'orange' => $colour[45], + ); + +my @line_width = ('none', '0.018cm solid', '0.035cm solid', + '0.018cm dashed', '0.018cm dotted', '0.141cm solid', + '0.039cm double', '0.002cm solid' + ); + sub get_template { my $name = shift; return "${name}.odst"; @@ -154,13 +217,13 @@ sub _border_set { if ($properties->{cell}{"fo:$border"}){ $properties->{cell}{"fo:$border"} =~ s/^.* (\#......)$/$val $1/; } else { - $properties->{cell}{"fo:$border"} = "$width[$val] #000000"; + $properties->{cell}{"fo:$border"} = "$line_width[$val] #000000"; } if ($edge and $format->{att}->{"${edge}_color"}) { my $colour = $format->{att}->{"${edge}_color"}; if ($colour =~ /^\d+$/) { $colour = $colour[$colour]; - } elsif ($color !~ /^\#......$/) { + } elsif ($colour !~ /^\#......$/) { $colour = $colour_name{$colour}; } $properties->{cell}{"fo:$border"} =~ s/^(.*) \#......$/$1 $colour/; @@ -168,7 +231,7 @@ sub _border_set { my $colour = $format->{att}->{"${edge}_color"}; if ($colour =~ /^\d+$/) { $colour = $colour[$colour]; - } elsif ($color !~ /^\#......$/) { + } elsif ($colour !~ /^\#......$/) { $colour = $colour_name{$colour}; } $properties->{cell}{"fo:$border"} =~ s/^(.*) \#......$/$1 $colour/; @@ -221,51 +284,7 @@ sub _create_positive_style { sub _format_handler { my ($t, $format) = @_; my $style = sprintf "ce%d", (scalar (keys %style_table) + 1); - my @extras; - local @width = ('none', '0.018cm solid', '0.035cm solid', - '0.018cm dashed', '0.018cm dotted', '0.141cm solid', - '0.039cm double', '0.002cm solid'); - # SC: Subtract 8 from the attribute to get the index - # http://search.cpan.org/src/JMCNAMARA/Spreadsheet-WriteExcel-2.11/doc/palette.html - local @colour = (odfColor(0, 0, 0), odfColor(255, 255, 255), - odfColor(255, 0, 0), odfColor(0, 255, 0), - odfColor(0, 0, 255), odfColor(255, 255, 0), - odfColor(255, 0, 255), odfColor(0, 255, 255), - odfColor(128, 0, 0), odfColor(0, 128, 0), - odfColor(0, 0, 128), odfColor(128, 128, 0), - odfColor(128, 0, 128), odfColor(0, 128, 128), - odfColor(192, 192, 192), odfColor(128, 128, 128), - odfColor(153, 153, 255), odfColor(153, 51, 102), - odfColor(255, 255, 204), odfColor(204, 255, 255), - odfColor(102, 0, 102), odfColor(255, 128, 128), - odfColor(0, 102, 204), odfColor(204, 204, 255), - odfColor(0, 0, 128), odfColor(255, 0, 255), - odfColor(255, 255, 0), odfColor(0, 255, 255), - odfColor(128, 0, 128), odfColor(120, 0, 0), - odfColor(0, 128, 128), odfColor(0, 0, 255), - odfColor(0, 204, 255), odfColor(204, 255, 255), - odfColor(204, 255, 204), odfColor(255, 255, 153), - odfColor(153, 204, 255), odfColor(255, 153, 204), - odfColor(204, 153, 255), odfColor(192, 192, 192), - odfColor(51, 102, 255), odfColor(51, 204, 204), - odfColor(153, 204, 0), odfColor(255, 204, 0), - odfColor(255, 153, 0), odfColor(255, 102, 0), - odfColor(102, 102, 153), odfColor(150, 150, 150), - odfColor(0, 51, 102), odfColor(51, 153, 102), - odfColor(0, 51, 0), odfColor(51, 51, 0), - odfColor(153, 51, 0), odfColor(153, 51, 102), - odfColor(51, 51, 153), odfColor(51, 51, 51), - ); - local %colour_name = ('black' => $colour[0], 'white' => $colour[1], - 'red' => $colour[2], 'lime' => $colour[3], - 'blue' => $colour[4], 'yellow' => $colour[5], - 'magenta' => $colour[6], 'cyan' => $colour[7], - 'brown' => $colour[8], 'green' => $colour[9], - 'navy' => $colour[10], 'purple' => $colour[12], - 'silver' => $colour[14], 'gray' => $colour[15], - 'grey' => $colour[15], 'orange' => $colour[45], - ); # SC: There are multiple types of properties that can be associated # with a style. However, the OO::OOD style creation code appears @@ -740,14 +759,14 @@ sub _format_handler { -area => 'text', %{$properties{text}} } - ); + ) if $properties{text}; $ods->updateStyle( $style, properties => { -area => 'paragraph', %{$properties{paragraph}} } - ); + ) if $properties{paragraph}; $style_table{$mystyle} = [$style, \%properties]; } unshift @style_stack, $style_table{$mystyle}; @@ -761,18 +780,7 @@ sub _format_cleanup_handler { sub _ods_process { my ($filename, $template, $user) = @_; - # the handlers need these vars in common - local $ods = ooDocument(file => $filename, create => 'spreadsheet'); - local $rowcount; - local $currcol; - local %celltype; - - # SC: The elements of the style table for regular styles and stack are - # arrays where the stack name is the first element and the style - # properties are the second. The name is used for setting styles, - # while the properties are used in handling nested styles. - local @style_stack; # stack of styles, 0 is active style - local %style_table; # hash table for created styles + $ods = ooDocument(file => $filename, create => 'spreadsheet'); my $parser = XML::Twig->new( start_tag_handlers => { @@ -825,7 +833,7 @@ sub process { } &_ods_process("$parent->{outputfile}.ods", $output, $parent->{myconfig}); - parent->{mimetype} = 'application/vnd.oasis.opendocument.spreadsheet'; + $parent->{mimetype} = 'application/vnd.oasis.opendocument.spreadsheet'; } sub postprocess { |