$self->{userspath} = shift;
$self->{error} = undef;
+ $self->{quot_re} = '"';
$self->set_tag_style('<%', '%>');
}
return 0;
}
-sub _get_loop_variable_value {
- my $self = shift;
- my $var = shift;
- my @indices = @_;
+sub _get_loop_variable {
+ my $self = shift;
+ my $var = shift;
+ my $get_array = shift;
+ my @indices = @_;
- my $form = $self->{form};
- my $value = $form->{$var};
+ 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");
my ($tag_pos, $tag_len) = ($-[0], $+[0] - $-[0]);
my ($var, @options) = split(/\s+/, $1);
- my $value = $self->_get_loop_variable_value($var, @indices);
+ 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;
}
+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}
+ (.*?)(?<!\\) # $7 -- Gequoteter String -- direkter Vergleich mit eq bzw. ne oder Patternmatching; Escapete Anführungs als Teil des Strings belassen
+ $self->{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;
####
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;
+ 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//;
}
# Yes we need a manual page break -- or the user has forced one
- if ((($current_line + $lines) > $lpp) || ($form->{"description"}->[$i] =~ /<pagebreak>/) || ($form->{"longdescription"}->[$i] =~ /<pagebreak>/)) {
+ if ((($current_line + $lines) > $lpp) || ($description_array->[$i] =~ /<pagebreak>/) || ($longdescription_array->[$i] =~ /<pagebreak>/)) {
my $pb = $self->{"pagebreak_block"};
# replace the special variables <%sumcarriedforward%>
}
$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));
$new_contents .= $start_tag . $new_text . $end_tag;
$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 $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;
- }
}
}
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}/) {
$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();
$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();
$self->cleanup();
}
+sub _get_latex_path {
+ return $main::latex_bin || 'pdflatex';
+}
+
sub get_mime_type() {
my ($self) = @_;
$self->{"iconv"} = Text::Iconv->new($main::dbcharset, "UTF-8");
$self->set_tag_style('<%', '%>');
+ $self->{quot_re} = '"';
return $self;
}
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;
$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;
- }
}
}
}
####
##########################################################
-package XMLTemplate;
+package XMLTemplate;
use vars qw(@ISA);