Просмотр исходного кода

added initial part of custom tags

git-svn-id: http://erlydtl.googlecode.com/svn/trunk@11 a5195066-8e3e-0410-a82a-05b01b1b9875
rsaccon 17 лет назад
Родитель
Сommit
3baccfbc38

+ 12 - 0
demo/out/test_tags.html

@@ -0,0 +1,12 @@
+<!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>
+	before
+	not_fully_implemented_yet
+	after
+  </body>
+</html>

+ 12 - 0
demo/templates/test_tags.html

@@ -0,0 +1,12 @@
+<!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>
+	before
+	{% flashvideo test.swf 800 600 %}
+	after
+  </body>
+</html>

+ 17 - 3
src/demo/erlydtl_demo.erl

@@ -34,7 +34,7 @@
 -author('rsaccon@gmail.com').
 
 %% API
--export([compile_templates/0, render_html/0]).
+-export([compile_templates/0, compile_test_template/1, render_html/0]).
 
 %%====================================================================
 %% API
@@ -54,7 +54,19 @@ compile_templates() ->
             erlydtl:compile(Path, Name, DocRoot)
         end,
         []).
-  
+ 
+%%--------------------------------------------------------------------
+%% @spec (string()) -> any()
+%% @doc 
+%% compiles the template to beam files
+%% @end 
+%%--------------------------------------------------------------------       
+compile_test_template(Name) ->
+    DocRoot = filename:join([filename:dirname(code:which(?MODULE)),"..", "demo", "templates"]),
+    Name2 = "test_" ++ Name,
+    Path = filename:join([DocRoot, Name2 ++ ".html"]),
+    erlydtl:compile(Path, Name2, DocRoot).
+
                        
 %%--------------------------------------------------------------------
 %% @spec () -> any()
@@ -65,7 +77,9 @@ render_html() ->
     OutDir = filename:join([filename:dirname(code:which(?MODULE)),"..", "demo", "out"]),
     render(OutDir, test_variable, ".html", ["foostring"]),
     render(OutDir, test_extend, ".html", ["bar1string", "bar2string"]),
-    render(OutDir, test_comment, ".html").
+ %% render(OutDir, test_extend, ".html", ["bar1string"]),
+    render(OutDir, test_comment, ".html"),
+    render(OutDir, test_tags, ".html").
 
               
 %%====================================================================

+ 24 - 19
src/erlydtl/erlydtl.erl

@@ -98,12 +98,12 @@ compile_reload_ast([H | T], ModuleName, FunctionName, RelDir) ->
 		    {[inplace_block(X) ||  X <- List0], Args0};
 		{inherited, List0, Arg0} ->
 			{List0, Arg0}
-	end,    	           
+	end,	           
     Args2 = lists:reverse([{var, 1, Val} || {Val, _} <- Args]),  
     Cons = list_fold(lists:reverse(List)),                           
     Ast2 = {function, 1, list_to_atom(FunctionName), length(Args2),
         [{clause, 1, Args2, [], [Cons]}]},
-    Ac = erlydtl_tools:create_module(Ast2 , ModuleName),    
+    Ac = erlydtl_tools:create_module(Ast2 , ModuleName),   
     case compile:forms(Ac) of
         {ok, Module, Bin} ->
             case erlydtl_tools:reload(Module, Bin) of
@@ -127,7 +127,7 @@ list_fold([E1, E2 | Tail]) ->
     end, {cons, 1, E2, E1}, Tail).                       
 
 
-transl(nil, [{extends, _, Name}], Out, Args, RelDir) -> 
+transl(nil, [{extends, _Line, Name}], Out, Args, RelDir) -> 
     case parse(filename:join([RelDir, Name])) of
         {ok, ParentAst} ->
 		    [H|T]=ParentAst,
@@ -143,47 +143,52 @@ transl(nil, [{extends, _, Name}], Out, Args, RelDir) ->
 		     {regular, Out, Args}			
     end;
 	
