X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FTemplate.pm;h=f19e67ab06f7ee9bf669fa46e39c30d347e650ba;hb=56e52e62aa29100c6369274dcf805d5cb99bf315;hp=18b44d069288fac571c764dfa189ac71f2d69bde;hpb=319c72e8738bbbfd457ae33dafd03ab8d5203a12;p=kivitendo-erp.git diff --git a/SL/Template.pm b/SL/Template.pm index 18b44d069..f19e67ab0 100644 --- a/SL/Template.pm +++ b/SL/Template.pm @@ -28,12 +28,25 @@ sub new { sub _init { my $self = shift; - $self->{"source"} = shift; - $self->{"form"} = shift; - $self->{"myconfig"} = shift; - $self->{"userspath"} = shift; + $self->{source} = shift; + $self->{form} = shift; + $self->{myconfig} = shift; + $self->{userspath} = shift; - $self->{"error"} = undef; + $self->{error} = undef; + + $self->set_tag_style('<%', '%>'); +} + +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; } sub cleanup { @@ -91,7 +104,9 @@ sub format_string { '', '&', quotemeta("\n"), '"', '\$', '%', '_', '#', quotemeta('^'), - '{', '}', '<', '>', '£', "\r", '±', + '{', '}', '<', '>', '£', "\r", '±', '\xe1', + '²', '³', + ], quotemeta("\\") => '\\textbackslash ', '' => '', @@ -108,8 +123,11 @@ sub format_string { '£' => '\pounds ', "\r" => "", '±' => '$\pm$', + '\xe1' => '$\bullet$', quotemeta('^') => '\^\\', - quotemeta("\n") => '\newline ' + quotemeta("\n") => '\newline ', + '²' => '$^2$', + '³' => '$^3$', ); map({ $variable =~ s/$_/$replace{$_}/g; } @{ $replace{"order"} }); @@ -125,6 +143,8 @@ sub format_string { $variable =~ s/\$\<\$${key}\$\>\$(.*?)\$<\$\/${key}\$>\$/\\${new}\{$1\}/gi; } + $variable =~ s/[\x00-\x1f]//g; + return $variable; } @@ -133,7 +153,8 @@ sub substitute_vars { my $form = $self->{"form"}; - while ($text =~ /<\%(.*?)\%>/) { + 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}; @@ -142,7 +163,7 @@ sub substitute_vars { $value = $value->[$indices[$i]]; } $value = $self->format_string($value) unless (grep(/^NOESCAPE$/, @options)); - substr($text, $-[0], $+[0] - $-[0]) = $value; + substr($text, $tag_pos, $tag_len) = $value; } return $text; @@ -198,8 +219,8 @@ sub parse_foreach { # and <%lastpage%> my $psum = $form->format_amount($self->{"myconfig"}, $sum, 2); - $pb =~ s/<%sumcarriedforward%>/$psum/g; - $pb =~ s/<%lastpage%>/$current_page/g; + $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)); @@ -229,36 +250,43 @@ sub parse_foreach { sub find_end { my ($self, $text, $pos, $var, $not) = @_; + my $tag_start_len = length $self->{tag_start}; + my $depth = 1; $pos = 0 unless ($pos); while ($pos < length($text)) { $pos++; - next if (substr($text, $pos - 1, 2) ne '<%'); + next if (substr($text, $pos - 1, length($self->{tag_start})) ne $self->{tag_start}); - if ((substr($text, $pos + 1, 2) eq 'if') || (substr($text, $pos + 1, 3) eq 'for')) { + my $keyword_pos = $pos - 1 + $tag_start_len; + + if ((substr($text, $keyword_pos, 2) eq 'if') || (substr($text, $keyword_pos, 3) eq 'for')) { $depth++; - } elsif ((substr($text, $pos + 1, 4) eq 'else') && (1 == $depth)) { + } elsif ((substr($text, $keyword_pos, 4) eq 'else') && (1 == $depth)) { if (!$var) { - $self->{"error"} = '<%else%> outside of <%if%> / <%ifnot%>.'; + $self->{"error"} = + "$self->{tag_start}else$self->{tag_end} outside of " + . "$self->{tag_start}if$self->{tag_end} / " + . "$self->{tag_start}ifnot$self->{tag_end}."; return undef; } my $block = substr($text, 0, $pos - 1); substr($text, 0, $pos - 1) = ""; - $text =~ s!^<\%[^\%]+\%>!!; - $text = '<%if' . ($not ? " " : "not ") . $var . '%>' . $text; + $text =~ s!^$self->{tag_start_qm}.+?$self->{tag_end_qm}!!; + $text = $self->{tag_start} . 'if' . ($not ? " " : "not ") . $var . $self->{tag_end} . $text; return ($block, $text); - } elsif (substr($text, $pos + 1, 3) eq 'end') { + } elsif (substr($text, $keyword_pos, 3) eq 'end') { $depth--; if ($depth == 0) { my $block = substr($text, 0, $pos - 1); substr($text, 0, $pos - 1) = ""; - $text =~ s!^<\%[^\%]+\%>!!; + $text =~ s!^$self->{tag_start_qm}.+?$self->{tag_end_qm}!!; return ($block, $text); } @@ -276,8 +304,8 @@ sub parse_block { my $new_contents = ""; while ($contents ne "") { - my $pos_if = index($contents, '<%if'); - my $pos_foreach = index($contents, '<%foreach'); + my $pos_if = index($contents, $self->{tag_start} . 'if'); + my $pos_foreach = index($contents, $self->{tag_start} . 'foreach'); if ((-1 == $pos_if) && (-1 == $pos_foreach)) { $new_contents .= $self->substitute_vars($contents, @indices); @@ -288,8 +316,8 @@ sub parse_block { $new_contents .= $self->substitute_vars(substr($contents, 0, $pos_foreach), @indices); substr($contents, 0, $pos_foreach) = ""; - if ($contents !~ m|^<\%foreach (.*?)\%>|) { - $self->{"error"} = "Malformed <\%foreach\%>."; + 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; } @@ -301,7 +329,7 @@ sub parse_block { my $block; ($block, $contents) = $self->find_end($contents); if (!$block) { - $self->{"error"} = "Unclosed <\%foreach\%>." unless ($self->{"error"}); + $self->{"error"} = "Unclosed $self->{tag_start}foreach$self->{tag_end}." unless ($self->{"error"}); $main::lxdebug->leave_sub(); return undef; } @@ -317,8 +345,8 @@ sub parse_block { $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 ($contents !~ m|^$self->{tag_start_qm}if\s*(not)?\s+(.*?)$self->{tag_end_qm}|) { + $self->{"error"} = "Malformed $self->{tag_start}if$self->{tag_end}."; $main::lxdebug->leave_sub(); return undef; } @@ -329,7 +357,7 @@ sub parse_block { ($block, $contents) = $self->find_end($contents, 0, $var, $not); if (!$block) { - $self->{"error"} = "Unclosed <\%if${not}\%>." unless ($self->{"error"}); + $self->{"error"} = "Unclosed $self->{tag_start}if${not}$self->{tag_end}." unless ($self->{"error"}); $main::lxdebug->leave_sub(); return undef; } @@ -356,6 +384,68 @@ sub parse_block { return $new_contents; } +sub parse_first_line { + my $self = shift; + my $line = shift || ""; + + if ($line =~ m/([^\s]+)set-tag-style([^\s]+)/) { + if ($1 eq $2) { + $self->{error} = "The tag start and end markers must not be equal."; + return 0; + } + + $self->set_tag_style($1, $2); + } + + return 1; +} + +sub _parse_config_option { + my $self = shift; + my $line = shift; + + $line =~ s/^\s*//; + $line =~ s/\s*$//; + + my ($key, $value) = split m/\s*=\s*/, $line, 2; + + if ($key eq 'tag-style') { + $self->set_tag_style(split(m/\s+/, $value, 2)); + } +} + +sub _parse_config_lines { + my $self = shift; + my $lines = shift; + + my ($comment_start, $comment_end) = ("", ""); + + if (ref $self eq 'LaTeXTemplate') { + $comment_start = '\s*%'; + } elsif (ref $self eq 'HTMLTemplate') { + $comment_start = '\s*