OrderController Sortierung berichtigt. Sort::Naturally hat auch nicht
[kivitendo-erp.git] / SL / Template / LaTeX.pm
index c76b82a..130a424 100644 (file)
@@ -66,6 +66,13 @@ my %html_replace = (
   '<br>'      => "\\newline ",
 );
 
+sub _lb_to_space {
+  my ($to_replace) = @_;
+
+  my $vspace = '\vspace*{0.5cm}';
+  return $vspace x (length($to_replace) / length($html_replace{'<br>'}));
+}
+
 sub _format_html {
   my ($self, $content, %params) = @_;
 
@@ -86,7 +93,13 @@ sub _format_html {
   } split(m{(<.*?>)}x, $content);
 
   $content =  join '', @parts;
-  $content =~ s{ (?: [\n\s] | \\newline )+$ }{}gx;
+  $content =~ s{ (?: [\n\s] | \\newline )+ $ }{}gx;                                         # remove line breaks at the end of the text
+  $content =~ s{ ^ \s+ }{}gx;                                                               # remove white space at the start of the text
+  $content =~ s{ ^ ( \\newline \  )+ }{ _lb_to_space($1) }gxe;                              # convert line breaks at the start of the text to vertical space
+  $content =~ s{ ( \n\n+ ) ( \\newline \  )+ }{ $1 . _lb_to_space($2) }gxe;                 # convert line breaks at the start of a paragraph to vertical space
+  $content =~ s{ ( \\end\{ [^\}]+ \} \h* ) ( \\newline \  )+ }{ $1 . _lb_to_space($2) }gxe; # convert line breaks after LaTeX environments like lists to vertical space
+  $content =~ s{ ^ \h+ \\newline }{\\newline}gmx;
+  $content =~ s{ \n\n \h* \\newline \h* }{\n\n}gmx;
 
   return $content;
 }
@@ -112,6 +125,9 @@ sub format_string {
     // $formatters{ $self->{default_content_type} }
     // $formatters{ text };
 
+  $content  =~ s{[^\p{Print}\n]|\p{Cf}}{}g;
+  $variable =~ s{[^\p{Print}\n]|\p{Cf}}{}g;
+
   return $formatter->($self, $content, variable => $variable);
 }
 
@@ -269,15 +285,15 @@ sub parse_block {
       $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}|) {
+      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;
+      my $var = $2;
 
-      substr($contents, 0, length($&)) = "";
+      substr($contents, 0, length($1)) = "";
 
       my $block;
       ($block, $contents) = $self->find_end($contents);
@@ -420,13 +436,13 @@ sub parse {
   my $contents = join("", @lines);
 
   # detect pagebreak block and its parameters
-  if ($contents =~ /$self->{tag_start_qm}pagebreak\s+(\d+)\s+(\d+)\s+(\d+)\s*$self->{tag_end_qm}(.*?)$self->{tag_start_qm}end(\s*pagebreak)?$self->{tag_end_qm}/s) {
-    $self->{"chars_per_line"} = $1;
-    $self->{"lines_on_first_page"} = $2;
-    $self->{"lines_on_second_page"} = $3;
-    $self->{"pagebreak_block"} = $4;
+  if ($contents =~ /^(.*)($self->{tag_start_qm}pagebreak\s+(\d+)\s+(\d+)\s+(\d+)\s*$self->{tag_end_qm}(.*?)$self->{tag_start_qm}end(\s*pagebreak)?$self->{tag_end_qm})/s) {
+    $self->{"chars_per_line"} = $3;
+    $self->{"lines_on_first_page"} = $4;
+    $self->{"lines_on_second_page"} = $5;
+    $self->{"pagebreak_block"} = $6;
 
-    substr($contents, length($`), length($&)) = "";
+    substr($contents, length($1), length($2)) = "";
   }
 
   $self->{"forced_pagebreaks"} = [];
@@ -437,7 +453,9 @@ sub parse {
       $contents = "[% TAGS $self->{tag_start} $self->{tag_end} %]\n" . $contents;
     }
 
-    $::form->init_template->process(\$contents, $form, \$new_contents) || die $::form->template->error;
+    my $globals = global_vars();
+
+    $::form->template->process(\$contents, { %$form, %$globals }, \$new_contents) || die $::form->template->error;
   } else {
     $new_contents = $self->parse_block($contents);
   }
@@ -480,8 +498,10 @@ sub convert_to_postscript {
   $ENV{openin_any} = "p";
 
   for (my $run = 1; $run <= 2; $run++) {
-    system("${latex} --interaction=nonstopmode $form->{tmpfile} " .
-           "> $form->{tmpfile}.err");
+    if (system("${latex} --interaction=nonstopmode $form->{tmpfile} " .
+               "> $form->{tmpfile}.err") == -1) {
+      die "system call to $latex failed: $!";
+    }
     if ($?) {
       $ENV{HOME} = $old_home;
       $ENV{openin_any} = $old_openin_any;
@@ -492,12 +512,14 @@ sub convert_to_postscript {
 
   $form->{tmpfile} =~ s/tex$/dvi/;
 
-  system("dvips $form->{tmpfile} -o -q > /dev/null");
+  if (system("dvips $form->{tmpfile} -o -q > /dev/null") == -1) {
+    die "system call to dvips failed: $!";
+  }
   $ENV{HOME} = $old_home;
   $ENV{openin_any} = $old_openin_any;
 
   if ($?) {
-    $self->{"error"} = "dvips : $!";
+    $self->{"error"} = "dvips : $?";
     $self->cleanup('dvips');
     return 0;
   }
@@ -530,8 +552,11 @@ sub convert_to_pdf {
   $ENV{openin_any} = "p";
 
   for (my $run = 1; $run <= 2; $run++) {
-    system("${latex} --interaction=nonstopmode $form->{tmpfile} " .
-           "> $form->{tmpfile}.err");
+    if (system("${latex} --interaction=nonstopmode $form->{tmpfile} " .
+               "> $form->{tmpfile}.err") == -1) {
+      die "system call to $latex failed: $!";
+    }
+
     if ($?) {
       $ENV{HOME}     = $old_home;
       $ENV{openin_any} = $old_openin_any;
@@ -617,4 +642,15 @@ sub parse_and_create_pdf {
   return (file_name => do { $tex_file_name =~ s/tex$/pdf/; $tex_file_name });
 }
 
+sub global_vars {
+  {
+    AUTH            => $::auth,
+    INSTANCE_CONF   => $::instance_conf,
+    LOCALE          => $::locale,
+    LXCONFIG        => $::lx_office_conf,
+    LXDEBUG         => $::lxdebug,
+    MYCONFIG        => \%::myconfig,
+  };
+}
+
 1;