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

Merge commit 'remotes/origin/master' into googlecode

Conflicts:
	Makefile
	src/erlydtl/erlydtl.app
	src/erlydtl/erlydtl_compiler.erl
	src/erlydtl/erlydtl_runtime.erl
	src/erlydtl/erlydtl_scanner.erl
Christian Sunesson 15 лет назад
Родитель
Сommit
d38f1dedd2

+ 6 - 0
Makefile

@@ -13,6 +13,12 @@ ebin/$(APP): src/erlydtl/$(APP)
 
 $(PARSER).erl: $(PARSER).yrl
 	$(ERLC) -o src/erlydtl src/erlydtl/erlydtl_parser.yrl
+
+ebin/erlydtl.app: ebin src/erlydtl/erlydtl.app
+	@cp src/erlydtl/erlydtl.app $<
+
+ebin:
+	mkdir ebin
  
 run:
 	$(ERL) -pa ebin

+ 25 - 0
bin/erlydtl_compile

@@ -0,0 +1,25 @@
+#!/usr/bin/env escript
+%% -*- mode: erlang -*-
+-export([main/1]).
+
+%% External API
+
+main([Prefix, File]) ->
+    ensure(),
+    Basename = filename:basename(File, ".dtl"),
+    ModuleName = list_to_atom(string:to_lower(lists:flatten([Prefix, "_", Basename]))),
+    erlydtl_compiler:compile(File, ModuleName, [{out_dir, filename:dirname(File)}]);
+main(_) ->
+    usage().
+
+ensure() ->
+    code:add_patha("ebin"),
+    code:add_patha("lib/erlydtl/ebin"),
+    [D1,D2|_] = code:get_path(),
+    io:format("Code Path: ~p~n", [[D1,D2]]).
+
+
+usage() ->
+    io:format("usage: ~s name [destdir]~n",
+              [filename:basename(escript:script_name())]),
+    halt(1).

+ 0 - 4
src/erlydtl/erlydtl.app

@@ -19,7 +19,3 @@
   {applications, [kernel, stdlib, crypto]},
   {registered, []}
  ]}.
-
-
-
-

+ 2 - 3
src/erlydtl/erlydtl_compiler.erl

@@ -85,7 +85,6 @@ compile(Binary, Module, Options) when is_binary(Binary) ->
     end;
     
 compile(File, Module, Options) ->  
-    crypto:start(),
     Context = init_dtl_context(File, Module, Options),
     case parse(File, Context) of  
         ok ->
@@ -165,7 +164,7 @@ is_up_to_date(CheckSum, Context) ->
                             ({XFile, XCheckSum}, Acc) ->
                                 case catch M:F(XFile) of
                                     {ok, Data} ->
-                                        case binary_to_list(crypto:sha(Data)) of
+                                        case binary_to_list(erlang:md5(Data)) of
                                             XCheckSum ->
                                                 Acc;
                                             _ ->
@@ -191,7 +190,7 @@ parse(File, Context) ->
     {M, F} = Context#dtl_context.reader,
     case catch M:F(File) of
         {ok, Data} ->
-            CheckSum = binary_to_list(crypto:sha(Data)),
+            CheckSum = binary_to_list(erlang:md5(Data)),
             case parse(CheckSum, Data, Context) of
                 {error, Msg} when is_list(Msg) ->
                     {error, File ++ ": " ++ Msg};

+ 4 - 0
src/erlydtl/erlydtl_filters.erl

@@ -210,6 +210,10 @@ urlencode(Input) when is_binary(Input) ->
 urlencode(Input) when is_list(Input) ->
     urlencode(Input, []).
 
+base64(Input) ->
+	base64:encode(erlang:iolist_to_binary(Input)).
+
+
 % internal
 
 escape(Binary, Index) when is_binary(Binary) ->

+ 2 - 0
src/erlydtl/erlydtl_runtime.erl

@@ -2,6 +2,8 @@
 
 -compile(export_all).
 
+find_value(Key, Fun) when is_function(Fun, 1) ->
+    Fun(Key);
 find_value(Key, L) when is_list(L) ->
     case proplists:get_value(Key, L) of
         undefined ->

