use strict;
+use Carp;
use Cwd;
+use English qw(-no_match_vars);
+use File::Basename;
+use File::Temp;
+use List::MoreUtils qw(any);
use Unicode::Normalize qw();
+use SL::DB::Default;
+
sub new {
my $type = shift;
sub format_string {
my ($self, $variable) = @_;
- my $form = $self->{"form"};
$variable = $main::locale->quote_special_chars('Template/LaTeX', $variable);
$form->{"__odd__"} = (($i + 1) % 2) == 1;
$form->{"__counter__"} = $i + 1;
+ #everything from here to the next marker should be removed after the release of 2.7.0
+ if ( ref $description_array eq 'ARRAY'
+ && scalar @{$description_array} == scalar @{$ary}
+ && $self->{"chars_per_line"} != 0)
+ {
+ my $lines = int(length($description_array->[$i]) / $self->{"chars_per_line"});
+ my $lpp;
+
+ $description_array->[$i] =~ s/(\\newline\s?)*$//;
+ $lines++ while ($description_array->[$i] =~ m/\\newline/g);
+ $lines++;
+
+ if ($current_page == 1) {
+ $lpp = $self->{"lines_on_first_page"};
+ } else {
+ $lpp = $self->{"lines_on_second_page"};
+ }
+
+ # Yes we need a manual page break -- or the user has forced one
+ if ( (($current_line + $lines) > $lpp)
+ || ($description_array->[$i] =~ /<pagebreak>/)
+ || ( ref $longdescription_array eq 'ARRAY'
+ && $longdescription_array->[$i] =~ /<pagebreak>/)) {
+ my $pb = $self->{"pagebreak_block"};
+
+ # replace the special variables <%sumcarriedforward%>
+ # and <%lastpage%>
+
+ my $psum = $form->format_amount($self->{"myconfig"}, $sum, 2);
+ $pb =~ s/$self->{tag_start_qm}sumcarriedforward$self->{tag_end_qm}/$psum/g;
+ $pb =~ s/$self->{tag_start_qm}lastpage$self->{tag_end_qm}/$current_page/g;
+
+ my $new_text = $self->parse_block($pb, (@indices, $i));
+ return undef unless (defined($new_text));
+ $new_contents .= $new_text;
+
+ $current_page++;
+ $current_line = 0;
+ }
+ $current_line += $lines;
+ }
+ #stop removing code here.
+
if ( ref $linetotal_array eq 'ARRAY'
&& $i < scalar(@{$linetotal_array})) {
$sum += $form->parse_amount($self->{"myconfig"}, $linetotal_array->[$i]);
if ($key eq 'tag-style') {
$self->set_tag_style(split(m/\s+/, $value, 2));
}
+ if ($key eq 'use-template-toolkit') {
+ $self->set_use_template_toolkit($value);
+ }
}
sub _parse_config_lines {
$used_packages{$1} = 1;
$last_usepackage_line = $i;
- } elsif ($lines->[$i] =~ m/\\begin{document}/) {
+ } elsif ($lines->[$i] =~ m/\\begin\{document\}/) {
$document_start_line = $i;
last;
my $form = $self->{"form"};
if (!open(IN, "$form->{templates}/$form->{IN}")) {
- $self->{"error"} = "$!";
+ $self->{"error"} = "$form->{templates}/$form->{IN}: $!";
return 0;
}
- binmode IN, ":utf8" if $::locale->is_utf8;
+ binmode IN, ":utf8";
my @lines = <IN>;
close(IN);
my $contents = join("", @lines);
- my $new_contents = $self->parse_block($contents);
- if (!defined($new_contents)) {
- $main::lxdebug->leave_sub();
- return 0;
+ # detect pagebreak block and its parameters
+ if ($contents =~ /$self->{tag_start_qm}pagebreak\s+(\d+)\s+(\d+)\s+(\d+)\s*$self->{tag_end_qm}(.*?)$self->{tag_start_qm}end(\s*pagebreak)?$self->{tag_end_qm}/s) {
+ $self->{"chars_per_line"} = $1;
+ $self->{"lines_on_first_page"} = $2;
+ $self->{"lines_on_second_page"} = $3;
+ $self->{"pagebreak_block"} = $4;
+
+ substr($contents, length($`), length($&)) = "";
}
- if ($::locale->is_utf8) {
- binmode OUT, ":utf8";
- print OUT Unicode::Normalize::normalize('C', $new_contents);
+ $self->{"forced_pagebreaks"} = [];
+
+ my $new_contents;
+ if ($self->{use_template_toolkit}) {
+ if ($self->{custom_tag_style}) {
+ $contents = "[% TAGS $self->{tag_start} $self->{tag_end} %]\n" . $contents;
+ }
+ $::form->init_template->process(\$contents, $form, \$new_contents) || die $::form->template->error;
} else {
- print OUT $new_contents;
+ $new_contents = $self->parse_block($contents);
}
+ if (!defined($new_contents)) {
+ $main::lxdebug->leave_sub();
+ return 0;
+ }
+
+ binmode OUT, ":utf8";
+ print OUT Unicode::Normalize::normalize('C', $new_contents);
if ($form->{"format"} =~ /postscript/i) {
return $self->convert_to_postscript();
my ($form, $userspath) = ($self->{"form"}, $self->{"userspath"});
# Convert the tex file to postscript
+ local $ENV{TEXINPUTS} = ".:" . $form->{cwd} . "/" . $form->{templates} . ":" . $ENV{TEXINPUTS};
if (!chdir("$userspath")) {
$self->{"error"} = "chdir : $!";
my ($form, $userspath) = ($self->{"form"}, $self->{"userspath"});
# Convert the tex file to PDF
+ local $ENV{TEXINPUTS} = ".:" . $form->{cwd} . "/" . $form->{templates} . ":" . $ENV{TEXINPUTS};
if (!chdir("$userspath")) {
$self->{"error"} = "chdir : $!";
$form->{tmpfile} =~ s/tex$/pdf/;
$self->cleanup();
+
+ return 1;
}
sub _get_latex_path {
return 1;
}
+sub parse_and_create_pdf {
+ my ($class, $template_file_name, %params) = @_;
+
+ my $keep_temp = $::lx_office_conf{debug} && $::lx_office_conf{debug}->{keep_temp_files};
+ my ($tex_fh, $tex_file_name) = File::Temp::tempfile(
+ 'kivitendo-printXXXXXX',
+ SUFFIX => '.tex',
+ DIR => $::lx_office_conf{paths}->{userspath},
+ UNLINK => $keep_temp ? 0 : 1,,
+ );
+
+ my $old_wd = getcwd();
+
+ my $local_form = Form->new('');
+ $local_form->{cwd} = $old_wd;
+ $local_form->{IN} = $template_file_name;
+ $local_form->{tmpdir} = $::lx_office_conf{paths}->{userspath};
+ $local_form->{tmpfile} = $tex_file_name;
+ $local_form->{templates} = SL::DB::Default->get->templates;
+
+ foreach (keys %params) {
+ croak "The parameter '$_' must not be used." if exists $local_form->{$_};
+ $local_form->{$_} = $params{$_};
+ }
+
+ my $error;
+ eval {
+ my $template = SL::Template::LaTeX->new($template_file_name, $local_form, \%::myconfig, $::lx_office_conf{paths}->{userspath});
+ my $result = $template->parse($tex_fh) && $template->convert_to_pdf;
+
+ die $template->{error} unless $result;
+
+ 1;
+ } or do { $error = $EVAL_ERROR; };
+
+ chdir $old_wd;
+ close $tex_fh;
+
+ if ($keep_temp) {
+ chmod(((stat $tex_file_name)[2] & 07777) | 0660, $tex_file_name);
+ } else {
+ my $tmpfile = $tex_file_name;
+ $tmpfile =~ s/\.\w+$//;
+ unlink(grep { !m/\.pdf$/ } <$tmpfile.*>);
+ }
+
+ return (error => $error) if $error;
+ return (file_name => do { $tex_file_name =~ s/tex$/pdf/; $tex_file_name });
+}
+
1;