Browse Source

support silent option in cycle tag (close #195).

Notice: we're still not supporting independently cycling the value
using the `{% cycle varname %}` syntax (where `varname` is the name
used in a previous `cycle .. as varname` tag).
Andreas Stenius 10 years ago
parent
commit
d8122aa346

+ 6 - 3
src/erlydtl_beam_compiler.erl

@@ -1440,13 +1440,16 @@ cycle_ast(Names, undefined, #treewalker{ context=Context }=TreeWalker) ->
     {{?Q("erlydtl_runtime:cycle({_@NamesTuple}, _@ForLoop)"),
     {{?Q("erlydtl_runtime:cycle({_@NamesTuple}, _@ForLoop)"),
       #ast_info{ var_names = VarNames }},
       #ast_info{ var_names = VarNames }},
      TreeWalker1};
      TreeWalker1};
-cycle_ast(Names, {identifier, _, VarName}, TreeWalker) ->
+cycle_ast(Names, [{identifier, _, VarName}|Opts], TreeWalker) ->
     {{VarAst, AstInfo}, TW1} = cycle_ast(Names, undefined, TreeWalker),
     {{VarAst, AstInfo}, TW1} = cycle_ast(Names, undefined, TreeWalker),
     VarNameAst = varname_ast(VarName),
     VarNameAst = varname_ast(VarName),
     {Scope, TW2} = begin_scope(
     {Scope, TW2} = begin_scope(
                      {[{VarName, VarNameAst}],
                      {[{VarName, VarNameAst}],
-                      [?Q("_@VarNameAst = _@VarAst"),
-                       VarAst
+                      [?Q("_@VarNameAst = _@VarAst")
+                       | case Opts of
+                             [silent] -> [];
+                             [] -> [VarAst]
+                         end
                       ]},
                       ]},
                      TW1),
                      TW1),
     {{Scope, AstInfo}, TW2}.
     {{Scope, AstInfo}, TW2}.

+ 3 - 1
src/erlydtl_parser.yrl

@@ -199,6 +199,7 @@ Terminals
     plural_keyword
     plural_keyword
     regroup_keyword
     regroup_keyword
     reversed_keyword
     reversed_keyword
+    silent_keyword
     spaceless_keyword
     spaceless_keyword
     ssi_keyword
     ssi_keyword
     string_literal
     string_literal
@@ -321,7 +322,8 @@ CycleNames -> Value : ['$1'].
 CycleNames -> CycleNames Value : '$1' ++ ['$2'].
 CycleNames -> CycleNames Value : '$1' ++ ['$2'].
 
 
 CycleAs -> '$empty' : undefined.
 CycleAs -> '$empty' : undefined.
-CycleAs -> as_keyword identifier : '$2'.
+CycleAs -> as_keyword identifier : ['$2'].
+CycleAs -> as_keyword identifier silent_keyword : ['$2', silent].
 
 
 CycleNamesCompat -> identifier ',' : ['$1'].
 CycleNamesCompat -> identifier ',' : ['$1'].
 CycleNamesCompat -> CycleNamesCompat identifier ',' : '$1' ++ ['$2'].
 CycleNamesCompat -> CycleNamesCompat identifier ',' : '$1' ++ ['$2'].

+ 2 - 1
src/erlydtl_scanner.erl

@@ -36,7 +36,7 @@
 %%%-------------------------------------------------------------------
 %%%-------------------------------------------------------------------
 -module(erlydtl_scanner).
 -module(erlydtl_scanner).
 
 
-%% This file was generated 2014-12-16 17:54:22 UTC by slex 0.2.1-2-g7814678.
+%% This file was generated 2014-12-16 18:46:16 UTC by slex 0.2.1-2-g7814678.
 %% http://github.com/erlydtl/slex
 %% http://github.com/erlydtl/slex
 -slex_source(["src/erlydtl_scanner.slex"]).
 -slex_source(["src/erlydtl_scanner.slex"]).
 
 
@@ -92,6 +92,7 @@ is_keyword(any, "context") -> true;
 is_keyword(any, "noop") -> true;
 is_keyword(any, "noop") -> true;
 is_keyword(close, "only") -> true;
 is_keyword(close, "only") -> true;
 is_keyword(close, "parsed") -> true;
 is_keyword(close, "parsed") -> true;
+is_keyword(close, "silent") -> true;
 is_keyword(close, "reversed") -> true;
 is_keyword(close, "reversed") -> true;
 is_keyword(close, "openblock") -> true;
 is_keyword(close, "openblock") -> true;
 is_keyword(close, "closeblock") -> true;
 is_keyword(close, "closeblock") -> true;

+ 1 - 0
src/erlydtl_scanner.slex

@@ -317,6 +317,7 @@ form \
   \
   \
   is_keyword(close, "only") -> true; \
   is_keyword(close, "only") -> true; \
   is_keyword(close, "parsed") -> true; \
   is_keyword(close, "parsed") -> true; \
+  is_keyword(close, "silent") -> true; \
   is_keyword(close, "reversed") -> true; \
   is_keyword(close, "reversed") -> true; \
   is_keyword(close, "openblock") -> true; \
   is_keyword(close, "openblock") -> true; \
   is_keyword(close, "closeblock") -> true; \
   is_keyword(close, "closeblock") -> true; \

+ 6 - 0
test/erlydtl_test_defs.erl

@@ -92,6 +92,12 @@ all_test_defs() ->
           source = <<"{% for i in test %}{% cycle 'a' 'b' as c %}{{ i }}{{ c }},{% endfor %}">>,
           source = <<"{% for i in test %}{% cycle 'a' 'b' as c %}{{ i }}{{ c }},{% endfor %}">>,
           render_vars = [{test, [0,1,2,3,4]}],
           render_vars = [{test, [0,1,2,3,4]}],
           output = <<"a0a,b1b,a2a,b3b,a4a,">>
           output = <<"a0a,b1b,a2a,b3b,a4a,">>
+         },
+       #test{
+          title = "keep current value silently in local variable",
+          source = <<"{% for i in test %}{% cycle 'a' 'b' as c silent %}{{ i }}{{ c }},{% endfor %}">>,
+          render_vars = [{test, [0,1,2,3,4]}],
+          output = <<"0a,1b,2a,3b,4a,">>
          }
          }
       ]},
       ]},
      {"number literal",
      {"number literal",