Browse Source

started work on for tag, not finished yet

Roberto Saccon 17 years ago
parent
commit
a4226bd71c

+ 9 - 0
demo/templates/test_for.html

@@ -0,0 +1,9 @@
+before
+
+<ul>
+{% for fruit in fruit_list %}
+    <li>{{ fruit }}</li>
+{% endfor %}
+</ul>
+
+after

+ 2 - 1
src/demo/erlydtl_demo.erl

@@ -93,7 +93,8 @@ render_all() ->
     render(OutDir, test_extend, ".html", ["bar1string", "bar2string"]),
     render(OutDir, test_comment, ".html"),
     render(OutDir, test_tags, ".html"),
-    render(OutDir, test_tags, ".css").
+    render(OutDir, test_tags, ".css"),
+    render(OutDir, test_for, ".html", ["apple", "banana"]).
 
               
 %%====================================================================

+ 85 - 37
src/erlydtl/erlydtl_parser.erl

@@ -1,6 +1,6 @@
 -module(erlydtl_parser).
 -export([parse/1, parse_and_scan/1, format_error/1]).
--file("src/erlydtl/erlydtl_parser.yrl", 65).
+-file("src/erlydtl/erlydtl_parser.yrl", 68).
 
 extends({_, Line, [Name]}) ->
     %% TODO: check if string or variable, now it is assumed it is string
@@ -11,6 +11,9 @@ block({_, Line, [Name]}, Content) ->
 
 tag({_, Line, Args}) ->
     {tag, Line, Args}.
