tv_io_lib_pretty.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 173 行

ERL
173
字号
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(tv_io_lib_pretty).-export([pretty_print/4]).%% pretty_print(Term, Column, LineLength, Depth) -> [Chars]%% Depth = -1 gives unlimited print depth. Use tv_io_lib:write for atomic terms.pretty_print(_, _, _, 0) -> "...";pretty_print([], _, _, _) -> "[]";pretty_print({}, _, _, _) -> "{}";pretty_print(List, Col, Ll, D) when is_list(List) ->    case tv_io_lib:printable_list(List) of	true ->	    tv_io_lib:write_string(List, $");	false ->	    Len = write_length(List, D, 0, Ll - Col),	    if		D =:= 1 -> "[...]";		Len + Col < Ll ->		    write(List, D);		true ->		    [$[,		     [pretty_print(hd(List), Col + 1, Ll, D - 1)|		      pretty_print_tail(tl(List), Col + 1, Ll, D - 1)],		     $]]	    end    end;pretty_print(Fun, _Col, _Ll, _D) when is_function(Fun) ->    tv_io_lib:write(Fun);pretty_print(Tuple, Col, Ll, D) when is_tuple(Tuple) ->    Len = write_length(Tuple, D, 0, Ll - Col),    if	D =:= 1 -> "{...}";	Len + Col < Ll ->	    write(Tuple, D);	is_atom(element(1, Tuple)), size(Tuple) > 1 ->	    print_tag_tuple(Tuple, Col, Ll, D);	true ->	    [${,	     [pretty_print(element(1, Tuple), Col + 1, Ll, D - 1)|	      pretty_print_tail(tl(tuple_to_list(Tuple)), Col + 1, Ll, D - 1)],	     $}]    end;pretty_print(Term, _Col, _Ll, D) -> tv_io_lib:write(Term, D).%% print_tag_tuple(Tuple, Column, LineLength, Depth) -> [Char]%%  Print a tagged tuple by indenting the rest of the elements differently%%  to the tag. Start beside the tag if start column not too far to%%  the right. Tuple has size >= 2.print_tag_tuple(Tuple, Col, Ll, D) ->    Tag = tv_io_lib:write_atom(element(1, Tuple)),    Tlen = length(Tag),    Tcol = Col + Tlen + 2,    if	Tcol >= Ll div 2, Tlen > 2 ->	    [${,Tag,	     pretty_print_tail(tl(tuple_to_list(Tuple)), Col + 4, Ll, D - 2),	     $}];	true ->	    [${,Tag,$,,	     [pretty_print(element(2, Tuple), Col + Tlen + 2, Ll, D - 2)|	      pretty_print_tail(tl(tl(tuple_to_list(Tuple))), Tcol, Ll, D - 3)],	     $}]    end.%% pretty_print_tail([Element], Column, LineLength, D) -> [Char]%%  Pretty print the elements of a list or tuple.pretty_print_tail([], _Col, _Ll, _D) -> "";pretty_print_tail(_Es, _Col, _Ll, 1) -> "|...";pretty_print_tail([E|Es], Col, Ll, D) ->    [$,,nl_indent(Col-1),     pretty_print(E, Col, Ll, D-1)|     pretty_print_tail(Es, Col, Ll, D-1)];pretty_print_tail(E, Col, Ll, D) ->    [$|,nl_indent(Col-1),pretty_print(E, Col, Ll, D-1)].%% write(Term, Depth) -> [Char]%%  Write a term down to Depth on one line. Use tv_io_lib:write/2 for%%  atomic terms.write(_, 0) -> "...";write([], _) -> "[]";write({}, _) -> "{}";write(List, D) when is_list(List) ->    case tv_io_lib:printable_list(List) of	true ->	    tv_io_lib:write_string(List, $");	false ->	    if		D =:= 1 -> "[...]";		true ->		    [$[,		     [write(hd(List), D-1)|write_tail(tl(List), D-1)],		     $]]	    end    end;write(Fun, _D) when is_function(Fun) -> tv_io_lib:write(Fun); %Must catch this firstwrite(T, D) when is_tuple(T) ->    if	D =:= 1 -> "{...}";	true ->	    [${,	     [write(element(1, T), D-1)|write_tail(tl(tuple_to_list(T)), D-1)],	     $}]    end;write(Term, D) -> tv_io_lib:write(Term, D).write_tail([], _D) -> "";write_tail(_Es, 1) -> "|...";write_tail([E|Es], D) ->    [$,,write(E, D - 1)|write_tail(Es, D - 1)];write_tail(E, D) ->    [$|,write(E, D - 1)].     %% write_length(Term, Depth, Accumulator, MaxLength) -> integer()%%  Calculate the print length of a term, but exit when length becomes%%  greater than MaxLength.write_length(_T, _D, Acc, Max) when Acc > Max -> Acc;write_length(_T, 0, Acc, _Max) -> Acc + 3;write_length([], _, Acc, _) -> Acc + 2;write_length({}, _, Acc, _) -> Acc + 2;write_length(List, D, Acc, Max) when is_list(List) ->    case tv_io_lib:printable_list(List) of	true ->	    Acc + length(tv_io_lib:write_string(List, $"));	false ->	    write_length_list(List, D, Acc, Max)    end;write_length(Fun, _D, Acc, _Max) when is_function(Fun) ->    Acc + length(tv_io_lib:write(Fun));write_length(Tuple, D, Acc, Max) when is_tuple(Tuple) ->    write_length_list(tuple_to_list(Tuple), D, Acc, Max);write_length(Term, _D, Acc, _Max) ->    Acc + length(tv_io_lib:write(Term)).write_length_list(_, _, Acc, Max) when Acc > Max -> Acc;write_length_list([], _, Acc, _) -> Acc + 1;	%]write_length_list(_Es, 1, Acc, _) -> Acc + 5;	%|...]write_length_list([E|Es], D, Acc, Max) ->    write_length_list(Es,		      D - 1,		      write_length(E, D - 1, Acc + 1, Max),		      Max);write_length_list(E, D, Acc, Max) ->    write_length(E, D - 1, Acc + 2, Max).	%| ]nl_indent(_) -> "".

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?