Browse Source

Fix escapejs to use \u syntax.

Follows the Django implementation. Thanks to wpntv for the initial bug report.
Evan Miller 14 years ago
parent
commit
fc9e1c2df4
2 changed files with 8 additions and 19 deletions
  1. 6 17
      src/erlydtl/erlydtl_filters.erl
  2. 2 2
      src/tests/erlydtl_unittests.erl

+ 6 - 17
src/erlydtl/erlydtl_filters.erl

@@ -147,7 +147,7 @@ divisibleby(Input, Divisor) when is_integer(Input), is_integer(Divisor) ->
 
 %% @doc Escapes characters for use in JavaScript strings.
 escapejs(Input) when is_binary(Input) ->
-    escapejs(Input, 0);
+    escapejs(binary_to_list(Input));
 escapejs(Input) when is_list(Input) ->
     escapejs(Input, []).
 
@@ -365,23 +365,12 @@ escape([C | Rest], 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) when C < 32; C =:= $"; C =:= $'; C =:= $\\; C =:= $<;
+                               C =:= $>; C =:= $&; C =:= $=; C =:= $-; C =:= $;; 
+                               C =:= 8232; C =:= 8233 -> % just following django here...
+    escapejs(Rest, lists:reverse(lists:flatten(io_lib:format("\\u~4.16.0B", [C])), Acc));
 escapejs([C | Rest], Acc) ->
-    escapejs(Rest, [C | Acc]);
-escapejs(Binary, Index) when is_binary(Binary) ->
-    case Binary of
-        <<Pre:Index/binary, 39, Post/binary>> ->
-            process_binary_match(Pre, <<"\\'">>, size(Post), escapejs(Post, 0));
-        <<Pre:Index/binary, 34, Post/binary>> ->
-            process_binary_match(Pre, <<"\\\"">>, size(Post), escapejs(Post, 0));
-        <<_:Index/binary, _/binary>> ->
-            escapejs(Binary, Index + 1);
-        _ ->
-            Binary
-    end.
+    escapejs(Rest, [C | Acc]).
 
 filesizeformat(Bytes, UnitStr) ->
     lists:flatten(io_lib:format("~.1f ~s", [Bytes, UnitStr])).

+ 2 - 2
src/tests/erlydtl_unittests.erl

@@ -390,8 +390,8 @@ tests() ->
                 {"|divisibleby:\"3\"",
                     <<"{% if var1|divisibleby:\"3\" %}yay{% endif %}">>, [{var1, 22}], <<"">>},
                 {"|escapejs",
-                    <<"{{ var1|escapejs }}">>, [{var1, "Skip's \"Old-Timey\" Diner"}], 
-                    <<"Skip\\'s \\\"Old-Timey\\\" Diner">>},
+                    <<"{{ var1|escapejs }}">>, [{var1, "testing\r\njavascript 'string\" <b>escaping</b>"}],
+                    <<"testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E">>},
                 {"|filesizeformat (bytes)",
                     <<"{{ var1|filesizeformat }}">>, [{var1, 1023}], <<"1023 bytes">>},
                 {"|filesizeformat (KB)",