Browse Source

made for (simple) and for (record version) work, but now comment, extends, htmltags and csstags tests fail

Roberto Saccon 17 years ago
parent
commit
94fafb57a0

+ 4 - 2
demo/out/test_for.html

@@ -2,9 +2,11 @@ before
 
 <ul>
 
-    <li>apple</li>
+	<li>apple</li>
 
-    <li>banana</li>
+	<li>banana</li>
+
+	<li>coconut</li>
 
 </ul>
 

+ 13 - 0
demo/out/test_for_records.html

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

+ 2 - 2
demo/templates/test_for.html

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

+ 9 - 0
demo/templates/test_for_records.html

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

+ 9 - 2
src/demo/erlydtl_demo.erl

@@ -73,7 +73,10 @@ compile("comment" = Name) ->
                
 compile("for" = Name) ->
     compile(Name, ".html");
-                        
+ 
+compile("for_records" = Name) ->
+    compile(Name, ".html");
+                                
 compile("htmltags" = Name) ->
     compile(Name, ".html");
                     
@@ -107,6 +110,7 @@ render() ->
     render("extends"),
     render("comment"),
     render("for"),
+    render("for_records"),
     render("htmltags"),
     render("csstags").
         
@@ -124,8 +128,11 @@ render("extends" = Name) ->
         
 render("comment" = Name) ->
     render(Name, ".html");
-    
+
 render("for" = Name) ->
+    render(Name, ".html", [{fruit_list, ["apple", "banana", "coconut"]}]);
+            
+render("for_records" = Name) ->
     Link1 = [{name, "Amazon"}, {url, "http://amazon.com"}],
     Link2 = [{name, "Google"}, {url, "http://google.com"}],
     Link3 = [{name, "Microsoft"}, {url, "http://microsoft.com"}],

+ 1 - 1
src/erlydtl/erlydtl_parser.erl

@@ -45,7 +45,7 @@ tag({_, Line, [TagName | Args]}) ->
 
 
 for({_, Line, [Iterator, _, Var]}, Content) ->
-    {for, Line, list_to_atom("A" ++ Iterator), list_to_atom(Var), Content}.
+    {for, Line, list_to_atom("A" ++ Iterator), list_to_atom("A" ++ Var), Content}.
 -file("/Users/rsaccon/R11B/erlang/lib/parsetools-1.4.1.1/include/yeccpre.hrl", 0).
 %% ``The contents of this file are subject to the Erlang Public License,
 %% Version 1.1, (the "License"); you may not use this file except in

+ 1 - 1
src/erlydtl/erlydtl_parser.yrl

@@ -110,4 +110,4 @@ tag({_, Line, [TagName | Args]}) ->
 
 
 for({_, Line, [Iterator, _, Var]}, Content) ->
-    {for, Line, list_to_atom("A" ++ Iterator), list_to_atom(Var), Content}.
+    {for, Line, list_to_atom("A" ++ Iterator), list_to_atom("A" ++ Var), Content}.

+ 56 - 33
src/erlydtl/erlydtl_server.erl

@@ -198,12 +198,12 @@ compile([H | T], ModuleName, FunctionName, RelDir, Ext) ->
 		{inherited, List0, Arg0, _} ->
 			{List0, Arg0}
 	end,    
-	{Args1, Body} = case Args of 
+	{[VarPrint]=Args1, BodyAST} = case Args of 
 	    []  ->
 	        {[], [erl_syntax:list(List)]};
 	    _ ->
 	        Var = erl_syntax:variable(new_var(Args, 0)),
