Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 7fe3133a

Von Moritz Bunkus vor mehr als 15 Jahren hinzugefügt

  • ID 7fe3133a5c2db8231147e5eab775a4213299397c
  • Vorgänger 1c9aacf6
  • Nachfolger 6a9e0071

Bugfixes für und Erweiterung der Vergleichsmöglichkeiten in <%if...%>.

1. Bugfixes -- die vorherige Version war gar nicht getestet.

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

Unterschiede anzeigen:

SL/Template.pm
336 336
      $new_contents .= $self->substitute_vars(substr($contents, 0, $pos_if), @indices);
337 337
      substr($contents, 0, $pos_if) = "";
338 338

  
339
      # if ($contents !~ m|^$self->{tag_start_qm}if\s*(not)?\s+(.*?)$self->{tag_end_qm}|) {
340
      if ($contents !~ m/^$self->{tag_start_qm}
339
      if ($contents !~ m/^$self->{tag_start_qm}if
341 340
                         \s*
342
                         (not|\!)?           # $1 -- Eventuelle Negierung
343
                         \s*
344
                         ([^\s]+)            # $2 -- Name der zu ?berpr?fenden Variablen
341
                         (not\b|\!)?         # $1 -- Eventuelle Negierung
342
                         \s+
343
                         (\b.+?\b)           # $2 -- Name der zu ?berpr?fenden Variablen
345 344
                         (                   # $3 -- Beginn des optionalen Vergleiches
346 345
                           \s*
347
                           ([!=])=           # $4 -- Art des Vergleiches speichern
346
                           ([!=])            # $4 -- Negierung des Vergleiches speichern
347
                           ([=~])            # $5 -- Art des Vergleiches speichern
348 348
                           \s*
349
                           (                 # $5 -- Gequoteter String oder Bareword
350
                             "(.*)(?<!\\)"   # $6 -- Gequoteter String -- direkter Vergleich mit eq bzw. ne; Escapete Anf?hrungs als Teil des Strings belassen
349
                           (                 # $6 -- Gequoteter String oder Bareword
350
                             "(.*?)(?<!\\)"  # $7 -- Gequoteter String -- direkter Vergleich mit eq bzw. ne oder Patternmatching; Escapete Anf?hrungs als Teil des Strings belassen
351 351
                           |
352
                             ([^\s]+)        # $7 -- Bareword -- als Index f?r $form benutzen
352
                             (\b.+?\b)       # $8 -- Bareword -- als Index f?r $form benutzen
353 353
                           )
354 354
                         )?
355 355
                         \s*
......
360 360
        return undef;
361 361
      }
362 362

  
363
      my $not      = $1;
364
      my $var      = $2;
365
      my $operator = $4;        # '=' oder '!' oder undef, wenn kein Vergleich erkannt
366
      my $quoted   = $5;        # nur g?ltig, wenn quoted string angegeben (siehe unten); dann "value" aus <%if var == "value" %>
367
      my $bareword = $7;        # undef, falls quoted string angegeben wurde; andernfalls "othervar" aus <%if var == othervar %>
363
      my $not           = $1;
364
      my $var           = $2;
365
      my $operator_neg  = $4; # '=' oder '!' oder undef, wenn kein Vergleich erkannt
366
      my $operator_type = $5; # '=' oder '~' f?r Stringvergleich oder Regex
367
      my $quoted_word   = $7; # nur g?ltig, wenn quoted string angegeben (siehe unten); dann "value" aus <%if var == "value" %>
368
      my $bareword      = $8; # undef, falls quoted string angegeben wurde; andernfalls "othervar" aus <%if var == othervar %>
368 369

  
369
      $not = !$not if ($operator && $operator eq '!');
370
      $not = !$not if ($operator_neg && $operator_neg eq '!');
370 371

  
371 372
      substr($contents, 0, length($&)) = "";
372 373

  
......
380 381
      my $value = $self->_get_loop_variable($var, 0, @indices);
381 382
      my $hit   = 0;
382 383

  
383
      if ($operator) {
384
        my $compare_to = $bareword ? $self->_get_loop_variable($bareword, 0, @indices) : $quoted;
385
        $hit           = ($not && !($value eq $compare_to)) || (!$not && ($value eq $compare_to));
384
      if ($operator_type) {
385
        my $compare_to = $bareword ? $self->_get_loop_variable($bareword, 0, @indices) : $quoted_word;
386
        if ($operator_type eq '=') {
387
          $hit         = ($not && !($value eq $compare_to))    || (!$not && ($value eq $compare_to));
388
        } else {
389
          $hit         = ($not && !($value =~ m/$compare_to/)) || (!$not && ($value =~ m/$compare_to/));
390
        }
386 391

  
387 392
      } else {
388
        $hit           = ($not && ! $value)                 || (!$not &&  $value);
393
        $hit           = ($not && ! $value)                    || (!$not &&  $value);
389 394
      }
390 395

  
391 396
      if ($hit) {

Auch abrufbar als: Unified diff