|
%%% @doc Compatibility module for string functionality
|
|
%%% for pre- and post-unicode support.
|
|
%%%
|
|
%%% Also contains other useful string functionality.
|
|
-module(rebar_string).
|
|
%% Compatibility exports
|
|
-export([join/2, split/2, lexemes/2, trim/1, trim/3, uppercase/1, lowercase/1, chr/2]).
|
|
%% Util exports
|
|
-export([consult/1, consult/2]).
|
|
|
|
-ifdef(unicode_str).
|
|
|
|
%% string:join/2 copy; string:join/2 is getting obsoleted
|
|
%% and replaced by lists:join/2, but lists:join/2 is too new
|
|
%% for version support (only appeared in 19.0) so it cannot be
|
|
%% used. Instead we just adopt join/2 locally and hope it works
|
|
%% for most unicode use cases anyway.
|
|
join([], Sep) when is_list(Sep) ->
|
|
[];
|
|
join([H|T], Sep) ->
|
|
H ++ lists:append([Sep ++ X || X <- T]).
|
|
|
|
split(Str, SearchPattern) -> string:split(Str, SearchPattern).
|
|
lexemes(Str, SepList) -> string:lexemes(Str, SepList).
|
|
trim(Str) -> string:trim(Str).
|
|
trim(Str, Direction, Cluster=[_]) -> string:trim(Str, Direction, Cluster).
|
|
uppercase(Str) -> string:uppercase(Str).
|
|
lowercase(Str) -> string:lowercase(Str).
|
|
|
|
chr(S, C) when is_integer(C) -> chr(S, C, 1).
|
|
chr([C|_Cs], C, I) -> I;
|
|
chr([_|Cs], C, I) -> chr(Cs, C, I+1);
|
|
chr([], _C, _I) -> 0.
|
|
-else.
|
|
|
|
join(Strings, Separator) -> string:join(Strings, Separator).
|
|
split(Str, SearchPattern) when is_list(Str) -> string:split(Str, SearchPattern);
|
|
split(Str, SearchPattern) when is_binary(Str) -> binary:split(Str, SearchPattern).
|
|
lexemes(Str, SepList) -> string:tokens(Str, SepList).
|
|
trim(Str) when is_list(Str) ->
|
|
re:replace(Str, "\\s+", "", [global, {return, list}]);
|
|
trim(Str) when is_binary(Str) ->
|
|
list_to_binary(trim(binary_to_list(Str))).
|
|
trim(Str, Direction, [Char]) ->
|
|
Dir = case Direction of
|
|
both -> both;
|
|
leading -> left;
|
|
trailing -> right
|
|
end,
|
|
string:strip(Str, Dir, Char).
|
|
uppercase(Str) -> string:to_upper(Str).
|
|
lowercase(Str) -> string:to_lower(Str).
|
|
chr(Str, Char) -> string:chr(Str, Char).
|
|
-endif.
|
|
|
|
%% @doc
|
|
%% Given a string or binary, parse it into a list of terms, ala file:consult/1
|
|
-spec consult(unicode:chardata(), epp:source_encoding() | none) -> {error, term()} | [term()].
|
|
consult(Str, none) ->
|
|
consult(Str, epp:default_encoding());
|
|
consult(Bin, latin1) when is_binary(Bin) ->
|
|
consult([], binary_to_list(Bin), []);
|
|
consult(Str, _) ->
|
|
consult([], unicode:characters_to_list(Str), []).
|
|
|
|
%% Backward compatibility for plugins.
|
|
-spec consult(unicode:chardata()) -> {error, term()} | [term()].
|
|
consult(Str) -> consult(Str, utf8).
|
|
|
|
consult(Cont, Str, Acc) ->
|
|
case erl_scan:tokens(Cont, Str, 0) of
|
|
{done, Result, Remaining} ->
|
|
case Result of
|
|
{ok, Tokens, _} ->
|
|
case erl_parse:parse_term(Tokens) of
|
|
{ok, Term} -> consult([], Remaining, [Term | Acc]);
|
|
{error, Reason} -> {error, Reason}
|
|
end;
|
|
{eof, _Other} ->
|
|
lists:reverse(Acc);
|
|
{error, Info, _} ->
|
|
{error, Info}
|
|
end;
|
|
{more, Cont1} ->
|
|
consult(Cont1, eof, Acc)
|
|
end.
|