+
+for({_, Line, [Var, _, List]}, Content) ->
+    {for, Line, list_to_atom(Var), List, 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
@@ -104,7 +107,7 @@ yecctoken2string(Other) ->
 
 
 
--file("src/erlydtl/erlydtl_parser.erl", 107).
+-file("src/erlydtl/erlydtl_parser.erl", 110).
 
 yeccpars2(0, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  __NewStack = yeccpars2_0_(__Stack),
@@ -115,12 +118,14 @@ yeccpars2(1, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 3, [1 | __Ss], [__T | __Stack]);
 yeccpars2(1, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 4, [1 | __Ss], [__T | __Stack]);
-yeccpars2(1, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
+yeccpars2(1, for, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 5, [1 | __Ss], [__T | __Stack]);
-yeccpars2(1, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
+yeccpars2(1, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 6, [1 | __Ss], [__T | __Stack]);
-yeccpars2(1, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
+yeccpars2(1, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 7, [1 | __Ss], [__T | __Stack]);
+yeccpars2(1, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 8, [1 | __Ss], [__T | __Stack]);
 yeccpars2(1, _, _, _, __T, _, _) ->
  yeccerror(__T);
 yeccpars2(2, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
@@ -129,33 +134,58 @@ yeccpars2(2, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars2(yeccgoto('Elements', hd(__Nss)), __Cat, __Nss, __NewStack, __T, __Ts, __Tzr);
 yeccpars2(3, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  __NewStack = yeccpars2_3_(__Stack),
- yeccpars2(8, __Cat, [3 | __Ss], __NewStack, __T, __Ts, __Tzr);
+ yeccpars2(11, __Cat, [3 | __Ss], __NewStack, __T, __Ts, __Tzr);
 yeccpars2(4, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  __NewStack = yeccpars2_4_(__Stack),
  yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
 yeccpars2(5, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __Stack, __T, __Ts, __Tzr);
+ __NewStack = yeccpars2_5_(__Stack),
+ yeccpars2(9, __Cat, [5 | __Ss], __NewStack, __T, __Ts, __Tzr);
 yeccpars2(6, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
- __NewStack = yeccpars2_6_(__Stack),
- yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
+ yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __Stack, __T, __Ts, __Tzr);
 yeccpars2(7, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __NewStack = yeccpars2_7_(__Stack),
+ yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
+yeccpars2(8, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __Stack, __T, __Ts, __Tzr);
-yeccpars2(8, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 3, [8 | __Ss], [__T | __Stack]);
-yeccpars2(8, endblock, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 9, [8 | __Ss], [__T | __Stack]);
-yeccpars2(8, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 4, [8 | __Ss], [__T | __Stack]);
-yeccpars2(8, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 5, [8 | __Ss], [__T | __Stack]);
-yeccpars2(8, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 6, [8 | __Ss], [__T | __Stack]);
-yeccpars2(8, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 7, [8 | __Ss], [__T | __Stack]);
-yeccpars2(8, _, _, _, __T, _, _) ->
+yeccpars2(9, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 3, [9 | __Ss], [__T | __Stack]);
+yeccpars2(9, endfor, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 10, [9 | __Ss], [__T | __Stack]);
+yeccpars2(9, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 4, [9 | __Ss], [__T | __Stack]);
+yeccpars2(9, for, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 5, [9 | __Ss], [__T | __Stack]);
+yeccpars2(9, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 6, [9 | __Ss], [__T | __Stack]);
+yeccpars2(9, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 7, [9 | __Ss], [__T | __Stack]);
+yeccpars2(9, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 8, [9 | __Ss], [__T | __Stack]);
+yeccpars2(9, _, _, _, __T, _, _) ->
+ yeccerror(__T);
+yeccpars2(10, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __NewStack = yeccpars2_10_(__Stack),
+ __Nss = lists:nthtail(2, __Ss),
+ yeccpars2(yeccgoto('Element', hd(__Nss)), __Cat, __Nss, __NewStack, __T, __Ts, __Tzr);
+yeccpars2(11, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 3, [11 | __Ss], [__T | __Stack]);
+yeccpars2(11, endblock, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 12, [11 | __Ss], [__T | __Stack]);
+yeccpars2(11, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 4, [11 | __Ss], [__T | __Stack]);
+yeccpars2(11, for, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 5, [11 | __Ss], [__T | __Stack]);
+yeccpars2(11, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 6, [11 | __Ss], [__T | __Stack]);
+yeccpars2(11, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 7, [11 | __Ss], [__T | __Stack]);
+yeccpars2(11, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 8, [11 | __Ss], [__T | __Stack]);
+yeccpars2(11, _, _, _, __T, _, _) ->
  yeccerror(__T);
-yeccpars2(9, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
- __NewStack = yeccpars2_9_(__Stack),
+yeccpars2(12, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __NewStack = yeccpars2_12_(__Stack),
  __Nss = lists:nthtail(2, __Ss),
  yeccpars2(yeccgoto('Element', hd(__Nss)), __Cat, __Nss, __NewStack, __T, __Ts, __Tzr);
 yeccpars2(__Other, _, _, _, _, _, _) ->
@@ -163,56 +193,74 @@ yeccpars2(__Other, _, _, _, _, _, _) ->
 
 yeccgoto('Element', 1) ->
  2;
-yeccgoto('Element', 8) ->
+yeccgoto('Element', 9) ->
+ 2;
+yeccgoto('Element', 11) ->
  2;
 yeccgoto('Elements', 0) ->
  1;
 yeccgoto('Elements', 3) ->
- 8;
+ 11;
+yeccgoto('Elements', 5) ->
+ 9;
 yeccgoto(__Symbol, __State) ->
  erlang:error({yecc_bug,"1.1",{__Symbol, __State, missing_in_goto_table}}).
 
 -compile({inline,{yeccpars2_0_,1}}).
--file("src/erlydtl/erlydtl_parser.yrl", 52).
+-file("src/erlydtl/erlydtl_parser.yrl", 54).
 yeccpars2_0_(__Stack) ->
  [begin
    nil
   end | __Stack].
 
 -compile({inline,{yeccpars2_2_,1}}).
--file("src/erlydtl/erlydtl_parser.yrl", 53).
+-file("src/erlydtl/erlydtl_parser.yrl", 55).
 yeccpars2_2_([__2,__1 | __Stack]) ->
  [begin
    [ __1 , __2 ]
   end | __Stack].
 
 -compile({inline,{yeccpars2_3_,1}}).
--file("src/erlydtl/erlydtl_parser.yrl", 52).
+-file("src/erlydtl/erlydtl_parser.yrl", 54).
 yeccpars2_3_(__Stack) ->
  [begin
    nil
   end | __Stack].
 
 -compile({inline,{yeccpars2_4_,1}}).
--file("src/erlydtl/erlydtl_parser.yrl", 57).
+-file("src/erlydtl/erlydtl_parser.yrl", 59).
 yeccpars2_4_([__1 | __Stack]) ->
  [begin
    extends ( __1 )
   end | __Stack].
 
--compile({inline,{yeccpars2_6_,1}}).
--file("src/erlydtl/erlydtl_parser.yrl", 59).
-yeccpars2_6_([__1 | __Stack]) ->
+-compile({inline,{yeccpars2_5_,1}}).
+-file("src/erlydtl/erlydtl_parser.yrl", 54).
+yeccpars2_5_(__Stack) ->
+ [begin
+   nil
+  end | __Stack].
+
+-compile({inline,{yeccpars2_7_,1}}).
+-file("src/erlydtl/erlydtl_parser.yrl", 61).
+yeccpars2_7_([__1 | __Stack]) ->
  [begin
    tag ( __1 )
   end | __Stack].
 
--compile({inline,{yeccpars2_9_,1}}).
--file("src/erlydtl/erlydtl_parser.yrl", 58).
-yeccpars2_9_([__3,__2,__1 | __Stack]) ->
+-compile({inline,{yeccpars2_10_,1}}).
+-file("src/erlydtl/erlydtl_parser.yrl", 62).
+yeccpars2_10_([__3,__2,__1 | __Stack]) ->
+ [begin
+   for ( __1 , __2 )
+  end | __Stack].
+
+-compile({inline,{yeccpars2_12_,1}}).
+-file("src/erlydtl/erlydtl_parser.yrl", 60).
+yeccpars2_12_([__3,__2,__1 | __Stack]) ->
  [begin
    block ( __1 , __2 )
   end | __Stack].
 
 
--file("src/erlydtl/erlydtl_parser.yrl", 75).
+-file("src/erlydtl/erlydtl_parser.yrl", 81).

+ 8 - 2
src/erlydtl/erlydtl_parser.yrl

@@ -42,7 +42,9 @@ Terminals
     extends
     block
     endblock
-    tag.
+    tag
+    for
+    endfor.
 
 Rootsymbol    
     Elements. 
@@ -60,6 +62,7 @@ Element -> var : '$1'.
 Element -> extends : extends('$1').
 Element -> block Elements endblock : block('$1', '$2').
 Element -> tag : tag('$1').
+Element -> for Elements endfor : for('$1', '$2').
 
 
 Erlang code.
@@ -72,4 +75,7 @@ block({_, Line, [Name]}, Content) ->
     {block, Line, list_to_atom(Name), Content}.
 
 tag({_, Line, Args}) ->
-    {tag, Line, Args}.
+    {tag, Line, Args}.
+
+for({_, Line, [Var, _, List]}, Content) ->
+    {for, Line, list_to_atom(Var), List, Content}.

+ 7 - 1
src/erlydtl/erlydtl_scanner.erl

@@ -175,8 +175,14 @@ translate_tag("block" = H, T, Line) ->
     {list_to_atom(H), Line, T};   
     
 translate_tag("endblock" = H, T, Line) ->
-    {list_to_atom(H), Line, T};         
+    {list_to_atom(H), Line, T};    
+    
+translate_tag("for" = H, T, Line) ->
+    {list_to_atom(H), Line, T};   
 
+translate_tag("endfor" = H, T, Line) ->
+    {list_to_atom(H), Line, T};    
+         
 translate_tag(H, T, Line) ->
     {tag, Line, [list_to_atom(H) | T]}.
 

+ 81 - 48
src/erlydtl/erlydtl_server.erl

@@ -175,12 +175,6 @@ code_change(_OldVsn, State, _Extra) ->
 %% Internal functions
 %%====================================================================
 
-rel_dir(Dir, DocRoot) when Dir =:= DocRoot ->
-    DocRoot;
-rel_dir(Dir, DocRoot) ->
-    RelFile = string:substr(Dir, length(DocRoot)+2),
-    filename:join([DocRoot, RelFile]).
-
 
 parse(File) ->
 	case file:read_file(File) of
@@ -194,15 +188,15 @@ parse(File) ->
 	                Err
 	        end;
 	    Err ->
-	        io:format("TRACE ~p:~p ~p~n",[?MODULE, ?LINE, "File read error"]),
+	        io:format("TRACE ~p:~p ~p: ~p~n",[?MODULE, ?LINE, "File read error with:", File]),
 	        Err   
 	end.
 	
 
 compile_reload_ast([H | T], ModuleName, FunctionName, RelDir, Ext) ->
-    {List, Args} = case transl(H, T, [], [], RelDir, Ext) of
+    {List, Args} = case walk_ast(H, T, [], [], RelDir, Ext) of
 	    {regular, List0, Args0} ->
-		    {[inplace_block(X) ||  X <- List0], Args0};
+		    {[parse_transform(X) ||  X <- List0], Args0};
 		{inherited, List0, Arg0} ->
 			{List0, Arg0}
 	end,	           
@@ -221,26 +215,16 @@ compile_reload_ast([H | T], ModuleName, FunctionName, RelDir, Ext) ->
             end;            
         _ ->
            {error, "compilation failed"}
-    end.
-
-
-list_fold([E]) ->
-    E;      
-list_fold([E1, E2]) ->
-    {cons, 1, E2, E1};           
-list_fold([E1, E2 | Tail]) ->
-    lists:foldl(fun(X, T) -> 
-        {cons, 1, X, T}
-    end, {cons, 1, E2, E1}, Tail).                       
+    end.                      
 
 
-transl(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext) -> 
+walk_ast(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext) -> 
     case parse(filename:join([RelDir, Name])) of
         {ok, ParentAst} ->
 		    [H|T]=ParentAst,
-			{_, List, Args1} = transl(H, T, [], [], RelDir, Ext),			 
+			{_, List, Args1} = walk_ast(H, T, [], [], RelDir, Ext),			 
 			{List3, Args3} = lists:foldl(fun(X, {List2, Args2}) -> 
-                {List4, Args4} = replace_block(X, Out, Args2, Ext),            
+                {List4, Args4} = parse_transform(X, Out, Args2, Ext),            
                 {[List4 | List2], Args4}
             end, {[], Args1}, List),		   
 		    {inherited, lists:reverse(lists:flatten([List3])), lists:flatten(Args3)};
@@ -250,7 +234,7 @@ transl(nil, [{extends, _Line, Name}], Out, Args, RelDir, Ext) ->
 		     {regular, Out, Args}			
     end;
 	
-transl(nil, [{var, Line, Val}], Out, Args, _, _) ->
+walk_ast(nil, [{var, Line, Val}], Out, Args, _, _) ->
     case lists:keysearch(Val, 2, Args) of
         false ->
             Key = list_to_atom(lists:concat(["A", length(Args) + 1])),
@@ -259,55 +243,93 @@ transl(nil, [{var, Line, Val}], Out, Args, _, _) ->
             {regular, [{var, Line, Key} | Out], Args}
     end;
     
-transl(nil, [{tag, _Line, [TagName | TagArgs]}], Out, Args, _, Ext) ->
+walk_ast(nil, [{tag, _Line, [TagName | TagArgs]}], Out, Args, _, Ext) ->
     Out2 = load_tag(TagName, TagArgs, Out, default, Ext),    
     {regular, Out2, Args};
-
-transl(nil, [Token], Out, Args, _, _) ->
+    
+walk_ast(nil, [{for, _Line, Var, List, Content}], Out, Args, _, Ext) ->
+io:format("TRACE ~p:~p Content-nil: ~p~n",[?MODULE, ?LINE, Content]),
+     Out2 = Out,
+     {regular, Out2, Args};    
+    
+walk_ast(nil, [Token], Out, Args, _, _) ->
     {regular, [Token | Out], Args}; 
 	
-transl([H | T], [{var, Line, Val}], Out, Args, DocRoot, Ext) ->
+walk_ast([H | T], [{var, Line, Val}], Out, Args, DocRoot, Ext) ->
     case lists:keysearch(Val, 2, Args) of
         false ->           
             Key = list_to_atom(lists:concat(["A", length(Args) + 1])),
-            transl(H, T, [{var, Line, Key} | Out], [{Key, Val} | Args], DocRoot, Ext);
+            walk_ast(H, T, [{var, Line, Key} | Out], [{Key, Val} | Args], DocRoot, Ext);
         {value, {Key, _}} ->  
-            transl(H, T, [{var, Line, Key} | Out], Args, DocRoot, Ext)
+            walk_ast(H, T, [{var, Line, Key} | Out], Args, DocRoot, Ext)
 	end;	 
 	
-transl([H | T], [{tag, _Line, [TagName | TagArgs]}], Out, Args, DocRoot, Ext) ->
+walk_ast([H | T], [{tag, _Line, [TagName | TagArgs]}], Out, Args, DocRoot, Ext) ->
     Out2 = load_tag(TagName, TagArgs, Out, default, Ext),
-    transl(H, T, Out2, Args, DocRoot, Ext);
+    walk_ast(H, T, Out2, Args, DocRoot, Ext);
+    
+walk_ast([H | T], [{for, _Line, Var, List, [nil | TFor]}], Out, Args, DocRoot, Ext) ->
+io:format("TRACE ~p:~p Content-not-nil: ~p~n",[?MODULE, ?LINE, T]),  %%
+    % just subst. var
+    Out2 = Out,
+    walk_ast(H, T, Out2, Args, DocRoot, Ext);     
+
+walk_ast([H | T], [{for, _Line, Var, List, [HFor | TFor]}], Out, Args, DocRoot, Ext) -> 
+    %% List2 = lists:foldl(fun(X, Acc) -> 
+    %%         {_, List1, _Args1} = walk_ast(HFor, TFor, [], [], undefined, Ext),
+    %%         [parse_transform(Y, X, Var)  || Y <- List1]                
+    %%     end,
+    %%     [],
+    %%     List),
+    %% io:format("TRACE ~p:~p Content-not-nil-out1: ~p~n",[?MODULE, ?LINE, List2]),
+    %% io:format("TRACE ~p:~p Content-not-nil-out2: ~p~n",[?MODULE, ?LINE, lists:flatten(List2)]),
+    io:format("TRACE ~p:~p Content-not-nil-out1: ~p~n",[?MODULE, ?LINE, Var]),
+    io:format("TRACE ~p:~p Content-not-nil-out1: ~p~n",[?MODULE, ?LINE, List]),
+    io:format("TRACE ~p:~p Content-not-nil-out1: ~p~n",[?MODULE, ?LINE, [HFor | TFor]]),
+    Out2 = Out,
+    walk_ast(H, T, Out2, Args, DocRoot, Ext);	
 	
-transl([H | T], [Token], Out, Args, DocRoot, Ext) ->      
-    transl(H, T, [Token | Out], Args, DocRoot, Ext).
+walk_ast([H | T], [Token], Out, Args, DocRoot, Ext) ->      
+    walk_ast(H, T, [Token | Out], Args, DocRoot, Ext).
 
 
-replace_block({block, _Line, Name, [nil, Val]}, List, Args, Ext) ->
+parse_transform({block, _Line, Name, [nil, Val]}, List, Args, Ext) ->
 	case lists:keysearch(Name, 3, List) of
 		false -> 
 			{Val, Args};
 		{value, {_, _, _, [H | T]}} ->  
-		    {_, List2, Args2} = transl(H, T, [], Args, undefined, Ext),
+		    {_, List2, Args2} = walk_ast(H, T, [], Args, undefined, Ext),
 		    {lists:reverse(List2), Args2} 
  	end;
-replace_block(Other, _What, Args, _) ->	
+parse_transform(Other, _What, Args, _) ->	
 	{Other, Args}.
+
     
-	
-inplace_block({block, _Line , _Name, [nil, Str]}) ->
+parse_transform({var, Line, Var}, Var1, Var) when is_atom(Var1) ->
+    {var, Line, Var1}.
+    
+            
+parse_transform({var, Line, Var}, Args) ->
+    {value, {_, Val}} = lists:keysearch(Var, 1, Args),
+    {string, Line, Val};            
+parse_transform(Other, _) ->
+    Other.
+        
+
+parse_transform({block, _Line , _Name, [nil, Str]}) ->
 	Str;
-inplace_block(Other) ->	
+parse_transform(Other) ->	
 	Other.
-	
+    	
+    	        	
 load_tag(TagName, TagArgs, Acc0, default, Ext) ->
     case parse(filename:join([erlydtl_deps:get_base_dir(), "priv", "tags", atom_to_list(TagName) ++ Ext])) of
         {ok, ParentAst} ->
 		    [H|T]=ParentAst,
-			{_, List, Args1} = transl(H, T, [], [], undefined, Ext),
+			{_, List, Args1} = walk_ast(H, T, [], [], undefined, Ext),
 			Args2 = [{Var, Val} || {{Var, _}, Val} <- lists:zip(Args1, TagArgs)], 			
 			lists:foldl(fun(X, Acc) -> 
-			        [replace_tag_variable(X, Args2) | Acc]			        
+			        [parse_transform(X, Args2) | Acc]			        
 			    end, 
 			    Acc0,
 			    lists:reverse(List));
@@ -315,10 +337,21 @@ load_tag(TagName, TagArgs, Acc0, default, Ext) ->
     	    io:format("TRACE ~p:~p ~p~n",[?MODULE, ?LINE, Msg]),
     	    Acc0
     end.
+ 
+
+list_fold([E]) ->
+    E;      
+list_fold([E1, E2]) ->
+    {cons, 1, E2, E1};           
+list_fold([E1, E2 | Tail]) ->
+    lists:foldl(fun(X, T) -> 
+        {cons, 1, X, T}
+    end, {cons, 1, E2, E1}, Tail).
+     
     
-replace_tag_variable({var, _Line, Var}, Args) ->
-    {value, {_, Val}} = lists:keysearch(Var, 1, Args),
-    {string, 1, Val};            
-replace_tag_variable(Other, _) ->
-    Other.
+rel_dir(Dir, DocRoot) when Dir =:= DocRoot ->
+    DocRoot;
+rel_dir(Dir, DocRoot) ->
+    RelFile = string:substr(Dir, length(DocRoot)+2),
+    filename:join([DocRoot, RelFile]).