add an undefined value literal to template expressions
authorTony Cook <tony@develop-help.com>
Wed, 19 Mar 2014 04:25:22 +0000 (15:25 +1100)
committerTony Cook <tony@develop-help.com>
Wed, 19 Mar 2014 04:28:12 +0000 (15:28 +1100)
site/cgi-bin/modules/Squirrel/Template/Expr.pm
t/020-templater/040-original.t

index a491a18..fdc3875 100644 (file)
@@ -1,7 +1,7 @@
 package Squirrel::Template::Expr;
 use strict;
 
-our $VERSION = "1.013";
+our $VERSION = "1.014";
 
 package Squirrel::Template::Expr::Eval;
 use Scalar::Util ();
@@ -73,6 +73,10 @@ sub _process_mod {
   return $_[0]->process($_[1][1]) % $_[0]->process($_[1][2]);
 }
 
+sub _process_undef {
+  return undef;
+}
+
 # string relops
 sub _process_eq {
   return $_[0]->process($_[1][1]) eq $_[0]->process($_[1][2]);
@@ -572,7 +576,12 @@ sub _parse_primary {
     return [ const => $re ];
   }
   elsif ($t->[0] eq 'id') {
-    return [ var => $t->[2] ];
+    if ($t->[2] eq "undef") {
+      return [ "undef" ];
+    }
+    else {
+      return [ var => $t->[2] ];
+    }
   }
   elsif ($t->[0] eq 'op[') {
     my $list = [];
@@ -595,6 +604,9 @@ sub _parse_primary {
   elsif ($t->[0] eq 're') {
     return [ re => $t->[2], $t->[3] ];
   }
+  elsif ($t->[0] eq 'undef') {
+    return [ "undef" ];
+  }
   else {
     die [ error => "Expected term but got $t->[0]" ];
   }
@@ -698,6 +710,9 @@ sub get {
   elsif ($self->[TEXT] =~ s/\A(\s*\'([^\']*)\'\s*)//) {
     push @$queue, [ str => $1, $2 ];
   }
+  elsif ($self->[TEXT] =~ s/\A(\s*\@undef\bs*)//) {
+    push @$queue, [ undef => $1 ];
+  }
   else {
     die [ error => "Unknown token '$self->[TEXT]'" ];
   }
@@ -925,6 +940,10 @@ octal - C<0o144>
 
 binary - C<0b1100100>
 
+=item *
+
+an undefined value - C<@undef>
+
 =back
 
 Strings can be either " or ' delimited.
index 1bbaa7a..d223a6d 100644 (file)
@@ -1,7 +1,7 @@
 #!perl -w
 # Basic tests for Squirrel::Template
 use strict;
-use Test::More tests => 186;
+use Test::More tests => 187;
 use HTML::Entities;
 
 sub template_test($$$$;$$);
@@ -541,6 +541,7 @@ OUT
      [ '{ "a": 11, "b": 12, "c": 20 }["b"]', 12 ],
      [ '[ 1, 2, 3 ][1]', 2 ],
      [ 'testclass.foo', "[TestClass.foo]" ],
+     [ '@undef.defined', "" ],
 
      # WrapScalar
      [ '"foo".length', 3 ],