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

New "escapejs" filter (Django standard)

Evan Miller 17 лет назад
Родитель
Сommit
9bfe95df9d
3 измененных файлов с 21 добавлено и 1 удалено
  1. 2 0
      demo/out/test_filters.html
  2. 2 0
      demo/templates/test_filters.html
  3. 17 1
      src/erlydtl/erlydtl_filters.erl

+ 2 - 0
demo/out/test_filters.html

@@ -5,6 +5,8 @@ Centered:
        center       
 </pre>
 
+Escape JS: \" \'
+
 First letter: f
 
 Fix ampersands: &amp;

+ 2 - 0
demo/templates/test_filters.html

@@ -5,6 +5,8 @@ Centered:
 {{ "center"|center:20 }}
 </pre>
 
+Escape JS: {{ "\" '"|escapejs }}
+
 First letter: {{ "first"|first }}
 
 Fix ampersands: {{ "&"|fix_ampersands }}

+ 17 - 1
src/erlydtl/erlydtl_filters.erl

@@ -44,14 +44,21 @@ capfirst(Input) ->
 center(Input, Number) ->
     string:centre(lists:flatten(Input), Number).
 
+escapejs([Input]) when is_list(Input) ->
+    escapejs(Input);
+escapejs(Input) ->
+    escapejs(Input, []).
+
 first([[First|_Rest]]) ->
     [First].
 
 fix_ampersands(Input) ->
     fix_ampersands(lists:flatten(Input), []).
 
+force_escape([Input]) when is_list(Input) ->
+    force_escape(Input);
 force_escape(Input) when is_list(Input) ->
-    escape(lists:flatten(Input), []);
+    escape(Input, []);
 force_escape(Input) when is_binary(Input) ->
     escape(binary_to_list(Input), []);
 force_escape(Input) ->
@@ -121,6 +128,15 @@ escape("'" ++ Rest, Acc) ->
 escape([C | Rest], Acc) ->
     escape(Rest, [C | Acc]).
 
+escapejs([], Acc) ->
+    lists:reverse(Acc);
+escapejs("'" ++ Rest, Acc) ->
+    escapejs(Rest, lists:reverse("\\'", Acc));
+escapejs("\"" ++ Rest, Acc) ->
+    escapejs(Rest, lists:reverse("\\\"", Acc));
+escapejs([C | Rest], Acc) ->
+    escapejs(Rest, [C | Acc]).
+
 fix_ampersands([], Acc) ->
     lists:reverse(Acc);
 fix_ampersands("&" ++ Rest, Acc) ->