+ 6 - 3
src/erlydtl/erlydtl_scanner.erl

@@ -109,6 +109,9 @@ scan("{%" ++ T, Scanned, {Row, Column}, in_text) ->
 scan([_ | T], Scanned, {Row, Column}, {in_comment, Closer}) ->
     scan(T, Scanned, {Row, Column + 1}, {in_comment, Closer});
 
+%% Drop newlines from lines that end with a backslash
+scan("\\\n" ++ T, Scanned, {Row, _Column}, in_text) ->
+    scan(T, Scanned, {Row + 1, 1}, in_text);
 scan("\n" ++ T, Scanned, {Row, Column}, in_text) ->
     scan(T, append_text_char(Scanned, {Row, Column}, $\n), {Row + 1, 1}, in_text);
 
@@ -194,7 +197,7 @@ scan([H | T], Scanned, {Row, Column}, {in_code, Closer}) ->
         digit ->
             scan(T, [{number_literal, {Row, Column}, [H]} | Scanned], {Row, Column + 1}, {in_number, Closer});
         _ ->
-            {error, {illegal_character, {line, Row}, {column, Column}}}
+            {error, lists:concat(["Illegal character line ", Row, " column ", Column])}
     end;
 
 scan([H | T], Scanned, {Row, Column}, {in_number, Closer}) ->
@@ -202,7 +205,7 @@ scan([H | T], Scanned, {Row, Column}, {in_number, Closer}) ->
         digit ->
             scan(T, append_char(Scanned, H), {Row, Column + 1}, {in_number, Closer});
         _ ->
-            {error, {illegal_character, {line, Row}, {column, Column}}}
+            {error, lists:concat(["Illegal character line ", Row, " column ", Column])}
     end;
 
 scan([H | T], Scanned, {Row, Column}, {in_identifier, Closer}) ->
@@ -212,7 +215,7 @@ scan([H | T], Scanned, {Row, Column}, {in_identifier, Closer}) ->
         digit ->
             scan(T, append_char(Scanned, H), {Row, Column + 1}, {in_identifier, Closer});
         _ ->
-            {error, {illegal_character, {line, Row}, {column, Column}}}
+            {error, lists:concat(["Illegal character line ", Row, " column ", Column])}
     end.
 
 % internal functions

+ 7 - 0
src/tests/erlydtl_unittests.erl

@@ -66,10 +66,14 @@ tests() ->
                     <<"{{ var1 }}">>, dict:store(var1, "bar", dict:new()), <<"bar">>},
                 {"Render variable in gb_tree",
                     <<"{{ var1 }}">>, gb_trees:insert(var1, "bar", gb_trees:empty()), <<"bar">>},
+                {"Render variable in arity-1 func",
+                    <<"I enjoy {{ var1 }}">>, fun (var1) -> "Othello" end, <<"I enjoy Othello">>},
                 {"Render variable with attribute in dict",
                     <<"{{ var1.attr }}">>, [{var1, dict:store(attr, "Othello", dict:new())}], <<"Othello">>},
                 {"Render variable with attribute in gb_tree",
                     <<"{{ var1.attr }}">>, [{var1, gb_trees:insert(attr, "Othello", gb_trees:empty())}], <<"Othello">>},
+                {"Render variable with attribute in arity-1 func",
+                    <<"I enjoy {{ var1.game }}">>, [{var1, fun (game) -> "Othello" end}], <<"I enjoy Othello">>},
                 {"Render variable in parameterized module",
                     <<"{{ var1.some_var }}">>, [{var1, erlydtl_example_variable_storage:new("foo")}], <<"foo">>},
                 {"Nested attributes",
@@ -301,6 +305,9 @@ tests() ->
                 {"|upper",
                     <<"{{ message|upper }}">>, [{message, "That man has a gun."}],
                     <<"THAT MAN HAS A GUN.">>},
+                {"|base64",
+                    <<"{{ url|base64 }}">>, [{url, "You #$*@!!"}],
+                    <<"WW91ICMkKkAhIQ==">>},
                 {"|urlencode",
                     <<"{{ url|urlencode }}">>, [{url, "You #$*@!!"}],
                     <<"You+%23%24%2A%40%21%21">>}