-transl(nil, [{var, L, Val}], Out, Args, _) ->
-     io:format("TRACE ~p:~p nil ~p~n",[?MODULE, ?LINE, {Val, Args}]),
+transl(nil, [{var, Line, Val}], Out, Args, _) ->
     case lists:keysearch(Val, 2, Args) of
         false ->
             Key = list_to_atom(lists:concat(["A", length(Args) + 1])),
-            {regular, [{var, L, Key} | Out], [{Key, Val} | Args]}; 
+            {regular, [{var, Line, Key} | Out], [{Key, Val} | Args]}; 
         {value, {Key, _}} ->   
-            {regular, [{var, L, Key} | Out], Args}
+            {regular, [{var, Line, Key} | Out], Args}
     end;
+    
+transl(nil, [{tag, Line, _TagArgs}], Out, Args, _) ->
+    %% TODO: call insert_ tag code
+    {regular, [{string, Line, "not_fully_implemented_yet"} | Out], Args};
 
 transl(nil, [Token], Out, Args, _) ->
     {regular, [Token | Out], Args}; 
 	
-transl([H | T], [{var, L, Val}], Out, Args, DocRoot) ->
+transl([H | T], [{var, Line, Val}], Out, Args, DocRoot) ->
     case lists:keysearch(Val, 2, Args) of
-        false ->
-                io:format("TRACE ~p:~p normal_not_found ~p~n",[?MODULE, ?LINE, {Val, Args}]),              
+        false ->           
             Key = list_to_atom(lists:concat(["A", length(Args) + 1])),
-            transl(H, T, [{var, L, Key} | Out], [{Key, Val} | Args], DocRoot);
+            transl(H, T, [{var, Line, Key} | Out], [{Key, Val} | Args], DocRoot);
         {value, {Key, _}} ->  
-                   io:format("TRACE ~p:~p normal_found ~p~n",[?MODULE, ?LINE, {Val, Key, Args}]),
-            transl(H, T, [{var, L, Key} | Out], Args, DocRoot)
+            transl(H, T, [{var, Line, Key} | Out], Args, DocRoot)
 	end;	 
 	
-transl([H | T], [Token], Out, Args, DocRoot) ->       
+transl([H | T], [{tag, Line, _TagArgs}], Out, Args, DocRoot) ->
+    %% TODO: call insert_tag code
+    transl(H, T, [{string, Line, "not_fully_implemented_yet"} | Out], Args, DocRoot);
+	
+transl([H | T], [Token], Out, Args, DocRoot) ->      
     transl(H, T, [Token | Out], Args, DocRoot).
 
 
-replace_block({block, Name, [nil, Val]}, List, Args) ->
-	case lists:keysearch(Name, 2, List) of
+replace_block({block, _Line, Name, [nil, Val]}, List, Args) ->
+	case lists:keysearch(Name, 3, List) of
 		false -> 
 			{Val, Args};
-		{value, {_, _, [H | T]}} ->  
+		{value, {_, _, _, [H | T]}} ->  
 		    {_, List2, Args2} = transl(H, T, [], Args, undefined),
 		    {lists:reverse(List2), Args2} 
  	end;
-replace_block(Other, _, Args) ->	
+replace_block(Other, What, Args) ->	
 	{Other, Args}.
     
 	
-inplace_block({block, _, [nil, Str]}) ->
+inplace_block({block, _Line , _Name, [nil, Str]}) ->
 	Str;
 inplace_block(Other) ->	
 	Other.

+ 46 - 28
src/erlydtl/erlydtl_parser.erl

@@ -2,11 +2,15 @@
 -export([parse/1, parse_and_scan/1, format_error/1]).
 -file("src/erlydtl/erlydtl_parser.yrl", 65).
 
