Browse Source

reorganized tests and rewrote core (not complete yet)

git-svn-id: http://erlydtl.googlecode.com/svn/trunk@28 a5195066-8e3e-0410-a82a-05b01b1b9875
rsaccon 17 years ago
parent
commit
e20a8503bc

+ 0 - 3
demo/out/test_simple.html

@@ -1,3 +0,0 @@
-before
-
-after

+ 0 - 11
demo/out/test_variable.html

@@ -1,11 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <title>Test variable</title>								 
-  </head>
-  <body>
-	bar
-	foostring
-  </body>
-</html>

+ 0 - 3
demo/templates/test_simple.html

@@ -1,3 +0,0 @@
-before
-{# comment #}
-after

+ 0 - 0
demo/templates/test_variable.html → demo/templates/test_var.html


+ 4 - 8
src/demo/erlydtl_demo.erl

@@ -85,10 +85,9 @@ compile(Name, Ext) ->
 %% @end 
 %% @end 
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
 render() ->
 render() ->
-    render("variable", ".html", ["foostring", "bar"]),
+    render("var"),
-    render("extends", ".html", ["bar1string", "bar2string"]),
+    render("extends", ".html", ["barstring1", "barstring2"]),
     render("comment", ".html"),
     render("comment", ".html"),
-    render("simple", ".html"),
     render("htmltags", ".html"),
     render("htmltags", ".html"),
     render("csstags", ".css"),
     render("csstags", ".css"),
     render("for", ".html", [["apple", "banana"]]).
     render("for", ".html", [["apple", "banana"]]).
@@ -99,17 +98,14 @@ render() ->
 %% @doc renders template to a file
 %% @doc renders template to a file
 %% @end 
 %% @end 
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
-render("variable" = Name) ->
+render("var" = Name) ->
-    render(Name, ".html", ["foostring", "bar"]);
+    render(Name, ".html", [{var1, "foostring1"}, {var2, "foostring2"}]);
  
  
 render("extends" = Name) ->
 render("extends" = Name) ->
     render(Name, ".html", ["bar1string", "bar2string"]);
     render(Name, ".html", ["bar1string", "bar2string"]);
         
         
 render("comment" = Name) ->
 render("comment" = Name) ->
     render(Name, ".html");
     render(Name, ".html");
-            
-render("simple" = Name) ->
-    render(Name, ".html");
                 
                 
 render("htmltags" = Name) ->
 render("htmltags" = Name) ->
     render(Name, ".html");
     render(Name, ".html");

+ 18 - 6
src/erlydtl/erlydtl_parser.erl

@@ -2,8 +2,12 @@
 -export([parse/1, parse_and_scan/1, format_error/1]).
 -export([parse/1, parse_and_scan/1, format_error/1]).
 -file("src/erlydtl/erlydtl_parser.yrl", 68).
 -file("src/erlydtl/erlydtl_parser.yrl", 68).
 
 
+var({_, Line, Var}) ->
+    {var, Line, list_to_atom("A" ++ Var)}.
+
 extends({_, Line, [Name]}) ->
 extends({_, Line, [Name]}) ->
-    %% TODO: check if string or variable, now it is assumed it is string
+    %% TODO: check if string (enclosed with  "") or variable. 
+    %% for now we handle it (even not enclosed with "") as string
     {extends, Line, string:strip(Name, both, $")}.
     {extends, Line, string:strip(Name, both, $")}.
 
 
 block({_, Line, [Name]}, Content) ->
 block({_, Line, [Name]}, Content) ->
@@ -12,8 +16,8 @@ block({_, Line, [Name]}, Content) ->
 tag({_, Line, Args}) ->
 tag({_, Line, Args}) ->
     {tag, Line, Args}.
     {tag, Line, Args}.
 
 
-for({_, Line, [VarIndex, _, VarArray]}, Content) ->
+for({_, Line, [Iterator, _, Var]}, Content) ->
-    {for, Line, list_to_atom(VarIndex), list_to_atom(VarArray), Content}.
+    {for, Line, list_to_atom(Iterator), list_to_atom(Var), Content}.
 -file("/Users/rsaccon/R11B/erlang/lib/parsetools-1.4.1.1/include/yeccpre.hrl", 0).
 -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,
 %% ``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
 %% Version 1.1, (the "License"); you may not use this file except in
@@ -107,7 +111,7 @@ yecctoken2string(Other) ->
 
 
 
 
 
 
--file("src/erlydtl/erlydtl_parser.erl", 110).
+-file("src/erlydtl/erlydtl_parser.erl", 114).
 
 
 yeccpars2(0, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
 yeccpars2(0, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  __NewStack = yeccpars2_0_(__Stack),
  __NewStack = yeccpars2_0_(__Stack),
@@ -147,7 +151,8 @@ yeccpars2(7, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  __NewStack = yeccpars2_7_(__Stack),
  __NewStack = yeccpars2_7_(__Stack),
  yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
  yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
 yeccpars2(8, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
 yeccpars2(8, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __Stack, __T, __Ts, __Tzr);
+ __NewStack = yeccpars2_8_(__Stack),
+ yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
 yeccpars2(9, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
 yeccpars2(9, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 3, [9 | __Ss], [__T | __Stack]);
  yeccpars1(__Ts, __Tzr, 3, [9 | __Ss], [__T | __Stack]);
 yeccpars2(9, endfor, __Ss, __Stack, __T, __Ts, __Tzr) ->
 yeccpars2(9, endfor, __Ss, __Stack, __T, __Ts, __Tzr) ->
@@ -248,6 +253,13 @@ yeccpars2_7_([__1 | __Stack]) ->
    tag ( __1 )
    tag ( __1 )
   end | __Stack].
   end | __Stack].
 
 
+-compile({inline,{yeccpars2_8_,1}}).
+-file("src/erlydtl/erlydtl_parser.yrl", 58).
+yeccpars2_8_([__1 | __Stack]) ->
+ [begin
+   var ( __1 )
+  end | __Stack].
+
 -compile({inline,{yeccpars2_10_,1}}).
 -compile({inline,{yeccpars2_10_,1}}).
 -file("src/erlydtl/erlydtl_parser.yrl", 62).
 -file("src/erlydtl/erlydtl_parser.yrl", 62).
 yeccpars2_10_([__3,__2,__1 | __Stack]) ->
 yeccpars2_10_([__3,__2,__1 | __Stack]) ->
@@ -263,4 +275,4 @@ yeccpars2_12_([__3,__2,__1 | __Stack]) ->
   end | __Stack].
   end | __Stack].
 
 
 
 
--file("src/erlydtl/erlydtl_parser.yrl", 81).
+-file("src/erlydtl/erlydtl_parser.yrl", 85).

+ 6 - 2
src/erlydtl/erlydtl_parser.yrl

@@ -58,7 +58,7 @@ Elements -> '$empty' : nil.
 Elements -> Elements Element : ['$1', '$2'].
 Elements -> Elements Element : ['$1', '$2'].
 
 
 Element -> string : '$1'.
 Element -> string : '$1'.
-Element -> var : '$1'.
+Element -> var : var('$1').
 Element -> extends : extends('$1').
 Element -> extends : extends('$1').
 Element -> block Elements endblock : block('$1', '$2').
 Element -> block Elements endblock : block('$1', '$2').
 Element -> tag : tag('$1').
 Element -> tag : tag('$1').
@@ -67,8 +67,12 @@ Element -> for Elements endfor : for('$1', '$2').
 
 
 Erlang code.
 Erlang code.
 
 
+var({_, Line, Var}) ->
+    {var, Line, list_to_atom("A" ++ Var)}.
+
 extends({_, Line, [Name]}) ->
 extends({_, Line, [Name]}) ->
-    %% TODO: check if string or variable, now it is assumed it is string
+    %% TODO: check if string (enclosed with  "") or variable. 
+    %% for now we handle it (even not enclosed with "") as string
     {extends, Line, string:strip(Name, both, $")}.
     {extends, Line, string:strip(Name, both, $")}.
 
 
 block({_, Line, [Name]}, Content) ->
 block({_, Line, [Name]}, Content) ->

+ 73 - 50
src/erlydtl/erlydtl_server.erl

@@ -197,21 +197,38 @@ compile([H | T], ModuleName, FunctionName, RelDir, Ext) ->
 		    {[parse_transform(X) ||  X <- List0], Args0};
 		    {[parse_transform(X) ||  X <- List0], Args0};
 		{inherited, List0, Arg0} ->
 		{inherited, List0, Arg0} ->
 			{List0, Arg0}
 			{List0, Arg0}
+	end,    
+	{Args1, Body} = case Args of 
+	    []  ->
+	        {[], [erl_syntax:list(List)]};
+	    _ ->
+	        Var = erl_syntax:variable(new_var(Args, 0)),
+	        Body0 = lists:foldl(fun(X, Acc) -> 
+	                X2 = list_to_atom(lists:concat(["A", X])),
+        	        A = erl_syntax:variable(X),
+        	        B = erl_syntax:application(erl_syntax:atom(proplists), 
+    	                erl_syntax:atom(get_value), [erl_syntax:atom(X2), Var]),
+        	        [erl_syntax:match_expr(A, B) | Acc]
+        	    end,
+        	    [erl_syntax:list(List)],
+        	    Args),
+        	{[Var], Body0}
 	end, 
 	end, 
-	List1 = erl_syntax:list(List),
+%io:format("TRACE ~p:~p Body ~p~n",[?MODULE, ?LINE, Body]),
-	Args1 = [erl_syntax:variable(Val) || {Val, _} <- lists:reverse(Args)],
+io:format("TRACE ~p:~p Body ~p~n",[?MODULE, ?LINE, erl_syntax:revert(Body)]),
-	Clause = erl_syntax:clause(Args1, none, [List1]),
+	Clause = erl_syntax:clause(Args1, none, Body),
 	Func = erl_syntax:function(erl_syntax:atom(FunctionName), [Clause]),
 	Func = erl_syntax:function(erl_syntax:atom(FunctionName), [Clause]),
 	[Mod, Cmp] = [erl_syntax:attribute(erl_syntax:atom(X), [erl_syntax:atom(Y)]) ||
 	[Mod, Cmp] = [erl_syntax:attribute(erl_syntax:atom(X), [erl_syntax:atom(Y)]) ||
 	    {X, Y} <- [{"module", ModuleName}, {"compile", "export_all"}]],
 	    {X, Y} <- [{"module", ModuleName}, {"compile", "export_all"}]],
     Forms = [erl_syntax:revert(X) || X <- [Mod, Cmp, Func]],
     Forms = [erl_syntax:revert(X) || X <- [Mod, Cmp, Func]],
+io:format("TRACE ~p:~p ~p~n",[?MODULE, ?LINE, Forms]),
     case compile:forms(Forms) of
     case compile:forms(Forms) of
         {ok, Module, Bin} ->
         {ok, Module, Bin} ->
             erlydtl_tools:write_beam(Module, Bin, "ebin"),
             erlydtl_tools:write_beam(Module, Bin, "ebin"),
             erlydtl_tools:reload(Module, Bin);
             erlydtl_tools:reload(Module, Bin);
         _ ->
         _ ->
             {error, "compilation failed"}
             {error, "compilation failed"}
-    end.   
+    end.    
     
     
 
 
 build_tree(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext, _) -> 
 build_tree(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext, _) -> 
@@ -229,34 +246,32 @@ build_tree(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext, _) ->
 		     {regular, Out, Args}			
 		     {regular, Out, Args}			
     end;
     end;
     
     
-build_tree(nil, [{var, Line, Var}], Out, Args, DocRoot, Ext, Var) ->
+build_tree(nil, [{var, Line, Val}], Out, Args, DocRoot, Ext, Val) ->
-    {regular, [erl_syntax:variable(Var) | Out], Args};
+    {regular, [erl_syntax:variable(Val) | Out], Args};
 	
 	
-build_tree(nil, [{var, Line, Val}], Out, Args, _, _, IgnoreVar)  ->
+build_tree(nil, [{var, Line, Var}], Out, Args, _, _, IgnoreVar)  ->
-    case lists:keysearch(Val, 2, Args) of
+    case lists:member(Var, Args) of
-        false ->
+        true ->
-            Key = list_to_atom(lists:concat(["A", length(Args) + 1])),
+            {regular, [{var, Line, Var} | Out], Args};
-            {regular, [{var, Line, Key} | Out], [{Key, Val} | Args]}; 
+        _ ->
-        {value, {Key, _}} ->   
+            {regular, [{var, Line, Var} | Out], [Var | Args]} 
-            {regular, [{var, Line, Key} | Out], Args}
+    end;    
-    end;
     
     
 build_tree(nil, [{tag, _Line, [TagName | TagArgs]}], Out, Args, _, Ext, IgnoreVar) ->
 build_tree(nil, [{tag, _Line, [TagName | TagArgs]}], Out, Args, _, Ext, IgnoreVar) ->
     Out2 = load_tag(TagName, TagArgs, Out, default, Ext, IgnoreVar),    
     Out2 = load_tag(TagName, TagArgs, Out, default, Ext, IgnoreVar),    
     {regular, Out2, Args};
     {regular, Out2, Args};
     
     
-build_tree(nil, [{for, _Line, Iterator, Var, [HFor | TFor]}], Out, Args, _, Ext, _) ->
+build_tree(nil, [{for, _Line, Iterator, Var, [HFor | TFor]}], Out, Args, _, Ext, _) -> 
-    {_, List1, Args1} = build_tree(HFor, TFor, [], Args, undefined, Ext, atom_to_list(Iterator)),  
+    {_, List1, Args1} = build_tree(HFor, TFor, [], Args, undefined, Ext, Iterator),  
-    {Key, Args2} = case lists:keysearch(atom_to_list(Var), 2, Args1) of
+    Args2 = case lists:member(Var, Args1) of
-        false ->           
+        true ->
-            Key = list_to_atom(lists:concat(["A", length(Args) + 1])),
+            Args1;
-            {Key, [{Key, atom_to_list(Var)} | Args1]};
+        _ ->
-        {value, {Key, _}} ->  
+            [Var | Args1]
-            {Key, Args1}
 	end,     
 	end,     
-    Body = erl_syntax:generator(erl_syntax:variable(Iterator), erl_syntax:variable(Key)),  
+    Body = erl_syntax:generator(erl_syntax:variable(Iterator), erl_syntax:variable(Var)),  
     Out1 = erl_syntax:list_comp(erl_syntax:list(List1), [Body]),
     Out1 = erl_syntax:list_comp(erl_syntax:list(List1), [Body]),
-    {regular, Out1, Args2};    
+    {regular, Out1, Args2};   
  
  
 build_tree(nil, [{string, Val}], Out, Args, _, _, _) ->
 build_tree(nil, [{string, Val}], Out, Args, _, _, _) ->
      {regular, [binary_string(Val) | Out], Args}; 
      {regular, [binary_string(Val) | Out], Args}; 
@@ -267,32 +282,30 @@ build_tree(nil, [Token], Out, Args, _, _, _) ->
 build_tree([H | T], [{var, Line, Var}], Out, Args, DocRoot, Ext, Var) ->
 build_tree([H | T], [{var, Line, Var}], Out, Args, DocRoot, Ext, Var) ->
     build_tree(H, T, [erl_syntax:variable(Var) | Out], Args, DocRoot, Ext, Var) ;
     build_tree(H, T, [erl_syntax:variable(Var) | Out], Args, DocRoot, Ext, Var) ;
     		
     		
-build_tree([H | T], [{var, Line, Val}], Out, Args, DocRoot, Ext, IgnoreVar) ->
+build_tree([H | T], [{var, Line, Var}], Out, Args, DocRoot, Ext, IgnoreVar) ->
-    case lists:keysearch(Val, 2, Args) of
+    case lists:member(Var, Args) of
-        false ->           
+        true ->
-            Key = list_to_atom(lists:concat(["A", length(Args) + 1])),
+            build_tree(H, T, [{var, Line, Var} | Out], Args, DocRoot, Ext, IgnoreVar);
-            build_tree(H, T, [{var, Line, Key} | Out], [{Key, Val} | Args], DocRoot, Ext, IgnoreVar);
+        _ ->
-        {value, {Key, _}} ->  
+            build_tree(H, T, [{var, Line, Var} | Out], [Var | Args], DocRoot, Ext, IgnoreVar)
-            build_tree(H, T, [{var, Line, Key} | Out], Args, DocRoot, Ext, IgnoreVar) 
+    end;    
-	end;	 
 	
 	
 build_tree([H | T], [{tag, _Line, [TagName | TagArgs]}], Out, Args, DocRoot, Ext, IgnoreVar) ->
 build_tree([H | T], [{tag, _Line, [TagName | TagArgs]}], Out, Args, DocRoot, Ext, IgnoreVar) ->
     Out2 = load_tag(TagName, TagArgs, Out, default, Ext, IgnoreVar),
     Out2 = load_tag(TagName, TagArgs, Out, default, Ext, IgnoreVar),
     build_tree(H, T, Out2, Args, DocRoot, Ext, IgnoreVar);
     build_tree(H, T, Out2, Args, DocRoot, Ext, IgnoreVar);
  
  
-build_tree([H | T], [{for, _Line, Iterator, Var, [HFor | TFor]}], Out, Args, DocRoot, Ext, IgnoreVar) -> 
+build_tree([H | T], [{for, _Line, Iterator, Var, [HFor | TFor]}], Out, Args, DocRoot, Ext, IgnoreVar) -> 	
-    {_, List1, Args1} = build_tree(HFor, TFor, [], Args, undefined, Ext, atom_to_list(Iterator)),  
+    {_, List1, Args1} = build_tree(HFor, TFor, [], Args, undefined, Ext, Iterator),  
-    {Key, Args2} = case lists:keysearch(atom_to_list(Var), 2, Args1) of
+    Args2 = case lists:member(Var, Args1) of
-        false ->           
+        true ->
-            Key = list_to_atom(lists:concat(["A", length(Args) + 1])),
+            Args1;
-            {Key, [{Key, atom_to_list(Var)} | Args1]};
+        _ ->
-        {value, {Key, _}} ->  
+            [Var | Args1]
-            {Key, Args1}
+	end,
-	end,     
+    Body = erl_syntax:generator(erl_syntax:variable(Iterator), erl_syntax:variable(Var)),  
-    Body = erl_syntax:generator(erl_syntax:variable(Iterator), erl_syntax:variable(Key)),  
     Out1 = erl_syntax:list_comp(erl_syntax:list(List1), [Body]),
     Out1 = erl_syntax:list_comp(erl_syntax:list(List1), [Body]),
-    build_tree(H, T, lists:flatten([Out1, Out]), Args2, DocRoot, Ext, IgnoreVar);	
+    build_tree(H, T, lists:flatten([Out1, Out]), Args2, DocRoot, Ext, IgnoreVar);
-
+    	
 build_tree([H | T], [{string, Val}], Out, Args, DocRoot, Ext, IgnoreVar) ->      
 build_tree([H | T], [{string, Val}], Out, Args, DocRoot, Ext, IgnoreVar) ->      
     build_tree(H, T, [binary_string(Val) | Out], Args, DocRoot, Ext, IgnoreVar);
     build_tree(H, T, [binary_string(Val) | Out], Args, DocRoot, Ext, IgnoreVar);
         	
         	
@@ -334,11 +347,7 @@ parse_transform({var, L, Val}) ->
 parse_transform(Other) ->    
 parse_transform(Other) ->    
     Other.   	
     Other.   	
 
 
-
+   	        	
-binary_string(String) ->
-    erl_syntax:binary([erl_syntax:binary_field(erl_syntax:integer(X)) || X <- String]).
-    
-       	        	
 load_tag(TagName, TagArgs, Acc0, default, Ext, IgnoreVar) ->
 load_tag(TagName, TagArgs, Acc0, default, Ext, IgnoreVar) ->
     case parse(filename:join([erlydtl_deps:get_base_dir(), "priv", "tags", atom_to_list(TagName) ++ Ext])) of
     case parse(filename:join([erlydtl_deps:get_base_dir(), "priv", "tags", atom_to_list(TagName) ++ Ext])) of
         {ok, ParentAst} ->
         {ok, ParentAst} ->
@@ -356,9 +365,23 @@ load_tag(TagName, TagArgs, Acc0, default, Ext, IgnoreVar) ->
     end.
     end.
   
   
     
     
+binary_string(String) ->
+    erl_syntax:string(String).
+%    erl_syntax:binary([erl_syntax:binary_field(erl_syntax:integer(X)) || X <- String]).
+
+
 rel_dir(Dir, DocRoot) when Dir =:= DocRoot ->
 rel_dir(Dir, DocRoot) when Dir =:= DocRoot ->
     DocRoot;
     DocRoot;
 rel_dir(Dir, DocRoot) ->
 rel_dir(Dir, DocRoot) ->
     RelFile = string:substr(Dir, length(DocRoot)+2),
     RelFile = string:substr(Dir, length(DocRoot)+2),
     filename:join([DocRoot, RelFile]).
     filename:join([DocRoot, RelFile]).
-    
+
+
+new_var(List, Acc) ->
+    Var = list_to_atom(lists:concat(["A", Acc])),
+    case lists:member(Var, List) of
+        false ->
+            Var;
+        _ ->
+            new_var(List, Acc + 1)
+    end.