-	        Body0 = lists:foldl(fun(X, Acc) -> 
+	        BodyAST0 = lists:foldl(fun(X, Acc) -> 
 	                X2 = list_to_atom(tl(atom_to_list(X))),
         	        A = erl_syntax:variable(X),
         	        B = erl_syntax:application(erl_syntax:atom(proplists), 
@@ -212,14 +212,19 @@ compile([H | T], ModuleName, FunctionName, RelDir, Ext) ->
         	    end,
         	    [erl_syntax:list(List)],
         	    Args),
-        	{[Var], Body0}
+        	{[Var], BodyAST0}
 	end, 
-	Clause = erl_syntax:clause(Args1, none, Body),
-	Func = erl_syntax:function(erl_syntax:atom(FunctionName), [Clause]),
-	[Mod, Cmp] = [erl_syntax:attribute(erl_syntax:atom(X), [erl_syntax:atom(Y)]) ||
+	%% -------------------------------------------------------------
+    %% Trace = erl_syntax:application(erl_syntax:atom(io), 
+    %%         erl_syntax:atom(format),
+    %%         [erl_syntax:string("TEMPLATE-TRACE: ~p~n"), erl_syntax:list([VarPrint])]),   
+    %% ClauseAST = erl_syntax:clause(Args1, none, [Trace | BodyAST]),
+    %% --------------------------------------------------------------
+	ClauseAST = erl_syntax:clause(Args1, none, BodyAST),
+	FuncAST = erl_syntax:function(erl_syntax:atom(FunctionName), [ClauseAST]),
+	[ModAST, CmpAST] = [erl_syntax:attribute(erl_syntax:atom(X), [erl_syntax:atom(Y)]) ||
 	    {X, Y} <- [{"module", ModuleName}, {"compile", "export_all"}]],
-    Forms = [erl_syntax:revert(X) || X <- [Mod, Cmp, Func]],
-io:format("TRACE ~p:~p Forms: ~p~n",[?MODULE, ?LINE, Forms]),
+    Forms = [erl_syntax:revert(X) || X <- [ModAST, CmpAST, FuncAST]],
     case compile:forms(Forms) of
         {ok, Module, Bin} ->
             erlydtl_tools:write_beam(Module, Bin, "ebin"),
@@ -235,9 +240,11 @@ build_tree(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext, _, _) ->
 		    [H|T]=ParentAst,
 			{_, List, Args1, _} = build_tree(H, T, [], [], RelDir, Ext, [], []),			 
 			{List3, Args3} = lists:foldl(fun(X, {List2, Args2}) -> 
-                {List4, Args4} = parse_transform(X, Out, Args2, Ext, [],[]),            
-                {[List4 | List2], Args4}
-            end, {[], Args1}, List),		   
+                    {List4, Args4} = parse_transform(X, Out, Args2, Ext, [],[]),           
+                    {[List4 | List2], Args4}
+                end, 
+                {[], Args1}, 
+                List),		   
 		    {inherited, lists:reverse(lists:flatten([List3])), lists:flatten(Args3), []};
 	    {error, Msg} ->
 	         io:format("TRACE ~p:~p Parent Parser failure: ~p~n",[?MODULE, ?LINE, Name]),
@@ -264,16 +271,34 @@ build_tree(nil, [{tag, _Line, TagName, TagArgs}], Out, Args, _, Ext, _, Rec) ->
     Out2 = load_tag(TagName, TagArgs, Out, default, Ext),    
     {regular, Out2, Args, Rec};
     
-build_tree(nil, [{for, _Line, Iterator, Var, [HFor | TFor]}], Out, Args, _, Ext, _, Rec) -> 
-    {_, List1, Args1, TmpArgs1} = build_tree(HFor, TFor, [], Args, undefined, Ext, Iterator, []),  
+build_tree(nil, [{for, _Line, It, Var, [HFor | TFor]}], Out, Args, _, Ext, _, Rec) -> 
+    {_, List1, Args1, Rec1} = build_tree(HFor, TFor, [], Args, undefined, Ext, It, []),  
     Args2 = case lists:member(Var, Args1) of
         true ->
             Args1;
         _ ->
             [Var | Args1]
-	end,    
-    Body = erl_syntax:generator(erl_syntax:variable(Iterator), erl_syntax:variable(Var)),  
-    Out1 = erl_syntax:list_comp(erl_syntax:list(List1), [Body]),
+	end,  
+	ItAST = erl_syntax:variable(It),
+    Out1 = case Rec1 of
+        [] ->
+            BodyAST = erl_syntax:generator(ItAST, erl_syntax:variable(Var)),  
+            erl_syntax:list_comp(erl_syntax:list(List1), [BodyAST]);
+        _ ->                                 
+            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)],
+                 Rec1),
+            FunClauseAST = erl_syntax:clause([ItAST], none, FunBodyAST),
+            erl_syntax:application(erl_syntax:atom(lists), 
+                erl_syntax:atom(map),
+                [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:variable(Var)])
+    end,
     {regular, Out1, Args2, Rec};   
     
 build_tree(nil, [Token], Out, Args, _, _, _, Rec) ->
@@ -312,23 +337,20 @@ build_tree([H | T], [{for, _Line, It, Var, [HFor | TFor]}], Out, Args, DocRoot,
         [] ->
             BodyAST = erl_syntax:generator(ItAST, erl_syntax:variable(Var)),  
             erl_syntax:list_comp(erl_syntax:list(List1), [BodyAST]);
-        _ ->                
-            ListAST = erl_syntax:variable('List'), 
-            RecAST = erl_syntax:variable('Rec'), 
-            
-            A = erl_syntax:variable('Aiterator.name'),
-            B = erl_syntax:application(erl_syntax:atom(proplists), 
-                erl_syntax:atom(get_value), [erl_syntax:atom('Aiterator.name'), ItAST]),            
-            C = erl_syntax:variable('Aiterator.url'),
-            D = erl_syntax:application(erl_syntax:atom(proplists), 
-                erl_syntax:atom(get_value), [erl_syntax:atom('Aiterator.url'), ItAST]),     
-                     
-            FunBodyAST = [erl_syntax:match_expr(A, B), erl_syntax:match_expr(C, D), ListAST],
-            FunClauseAST = erl_syntax:clause([ItAST, ListAST, RecAST], none, FunBodyAST),
-        	                      
-            erl_syntax:application(erl_syntax:atom(lists),
-                erl_syntax:atom(foreach),
-                [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:list(List1)])
+        _ ->                                 
+            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)],
+                 Rec1),
+            FunClauseAST = erl_syntax:clause([ItAST], none, FunBodyAST),
+            erl_syntax:application(erl_syntax:atom(lists), 
+                erl_syntax:atom(map),
+                [erl_syntax:fun_expr([FunClauseAST]), erl_syntax:variable(Var)])
     end,
     build_tree(H, T, lists:flatten([Out1, Out]), Args2, DocRoot, Ext, IgnoreVar, Rec);
         	
@@ -337,6 +359,7 @@ build_tree([H | T], [Token], Out, Args, DocRoot, Ext, IgnoreVar, Rec) ->
 
 
 parse_transform({block, _Line, Name, [nil, Val]}, List, Args, Ext, IgnoreVar, Rec) ->
+    %io:format("TRACE ~p:~p block: ~p~n",[?MODULE, ?LINE, {Name, Val, List, Args, Ext, IgnoreVar, Rec}]),
 	case lists:keysearch(Name, 3, List) of
 		false -> 
             parse_transform(Val, List, Args, Ext, IgnoreVar, Rec);