X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FTemplate%2FLaTeX.pm;h=130a42484d1405f49f88bcae7d8c0c67d9ff191b;hb=34cece27c008f9fbbb0703e0fd3d495f34c59209;hp=c76b82a6274067af448d9360c54bd30a6140628a;hpb=cbf105b2340879d2381b81148f2cbfe16dfdffbf;p=kivitendo-erp.git diff --git a/SL/Template/LaTeX.pm b/SL/Template/LaTeX.pm index c76b82a62..130a42484 100644 --- a/SL/Template/LaTeX.pm +++ b/SL/Template/LaTeX.pm @@ -66,6 +66,13 @@ my %html_replace = ( '
' => "\\newline ", ); +sub _lb_to_space { + my ($to_replace) = @_; + + my $vspace = '\vspace*{0.5cm}'; + return $vspace x (length($to_replace) / length($html_replace{'
'})); +} + sub _format_html { my ($self, $content, %params) = @_; @@ -86,7 +93,13 @@ sub _format_html { } split(m{(<.*?>)}x, $content); $content = join '', @parts; - $content =~ s{ (?: [\n\s] | \\newline )+$ }{}gx; + $content =~ s{ (?: [\n\s] | \\newline )+ $ }{}gx; # remove line breaks at the end of the text + $content =~ s{ ^ \s+ }{}gx; # remove white space at the start of the text + $content =~ s{ ^ ( \\newline \ )+ }{ _lb_to_space($1) }gxe; # convert line breaks at the start of the text to vertical space + $content =~ s{ ( \n\n+ ) ( \\newline \ )+ }{ $1 . _lb_to_space($2) }gxe; # convert line breaks at the start of a paragraph to vertical space + $content =~ s{ ( \\end\{ [^\}]+ \} \h* ) ( \\newline \ )+ }{ $1 . _lb_to_space($2) }gxe; # convert line breaks after LaTeX environments like lists to vertical space + $content =~ s{ ^ \h+ \\newline }{\\newline}gmx; + $content =~ s{ \n\n \h* \\newline \h* }{\n\n}gmx; return $content; } @@ -112,6 +125,9 @@ sub format_string { // $formatters{ $self->{default_content_type} } // $formatters{ text }; + $content =~ s{[^\p{Print}\n]|\p{Cf}}{}g; + $variable =~ s{[^\p{Print}\n]|\p{Cf}}{}g; + return $formatter->($self, $content, variable => $variable); } @@ -269,15 +285,15 @@ sub parse_block { $new_contents .= $self->substitute_vars(substr($contents, 0, $pos_foreach), @indices); substr($contents, 0, $pos_foreach) = ""; - if ($contents !~ m|^$self->{tag_start_qm}foreach (.+?)$self->{tag_end_qm}|) { + if ($contents !~ m|^($self->{tag_start_qm}foreach (.+?)$self->{tag_end_qm})|) { $self->{"error"} = "Malformed $self->{tag_start}foreach$self->{tag_end}."; $main::lxdebug->leave_sub(); return undef; } - my $var = $1; + my $var = $2; - substr($contents, 0, length($&)) = ""; + substr($contents, 0, length($1)) = ""; my $block; ($block, $contents) = $self->find_end($contents); @@ -420,13 +436,13 @@ 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; + 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"} = $3; + $self->{"lines_on_first_page"} = $4; + $self->{"lines_on_second_page"} = $5; + $self->{"pagebreak_block"} = $6; - substr($contents, length($`), length($&)) = ""; + substr($contents, length($1), length($2)) = ""; } $self->{"forced_pagebreaks"} = []; @@ -437,7 +453,9 @@ sub parse { $contents = "[% TAGS $self->{tag_start} $self->{tag_end} %]\n" . $contents; } - $::form->init_template->process(\$contents, $form, \$new_contents) || die $::form->template->error; + my $globals = global_vars(); + + $::form->template->process(\$contents, { %$form, %$globals }, \$new_contents) || die $::form->template->error; } else { $new_contents = $self->parse_block($contents); } @@ -480,8 +498,10 @@ sub convert_to_postscript { $ENV{openin_any} = "p"; for (my $run = 1; $run <= 2; $run++) { - system("${latex} --interaction=nonstopmode $form->{tmpfile} " . - "> $form->{tmpfile}.err"); + if (system("${latex} --interaction=nonstopmode $form->{tmpfile} " . + "> $form->{tmpfile}.err") == -1) { + die "system call to $latex failed: $!"; + } if ($?) { $ENV{HOME} = $old_home; $ENV{openin_any} = $old_openin_any; @@ -492,12 +512,14 @@ sub convert_to_postscript { $form->{tmpfile} =~ s/tex$/dvi/; - system("dvips $form->{tmpfile} -o -q > /dev/null"); + if (system("dvips $form->{tmpfile} -o -q > /dev/null") == -1) { + die "system call to dvips failed: $!"; + } $ENV{HOME} = $old_home; $ENV{openin_any} = $old_openin_any; if ($?) { - $self->{"error"} = "dvips : $!"; + $self->{"error"} = "dvips : $?"; $self->cleanup('dvips'); return 0; } @@ -530,8 +552,11 @@ sub convert_to_pdf { $ENV{openin_any} = "p"; for (my $run = 1; $run <= 2; $run++) { - system("${latex} --interaction=nonstopmode $form->{tmpfile} " . - "> $form->{tmpfile}.err"); + if (system("${latex} --interaction=nonstopmode $form->{tmpfile} " . + "> $form->{tmpfile}.err") == -1) { + die "system call to $latex failed: $!"; + } + if ($?) { $ENV{HOME} = $old_home; $ENV{openin_any} = $old_openin_any; @@ -617,4 +642,15 @@ sub parse_and_create_pdf { return (file_name => do { $tex_file_name =~ s/tex$/pdf/; $tex_file_name }); } +sub global_vars { + { + AUTH => $::auth, + INSTANCE_CONF => $::instance_conf, + LOCALE => $::locale, + LXCONFIG => $::lx_office_conf, + LXDEBUG => $::lxdebug, + MYCONFIG => \%::myconfig, + }; +} + 1;