# Web http://www.lx-office.org
#
#====================================================================
+#
+#
+# NOTE: strict checks are package global. don't check this file
+# with perl -sc, it will only capture SimpleTemplate
+#
+#
package SimpleTemplate;
+use strict;
+
# Parameters:
# 1. The template's file name
# 2. A reference to the Form object
$self->{userspath} = shift;
$self->{error} = undef;
+ $self->{quot_re} = '"';
$self->set_tag_style('<%', '%>');
}
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;
####
@ISA = qw(SimpleTemplate);
+use strict;
+
sub new {
my $type = shift;
$form->{TEMPLATE_ARRAYS}->{cumulatelinetotal} = [];
+ # forech block hasn't given us an array. ignore
+ return $new_contents unless ref $ary eq 'ARRAY';
+
for (my $i = 0; $i < scalar(@{$ary}); $i++) {
+ # do magic markers
$form->{"__first__"} = $i == 1;
$form->{"__last__"} = ($i + 1) == scalar(@{$ary});
$form->{"__odd__"} = (($i + 1) % 2) == 1;
$form->{"__counter__"} = $i + 1;
- if (scalar @{$description_array} == scalar @{$ary} && $self->{"chars_per_line"} != 0) {
+ if ( ref $description_array eq 'ARRAY'
+ && scalar @{$description_array} == scalar @{$ary}
+ && $self->{"chars_per_line"} != 0)
+ {
my $lines = int(length($description_array->[$i]) / $self->{"chars_per_line"});
my $lpp;
$description_array->[$i] =~ s/(\\newline\s?)*$//;
- my $_description = $description_array->[$i];
- while ($_description =~ /\\newline/) {
- $lines++;
- $_description =~ s/\\newline//;
- }
+ $lines++ while ($description_array->[$i] =~ m/\\newline/g);
$lines++;
if ($current_page == 1) {
}
# Yes we need a manual page break -- or the user has forced one
- if ((($current_line + $lines) > $lpp) || ($description_array->[$i] =~ /<pagebreak>/) || ($longdescription_array->[$i] =~ /<pagebreak>/)) {
+ if ( (($current_line + $lines) > $lpp)
+ || ($description_array->[$i] =~ /<pagebreak>/)
+ || ( ref $longdescription_array eq 'ARRAY'
+ && $longdescription_array->[$i] =~ /<pagebreak>/)) {
my $pb = $self->{"pagebreak_block"};
# replace the special variables <%sumcarriedforward%>
$current_line += $lines;
}
- if ($i < scalar(@{$linetotal_array})) {
+ if ( ref $linetotal_array eq 'ARRAY'
+ && $i < scalar(@{$linetotal_array})) {
$sum += $form->parse_amount($self->{"myconfig"}, $linetotal_array->[$i]);
}
$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}|) {
- if ($contents !~ m/^$self->{tag_start_qm}
- \s*
- (not|\!)? # $1 -- Eventuelle Negierung
- \s*
- ([^\s]+) # $2 -- Name der zu überprüfenden Variablen
- ( # $3 -- Beginn des optionalen Vergleiches
- \s*
- ([!=])= # $4 -- Art des Vergleiches speichern
- \s*
- ( # $5 -- Gequoteter String oder Bareword
- "(.*)(?<!\\)" # $6 -- Gequoteter String -- direkter Vergleich mit eq bzw. ne; Escapete Anführungs als Teil des Strings belassen
- |
- ([^\s]+) # $7 -- 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 = $4; # '=' oder '!' oder undef, wenn kein Vergleich erkannt
- my $quoted = $5; # nur gültig, wenn quoted string angegeben (siehe unten); dann "value" aus <%if var == "value" %>
- my $bareword = $7; # undef, falls quoted string angegeben wurde; andernfalls "othervar" aus <%if var == othervar %>
-
- $not = !$not if ($operator && $operator eq '!');
-
- 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"});
+ if (!$self->_parse_block_if(\$contents, \$new_contents, $pos_if, @indices)) {
$main::lxdebug->leave_sub();
return undef;
}
-
- my $value = $self->_get_loop_variable($var, 0, @indices);
- my $hit = 0;
-
- if ($operator) {
- my $compare_to = $bareword ? $self->_get_loop_variable($bareword, 0, @indices) : $quoted;
- $hit = ($not && !($value eq $compare_to)) || (!$not && ($value eq $compare_to));
-
- } 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;
- }
}
}
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}/) {
@ISA = qw(LaTeXTemplate);
+use strict;
+
sub new {
my $type = shift;
@ISA = qw(LaTeXTemplate);
+use strict;
+
sub new {
my $type = shift;
@ISA = qw(SimpleTemplate);
+use strict;
+
sub new {
my $type = shift;
- $self = $type->SUPER::new(@_);
+ my $self = $type->SUPER::new(@_);
foreach my $module (qw(Archive::Zip Text::Iconv)) {
eval("use ${module};");
$self->{"iconv"} = Text::Iconv->new($main::dbcharset, "UTF-8");
$self->set_tag_style('<%', '%>');
+ $self->{quot_re} = '"';
return $self;
}
$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\%>.";
- $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"});
+ if (!$self->_parse_block_if(\$contents, \$new_contents, $pos_if, @indices)) {
$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 $zip = Archive::Zip->new();
- if (Archive::Zip::AZ_OK != $zip->read($file_name)) {
+ if (Archive::Zip->AZ_OK != $zip->read($file_name)) {
$self->{"error"} = "File not found/is not a OpenDocument file.";
$main::lxdebug->leave_sub();
return 0;
my $dfname = $self->{"userspath"} . "/xvfb_display";
my $display;
- $main::lxdebug->message(LXDebug::DEBUG2, " Looking for $dfname\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " Looking for $dfname\n");
if ((-f $dfname) && open(IN, $dfname)) {
my $pid = <IN>;
chomp($pid);
chomp($xauthority);
close(IN);
- $main::lxdebug->message(LXDebug::DEBUG2, " found with $pid and $display\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " found with $pid and $display\n");
if ((! -d "/proc/$pid") || !open(IN, "/proc/$pid/cmdline")) {
- $main::lxdebug->message(LXDebug::DEBUG2, " no/wrong process #1\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " no/wrong process #1\n");
unlink($dfname, $xauthority);
$main::lxdebug->leave_sub();
return undef;
my $line = <IN>;
close(IN);
if ($line !~ /xvfb/i) {
- $main::lxdebug->message(LXDebug::DEBUG2, " no/wrong process #2\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " no/wrong process #2\n");
unlink($dfname, $xauthority);
$main::lxdebug->leave_sub();
return undef;
$ENV{"XAUTHORITY"} = $xauthority;
$ENV{"DISPLAY"} = $display;
} else {
- $main::lxdebug->message(LXDebug::DEBUG2, " not found\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " not found\n");
}
$main::lxdebug->leave_sub();
my ($self) = @_;
- $main::lxdebug->message(LXDebug::DEBUG2, "spawn_xvfb()\n");
+ $main::lxdebug->message(LXDebug->DEBUG2, "spawn_xvfb()\n");
my $display = $self->is_xvfb_running();
$display++;
}
$display = ":${display}";
- $main::lxdebug->message(LXDebug::DEBUG2, " display $display\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " display $display\n");
my $mcookie = `mcookie`;
die("Installation error: mcookie not found.") if ($? != 0);
chomp($mcookie);
- $main::lxdebug->message(LXDebug::DEBUG2, " mcookie $mcookie\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " mcookie $mcookie\n");
my $xauthority = "/tmp/.Xauthority-" . $$ . "-" . time() . "-" . int(rand(9999999));
$ENV{"XAUTHORITY"} = $xauthority;
- $main::lxdebug->message(LXDebug::DEBUG2, " xauthority $xauthority\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " xauthority $xauthority\n");
system("xauth add \"${display}\" . \"${mcookie}\"");
if ($? != 0) {
return undef;
}
- $main::lxdebug->message(LXDebug::DEBUG2, " about to fork()\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " about to fork()\n");
my $pid = fork();
if (0 == $pid) {
- $main::lxdebug->message(LXDebug::DEBUG2, " Child execing\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " Child execing\n");
exec($main::xvfb_bin, $display, "-screen", "0", "640x480x8", "-nolisten", "tcp");
}
sleep(3);
- $main::lxdebug->message(LXDebug::DEBUG2, " parent dont sleeping\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " parent dont sleeping\n");
local *OUT;
my $dfname = $self->{"userspath"} . "/xvfb_display";
print(OUT "$pid\n$display\n$xauthority\n");
close(OUT);
- $main::lxdebug->message(LXDebug::DEBUG2, " parent re-testing\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " parent re-testing\n");
if (!$self->is_xvfb_running()) {
$self->{"error"} = "Conversion to PDF failed because OpenOffice could not be started.";
return undef;
}
- $main::lxdebug->message(LXDebug::DEBUG2, " spawn OK\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " spawn OK\n");
$main::lxdebug->leave_sub();
system("./scripts/oo-uno-test-conn.py $main::openofficeorg_daemon_port " .
"> /dev/null 2> /dev/null");
my $res = $? == 0;
- $main::lxdebug->message(LXDebug::DEBUG2, " is_openoffice_running(): $?\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " is_openoffice_running(): $?\n");
$main::lxdebug->leave_sub();
my ($self) = @_;
- $main::lxdebug->message(LXDebug::DEBUG2, "spawn_openoffice()\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), "spawn_openoffice()\n");
my ($try, $spawned_oo, $res);
if (!$spawned_oo) {
my $pid = fork();
if (0 == $pid) {
- $main::lxdebug->message(LXDebug::DEBUG2, " Child daemonizing\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " Child daemonizing\n");
chdir('/');
open(STDIN, '/dev/null');
open(STDOUT, '>/dev/null');
my $new_pid = fork();
exit if ($new_pid);
my $ssres = setsid();
- $main::lxdebug->message(LXDebug::DEBUG2, " Child execing\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " Child execing\n");
my @cmdline = ($main::openofficeorg_writer_bin,
"-minimized", "-norestore", "-nologo", "-nolockcheck",
"-headless",
exec(@cmdline);
}
- $main::lxdebug->message(LXDebug::DEBUG2, " Parent after fork\n");
+ $main::lxdebug->message(LXDebug->DEBUG2(), " Parent after fork\n");
$spawned_oo = 1;
sleep(3);
}
}
sub get_mime_type() {
+ my ($self) = @_;
+
if ($self->{"form"}->{"format"} =~ /pdf/) {
return "application/pdf";
} else {
@ISA = qw(HTMLTemplate);
+use strict;
+
sub new {
#evtl auskommentieren
my $type = shift;
return 1;
}
+
+##########################################################
+####
+#### ExcelTemplate
+####
+##########################################################
+
+package ExcelTemplate;
+
+use vars qw(@ISA);
+
+@ISA = qw(SimpleTemplate);
+
+sub new {
+ my $type = shift;
+
+ my $self = $type->SUPER::new(@_);
+
+ 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 get_mime_type() {
+ my ($self) = @_;
+
+ return "application/msexcel";
+}
+
+sub uses_temp_file {
+ return 1;
+}
+
+sub parse {
+ $main::lxdebug->enter_sub();
+
+ my $self = shift;
+ local *OUT = shift;
+ my $form = $self->{"form"};
+
+ open(IN, "$form->{templates}/$form->{IN}") or do { $self->{"error"} = "$!"; return 0; };
+ my @lines = <IN>;
+ close IN;
+
+ my $contents = join("", @lines);
+ my @indices;
+ $contents =~ s{
+ $self->{tag_start} [<]* (\s?) [<>\s]* ([\w\s]+) [<>\s]* $self->{tag_end}
+ }{
+ $self->format_vars(align_right => $1 ne '', varstring => $2, length => length($&), indices => \@indices)
+ }egx;
+
+ if (!defined($contents)) {
+ $main::lxdebug->leave_sub();
+ return 0;
+ }
+
+ print OUT $contents;
+
+ $main::lxdebug->leave_sub();
+ return 1;
+}
+
+sub format_vars {
+ my ($self, %params) = @_;
+ my $form = $self->{"form"};
+ my @indices = @{ $params{indices} };
+ my $align_right = $params{align_right};
+ my $varstring = $params{varstring};
+ my $length = $params{length};
+
+ $varstring =~ s/(\w+)/ $self->_get_loop_variable($1, 0, @indices) /eg;
+ my $old_string=$varstring;
+ my $new_string = sprintf "%*s", ($align_right ? 1 : -1 ) * $length, $varstring;
+ if (!defined($new_string) || $new_string eq ''){
+ $main::lxdebug->message(0, 'varstring' . $varstring . "old" . $old_string);
+ # return substr $varstring, ($align_right ? (0, $length) : -$length);
+ }
+ return substr $new_string, ($align_right ? (0, $length) : -$length);
+}
+
1;