Shop: vergessene locales
[kivitendo-erp.git] / SL / Template / Simple.pm
index d7a7c35..35e6cc1 100644 (file)
@@ -10,6 +10,8 @@ package SL::Template::Simple;
 
 use strict;
 
+use Scalar::Util qw(blessed);
+
 # Parameters:
 #   1. The template's file name
 #   2. A reference to the Form object
@@ -28,12 +30,16 @@ sub new {
 }
 
 sub _init {
-  my $self = shift;
+  my ($self, %params) = @_;
+
+  $params{myconfig}  ||= \%::myconfig;
+  $params{userspath} ||= $::lx_office_conf{paths}->{userspath};
+
+  $self->{$_} = $params{$_} for keys %params;
 
-  $self->{source}    = shift;
-  $self->{form}      = shift;
-  $self->{myconfig}  = shift;
-  $self->{userspath} = shift;
+  $self->{variable_content_types}        ||= {};
+  $self->{variable_content_types}->{$_}    = lc $self->{variable_content_types}->{$_} for keys %{ $self->{variable_content_types} };
+  $self->{default_variable_content_type}   = 'text';
 
   $self->{error}     = undef;
   $self->{quot_re}   = '"';
@@ -46,6 +52,7 @@ sub set_tag_style {
   my $tag_start               = shift;
   my $tag_end                 = shift;
 
+  $self->{custom_tag_style}   = 1;
   $self->{tag_start}          = $tag_start;
   $self->{tag_end}            = $tag_end;
   $self->{tag_start_qm}       = quotemeta $tag_start;
@@ -54,6 +61,13 @@ sub set_tag_style {
   $self->{substitute_vars_re} = "$self->{tag_start_qm}(.+?)$self->{tag_end_qm}";
 }
 
+sub set_use_template_toolkit {
+  my $self                    = shift;
+  my $value                   = shift;
+
+  $self->{use_template_toolkit} = $value;
+}
+
 sub cleanup {
   my ($self) = @_;
 }
@@ -83,13 +97,13 @@ sub uses_temp_file {
 }
 
 sub _get_loop_variable {
-  my $self      = shift;
-  my $var       = shift;
-  my $get_array = shift;
-  my @indices   = @_;
-
+  my ($self, $var, $get_array, @indices) = @_;
   my $form      = $self->{form};
-  my $value;
+  my ($value, @methods);
+
+  if ($var =~ m/\./) {
+    ($var, @methods) = split m/\./, $var;
+  }
 
   if (($get_array || @indices) && (ref $form->{TEMPLATE_ARRAYS} eq 'HASH') && (ref $form->{TEMPLATE_ARRAYS}->{$var} eq 'ARRAY')) {
     $value = $form->{TEMPLATE_ARRAYS}->{$var};
@@ -102,6 +116,17 @@ sub _get_loop_variable {
     $value = $value->[$indices[$i]];
   }
 
+  for my $part (@methods) {
+    if (ref($value) =~ m/^(?:Form|HASH)$/) {
+      $value = $value->{$part};
+    } elsif (blessed($value) && $value->can($part)) {
+      $value = $value->$part;
+    } else {
+      $value = '';
+      last;
+    }
+  }
+
   return $value;
 }
 
@@ -112,10 +137,12 @@ sub substitute_vars {
 
   while ($text =~ /$self->{substitute_vars_re}/) {
     my ($tag_pos, $tag_len) = ($-[0], $+[0] - $-[0]);
-    my ($var, @options)     = split(/\s+/, $1);
+    my ($var, @option_list) = split(/\s+/, $1);
+    my %options             = map { ($_ => 1) } @option_list;
 
     my $value               = $self->_get_loop_variable($var, 0, @indices);
-    $value                  = $self->format_string($value) unless (grep(/^NOESCAPE$/, @options));
+    $value                  = $form->parse_amount({ numberformat => $::myconfig{output_numberformat} || $::myconfig{numberformat} }, $value) if     $options{NOFORMAT};
+    $value                  = $self->format_string($value, $var)                                                                             unless $options{NOESCAPE};
 
     substr($text, $tag_pos, $tag_len, $value);
   }
@@ -135,43 +162,43 @@ sub _parse_block_if {
   $$new_contents .= $self->substitute_vars(substr($$contents, 0, $pos_if), @indices);
   substr($$contents, 0, $pos_if) = "";
 
-  if ($$contents !~ m/^$self->{tag_start_qm}if
+  if ($$contents !~ m/^$self->{tag_start_qm}if
                      \s*
-                     (not\b|\!)?           # $1 -- Eventuelle Negierung
+                     (not\b|\!)?           # $2 -- Eventuelle Negierung
                      \s+
-                     (\b.+?\b)             # $2 -- Name der zu überprüfenden Variablen
-                     (                     # $3 -- Beginn des optionalen Vergleiches
+                     (\b.+?\b)             # $3 -- Name der zu überprüfenden Variablen
+                     (                     # $4 -- Beginn des optionalen Vergleiches
                        \s*
-                       ([!=])              # $4 -- Negierung des Vergleiches speichern
-                       ([=~])              # $5 -- Art des Vergleiches speichern
+                       ([!=])              # $5 -- Negierung des Vergleiches speichern
+                       ([=~])              # $6 -- Art des Vergleiches speichern
                        \s*
-                       (                   # $6 -- Gequoteter String oder Bareword
+                       (                   # $7 -- 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
+                         (.*?)(?<!\\)      # $8 -- 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
+                         (\b.+?\b)         # $9 -- Bareword -- als Index für $form benutzen
                        )
                      )?
                      \s*
-                     $self->{tag_end_qm}
+                     $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 $comparison    = $3; # Optionaler Match um $4..$8
-  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 %>
+  my $not           = $2;
+  my $var           = $3;
+  my $comparison    = $4; # Optionaler Match um $4..$8
+  my $operator_neg  = $5; # '=' oder '!' oder undef, wenn kein Vergleich erkannt
+  my $operator_type = $6; # '=' oder '~' für Stringvergleich oder Regex
+  my $quoted_word   = $8; # nur gültig, wenn quoted string angegeben (siehe unten); dann "value" aus <%if var == "value" %>
+  my $bareword      = $9; # undef, falls quoted string angegeben wurde; andernfalls "othervar" aus <%if var == othervar %>
 
   $not = !$not if ($operator_neg && $operator_neg eq '!');
 
-  substr($$contents, 0, length($&)) = "";
+  substr($$contents, 0, length($1)) = "";
 
   my $block;
   ($block, $$contents) = $self->find_end($$contents, 0, "$var $comparison", $not);
@@ -182,6 +209,7 @@ sub _parse_block_if {
   }
 
   my $value = $self->_get_loop_variable($var, 0, @indices);
+  $value    = scalar(@{ $value }) if (ref($value) || '') eq 'ARRAY';
   my $hit   = 0;
 
   if ($operator_type) {