-extends({_, _, [Name]}) ->
-    {extends, 1, string:strip(Name, both, $")}.
+extends({_, Line, [Name]}) ->
+    %% TODO: check if string or variable, now it is assumed it is string
+    {extends, Line, string:strip(Name, both, $")}.
 
-block({_, _, [Name]}, Content) ->
-    {block, list_to_atom(Name), Content}.
+block({_, Line, [Name]}, Content) ->
+    {block, Line, list_to_atom(Name), Content}.
+
+tag({_, Line, Args}) ->
+    {tag, Line, Args}.
 -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
@@ -100,7 +104,7 @@ yecctoken2string(Other) ->
 
 
 
--file("src/erlydtl/erlydtl_parser.erl", 103).
+-file("src/erlydtl/erlydtl_parser.erl", 107).
 
 yeccpars2(0, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  __NewStack = yeccpars2_0_(__Stack),
@@ -113,8 +117,10 @@ yeccpars2(1, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 4, [1 | __Ss], [__T | __Stack]);
 yeccpars2(1, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 5, [1 | __Ss], [__T | __Stack]);
-yeccpars2(1, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
+yeccpars2(1, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars1(__Ts, __Tzr, 6, [1 | __Ss], [__T | __Stack]);
+yeccpars2(1, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ yeccpars1(__Ts, __Tzr, 7, [1 | __Ss], [__T | __Stack]);
 yeccpars2(1, _, _, _, __T, _, _) ->
  yeccerror(__T);
 yeccpars2(2, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
@@ -123,28 +129,33 @@ 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(7, __Cat, [3 | __Ss], __NewStack, __T, __Ts, __Tzr);
+ yeccpars2(8, __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);
 yeccpars2(6, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __NewStack = yeccpars2_6_(__Stack),
+ yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
+yeccpars2(7, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __Stack, __T, __Ts, __Tzr);
-yeccpars2(7, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 3, [7 | __Ss], [__T | __Stack]);
-yeccpars2(7, endblock, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 8, [7 | __Ss], [__T | __Stack]);
-yeccpars2(7, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 4, [7 | __Ss], [__T | __Stack]);
-yeccpars2(7, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 5, [7 | __Ss], [__T | __Stack]);
-yeccpars2(7, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
- yeccpars1(__Ts, __Tzr, 6, [7 | __Ss], [__T | __Stack]);
-yeccpars2(7, _, _, _, __T, _, _) ->
+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, _, _) ->
  yeccerror(__T);
-yeccpars2(8, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
- __NewStack = yeccpars2_8_(__Stack),
+yeccpars2(9, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
+ __NewStack = yeccpars2_9_(__Stack),
  __Nss = lists:nthtail(2, __Ss),
  yeccpars2(yeccgoto('Element', hd(__Nss)), __Cat, __Nss, __NewStack, __T, __Ts, __Tzr);
 yeccpars2(__Other, _, _, _, _, _, _) ->
@@ -152,31 +163,31 @@ yeccpars2(__Other, _, _, _, _, _, _) ->
 
 yeccgoto('Element', 1) ->
  2;
-yeccgoto('Element', 7) ->
+yeccgoto('Element', 8) ->
  2;
 yeccgoto('Elements', 0) ->
  1;
 yeccgoto('Elements', 3) ->
- 7;
+ 8;
 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", 51).
+-file("src/erlydtl/erlydtl_parser.yrl", 52).
 yeccpars2_0_(__Stack) ->
  [begin
    nil
   end | __Stack].
 
 -compile({inline,{yeccpars2_2_,1}}).
--file("src/erlydtl/erlydtl_parser.yrl", 52).
+-file("src/erlydtl/erlydtl_parser.yrl", 53).
 yeccpars2_2_([__2,__1 | __Stack]) ->
  [begin
    [ __1 , __2 ]
   end | __Stack].
 
 -compile({inline,{yeccpars2_3_,1}}).
--file("src/erlydtl/erlydtl_parser.yrl", 51).
+-file("src/erlydtl/erlydtl_parser.yrl", 52).
 yeccpars2_3_(__Stack) ->
  [begin
    nil
@@ -189,12 +200,19 @@ yeccpars2_4_([__1 | __Stack]) ->
    extends ( __1 )
   end | __Stack].
 
--compile({inline,{yeccpars2_8_,1}}).
+-compile({inline,{yeccpars2_6_,1}}).
+-file("src/erlydtl/erlydtl_parser.yrl", 59).
+yeccpars2_6_([__1 | __Stack]) ->
+ [begin
+   tag ( __1 )
+  end | __Stack].
+
+-compile({inline,{yeccpars2_9_,1}}).
 -file("src/erlydtl/erlydtl_parser.yrl", 58).
-yeccpars2_8_([__3,__2,__1 | __Stack]) ->
+yeccpars2_9_([__3,__2,__1 | __Stack]) ->
  [begin
    block ( __1 , __2 )
   end | __Stack].
 
 
--file("src/erlydtl/erlydtl_parser.yrl", 71).
+-file("src/erlydtl/erlydtl_parser.yrl", 75).

+ 10 - 7
src/erlydtl/erlydtl_parser.yrl

@@ -37,11 +37,12 @@ Nonterminals
     Element.
 
 Terminals 
+    string
     var
     extends
     block
     endblock
-    string.
+    tag.
 
 Rootsymbol    
     Elements. 
@@ -56,17 +57,19 @@ Elements -> Elements Element : ['$1', '$2'].
 
 Element -> string : '$1'.
 Element -> var : '$1'.
-% Element -> extends : '$1'.
 Element -> extends : extends('$1').
 Element -> block Elements endblock : block('$1', '$2').
-
+Element -> tag : tag('$1').
 
 
 Erlang code.
 
-extends({_, _, [Name]}) ->
+extends({_, Line, [Name]}) ->
     %% TODO: check if string or variable, now it is assumed it is string
-    {extends, 1, string:strip(Name, both, $")}.
+    {extends, Line, string:strip(Name, both, $")}.
+
+block({_, Line, [Name]}, Content) ->
+    {block, Line, list_to_atom(Name), Content}.
 
-block({_, _, [Name]}, Content) ->
-    {block, list_to_atom(Name), Content}.
+tag({_, Line, Args}) ->
+    {tag, Line, Args}.

+ 13 - 1
src/erlydtl/erlydtl_scanner.erl

@@ -162,12 +162,24 @@ translate_token({var, Line, [[S] | _]}) ->
     {var, Line, S};
 
 translate_token({tag, Line, [[H | T] | _]}) ->
-    {list_to_atom(H), Line, T};
+    translate_tag(H, T, Line) ;
 
 translate_token(Token) ->
     io:format("TRACE ~p:~p unrecognized token: ~p~n",[?MODULE, ?LINE, Token]),
     Token.
 
+translate_tag("extends" = H, T, Line) ->
+    {list_to_atom(H), Line, T};
+    
+translate_tag("block" = H, T, Line) ->
+    {list_to_atom(H), Line, T};   
+    
+translate_tag("endblock" = H, T, Line) ->
+    {list_to_atom(H), Line, T};         
+
+translate_tag(H, T, Line) ->
+    {tag, Line, [list_to_atom(H) | T]}.
+
 
 until(P) ->
     fun (Tmpl) -> 

+ 21 - 0
tags/flashvideo.html

@@ -0,0 +1,21 @@
+<object id="{{ dom_id }}" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{{ width }}" height="{{ height }}">
+	<param name="movie" value="{{ static }}/mediaplayer.swf">
+    <param name="allowfullscreen" value="true">
+    <param name="menu" value="false">
+    <param name="flashvars" value="file={{ path_to_video }}&image={{path_to_preview_image}}">
+    <!--[if !IE]>-->
+    <object type="application/x-shockwave-flash" data="{{ path}}/mediaplayer.swf" width="800" height="620">
+    <param name="allowfullscreen" value="true">
+    <param name="menu" value="false">
+    <param name="flashvars" value="file={{ path_to_video }}&image={{path_to_preview_image}}">
+    <!--<![endif]-->
+    <h2>To view the Video:</h2>
+    <p>
+    	<a href="http://www.adobe.com/go/getflashplayer">
+        	<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif"alt="Get Adobe Flash player">
+    	</a>
+    </p>
+    <!--[if !IE]>-->
+    </object>
+    <!--<![endif]-->
+</object>