=head1 NAME

LedgerSMB::Template::PDF  Template support module for LedgerSMB

=head1 METHODS

=over

=item get_template ($name)

Returns the appropriate template filename for this format.

=item preprocess ($vars)

Currently does nothing.

=item process ($parent, $cleanvars)

Processes the template for PDF.

=item postprocess ($parent)

Currently does nothing.

=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::PDF;

use Error qw(:try);
use Template::Latex;
use LedgerSMB::Template::TTI18N;

sub get_template {
	my $name = shift;
	return "${name}.tex";
}

sub preprocess {
	my $rawvars = shift;
	my $vars;
	my $type = ref $rawvars;

	return $rawvars if $type =~ /^LedgerSMB::Locale/;
	if ($type eq 'ARRAY') {
		for (@{$rawvars}) {
			push @{$vars}, preprocess($_);
		}
	} elsif ($type eq 'HASH') {
		for ( keys %{$rawvars} ) {
			$vars->{$_} = preprocess($rawvars->{$_});
		}
	} else {
		#XXX Fix escaping
		$rawvars =~ s/([&\$\\_<>~^#\%\{\}])/\\$1/g;
		$rawvars =~ s/"(.*)"/``$1''/gs;
		return $rawvars;
	}
	return $vars;
}

sub process {
	my $parent = shift;
	my $cleanvars = shift;
	my $template;

	$template = Template::Latex->new({
		LATEX_FORMAT => 'pdf',
		INCLUDE_PATH => $parent->{include_path},
		START_TAG => quotemeta('<?lsmb'),
		END_TAG => quotemeta('?>'),
		DELIMITER => ';'
		}) || throw Error::Simple Template::Latex->error(); 

	if (not $template->process(
		get_template($parent->{template}), 
		{%$cleanvars, %$LedgerSMB::Template::TTI18N::ttfuncs,
			'escape' => \&preprocess},
		"$parent->{outputfile}.pdf", binmode => 1)) {
		throw Error::Simple $template->error();
	}
	$parent->{mimetype} = 'application/pdf';
}

sub postprocess {
	my $parent = shift;
	$parent->{rendered} = "$parent->{outputfile}.pdf";
	return "$parent->{outputfile}.pdf";
}

1;