X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FTemplate%2FLaTeX.pm;h=c6d54d5934a601488ac2e9480734d1363592ee31;hb=77527022ef849e10970f285717b9db5d383a1a2e;hp=7b89aa4ab370e78682f5207c7f3f5e15e0da0cf7;hpb=f6ea0fa8433622ebf657a3a6a92f80e75b058bff;p=kivitendo-erp.git diff --git a/SL/Template/LaTeX.pm b/SL/Template/LaTeX.pm index 7b89aa4ab..c6d54d593 100644 --- a/SL/Template/LaTeX.pm +++ b/SL/Template/LaTeX.pm @@ -4,6 +4,9 @@ use parent qw(SL::Template::Simple); use strict; +use Cwd; +use Unicode::Normalize qw(); + sub new { my $type = shift; @@ -60,47 +63,6 @@ sub parse_foreach { $form->{"__odd__"} = (($i + 1) % 2) == 1; $form->{"__counter__"} = $i + 1; - 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] =~ //) - || ( ref $longdescription_array eq 'ARRAY' - && $longdescription_array->[$i] =~ //)) { - 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; - } - if ( ref $linetotal_array eq 'ARRAY' && $i < scalar(@{$linetotal_array})) { $sum += $form->parse_amount($self->{"myconfig"}, $linetotal_array->[$i]); @@ -132,7 +94,7 @@ sub find_end { my $keyword_pos = $pos - 1 + $tag_start_len; - if ((substr($text, $keyword_pos, 2) eq 'if') || (substr($text, $keyword_pos, 3) eq 'foreach')) { + if ((substr($text, $keyword_pos, 2) eq 'if') || (substr($text, $keyword_pos, 7) eq 'foreach')) { $depth++; } elsif ((substr($text, $keyword_pos, 4) eq 'else') && (1 == $depth)) { @@ -275,7 +237,7 @@ sub _parse_config_lines { while ($i < $num_lines) { my $line = $lines->[$i]; - if ($line !~ m/^${comment_start}\s*config\s*:(.*)${comment_end}$/i) { + if ($line !~ m/^${comment_start}\s*config\s*:(.*?)${comment_end}$/i) { $i++; next; } @@ -290,11 +252,12 @@ sub _force_mandatory_packages { my $self = shift; my $lines = shift; - my (%used_packages, $document_start_line); + my (%used_packages, $document_start_line, $last_usepackage_line); foreach my $i (0 .. scalar @{ $lines } - 1) { if ($lines->[$i] =~ m/\\usepackage[^\{]*{(.*?)}/) { $used_packages{$1} = 1; + $last_usepackage_line = $i; } elsif ($lines->[$i] =~ m/\\begin{document}/) { $document_start_line = $i; @@ -303,11 +266,14 @@ sub _force_mandatory_packages { } } - $document_start_line = scalar @{ $lines } - 1 if (!defined $document_start_line); + my $insertion_point = defined($document_start_line) ? $document_start_line + : defined($last_usepackage_line) ? $last_usepackage_line + : scalar @{ $lines } - 1; - if (!$used_packages{textcomp}) { - splice @{ $lines }, $document_start_line, 0, "\\usepackage{textcomp}\n"; - $document_start_line++; + foreach my $package (qw(textcomp)) { + next if $used_packages{$package}; + splice @{ $lines }, $insertion_point, 0, "\\usepackage{${package}}\n"; + $insertion_point++; } } @@ -329,26 +295,19 @@ sub parse { my $contents = join("", @lines); - # 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($&)) = ""; - } - - $self->{"forced_pagebreaks"} = []; - my $new_contents = $self->parse_block($contents); if (!defined($new_contents)) { $main::lxdebug->leave_sub(); return 0; } - binmode OUT, ":utf8" if $::locale->is_utf8; - print(OUT $new_contents); + if ($::locale->is_utf8) { + binmode OUT, ":utf8"; + print OUT Unicode::Normalize::normalize('C', $new_contents); + + } else { + print OUT $new_contents; + } if ($form->{"format"} =~ /postscript/i) { return $self->convert_to_postscript(); @@ -374,13 +333,18 @@ sub convert_to_postscript { $form->{tmpfile} =~ s/\Q$userspath\E\///g; my $latex = $self->_get_latex_path(); + my $old_home = $ENV{HOME}; + my $old_openin_any = $ENV{openin_any}; + $ENV{HOME} = $userspath =~ m|^/| ? $userspath : getcwd(); + $ENV{openin_any} = "p"; for (my $run = 1; $run <= 2; $run++) { system("${latex} --interaction=nonstopmode $form->{tmpfile} " . "> $form->{tmpfile}.err"); if ($?) { - $self->{"error"} = $form->cleanup(); - $self->cleanup(); + $ENV{HOME} = $old_home; + $ENV{openin_any} = $old_openin_any; + $self->{"error"} = $form->cleanup($latex); return 0; } } @@ -388,9 +352,12 @@ sub convert_to_postscript { $form->{tmpfile} =~ s/tex$/dvi/; system("dvips $form->{tmpfile} -o -q > /dev/null"); + $ENV{HOME} = $old_home; + $ENV{openin_any} = $old_openin_any; + if ($?) { $self->{"error"} = "dvips : $!"; - $self->cleanup(); + $self->cleanup('dvips'); return 0; } $form->{tmpfile} =~ s/dvi$/ps/; @@ -415,24 +382,31 @@ sub convert_to_pdf { $form->{tmpfile} =~ s/\Q$userspath\E\///g; my $latex = $self->_get_latex_path(); + my $old_home = $ENV{HOME}; + my $old_openin_any = $ENV{openin_any}; + $ENV{HOME} = $userspath =~ m|^/| ? $userspath : getcwd(); + $ENV{openin_any} = "p"; for (my $run = 1; $run <= 2; $run++) { system("${latex} --interaction=nonstopmode $form->{tmpfile} " . "> $form->{tmpfile}.err"); if ($?) { - $self->{"error"} = $form->cleanup(); - $self->cleanup(); + $ENV{HOME} = $old_home; + $ENV{openin_any} = $old_openin_any; + $self->{error} = $form->cleanup($latex); return 0; } } + $ENV{HOME} = $old_home; + $ENV{openin_any} = $old_openin_any; $form->{tmpfile} =~ s/tex$/pdf/; $self->cleanup(); } sub _get_latex_path { - return $main::latex_bin || 'pdflatex'; + return $::lx_office_conf{applications}->{latex} || 'pdflatex'; } sub get_mime_type() {