Browse Source

bugfixes, now test_for_records_preset also works

Roberto Saccon 17 years ago
parent
commit
b69041997e

+ 13 - 0
demo/out/test_for_records_preset.html

@@ -0,0 +1,13 @@
+before
+
+<ul>
+
+	<li><a href="http://amazon.com">Amazon (preset)</a></li>
+
+	<li><a href="http://google.com">Google (preset)</a></li>
+
+	<li><a href="http://microsoft.com">Microsoft (preset)</a></li>
+
+</ul>
+
+after

+ 9 - 0
demo/templates/test_for_records_preset.html

@@ -0,0 +1,9 @@
+before
+
+<ul>
+{% for iterator in link_list %}
+	<li><a href="{{ iterator.url }}">{{ iterator.name }}</a></li>
+{% endfor %}
+</ul>
+
+after

+ 23 - 10
src/demo/erlydtl_demo.erl

@@ -34,7 +34,7 @@
 -author('rsaccon@gmail.com').
 
 %% API
--export([compile/0, compile/1, compile/2, render/0, render/1, preset/1]).
+-export([compile_all/0, compile/1, compile/2, render_all/0, render/1, preset/1]).
 
 %%====================================================================
 %% API
@@ -44,7 +44,7 @@
 %% @doc  compiles the templates to beam files
 %% @end 
 %%--------------------------------------------------------------------
