Browse Source

Support {% trans .. as .. %} tag (#131)

Andreas Stenius 11 years ago
parent
commit
4aa87879f9
3 changed files with 22 additions and 5 deletions
  1. 11 0
      src/erlydtl_beam_compiler.erl
  2. 7 4
      src/erlydtl_parser.yrl
  3. 4 1
      tests/src/erlydtl_unittests.erl

+ 11 - 0
src/erlydtl_beam_compiler.erl

@@ -631,6 +631,8 @@ body_ast(DjangoParseTree, TreeWalker) ->
                   widthratio_ast(Numerator, Denominator, Scale, TW);
                   widthratio_ast(Numerator, Denominator, Scale, TW);
               ({'with', Args, Contents}, TW) ->
               ({'with', Args, Contents}, TW) ->
                   with_ast(Args, Contents, TW);
                   with_ast(Args, Contents, TW);
+              ({'scope_as', {identifier, _, Name}, Contents}, TW) ->
+                  scope_as(Name, Contents, TW);
               ({'extension', Tag}, TW) ->
               ({'extension', Tag}, TW) ->
                   extension_ast(Tag, TW);
                   extension_ast(Tag, TW);
               ({'extends', _}, _TW) ->
               ({'extends', _}, _TW) ->
@@ -1138,6 +1140,15 @@ with_ast(ArgList, Contents, TreeWalker) ->
       merge_info(ArgInfo, InnerInfo)},
       merge_info(ArgInfo, InnerInfo)},
      restore_scope(TreeWalker1, TreeWalker2)}.
      restore_scope(TreeWalker1, TreeWalker2)}.
 
 
+scope_as(VarName, Contents, TreeWalker) ->
+    {{ContentsAst, ContentsInfo}, TreeWalker1} = body_ast(Contents, TreeWalker),
+    VarAst = merl:var(lists:concat(["Var_", VarName])),
+    {Id, TreeWalker2} = begin_scope(
+                          [{VarName, VarAst}],
+                          [?Q("_@VarAst = _@ContentsAst")],
+                          TreeWalker1),
+    {{Id, ContentsInfo}, TreeWalker2}.
+
 regroup_ast(ListVariable, GrouperVariable, LocalVarName, TreeWalker) ->
 regroup_ast(ListVariable, GrouperVariable, LocalVarName, TreeWalker) ->
     {{ListAst, ListInfo}, TreeWalker1} = value_ast(ListVariable, false, true, TreeWalker),
     {{ListAst, ListInfo}, TreeWalker1} = value_ast(ListVariable, false, true, TreeWalker),
     LocalVarAst = merl:var(lists:concat(["Var_", LocalVarName])),
     LocalVarAst = merl:var(lists:concat(["Var_", LocalVarName])),

+ 7 - 4
src/erlydtl_parser.yrl

@@ -114,6 +114,7 @@ Nonterminals
     BlockTransBlock
     BlockTransBlock
     BlockTransContent
     BlockTransContent
     TransTag    
     TransTag    
+    TransText
 
 
     TemplatetagTag
     TemplatetagTag
     Templatetag
     Templatetag
@@ -385,10 +386,12 @@ Templatetag -> closebrace_keyword : '$1'.
 Templatetag -> opencomment_keyword : '$1'.
 Templatetag -> opencomment_keyword : '$1'.
 Templatetag -> closecomment_keyword : '$1'.
 Templatetag -> closecomment_keyword : '$1'.
 
 
-TransTag -> open_tag trans_keyword string_literal close_tag : {trans, '$3'}.
-TransTag -> open_tag trans_keyword Variable close_tag : {trans, '$3'}.
-TransTag -> open_tag trans_keyword string_literal noop_keyword close_tag : '$3'.
-TransTag -> open_tag trans_keyword Variable noop_keyword close_tag : '$3'.
+TransTag -> open_tag trans_keyword TransText close_tag : {trans, '$3'}.
+TransTag -> open_tag trans_keyword TransText as_keyword identifier close_tag : {scope_as, '$5', [{trans, '$3'}]}.
+TransTag -> open_tag trans_keyword TransText noop_keyword close_tag : '$3'.
+
+TransText -> string_literal : '$1'.
+TransText -> Variable : '$1'.
 
 
 WidthRatioTag -> open_tag widthratio_keyword Value Value number_literal close_tag : {widthratio, '$3', '$4', '$5'}.
 WidthRatioTag -> open_tag widthratio_keyword Value Value number_literal close_tag : {widthratio, '$3', '$4', '$5'}.
 
 

+ 4 - 1
tests/src/erlydtl_unittests.erl

@@ -1219,7 +1219,10 @@ tests() ->
         <<"Hello Hi">>},
         <<"Hello Hi">>},
        {"trans variable at run-time: No-op",
        {"trans variable at run-time: No-op",
         <<"Hello {% trans var1 noop %}">>, [{var1, <<"Hi">>}], [{translation_fun, fun(<<"Hi">>) -> <<"Konichiwa">> end}], [],
         <<"Hello {% trans var1 noop %}">>, [{var1, <<"Hi">>}], [{translation_fun, fun(<<"Hi">>) -> <<"Konichiwa">> end}], [],
-        <<"Hello Hi">>}
+        <<"Hello Hi">>},
+       {"trans as",
+        <<"{% trans 'Hans' as name %}Hello {{ name }}">>, [], <<"Hello Hans">>
+       }
       ]},
       ]},
      {"blocktrans",
      {"blocktrans",
       [
       [