diff options
Diffstat (limited to 'LedgerSMB')
-rwxr-xr-x | LedgerSMB/Template.pm | 11 | ||||
-rwxr-xr-x | LedgerSMB/Template/CSV.pm | 106 |
2 files changed, 115 insertions, 2 deletions
diff --git a/LedgerSMB/Template.pm b/LedgerSMB/Template.pm index 2432b5f1..de0fa797 100755 --- a/LedgerSMB/Template.pm +++ b/LedgerSMB/Template.pm @@ -11,7 +11,7 @@ This module renders templates. =over -=item new(user => \%myconfig, template => $string, format => 'HTML', [language => $string,] [include_path => $path], [no_auto_output => $bool], [method => $string] ); +=item new(user => \%myconfig, template => $string, format => 'HTML', [language => $string,] [include_path => $path], [no_auto_output => $bool], [method => $string], [no_escape => $bool]] ); This command instantiates a new template: template is the file name of the template to be processed. @@ -19,6 +19,7 @@ format is the type of format to be used. Currently only HTML is supported language (optional) specifies the language for template selection. include_path allows one to override the template directory and use this with user interface templates. no_auto_output disables the automatic output of rendered templates. +no_escape disables escaping on the template variables. method is the output method to use, defaults to HTTP media is a synonym for method @@ -62,6 +63,7 @@ sub new { $self->{format} = $args{format}; $self->{format} = 'PS' if lc $self->{format} eq 'postscript'; $self->{language} = $args{language}; + $self->{no_escape} = $args{no_escape}; if ($args{outputfile}) { $self->{outputfile} = "${LedgerSMB::Sysconfig::tempdir}/$args{outputfile}"; @@ -112,7 +114,12 @@ sub render { throw Error::Simple $@; } - my $cleanvars = $format->can('preprocess')->($vars); + my $cleanvars; + if ($self->{no_escape}) { + $cleanvars = $vars; + } else { + $cleanvars = $format->can('preprocess')->($vars); + } if (UNIVERSAL::isa($self->{locale}, 'LedgerSMB::Locale')){ $cleanvars->{text} = sub { return $self->{locale}->text(@_)}; diff --git a/LedgerSMB/Template/CSV.pm b/LedgerSMB/Template/CSV.pm new file mode 100755 index 00000000..42324a89 --- /dev/null +++ b/LedgerSMB/Template/CSV.pm @@ -0,0 +1,106 @@ + +=head1 NAME + +LedgerSMB::Template::CSV Template support module for LedgerSMB + +=head1 METHODS + +=over + +=item get_template ($name) + +Returns the appropriate template filename for this format. + +=item preprocess ($vars) + +Returns $vars. + +=item process ($parent, $cleanvars) + +Processes the template for text. + +=item postprocess ($parent) + +Returns the output filename. + +=back + +=head1 Copyright (C) 2007, The LedgerSMB core team. + +This work contains copyrighted information from a number of sources all used +with permission. + +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::CSV; + +use Error qw(:try); +use Template; +use LedgerSMB::Template::TTI18N; + +sub get_template { + my $name = shift; + return "${name}.csv"; +} + +sub preprocess { + my $rawvars = shift; + my $vars; + my $type = ref $rawvars; + + #XXX fix escaping function + return $rawvars if $type =~ /^LedgerSMB::Locale/; + if ( $type eq 'ARRAY' ) { + for (@{$rawvars}) { + push @{$vars}, preprocess( $_ ); + } + } elsif ( $type eq 'HASH' ) { + for ( keys %{$rawvars} ) { + $vars->{preprocess($_)} = preprocess( $rawvars->{$_} ); + } + } else { + $vars = $rawvars; + $vars =~ s/\ / /; + $vars =~ s/(\t\n\r )+/ /g; + $vars =~ s/(^ +| +$)//g; + $vars =~ s/~/\\~/g; + $vars =~ s/<.*?>//g; + $vars = qq|"$vars"| if $vars !~ /^\w+$/; + $vars = '' if $vars =~ /^""$/; + } + return $vars; +} + +sub process { + my $parent = shift; + my $cleanvars = shift; + my $template; + + $template = Template->new({ + INCLUDE_PATH => $parent->{include_path}, + START_TAG => quotemeta('<?lsmb'), + END_TAG => quotemeta('?>'), + DELIMITER => ';', + }) || throw Error::Simple Template->error(); + + if (not $template->process( + get_template($parent->{template}), + {%$cleanvars, %$LedgerSMB::Template::TTI18N::ttfuncs, + 'escape' => \&preprocess}, + "$parent->{outputfile}.csv", binmode => ':utf8')) { + throw Error::Simple $template->error(); + } + $parent->{mimetype} = 'text/plain'; +} + +sub postprocess { + my $parent = shift; + $parent->{rendered} = "$parent->{outputfile}.csv"; + return "$parent->{outputfile}.csv"; +} + +1; |