X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FTemplate.pm;h=99ca0f8bfb4c04aaa5959b54059e263776bf0f2b;hb=96627c4383425906651c53d19e73ef0204e013e7;hp=f6afe692a07e238b89507e957da80da883ffc765;hpb=5ada8632263f93bfaa78d9136cc815fbeee95ead;p=kivitendo-erp.git diff --git a/SL/Template.pm b/SL/Template.pm index f6afe692a..99ca0f8bf 100644 --- a/SL/Template.pm +++ b/SL/Template.pm @@ -39,14 +39,16 @@ sub _init { } sub set_tag_style { - my $self = shift; - my $tag_start = shift; - my $tag_end = shift; - - $self->{tag_start} = $tag_start; - $self->{tag_end} = $tag_end; - $self->{tag_start_qm} = quotemeta $tag_start; - $self->{tag_end_qm} = quotemeta $tag_end; + my $self = shift; + my $tag_start = shift; + my $tag_end = shift; + + $self->{tag_start} = $tag_start; + $self->{tag_end} = $tag_end; + $self->{tag_start_qm} = quotemeta $tag_start; + $self->{tag_end_qm} = quotemeta $tag_end; + + $self->{substitute_vars_re} = "$self->{tag_start_qm}(.+?)$self->{tag_end_qm}"; } sub cleanup { @@ -77,6 +79,47 @@ sub uses_temp_file { return 0; } +sub _get_loop_variable { + my $self = shift; + my $var = shift; + my $get_array = shift; + my @indices = @_; + + my $form = $self->{form}; + my $value; + + if (($get_array || @indices) && (ref $form->{TEMPLATE_ARRAYS} eq 'HASH') && (ref $form->{TEMPLATE_ARRAYS}->{$var} eq 'ARRAY')) { + $value = $form->{TEMPLATE_ARRAYS}->{$var}; + } else { + $value = $form->{$var}; + } + + for (my $i = 0; $i < scalar(@indices); $i++) { + last unless (ref($value) eq "ARRAY"); + $value = $value->[$indices[$i]]; + } + + return $value; +} + +sub substitute_vars { + my ($self, $text, @indices) = @_; + + my $form = $self->{"form"}; + + while ($text =~ /$self->{substitute_vars_re}/) { + my ($tag_pos, $tag_len) = ($-[0], $+[0] - $-[0]); + my ($var, @options) = split(/\s+/, $1); + + my $value = $self->_get_loop_variable($var, 0, @indices); + $value = $self->format_string($value) unless (grep(/^NOESCAPE$/, @options)); + + substr($text, $tag_pos, $tag_len, $value); + } + + return $text; +} + 1; #### @@ -92,45 +135,16 @@ use vars qw(@ISA); sub new { my $type = shift; - return $type->SUPER::new(@_); + my $self = $type->SUPER::new(@_); + + return $self; } sub format_string { my ($self, $variable) = @_; my $form = $self->{"form"}; - my %replace = - ('order' => [quotemeta("\\"), - '', - '&', quotemeta("\n"), - '"', '\$', '%', '_', '#', quotemeta('^'), - '{', '}', '<', '>', '£', "\r", '±', '\xe1', - '²', '³', - - ], - quotemeta("\\") => '\\textbackslash ', - '' => '', - '"' => "''", - '&' => '\&', - '\$' => '\$', - '%' => '\%', - '_' => '\_', - '#' => '\#', - '{' => '\{', - '}' => '\}', - '<' => '$<$', - '>' => '$>$', - '£' => '\pounds ', - "\r" => "", - '±' => '$\pm$', - '\xe1' => '$\bullet$', - quotemeta('^') => '\^\\', - quotemeta("\n") => '\newline ', - '²' => '$^2$', - '³' => '$^3$', - ); - - map({ $variable =~ s/$_/$replace{$_}/g; } @{ $replace{"order"} }); + $variable = $main::locale->quote_special_chars('Template/LaTeX', $variable); # Allow some HTML markup to be converted into the output format's # corresponding markup code, e.g. bold or italic. @@ -148,37 +162,12 @@ sub format_string { return $variable; } -sub substitute_vars { - my ($self, $text, @indices) = @_; - - my $form = $self->{"form"}; - - while ($text =~ /$self->{tag_start_qm}(.+?)$self->{tag_end_qm}/) { - my ($tag_pos, $tag_len) = ($-[0], $+[0] - $-[0]); - my ($var, @options) = split(/\s+/, $1); - my $value = $form->{$var}; - - for (my $i = 0; $i < scalar(@indices); $i++) { - last unless (ref($value) eq "ARRAY"); - $value = $value->[$indices[$i]]; - } - $value = $self->format_string($value) unless (grep(/^NOESCAPE$/, @options)); - substr($text, $tag_pos, $tag_len) = $value; - } - - return $text; -} - sub parse_foreach { my ($self, $var, $text, $start_tag, $end_tag, @indices) = @_; my ($form, $new_contents) = ($self->{"form"}, ""); - my $ary = $form->{$var}; - for (my $i = 0; $i < scalar(@indices); $i++) { - last unless (ref($ary) eq "ARRAY"); - $ary = $ary->[$indices[$i]]; - } + my $ary = $self->_get_loop_variable($var, 1, @indices); my $sum = 0; my $current_page = 1; @@ -211,8 +200,7 @@ sub parse_foreach { } # Yes we need a manual page break -- or the user has forced one - if ((($current_line + $lines) > $lpp) || - ($form->{"description"}->[$i] =~ //)) { + if ((($current_line + $lines) > $lpp) || ($form->{"description"}->[$i] =~ //) || ($form->{"longdescription"}->[$i] =~ //)) { my $pb = $self->{"pagebreak_block"}; # replace the special variables <%sumcarriedforward%> @@ -235,9 +223,9 @@ sub parse_foreach { $sum += $form->parse_amount($self->{"myconfig"}, $form->{"linetotal"}->[$i]); } - + $form->{"cumulatelinetotal"}[$i] = $form->format_amount($self->{"myconfig"}, $sum, 2); - + my $new_text = $self->parse_block($text, (@indices, $i)); return undef unless (defined($new_text)); $new_contents .= $start_tag . $new_text . $end_tag; @@ -362,7 +350,11 @@ sub parse_block { return undef; } - my $value = $self->{"form"}->{$var}; + my $form = $self->{form}; + $form = $form->{TEMPLATE_ARRAYS} if @indices + && ref $form->{TEMPLATE_ARRAYS} eq 'HASH' + && ref $form->{TEMPLATE_ARRAYS}->{$var} eq 'ARRAY'; + my $value = $form->{$var}; for (my $i = 0; $i < scalar(@indices); $i++) { last unless (ref($value) eq "ARRAY"); $value = $value->[$indices[$i]]; @@ -446,6 +438,31 @@ sub _parse_config_lines { } } +sub _force_mandatory_packages { + my $self = shift; + my $lines = shift; + + my (%used_packages, $document_start_line); + + foreach my $i (0 .. scalar @{ $lines } - 1) { + if ($lines->[$i] =~ m/\\usepackage[^{]*{(.*?)}/) { + $used_packages{$1} = 1; + + } elsif ($lines->[$i] =~ m/\\begin{document}/) { + $document_start_line = $i; + last; + + } + } + + $document_start_line = scalar @{ $lines } - 1 if (!defined $document_start_line); + + if (!$used_packages{textcomp}) { + splice @{ $lines }, $document_start_line, 0, "\\usepackage{textcomp}\n"; + $document_start_line++; + } +} + sub parse { my $self = $_[0]; local *OUT = $_[1]; @@ -459,6 +476,7 @@ sub parse { close(IN); $self->_parse_config_lines(\@lines); + $self->_force_mandatory_packages(\@lines) if (ref $self eq 'LaTeXTemplate'); my $contents = join("", @lines); @@ -503,10 +521,12 @@ sub convert_to_postscript { return 0; } - $form->{tmpfile} =~ s/$userspath\///g; + $form->{tmpfile} =~ s/\Q$userspath\E\///g; + + my $latex = $self->_get_latex_path(); for (my $run = 1; $run <= 2; $run++) { - system("latex --interaction=nonstopmode $form->{tmpfile} " . + system("${latex} --interaction=nonstopmode $form->{tmpfile} " . "> $form->{tmpfile}.err"); if ($?) { $self->{"error"} = $form->cleanup(); @@ -542,10 +562,12 @@ sub convert_to_pdf { return 0; } - $form->{tmpfile} =~ s/$userspath\///g; + $form->{tmpfile} =~ s/\Q$userspath\E\///g; + + my $latex = $self->_get_latex_path(); for (my $run = 1; $run <= 2; $run++) { - system("pdflatex --interaction=nonstopmode $form->{tmpfile} " . + system("${latex} --interaction=nonstopmode $form->{tmpfile} " . "> $form->{tmpfile}.err"); if ($?) { $self->{"error"} = $form->cleanup(); @@ -559,6 +581,10 @@ sub convert_to_pdf { $self->cleanup(); } +sub _get_latex_path { + return $main::latex_bin || 'pdflatex'; +} + sub get_mime_type() { my ($self) = @_; @@ -594,14 +620,7 @@ sub format_string { my ($self, $variable) = @_; my $form = $self->{"form"}; - my %replace = - ('order' => ['<', '>', quotemeta("\n")], - '<' => '<', - '>' => '>', - quotemeta("\n") => '
', - ); - - map({ $variable =~ s/$_/$replace{$_}/g; } @{ $replace{"order"} }); + $variable = $main::locale->quote_special_chars('Template/HTML', $variable); # Allow some HTML markup to be converted into the output format's # corresponding markup code, e.g. bold or italic. @@ -650,7 +669,7 @@ sub convert_to_postscript { return 0; } - $form->{"tmpfile"} =~ s/$userspath\///g; + $form->{"tmpfile"} =~ s/\Q$userspath\E\///g; my $psfile = $form->{"tmpfile"}; $psfile =~ s/.html/.ps/; if ($psfile eq $form->{"tmpfile"}) { @@ -683,7 +702,7 @@ sub convert_to_pdf { return 0; } - $form->{"tmpfile"} =~ s/$userspath\///g; + $form->{"tmpfile"} =~ s/\Q$userspath\E\///g; my $pdffile = $form->{"tmpfile"}; $pdffile =~ s/.html/.pdf/; if ($pdffile eq $form->{"tmpfile"}) { @@ -769,28 +788,12 @@ sub new { } } - $self->{"rnd"} = int(rand(1000000)); + $self->{"rnd"} = int(rand(1000000)); $self->{"iconv"} = Text::Iconv->new($main::dbcharset, "UTF-8"); - return $self; -} - -sub substitute_vars { - my ($self, $text, @indices) = @_; - - my $form = $self->{"form"}; - - while ($text =~ /\<\%(.*?)\%\>/) { - my $value = $form->{$1}; - - for (my $i = 0; $i < scalar(@indices); $i++) { - last unless (ref($value) eq "ARRAY"); - $value = $value->[$indices[$i]]; - } - substr($text, $-[0], $+[0] - $-[0]) = $self->format_string($value); - } + $self->set_tag_style('<%', '%>'); - return $text; + return $self; } sub parse_foreach { @@ -798,11 +801,7 @@ sub parse_foreach { my ($form, $new_contents) = ($self->{"form"}, ""); - my $ary = $form->{$var}; - for (my $i = 0; $i < scalar(@indices); $i++) { - last unless (ref($ary) eq "ARRAY"); - $ary = $ary->[$indices[$i]]; - } + my $ary = $self->_get_loop_variable($var, 1, @indices); for (my $i = 0; $i < scalar(@{$ary}); $i++) { $form->{"__first__"} = $i == 0; @@ -1342,21 +1341,7 @@ sub format_string { my $form = $self->{"form"}; my $iconv = $self->{"iconv"}; - my %replace = - ('order' => ['&', '<', '>', '"', "'", - '\x80', # Euro - quotemeta("\n"), quotemeta("\r")], - '<' => '<', - '>' => '>', - '"' => '"', - "'" => ''', - '&' => '&', - '\x80' => chr(0xa4), # Euro - quotemeta("\n") => '', - quotemeta("\r") => '', - ); - - map({ $variable =~ s/$_/$replace{$_}/g; } @{ $replace{"order"} }); + $variable = $main::locale->quote_special_chars('Template/OpenDocument', $variable); # Allow some HTML markup to be converted into the output format's # corresponding markup code, e.g. bold or italic. @@ -1366,7 +1351,7 @@ sub format_string { foreach my $key (keys(%markup_replace)) { my $value = $markup_replace{$key}; - $variable =~ s|\<${key}\>||gi; + $variable =~ s|\<${key}\>||gi; #" $variable =~ s|\</${key}\>||gi; } @@ -1392,7 +1377,7 @@ sub uses_temp_file { #### ########################################################## -package XMLTemplate; +package XMLTemplate; use vars qw(@ISA); @@ -1409,14 +1394,7 @@ sub format_string { my ($self, $variable) = @_; my $form = $self->{"form"}; - my %replace = - ('order' => ['<', '>', quotemeta("\n")], - '<' => '<', - '>' => '>', - quotemeta("\n") => '
', - ); - - map({ $variable =~ s/$_/$replace{$_}/g; } @{ $replace{"order"} }); + $variable = $main::locale->quote_special_chars('Template/XML', $variable); # Allow no markup to be converted into the output format my @markup_replace = ('b', 'i', 's', 'u', 'sub', 'sup');