Bugfixes für und Erweiterung der Vergleichsmöglichkeiten in <%if...%>.
authorMoritz Bunkus <m.bunkus@linet-services.de>
Wed, 1 Jul 2009 10:05:25 +0000 (12:05 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Thu, 2 Jul 2009 10:53:57 +0000 (12:53 +0200)
1. Bugfixes -- die vorherige Version war gar nicht getestet.

2. Erweiterung -- Mittels "=~" kann man nun auch reguläre Ausdrücke matchen lassen.

SL/Template.pm

index 4a26b7b..c0f54cc 100644 (file)
@@ -336,20 +336,20 @@ sub parse_block {
       $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}
+      if ($contents !~ m/^$self->{tag_start_qm}if
                          \s*
-                         (not|\!)?           # $1 -- Eventuelle Negierung
-                         \s*
-                         ([^\s]+)            # $2 -- Name der zu überprüfenden Variablen
+                         (not\b|\!)?         # $1 -- Eventuelle Negierung
+                         \s+
+                         (\b.+?\b)           # $2 -- Name der zu überprüfenden Variablen
                          (                   # $3 -- Beginn des optionalen Vergleiches
                            \s*
-                           ([!=])=           # $4 -- Art des Vergleiches speichern
+                           ([!=])            # $4 -- Negierung des Vergleiches speichern
+                           ([=~])            # $5 -- 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
+                           (                 # $6 -- Gequoteter String oder Bareword
+                             "(.*?)(?<!\\)"  # $7 -- Gequoteter String -- direkter Vergleich mit eq bzw. ne oder Patternmatching; Escapete Anführungs als Teil des Strings belassen
                            |
-                             ([^\s]+)        # $7 -- Bareword -- als Index für $form benutzen
+                             (\b.+?\b)       # $8 -- Bareword -- als Index für $form benutzen
                            )
                          )?
                          \s*
@@ -360,13 +360,14 @@ sub parse_block {
         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 %>
+      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 && $operator eq '!');
+      $not = !$not if ($operator_neg && $operator_neg eq '!');
 
       substr($contents, 0, length($&)) = "";
 
@@ -380,12 +381,16 @@ sub parse_block {
       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));
+      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/)) || (!$not && ($value =~ m/$compare_to/));
+        }
 
       } else {
-        $hit           = ($not && ! $value)                 || (!$not &&  $value);
+        $hit           = ($not && ! $value)                    || (!$not &&  $value);
       }
 
       if ($hit) {