Browse Source

Implement default_if_none filter.

Also complains less about nonexistent vars (these are rendered as "undefined"). Perhaps instead these should be intercepted during stringify_final.
Evan Miller 15 years ago
parent
commit
f4266d255e

+ 0 - 5
examples/docroot/var_error

@@ -1,5 +0,0 @@
-before varriable1
-{{ var1 }}
-after variable1
-<!--{{ var2 }}-->
-after variable2 (HTML-comment-wrapped)

+ 1 - 1
src/erlydtl/erlydtl_compiler.erl

@@ -503,7 +503,7 @@ search_for_escape_filter(_Variable, _Filter) ->
 
 
 
 
 resolve_variable_ast(VarTuple, Context) ->
 resolve_variable_ast(VarTuple, Context) ->
-    resolve_variable_ast(VarTuple, Context, 'fetch_value').
+    resolve_variable_ast(VarTuple, Context, 'find_value').
  
  
 resolve_ifvariable_ast(VarTuple, Context) ->
 resolve_ifvariable_ast(VarTuple, Context) ->
     resolve_variable_ast(VarTuple, Context, 'find_value').
     resolve_variable_ast(VarTuple, Context, 'find_value').

+ 29 - 4
src/erlydtl/erlydtl_filters.erl

@@ -35,10 +35,28 @@
 -author('rsaccon@gmail.com').
 -author('rsaccon@gmail.com').
 -author('emmiller@gmail.com').
 -author('emmiller@gmail.com').
 
 
--export([add/2, capfirst/1, center/2, date/2, escapejs/1, first/1]).
--export([fix_ampersands/1, force_escape/1, format_integer/1, format_number/1]).
--export([join/2, last/1, length/1, length_is/2, linebreaksbr/1, ljust/2]).
--export([lower/1, rjust/2, truncatewords/2, upper/1, urlencode/1]).
+-export([add/2, 
+        capfirst/1, 
+        center/2, 
+        date/2, 
+        default_if_none/2, 
+        escapejs/1,
+        first/1, 
+        fix_ampersands/1, 
+        force_escape/1, 
+        format_integer/1, 
+        format_number/1,
+        join/2, 
+        last/1, 
+        length/1, 
+        length_is/2, 
+        linebreaksbr/1, 
+        ljust/2,
+        lower/1, 
+        rjust/2, 
+        truncatewords/2, 
+        upper/1, 
+        urlencode/1]).
 
 
 -define(NO_ENCODE(C), ((C >= $a andalso C =< $z) orelse
 -define(NO_ENCODE(C), ((C >= $a andalso C =< $z) orelse
         (C >= $A andalso C =< $Z) orelse
         (C >= $A andalso C =< $Z) orelse
@@ -85,6 +103,13 @@ date(Input, _FormatStr) when is_list(Input) ->
     io:format("Unexpected date parameter : ~p~n", [Input]),
     io:format("Unexpected date parameter : ~p~n", [Input]),
     "".
     "".
 
 
+default_if_none([undefined], Default) ->
+    Default;
+default_if_none(undefined, Default) ->
+    Default;
+default_if_none(Input, _) ->
+    Input.
+
 %% @doc Escapes characters for use in JavaScript strings.
 %% @doc Escapes characters for use in JavaScript strings.
 escapejs([Input]) when is_list(Input) or is_binary(Input) ->
 escapejs([Input]) when is_list(Input) or is_binary(Input) ->
     escapejs(Input);
     escapejs(Input);

+ 1 - 4
src/tests/erlydtl_functional_tests.erl

@@ -44,7 +44,7 @@ test_list() ->
         "for_tuple", "for_list_preset", "for_preset", "for_records",
         "for_tuple", "for_list_preset", "for_preset", "for_records",
         "for_records_preset", "include", "if", "if_preset", "ifequal",
         "for_records_preset", "include", "if", "if_preset", "ifequal",
         "ifequal_preset", "ifnotequal", "ifnotequal_preset", "now",
         "ifequal_preset", "ifnotequal", "ifnotequal_preset", "now",
-        "var", "var_preset", "var_error", "cycle", "custom_tag",
+        "var", "var_preset", "cycle", "custom_tag",
         "custom_tag_error", "custom_call", 
         "custom_tag_error", "custom_call", 
         "include_template", "include_path",
         "include_template", "include_path",
         "extends_path", "extends_path2" ].
         "extends_path", "extends_path2" ].
@@ -139,9 +139,6 @@ setup("var") ->
 setup("var_preset") ->
 setup("var_preset") ->
     RenderVars = [{var1, "foostring1"}, {var2, "foostring2"}],
     RenderVars = [{var1, "foostring1"}, {var2, "foostring2"}],
     {ok, RenderVars}; 
     {ok, RenderVars}; 
-setup("var_error") ->
-    RenderVars = [{var1, "foostring1"}],   
-    {error, RenderVars};
 setup("cycle") ->
 setup("cycle") ->
     RenderVars = [{test, [integer_to_list(X) || X <- lists:seq(1, 20)]},
     RenderVars = [{test, [integer_to_list(X) || X <- lists:seq(1, 20)]},
                   {a, "Apple"}, {b, "Banana"}, {c, "Cherry"}],
                   {a, "Apple"}, {b, "Banana"}, {c, "Cherry"}],

+ 4 - 0
src/tests/erlydtl_unittests.erl

@@ -263,6 +263,10 @@ tests() ->
                    <<"{{ var1|date:\"jS F Y H:i\" }}">>,
                    <<"{{ var1|date:\"jS F Y H:i\" }}">>,
                    [{var1, {{1975,7,24}, {7,13,1}}}],
                    [{var1, {{1975,7,24}, {7,13,1}}}],
                    <<"24th July 1975 07:13">>},
                    <<"24th July 1975 07:13">>},
+                {"|default_if_none:\"foo\"",
+                   <<"{{ var1|default_if_none:\"foo\" }}">>, [], <<"foo">>},
+                {"|default_if_none:\"foo\" 2",
+                    <<"{{ var1|default_if_none:\"foo\" }}">>, [{var1, "bar"}], <<"bar">>},
                 {"|escapejs",
                 {"|escapejs",
                     <<"{{ var1|escapejs }}">>, [{var1, "Skip's \"Old-Timey\" Diner"}], 
                     <<"{{ var1|escapejs }}">>, [{var1, "Skip's \"Old-Timey\" Diner"}], 
                     <<"Skip\\'s \\\"Old-Timey\\\" Diner">>},
                     <<"Skip\\'s \\\"Old-Timey\\\" Diner">>},