Browse Source

UTF-8-capable truncatechars

Evan Miller 12 years ago
parent
commit
c18f2a00c2
2 changed files with 16 additions and 0 deletions
  1. 10 0
      src/erlydtl_filters.erl
  2. 6 0
      tests/src/erlydtl_unittests.erl

+ 10 - 0
src/erlydtl_filters.erl

@@ -1038,6 +1038,16 @@ truncatechars([], _CharsLeft, Acc) ->
     lists:reverse(Acc);
     lists:reverse(Acc);
 truncatechars(_Input, 0, Acc) ->
 truncatechars(_Input, 0, Acc) ->
     lists:reverse("..." ++ Acc);
     lists:reverse("..." ++ Acc);
+truncatechars([C|Rest], CharsLeft, Acc) when C >= 2#11111100 ->
+    truncatechars(Rest, CharsLeft + 4, [C|Acc]);
+truncatechars([C|Rest], CharsLeft, Acc) when C >= 2#11111000 ->
+    truncatechars(Rest, CharsLeft + 3, [C|Acc]);
+truncatechars([C|Rest], CharsLeft, Acc) when C >= 2#11110000 ->
+    truncatechars(Rest, CharsLeft + 2, [C|Acc]);
+truncatechars([C|Rest], CharsLeft, Acc) when C >= 2#11100000 ->
+    truncatechars(Rest, CharsLeft + 1, [C|Acc]);
+truncatechars([C|Rest], CharsLeft, Acc) when C >= 2#11000000 ->
+    truncatechars(Rest, CharsLeft, [C|Acc]);
 truncatechars([C|Rest], CharsLeft, Acc) ->
 truncatechars([C|Rest], CharsLeft, Acc) ->
     truncatechars(Rest, CharsLeft - 1, [C|Acc]).
     truncatechars(Rest, CharsLeft - 1, [C|Acc]).
 
 

+ 6 - 0
tests/src/erlydtl_unittests.erl

@@ -832,6 +832,12 @@ tests() ->
                 {"|truncatechars:17",
                 {"|truncatechars:17",
                     <<"{{ var1|truncatechars:17 }}">>, [{var1, "Don't Truncate Me"}],
                     <<"{{ var1|truncatechars:17 }}">>, [{var1, "Don't Truncate Me"}],
                     <<"Don't Truncate Me">>},
                     <<"Don't Truncate Me">>},
+                {"|truncatechars:1 (UTF-8)",
+                    <<"{{ var1|truncatechars:1 }}">>, [{var1, "\x{E2}\x{82}\x{AC}1.99"}],
+                    <<"\x{E2}\x{82}\x{AC}...">>},
+                {"|truncatechars:2 (UTF-8)",
+                    <<"{{ var1|truncatechars:2 }}">>, [{var1, "\x{E2}\x{82}\x{AC}1.99"}],
+                    <<"\x{E2}\x{82}\x{AC}1...">>},
                 {"|truncatewords:0",
                 {"|truncatewords:0",
                     <<"{{ var1|truncatewords:0 }}">>, [{var1, "Empty Me"}],
                     <<"{{ var1|truncatewords:0 }}">>, [{var1, "Empty Me"}],
                     <<"">>},
                     <<"">>},