X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FTemplate.pm;h=b20a7b1a3b5a25c55713b0daa10a53f972162e11;hb=ff159a4d47b9a2d10744dcfc23da2c63605c8a32;hp=8a9e6832613272c50fd30de8e5ccc6e675a8aba0;hpb=58b90d2d1159a4564f4ef0533669a506442e88eb;p=kivitendo-erp.git diff --git a/SL/Template.pm b/SL/Template.pm index 8a9e68326..b20a7b1a3 100644 --- a/SL/Template.pm +++ b/SL/Template.pm @@ -6,1409 +6,57 @@ # #==================================================================== -package SimpleTemplate; +package SL::Template; -# Parameters: -# 1. The template's file name -# 2. A reference to the Form object -# 3. A reference to the myconfig hash -# -# Returns: -# A new template object -sub new { - my $type = shift; - my $self = {}; - - bless($self, $type); - $self->_init(@_); - - return $self; -} - -sub _init { - my $self = shift; - - $self->{source} = shift; - $self->{form} = shift; - $self->{myconfig} = shift; - $self->{userspath} = shift; - - $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 { - my ($self) = @_; -} - -# Parameters: -# 1. A typeglob for the file handle. The output will be written -# to this file handle. -# -# Returns: -# 1 on success and undef or 0 if there was an error. In the latter case -# the calling function can retrieve the error message via $obj->get_error() -sub parse { - my $self = $_[0]; - local *OUT = $_[1]; - - print(OUT "Hallo!\n"); -} - -sub get_error { - my $self = shift; - - return $self->{"error"}; -} - -sub uses_temp_file { - return 0; -} - -1; - -#### -#### LaTeXTemplate -#### - -package LaTeXTemplate; - -use vars qw(@ISA); - -@ISA = qw(SimpleTemplate); - -sub new { - my $type = shift; - - return $type->SUPER::new(@_); -} - -sub format_string { - my ($self, $variable) = @_; - my $form = $self->{"form"}; - - $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. - my %markup_replace = ('b' => 'textbf', - 'i' => 'textit', - 'u' => 'underline'); - - foreach my $key (keys(%markup_replace)) { - my $new = $markup_replace{$key}; - $variable =~ s/\$\<\$${key}\$\>\$(.*?)\$<\$\/${key}\$>\$/\\${new}\{$1\}/gi; - } - - $variable =~ s/[\x00-\x1f]//g; - - 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 $sum = 0; - my $current_page = 1; - my ($current_line, $corrent_row) = (0, 1); - - 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->{"__counter__"} = $i + 1; - - if ((scalar(@{$form->{"description"}}) == scalar(@{$ary})) && - $self->{"chars_per_line"}) { - my $lines = - int(length($form->{"description"}->[$i]) / $self->{"chars_per_line"}); - my $lpp; - - $form->{"description"}->[$i] =~ s/(\\newline\s?)*$//; - my $_description = $form->{"description"}->[$i]; - while ($_description =~ /\\newline/) { - $lines++; - $_description =~ s/\\newline//; - } - $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) || ($form->{"description"}->[$i] =~ //) || ($form->{"longdescription"}->[$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 ($i < scalar(@{$form->{"linetotal"}})) { - $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; - } - map({ delete($form->{"__${_}__"}); } qw(first last odd counter)); - - return $new_contents; -} - -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, length($self->{tag_start})) ne $self->{tag_start}); - - 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, $keyword_pos, 4) eq 'else') && (1 == $depth)) { - if (!$var) { - $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!^$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, $keyword_pos, 3) eq 'end') { - $depth--; - if ($depth == 0) { - my $block = substr($text, 0, $pos - 1); - substr($text, 0, $pos - 1) = ""; - $text =~ s!^$self->{tag_start_qm}.+?$self->{tag_end_qm}!!; - - return ($block, $text); - } - } - } - - return undef; -} - -sub parse_block { - $main::lxdebug->enter_sub(); - - my ($self, $contents, @indices) = @_; - - my $new_contents = ""; - - while ($contents ne "") { - 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); - last; - } - - if ((-1 == $pos_if) || ((-1 != $pos_foreach) && ($pos_if > $pos_foreach))) { - $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}|) { - $self->{"error"} = "Malformed $self->{tag_start}foreach$self->{tag_end}."; - $main::lxdebug->leave_sub(); - return undef; - } - - my $var = $1; - - substr($contents, 0, length($&)) = ""; - - my $block; - ($block, $contents) = $self->find_end($contents); - if (!$block) { - $self->{"error"} = "Unclosed $self->{tag_start}foreach$self->{tag_end}." unless ($self->{"error"}); - $main::lxdebug->leave_sub(); - return undef; - } - - my $new_text = $self->parse_foreach($var, $block, "", "", @indices); - if (!defined($new_text)) { - $main::lxdebug->leave_sub(); - return undef; - } - $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}."; - $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 $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; - } - } - } - - $main::lxdebug->leave_sub(); - - 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; +use strict; - $line =~ s/^\s*//; - $line =~ s/\s*$//; +use IO::Dir; - my ($key, $value) = split m/\s*=\s*/, $line, 2; +use SL::Template::Simple; +use SL::Template::Excel; +use SL::Template::HTML; +use SL::Template::LaTeX; +use SL::Template::OpenDocument; +use SL::Template::PlainText; +use SL::Template::ShellCommand; - 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*