diff --git a/src/eFmt.erl b/src/eFmt.erl index 1c3a5dc..568b8b4 100644 --- a/src/eFmt.erl +++ b/src/eFmt.erl @@ -157,6 +157,17 @@ write(Term, Depth, IsPretty) -> writeTerm(Term, Depth, latin1) end. +splitPart(Term)when is_map(Term) -> + <<",...}">>; +splitPart(Term)when is_tuple(Term) -> + <<",...}">>; +splitPart(Term)when is_list(Term) -> + <<",...]">>; +splitPart(Term) when is_binary(Term) -> + <<",...>>">>; +splitPart(_Term) -> + <<",...">>. + -spec write(Term :: term(), Depth :: depth(), Encoding :: encoding(), CharsLimit :: charsLimit()) -> chars(). write(Term, Depth, Encoding, CharsLimit) -> if @@ -165,13 +176,13 @@ write(Term, Depth, Encoding, CharsLimit) -> CharsLimit < 0 -> writeTerm(Term, Depth, Encoding); true -> - BinTerm = writeTerm(Term, Depth, ?LineCCnt, Encoding, false), + BinTerm = writeTerm(Term, Depth, Encoding), BinTermSize = byte_size(BinTerm), if CharsLimit < 0 -> BinTerm; BinTermSize > CharsLimit -> - <<(part(BinTerm, 0, CharsLimit))/binary, "...">>; + <<(part(BinTerm, 0, CharsLimit))/binary, (splitPart(Term))/binary>>; true -> BinTerm end @@ -188,7 +199,7 @@ write(Term, Depth, Width, CharsLimit, Encoding, Strings) -> CharsLimit < 0 -> BinTerm; BinTermSize > CharsLimit -> - <<(part(BinTerm, 0, CharsLimit))/binary, "...">>; + <<(part(BinTerm, 0, CharsLimit))/binary, (splitPart(Term))/binary>>; true -> BinTerm end @@ -333,7 +344,7 @@ writeList([One], Depth, Width, Encoding, Strings, SumLC, BinAcc) -> TermBin = writeTerm(One, Depth, Width, Encoding, Strings), TermBinBinSize = byte_size(TermBin), NewSumLC = SumLC + TermBinBinSize, - case NewSumLC >= Width of + case Width /= 0 andalso NewSumLC >= Width of true -> <>; _ -> @@ -347,7 +358,7 @@ writeList([One | List], Depth, Width, Encoding, Strings, SumLC, BinAcc) -> TermBin = writeTerm(One, Depth, Width, Encoding, Strings), TermBinBinSize = byte_size(TermBin), NewSumLC = SumLC + TermBinBinSize, - case NewSumLC >= Width of + case Width /= 0 andalso NewSumLC >= Width of true -> writeList(List, Depth - 1, Width, Encoding, Strings, 0, <>); _ -> @@ -359,7 +370,7 @@ writeList(Other, Depth, Width, Encoding, Strings, SumLC, BinAcc) -> TermBinBinSize = byte_size(TermBin), NewSumLC = SumLC + TermBinBinSize, NewBinAcc = part(BinAcc, 0, byte_size(BinAcc) - 1), - case NewSumLC >= Width of + case Width /= 0 andalso NewSumLC >= Width of true -> <>; _ -> @@ -375,7 +386,7 @@ writeTuple(Tuple, Depth, Width, Encoding, Strings, Index, TupleSize, SumLC, BinA TermBin = writeTerm(element(Index, Tuple), Depth, Width, Encoding, Strings), TermBinBinSize = byte_size(TermBin), NewSumLC = SumLC + TermBinBinSize, - case NewSumLC >= Width of + case Width /= 0 andalso NewSumLC >= Width of true -> writeTuple(Tuple, Depth - 1, Width, Encoding, Strings, Index + 1, TupleSize, 0, <>); _ -> @@ -385,7 +396,7 @@ writeTuple(Tuple, Depth, Width, Encoding, Strings, Index, TupleSize, SumLC, BinA TermBin = writeTerm(element(Index, Tuple), Depth, Width, Encoding, Strings), TermBinBinSize = byte_size(TermBin), NewSumLC = SumLC + TermBinBinSize, - case NewSumLC >= Width of + case Width /= 0 andalso NewSumLC >= Width of true -> <>; _ -> @@ -415,7 +426,7 @@ writeMapBody(I, Depth, Width, Encoding, Strings, SumLC, BinAcc) -> ValueTermBin = writeTerm(V, -1, Width, Encoding, Strings), TermBinBinSize = byte_size(KeyTermBin) + byte_size(ValueTermBin), NewSumLC = SumLC + TermBinBinSize, - case NewSumLC >= Width of + case Width /= 0 andalso NewSumLC >= Width of true -> < ", ValueTermBin/binary, "}\n">>; _ -> @@ -426,7 +437,7 @@ writeMapBody(I, Depth, Width, Encoding, Strings, SumLC, BinAcc) -> ValueTermBin = writeTerm(V, -1, Width, Encoding, Strings), TermBinBinSize = byte_size(KeyTermBin) + byte_size(ValueTermBin), NewSumLC = SumLC + TermBinBinSize, - case NewSumLC >= Width of + case Width /= 0 andalso NewSumLC >= Width of true -> writeMapBody(NextI, Depth - 1, Width, Encoding, Strings, 0, < ", ValueTermBin/binary, ",\n">>); _ -> @@ -461,7 +472,7 @@ writeBinary(Bin, Depth, Width, Encoding, Strings, SumLC, BinAcc) -> TermBin = integer_to_binary(Int), TermBinBinSize = byte_size(TermBin), NewSumLC = SumLC + TermBinBinSize, - case NewSumLC >= Width of + case Width /= 0 andalso NewSumLC >= Width of true -> writeBinary(LeftBin, Depth - 1, Width, Encoding, Strings, 0, <>); _ -> @@ -538,7 +549,7 @@ doCollect(FmtBinStr, Args, Acc) -> true = [] == Args, ?IIF(NotMatch == <<>>, Acc, [NotMatch | Acc]); [FPart, LPart] -> - doCollWidth(LPart, Args, 0, right, ?IIF(FPart == <<>>, Acc, [FPart | Acc])) + doCollWidth(LPart, Args, none, right, ?IIF(FPart == <<>>, Acc, [FPart | Acc])) end. doCollWidth(<<>>, _Args, _Width, _Adjust, Acc) -> @@ -547,23 +558,41 @@ doCollWidth(LPart, Args, Width, Adjust, Acc) -> case LPart of <<"-*", LeftLPart/binary>> -> [WidthArgs | LeftArgs] = Args, - doCollPrecision(LeftLPart, LeftArgs, WidthArgs, left, Acc); + if + WidthArgs == 0 -> + NewWidth = WidthArgs, + NewAdjust = left; + WidthArgs < 0 -> + NewWidth = -WidthArgs, + NewAdjust = right; + true -> + NewWidth = WidthArgs, + NewAdjust = left + end, + doCollPrecision(LeftLPart, LeftArgs, NewWidth, NewAdjust, Acc); <<"-", LeftLPart/binary>> -> doCollWidth(LeftLPart, Args, Width, left, Acc); <<"*", LeftLPart/binary>> -> [WidthArgs | LeftArgs] = Args, - doCollPrecision(LeftLPart, LeftArgs, WidthArgs, right, Acc); + if + WidthArgs == 0 -> + NewWidth = WidthArgs, + NewAdjust = left; + WidthArgs < 0 -> + NewWidth = -WidthArgs, + NewAdjust = left; + true -> + NewWidth = WidthArgs, + NewAdjust = right + end, + doCollPrecision(LeftLPart, LeftArgs, NewWidth, NewAdjust, Acc); <> -> case WidthInt >= $0 andalso WidthInt =< $9 of true -> - doCollWidth(LeftLPart, Args, 10 * Width + (WidthInt - $0), Adjust, Acc); + NewWidth = ?IIF(Width == none, WidthInt - $0, 10 * Width + (WidthInt - $0)), + doCollWidth(LeftLPart, Args, NewWidth, Adjust, Acc); _ -> - case Width == 0 of - true -> - doCollPrecision(LPart, Args, none, left, Acc); - _ -> - doCollPrecision(LPart, Args, Width, Adjust, Acc) - end + doCollPrecision(LPart, Args, Width, Adjust, Acc) end end. @@ -579,7 +608,8 @@ doCollPrecision(LPart, Args, Width, Adjust, Precision, Acc) -> case LPart of <<"*", LeftLPart/binary>> -> [PrecisionArgs | LeftArgs] = Args, - doCollPadChar(LeftLPart, LeftArgs, Width, Adjust, PrecisionArgs, Acc); + NewPrecision = ?IIF(PrecisionArgs == 0, none, PrecisionArgs), + doCollPadChar(LeftLPart, LeftArgs, Width, Adjust, NewPrecision, Acc); <> -> case PrecisionInt >= $0 andalso PrecisionInt =< $9 of true ->