-compile() ->
+compile_all() ->
     DocRoot = filename:join([filename:dirname(code:which(?MODULE)),"..", "demo", "templates"]),
     filelib:fold_files(DocRoot,
         "\.html$|\.css$",
@@ -86,14 +86,17 @@ compile("htmltags" = Name) ->
     compile(Name, ".html");
                     
 compile("csstags" = Name) ->
-     compile(Name, ".css");
+    compile(Name, ".css");
 
 compile("var_preset" = Name) ->
-     compile(Name, ".html");
+    compile(Name, ".html");
      
 compile("for_preset" = Name) ->
-     compile(Name, ".html");     
-               
+    compile(Name, ".html");     
+
+compile("for_records_preset" = Name) ->
+    compile(Name, ".html");
+          
 compile(Name) ->
     io:format("No such template: ~p~n",[Name]).
                
@@ -121,7 +124,7 @@ compile(Name, Ext) ->
 %% @doc renders template to a file
 %% @end 
 %%--------------------------------------------------------------------
-render() ->
+render_all() ->
     render("var"),
     render("extends"),
     render("comment"),
@@ -130,7 +133,8 @@ render() ->
     render("htmltags"),
     render("csstags"),
     render("var_preset"),
-    render("for_preset").
+    render("for_preset"),
+    render("for_records_preset").
         
 
 %%--------------------------------------------------------------------
@@ -167,7 +171,10 @@ render("var_preset" = Name) ->
  
 render("for_preset" = Name) ->
     render(Name, ".html");
-                  
+            
+render("for_records_preset" = Name) ->
+    render(Name, ".html");
+        
 render(Name) ->
     io:format("No such template: ~p~n",[Name]).  
                 
@@ -201,8 +208,14 @@ preset(test_var_preset) ->
     [{preset_var1, "preset-var1"}, {preset_var2, "preset-var2"}];
     
 preset(test_for_preset) ->
-    [{fruit_list, ["preset-apple", "preset-banana", "preset-coconut"]}].
+    [{fruit_list, ["preset-apple", "preset-banana", "preset-coconut"]}];
            
+preset(test_for_records_preset) ->
+    Link1 = [{name, "Amazon (preset)"}, {url, "http://amazon.com"}],
+    Link2 = [{name, "Google (preset)"}, {url, "http://google.com"}],
+    Link3 = [{name, "Microsoft (preset)"}, {url, "http://microsoft.com"}],
+    [{link_list, [Link1, Link2, Link3]}].
+
               
 %%====================================================================
 %% Internal functions

+ 40 - 23
src/erlydtl/erlydtl_base.erl

@@ -251,9 +251,9 @@ handle_for(It, Var, HFor, TFor, Dtl) ->
     #dtl{args = Args, ext = Ext, preset = Preset} = Dtl,
     {_, List1, Args1, Props1} = build_tree(HFor, TFor, Args, Ext, It, Preset),    
 	ItAST = erl_syntax:variable(It),
+	Key = list_to_atom(tl(atom_to_list(Var))),
     case Props1 of
         [] ->
-            Key = list_to_atom(tl(atom_to_list(Var))),
             case proplists:get_value(Key, Preset) of
                 undefined ->
                     BodyAST = erl_syntax:generator(ItAST, erl_syntax:variable(Var)),  
@@ -266,7 +266,7 @@ handle_for(It, Var, HFor, TFor, Dtl) ->
                 	end;                   
                 Vals ->
                     List2 = lists:map(fun (X) -> 
-                            lists:map(fun ({tree, variable, _, It2}) when It2 =:= It ->
+                            lists:map(fun ({tree, variable, _, It1}) when It1 =:= It ->
                                     binary_string(X);
                                 (Other) ->
                                     Other
@@ -274,29 +274,46 @@ handle_for(It, Var, HFor, TFor, Dtl) ->
                         end, Vals),
                     {lists:flatten(List2), Args1}
             end;
-        _ -> 
-            io:format("TRACE ~p:~p ~p~n",[?MODULE, ?LINE, Props1]),
-            FunBodyAST = lists:foldl(fun(X, Acc) -> 
-                    [_,Prop] = string:tokens(tl(atom_to_list(X)), "."),
-                    A = erl_syntax:variable(X),
-                    B = erl_syntax:application(erl_syntax:atom(proplists), 
-                        erl_syntax:atom(get_value), [erl_syntax:atom(Prop), ItAST]),
-                    [erl_syntax:match_expr(A, B) | Acc]
-                 end,
-                 [erl_syntax:list(List1)],
-                 Props1),
-            FunClauseAST = erl_syntax:clause([ItAST], none, FunBodyAST),
-            List2 = erl_syntax:application(erl_syntax:atom(lists), 
-                erl_syntax:atom(map),
-                [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:variable(Var)]),
-            case lists:member(Var, Args1) of
-                true ->
-                    {List2, Args1};
-                _ ->
-                    {List2, [Var | Args1]}
+        _ ->
+            case proplists:get_value(Key, Preset) of
+                undefined ->
+                    FunBodyAST = lists:foldl(fun(X, Acc) -> 
+                            [_,Prop] = string:tokens(tl(atom_to_list(X)), "."),
+                            A = erl_syntax:variable(X),
+                            B = erl_syntax:application(erl_syntax:atom(proplists), 
+                                erl_syntax:atom(get_value), [erl_syntax:atom(Prop), ItAST]),
+                            [erl_syntax:match_expr(A, B) | Acc]
+                         end,
+                         [erl_syntax:list(List1)],
+                         Props1),
+                    FunClauseAST = erl_syntax:clause([ItAST], none, FunBodyAST),
+                    List2 = erl_syntax:application(erl_syntax:atom(lists), 
+                        erl_syntax:atom(map),
+                        [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:variable(Var)]),
+                    case lists:member(Var, Args1) of
+                        true ->
+                            {List2, Args1};
+                        _ ->
+                            {List2, [Var | Args1]}
+                    end;
+                Vals ->                    
+                    Ns = tl(atom_to_list(It)),
+                    List2 = lists:map(fun (X) -> 
+                            lists:map(fun ({tree, variable, _, It1} = Node) ->
+                                    case string:tokens(tl(atom_to_list(It1)), ".") of
+                                        [Ns, Key1 | _] ->
+                                            binary_string(proplists:get_value(list_to_atom(Key1), X));
+                                        _ ->
+                                            Node
+                                    end;
+                                (Other) ->
+                                    Other
+                                end, List1)
+                        end, Vals),
+                    {lists:flatten(List2), Args1}
             end
     end.
-    
+     
            	        	
 handle_tag(TagName, Line, TagArgs, Acc0, Ext, Preset) ->
     case parse(filename:join([erlydtl_deps:get_base_dir(), "priv", "tags", atom_to_list(TagName) ++ Ext])) of