summaryrefslogtreecommitdiff
path: root/LedgerSMB
diff options
context:
space:
mode:
Diffstat (limited to 'LedgerSMB')
-rwxr-xr-xLedgerSMB/Template.pm11
-rwxr-xr-xLedgerSMB/Template/CSV.pm106
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;