X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FTemplate.pm;h=fe4b24893aa2ef84e505da043444add2657d4418;hb=80f6efd0cd9de22d54ccc605808a74c9955e643c;hp=99ca0f8bfb4c04aaa5959b54059e263776bf0f2b;hpb=ba233a63330839f96a92a8001e13f7e1e120f7d5;p=kivitendo-erp.git diff --git a/SL/Template.pm b/SL/Template.pm index 99ca0f8bf..fe4b24893 100644 --- a/SL/Template.pm +++ b/SL/Template.pm @@ -34,6 +34,7 @@ sub _init { $self->{userspath} = shift; $self->{error} = undef; + $self->{quot_re} = '"'; $self->set_tag_style('<%', '%>'); } @@ -120,6 +121,92 @@ sub substitute_vars { return $text; } +sub _parse_block_if { + $main::lxdebug->enter_sub(); + + my $self = shift; + my $contents = shift; + my $new_contents = shift; + my $pos_if = shift; + my @indices = @_; + + $$new_contents .= $self->substitute_vars(substr($$contents, 0, $pos_if), @indices); + substr($$contents, 0, $pos_if) = ""; + + if ($$contents !~ m/^$self->{tag_start_qm}if + \s* + (not\b|\!)? # $1 -- Eventuelle Negierung + \s+ + (\b.+?\b) # $2 -- Name der zu überprüfenden Variablen + ( # $3 -- Beginn des optionalen Vergleiches + \s* + ([!=]) # $4 -- Negierung des Vergleiches speichern + ([=~]) # $5 -- Art des Vergleiches speichern + \s* + ( # $6 -- Gequoteter String oder Bareword + $self->{quot_re} + (.*?)(?{quot_re} + | + (\b.+?\b) # $8 -- Bareword -- als Index für $form benutzen + ) + )? + \s* + $self->{tag_end_qm} + /x) { + $self->{"error"} = "Malformed $self->{tag_start}if$self->{tag_end}."; + $main::lxdebug->leave_sub(); + return undef; + } + + my $not = $1; + my $var = $2; + my $operator_neg = $4; # '=' oder '!' oder undef, wenn kein Vergleich erkannt + my $operator_type = $5; # '=' oder '~' für Stringvergleich oder Regex + my $quoted_word = $7; # nur gültig, wenn quoted string angegeben (siehe unten); dann "value" aus <%if var == "value" %> + my $bareword = $8; # undef, falls quoted string angegeben wurde; andernfalls "othervar" aus <%if var == othervar %> + + $not = !$not if ($operator_neg && $operator_neg eq '!'); + + substr($$contents, 0, length($&)) = ""; + + my $block; + ($block, $$contents) = $self->find_end($$contents, 0, $var, $not); + if (!$block) { + $self->{"error"} = "Unclosed $self->{tag_start}if$self->{tag_end}." unless ($self->{"error"}); + $main::lxdebug->leave_sub(); + return undef; + } + + my $value = $self->_get_loop_variable($var, 0, @indices); + my $hit = 0; + + if ($operator_type) { + my $compare_to = $bareword ? $self->_get_loop_variable($bareword, 0, @indices) : $quoted_word; + if ($operator_type eq '=') { + $hit = ($not && !($value eq $compare_to)) || (!$not && ($value eq $compare_to)); + } else { + $hit = ($not && !($value =~ m/$compare_to/i)) || (!$not && ($value =~ m/$compare_to/i)); + } + + } else { + $hit = ($not && ! $value) || (!$not && $value); + } + + if ($hit) { + my $new_text = $self->parse_block($block, @indices); + if (!defined($new_text)) { + $main::lxdebug->leave_sub(); + return undef; + } + $$new_contents .= $new_text; + } + + $main::lxdebug->leave_sub(); + + return 1; +} + 1; #### @@ -169,24 +256,27 @@ sub parse_foreach { my $ary = $self->_get_loop_variable($var, 1, @indices); - my $sum = 0; - my $current_page = 1; + my $sum = 0; + my $current_page = 1; my ($current_line, $corrent_row) = (0, 1); + my $description_array = $self->_get_loop_variable("description", 1); + my $longdescription_array = $self->_get_loop_variable("longdescription", 1); + my $linetotal_array = $self->_get_loop_variable("linetotal", 1); + + $form->{TEMPLATE_ARRAYS}->{cumulatelinetotal} = []; for (my $i = 0; $i < scalar(@{$ary}); $i++) { - $form->{"__first__"} = $i == 0; - $form->{"__last__"} = ($i + 1) == scalar(@{$ary}); - $form->{"__odd__"} = (($i + 1) % 2) == 1; + $form->{"__first__"} = $i == 1; + $form->{"__last__"} = ($i + 1) == scalar(@{$ary}); + $form->{"__odd__"} = (($i + 1) % 2) == 1; $form->{"__counter__"} = $i + 1; - if ((scalar(@{$form->{"description"}}) == scalar(@{$ary})) && - $self->{"chars_per_line"}) { - my $lines = - int(length($form->{"description"}->[$i]) / $self->{"chars_per_line"}); + if (scalar @{$description_array} == scalar @{$ary} && $self->{"chars_per_line"} != 0) { + my $lines = int(length($description_array->[$i]) / $self->{"chars_per_line"}); my $lpp; - $form->{"description"}->[$i] =~ s/(\\newline\s?)*$//; - my $_description = $form->{"description"}->[$i]; + $description_array->[$i] =~ s/(\\newline\s?)*$//; + my $_description = $description_array->[$i]; while ($_description =~ /\\newline/) { $lines++; $_description =~ s/\\newline//; @@ -200,7 +290,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] =~ //) || ($form->{"longdescription"}->[$i] =~ //)) { + if ((($current_line + $lines) > $lpp) || ($description_array->[$i] =~ //) || ($longdescription_array->[$i] =~ //)) { my $pb = $self->{"pagebreak_block"}; # replace the special variables <%sumcarriedforward%> @@ -219,12 +309,12 @@ sub parse_foreach { } $current_line += $lines; } - if ($i < scalar(@{$form->{"linetotal"}})) { - $sum += $form->parse_amount($self->{"myconfig"}, - $form->{"linetotal"}->[$i]); + + if ($i < scalar(@{$linetotal_array})) { + $sum += $form->parse_amount($self->{"myconfig"}, $linetotal_array->[$i]); } - $form->{"cumulatelinetotal"}[$i] = $form->format_amount($self->{"myconfig"}, $sum, 2); + $form->{TEMPLATE_ARRAYS}->{cumulatelinetotal}->[$i] = $form->format_amount($self->{"myconfig"}, $sum, 2); my $new_text = $self->parse_block($text, (@indices, $i)); return undef unless (defined($new_text)); @@ -330,44 +420,10 @@ sub parse_block { $new_contents .= $new_text; } else { - $new_contents .= $self->substitute_vars(substr($contents, 0, $pos_if), @indices); - substr($contents, 0, $pos_if) = ""; - - if ($contents !~ m|^$self->{tag_start_qm}if\s*(not)?\s+(.*?)$self->{tag_end_qm}|) { - $self->{"error"} = "Malformed $self->{tag_start}if$self->{tag_end}."; + if (!$self->_parse_block_if(\$contents, \$new_contents, $pos_if, @indices)) { $main::lxdebug->leave_sub(); return undef; } - - my ($not, $var) = ($1, $2); - - substr($contents, 0, length($&)) = ""; - - ($block, $contents) = $self->find_end($contents, 0, $var, $not); - if (!$block) { - $self->{"error"} = "Unclosed $self->{tag_start}if${not}$self->{tag_end}." unless ($self->{"error"}); - $main::lxdebug->leave_sub(); - return undef; - } - - 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]]; - } - - if (($not && !$value) || (!$not && $value)) { - my $new_text = $self->parse_block($block, @indices); - if (!defined($new_text)) { - $main::lxdebug->leave_sub(); - return undef; - } - $new_contents .= $new_text; - } } } @@ -445,7 +501,7 @@ sub _force_mandatory_packages { my (%used_packages, $document_start_line); foreach my $i (0 .. scalar @{ $lines } - 1) { - if ($lines->[$i] =~ m/\\usepackage[^{]*{(.*?)}/) { + if ($lines->[$i] =~ m/\\usepackage[^\{]*{(.*?)}/) { $used_packages{$1} = 1; } elsif ($lines->[$i] =~ m/\\begin{document}/) { @@ -792,6 +848,7 @@ sub new { $self->{"iconv"} = Text::Iconv->new($main::dbcharset, "UTF-8"); $self->set_tag_style('<%', '%>'); + $self->{quot_re} = '"'; return $self; } @@ -953,40 +1010,10 @@ sub parse_block { $new_contents .= $new_text; } else { - $new_contents .= $self->substitute_vars(substr($contents, 0, $pos_if), @indices); - substr($contents, 0, $pos_if) = ""; - - if ($contents !~ m|^\<\%if\s*(not)?\s+(.*?)\%\>|) { - $self->{"error"} = "Malformed <\%if\%>."; + if (!$self->_parse_block_if(\$contents, \$new_contents, $pos_if, @indices)) { $main::lxdebug->leave_sub(); return undef; } - - my ($not, $var) = ($1, $2); - - substr($contents, 0, length($&)) = ""; - - ($block, $contents) = $self->find_end($contents, 0, $var, $not); - if (!$block) { - $self->{"error"} = "Unclosed <\%if${not}\%>." unless ($self->{"error"}); - $main::lxdebug->leave_sub(); - return undef; - } - - my $value = $self->{"form"}->{$var}; - for (my $i = 0; $i < scalar(@indices); $i++) { - last unless (ref($value) eq "ARRAY"); - $value = $value->[$indices[$i]]; - } - - if (($not && !$value) || (!$not && $value)) { - my $new_text = $self->parse_block($block, @indices); - if (!defined($new_text)) { - $main::lxdebug->leave_sub(); - return undef; - } - $new_contents .= $new_text; - } } } }