Browse Source

Add trimmed option to blocktrans tag (#212).

still need to write some tests.
Andreas Stenius 9 years ago
parent
commit
27cdc1cd7c

+ 2 - 0
src/erlydtl_parser.yrl

@@ -211,6 +211,7 @@ Terminals
     string_literal
     string_literal
     string
     string
     templatetag_keyword
     templatetag_keyword
+    trimmed_keyword
     openblock_keyword
     openblock_keyword
     closeblock_keyword
     closeblock_keyword
     openvariable_keyword
     openvariable_keyword
@@ -421,6 +422,7 @@ BlockTransArgs -> '$empty' : [].
 BlockTransArgs -> count_keyword Arg BlockTransArgs : [{count, '$2'}|'$3'].
 BlockTransArgs -> count_keyword Arg BlockTransArgs : [{count, '$2'}|'$3'].
 BlockTransArgs -> with_keyword Args BlockTransArgs : [{args, '$2'}|'$3'].
 BlockTransArgs -> with_keyword Args BlockTransArgs : [{args, '$2'}|'$3'].
 BlockTransArgs -> context_keyword string_literal BlockTransArgs : [{context, '$2'}|'$3'].
 BlockTransArgs -> context_keyword string_literal BlockTransArgs : [{context, '$2'}|'$3'].
+BlockTransArgs -> trimmed_keyword BlockTransArgs : [trimmed|'$2'].
 
 
 BlockTransContents -> '$empty' : [].
 BlockTransContents -> '$empty' : [].
 BlockTransContents -> open_var identifier close_var BlockTransContents : [{variable, '$2'}|'$4'].
 BlockTransContents -> open_var identifier close_var BlockTransContents : [{variable, '$2'}|'$4'].

+ 2 - 1
src/erlydtl_scanner.erl

@@ -36,7 +36,7 @@
 %%%-------------------------------------------------------------------
 %%%-------------------------------------------------------------------
 -module(erlydtl_scanner).
 -module(erlydtl_scanner).
 
 
-%% This file was generated 2015-10-16 21:31:55 UTC by slex 0.2.1-2-g7814678.
+%% This file was generated 2015-10-17 21:30:29 UTC by slex 0.2.1-2-g7814678.
 %% http://github.com/erlydtl/slex
 %% http://github.com/erlydtl/slex
 -slex_source(["src/erlydtl_scanner.slex"]).
 -slex_source(["src/erlydtl_scanner.slex"]).
 
 
@@ -90,6 +90,7 @@ is_keyword(any, "from") -> true;
 is_keyword(any, "count") -> true;
 is_keyword(any, "count") -> true;
 is_keyword(any, "context") -> true;
 is_keyword(any, "context") -> true;
 is_keyword(any, "noop") -> true;
 is_keyword(any, "noop") -> true;
+is_keyword(any, "trimmed") -> true;
 is_keyword(close, "only") -> true;
 is_keyword(close, "only") -> true;
 is_keyword(close, "parsed") -> true;
 is_keyword(close, "parsed") -> true;
 is_keyword(close, "silent") -> true;
 is_keyword(close, "silent") -> true;

+ 1 - 0
src/erlydtl_scanner.slex

@@ -314,6 +314,7 @@ form \
   is_keyword(any, "count") -> true; \
   is_keyword(any, "count") -> true; \
   is_keyword(any, "context") -> true; \
   is_keyword(any, "context") -> true; \
   is_keyword(any, "noop") -> true; \
   is_keyword(any, "noop") -> true; \
+  is_keyword(any, "trimmed") -> true; \
   \
   \
   is_keyword(close, "only") -> true; \
   is_keyword(close, "only") -> true; \
   is_keyword(close, "parsed") -> true; \
   is_keyword(close, "parsed") -> true; \

+ 4 - 1
src/erlydtl_unparser.erl

@@ -15,7 +15,7 @@ unparse([{'block', Identifier, Contents}|Rest], Acc) ->
 unparse([{'blocktrans', Args, Contents, undefined}|Rest], Acc) ->
 unparse([{'blocktrans', Args, Contents, undefined}|Rest], Acc) ->
     unparse(Rest, [["{% blocktrans ", unparse_blocktrans_args(Args), "%}", unparse(Contents), "{% endblocktrans %}"]|Acc]);
     unparse(Rest, [["{% blocktrans ", unparse_blocktrans_args(Args), "%}", unparse(Contents), "{% endblocktrans %}"]|Acc]);
 unparse([{'blocktrans', Args, Contents, PluralContents}|Rest], Acc) ->
 unparse([{'blocktrans', Args, Contents, PluralContents}|Rest], Acc) ->
-    unparse(Rest, [["{% blocktrans ", unparse_args(Args), " %}",
+    unparse(Rest, [["{% blocktrans ", unparse_blocktrans_args(Args), " %}",
                     unparse(Contents),
                     unparse(Contents),
                     "{% plural %}",
                     "{% plural %}",
                     unparse(PluralContents),
                     unparse(PluralContents),
@@ -212,5 +212,8 @@ unparse_blocktrans_args([{count, Count}|Args], Acc) ->
 unparse_blocktrans_args([{context, Context}|Args], Acc) ->
 unparse_blocktrans_args([{context, Context}|Args], Acc) ->
     unparse_blocktrans_args(
     unparse_blocktrans_args(
       Args, [["context ", unparse_value(Context)]|Acc]);
       Args, [["context ", unparse_value(Context)]|Acc]);
+unparse_blocktrans_args([trimmed|Args], Acc) ->
+    unparse_blocktrans_args(
+      Args, ["trimmed"|Acc]);
 unparse_blocktrans_args([], Acc) ->
 unparse_blocktrans_args([], Acc) ->
     lists:reverse(Acc).
     lists:reverse(Acc).

+ 14 - 2
src/i18n/sources_parser.erl

@@ -170,8 +170,9 @@ process_token(Fname,
     St#state{acc=[Phrase | Acc], translators_comment=undefined};
     St#state{acc=[Phrase | Acc], translators_comment=undefined};
 process_token(Fname, {blocktrans, Args, Contents, PluralContents}, #state{acc=Acc, translators_comment=Comment}=St) ->
 process_token(Fname, {blocktrans, Args, Contents, PluralContents}, #state{acc=Acc, translators_comment=Comment}=St) ->
     {Fname, Line, Col} = guess_blocktrans_lc(Fname, Args, Contents),
     {Fname, Line, Col} = guess_blocktrans_lc(Fname, Args, Contents),
-    Phrase = #phrase{msgid=unparse(Contents),
-                     msgid_plural=unparse(PluralContents),
+    Trim = proplists:get_value(trimmed, Args),
+    Phrase = #phrase{msgid=maybe_trim(unparse(Contents), Trim),
+                     msgid_plural=maybe_trim(unparse(PluralContents), Trim),
                      context=case proplists:get_value(context, Args) of
                      context=case proplists:get_value(context, Args) of
                                  {string_literal, _, String} ->
                                  {string_literal, _, String} ->
                                      erlydtl_compiler_utils:unescape_string_literal(String);
                                      erlydtl_compiler_utils:unescape_string_literal(String);
@@ -201,6 +202,17 @@ unescape(String) -> string:sub_string(String, 2, string:len(String) -1).
 unparse(undefined) -> undefined;
 unparse(undefined) -> undefined;
 unparse(Contents) -> erlydtl_unparser:unparse(Contents).
 unparse(Contents) -> erlydtl_unparser:unparse(Contents).
 
 
+maybe_trim(Text, undefined) -> Text;
+maybe_trim(Text, true) ->
+    tl(
+      lists:foldr(
+        fun (L, Ls) -> [" ", L|Ls] end, [],
+        lists:flatten(
+          re:replace(Text, <<"(^\s+)|(\s+$)|\n">>, <<"">>, [global, multiline])
+         )
+       )
+     ).
+
 %% hack to guess ~position of blocktrans
 %% hack to guess ~position of blocktrans
 guess_blocktrans_lc(Fname, [{{identifier, {L, C}, _}, _} | _], _) ->
 guess_blocktrans_lc(Fname, [{{identifier, {L, C}, _}, _} | _], _) ->
     %% guess by 1'st with
     %% guess by 1'st with