edoc_layout.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 851 行 · 第 1/2 页

ERL
851
字号
%% <!ELEMENT typedecl (typedef, description?)>%% <!ELEMENT typedef (erlangName, argtypes, type?, localdef*)>types([]) -> [];types(Ts) ->    Es = lists:flatmap(fun ({Name, E}) -> typedecl(Name, E) end, Ts),    [?NL,     {h2, [{a, [{name, ?DATA_TYPES_LABEL}],	    [?DATA_TYPES_TITLE]}]},     ?NL | Es].typedecl(Name, E=#xmlElement{content = Es}) ->    ([?NL, {h3, [{class, "typedecl"}], label_anchor([Name, "()"], E)}, ?NL]     ++ [{p, typedef(get_content(typedef, Es))}, ?NL]     ++ fulldesc(Es)).type_name(#xmlElement{content = Es}) ->    t_name(get_elem(erlangName, get_content(typedef, Es))).typedef(Es) ->    Name = ([t_name(get_elem(erlangName, Es)), "("]  	    ++ seq(fun t_utype_elem/1, get_content(argtypes, Es), [")"])),    (case get_elem(type, Es) of 	 [] -> [{b, ["abstract datatype"]}, ": ", {tt, Name}]; 	 Type ->	     [{tt, Name ++ [" = "] ++ t_utype(Type)}]     end     ++ local_defs(get_elem(localdef, Es))).local_defs([]) -> [];local_defs(Es) ->    [?NL,     {ul, [{class, "definitions"}],      lists:concat([[{li, [{tt, localdef(E)}]}, ?NL] || E <- Es])}].localdef(E = #xmlElement{content = Es}) ->    (case get_elem(typevar, Es) of	 [] -> 	     label_anchor(t_abstype(get_content(abstype, Es)), E);	 [V] ->	     t_var(V)     end     ++ [" = "] ++ t_utype(get_elem(type, Es))).fulldesc(Es) ->    case get_content(fullDescription, get_content(description, Es)) of	[] -> [?NL];	Desc -> [{p, Desc}, ?NL]    end.sees(Es) ->    case get_elem(see, Es) of	[] -> [];	Es1 ->	    [{p, [{b, ["See also:"]}, " "] ++ seq(fun see/1, Es1, ["."])},	     ?NL]    end.see(E=#xmlElement{content = Es}) ->    see(E, Es).see(E, Es) ->    case href(E) of	[] -> Es;	Ref ->	    [{a, Ref, Es}]    end.href(E) ->    case get_attrval(href, E) of	"" -> [];	URI ->	    T = case get_attrval(target, E) of		    "" -> [];		    S -> [{target, S}]		end,	    [{href, URI} | T]    end.equiv_p(Es) ->    equiv(Es, true).equiv(Es) ->    equiv(Es, false).equiv(Es, P) ->    case get_content(equiv, Es) of	[] -> [];	Es1 ->	    case get_content(expr, Es1) of		[] -> [];		[Expr] ->		    Expr1 = [{tt, [Expr]}],		    Expr2 = case get_elem(see, Es1) of				[] ->				    Expr1;				[E=#xmlElement{}] ->				    see(E, Expr1)			    end,		    Txt = ["Equivalent to "] ++ Expr2 ++ ["."],		    (case P of			 true -> [{p, Txt}];			 false -> Txt		     end		     ++ [?NL])	    end    end.copyright(Es) ->    case get_content(copyright, Es) of	[] -> [];	Es1 ->	    [{p, ["Copyright \251 " | Es1]}, ?NL]    end.version(Es) ->    case get_content(version, Es) of	[] -> [];	Es1 ->	    [{p, [{b, ["Version:"]}, " " | Es1]}, ?NL]    end.since(Es) ->    case get_content(since, Es) of	[] -> [];	Es1 ->	    [{p, [{b, ["Introduced in:"]}, " " | Es1]}, ?NL]    end.deprecated(Es, S) ->    Es1 = get_content(description, get_content(deprecated, Es)),    case get_content(fullDescription, Es1) of	[] -> [];	Es2 ->	    [{p, [{b, ["This " ++ S ++ " is deprecated:"]}, " " | Es2]},	     ?NL]    end.behaviours(Es, Name) ->    (case get_elem(behaviour, Es) of	 [] -> [];	 Es1 ->	     [{p, ([{b, ["Behaviours:"]}, " "]		   ++ seq(fun behaviour/1, Es1, ["."]))},	      ?NL]     end     ++     case get_content(callbacks, Es) of	 [] -> [];	 Es1 ->	     [{p, ([{b, ["This module defines the ", {tt, [Name]},			 " behaviour."]},		    br, " Required callback functions: "]		   ++ seq(fun callback/1, Es1, ["."]))},	      ?NL]     end).behaviour(E=#xmlElement{content = Es}) ->    see(E, [{tt, Es}]).callback(E=#xmlElement{}) ->    Name = get_attrval(name, E),    Arity = get_attrval(arity, E),    [{tt, [Name, "/", Arity]}].authors(Es) ->    case get_elem(author, Es) of	[] -> [];	Es1 ->	    [{p, [{b, ["Authors:"]}, " "] ++ seq(fun author/1, Es1, ["."])},	     ?NL]    end.atom(String) ->    io_lib:write_atom(list_to_atom(String)).%% <!ATTLIST author%%   name CDATA #REQUIRED%%   email CDATA #IMPLIED%%   website CDATA #IMPLIED>author(E=#xmlElement{}) ->    Name = get_attrval(name, E),    Mail = get_attrval(email, E),    URI = get_attrval(website, E),    (if Name == Mail ->	     [{a, [{href, "mailto:" ++ Mail}],[{tt, [Mail]}]}];	true ->	     if Mail == "" -> [Name];		true -> [Name, " (", {a, [{href, "mailto:" ++ Mail}],				      [{tt, [Mail]}]}, ")"]	     end     end     ++ if URI == "" ->		[];	   true ->		[" [", {em, ["web site:"]}, " ",		 {tt, [{a, [{href, URI}, {target, "_top"}], [URI]}]},		 "]"]	end).references(Es) ->    case get_elem(reference, Es) of	[] -> [];	Es1 ->	    [{p, [{b, ["References"]},		  {ul, [{li, C} || #xmlElement{content = C} <- Es1]}]},	     ?NL]    end.todos(Es) ->    case get_elem(todo, Es) of	[] -> [];	Es1 ->	    Todos = [{li, [{font, [{color,red}], C}]}		     || #xmlElement{content = C} <- Es1],	    [{p, [{b, [{font, [{color,red}], ["To do"]}]},		  {ul, Todos}]},	     ?NL]    end.t_name([E]) ->    N = get_attrval(name, E),    case get_attrval(module, E) of	"" -> atom(N);	M ->	    S = atom(M) ++ ":" ++ atom(N),	    case get_attrval(app, E) of		"" -> S;		A -> "//" ++ atom(A) ++ "/" ++ S	    end    end.t_utype([E]) ->    t_utype_elem(E).t_utype_elem(E=#xmlElement{content = Es}) ->    case get_attrval(name, E) of	"" -> t_type(Es);	Name ->	    T = t_type(Es),	    case T of		[Name] -> T;    % avoid generating "Foo::Foo"		T -> [Name] ++ ["::"] ++ T	    end    end.t_type([E=#xmlElement{name = typevar}]) ->    t_var(E);t_type([E=#xmlElement{name = atom}]) ->    t_atom(E);t_type([E=#xmlElement{name = integer}]) ->    t_integer(E);t_type([E=#xmlElement{name = float}]) ->    t_float(E);t_type([#xmlElement{name = nil}]) ->    t_nil();t_type([#xmlElement{name = list, content = Es}]) ->    t_list(Es);t_type([#xmlElement{name = tuple, content = Es}]) ->    t_tuple(Es);t_type([#xmlElement{name = 'fun', content = Es}]) ->    t_fun(Es);t_type([#xmlElement{name = record, content = Es}]) ->    t_record(Es);t_type([E = #xmlElement{name = abstype, content = Es}]) ->    T = t_abstype(Es),    see(E, T);t_type([#xmlElement{name = union, content = Es}]) ->    t_union(Es).t_var(E) ->    [get_attrval(name, E)].t_atom(E) ->    [get_attrval(value, E)].t_integer(E) ->    [get_attrval(value, E)].t_float(E) ->    [get_attrval(value, E)].t_nil() ->    ["[]"].t_list(Es) ->    ["["] ++ t_utype(get_elem(type, Es)) ++ ["]"].t_tuple(Es) ->    ["{"] ++ seq(fun t_utype_elem/1, Es, ["}"]).t_fun(Es) ->    ["("] ++ seq(fun t_utype_elem/1, get_content(argtypes, Es),		 [") -> "] ++ t_utype(get_elem(type, Es))).t_record(Es) ->    ["#"] ++ t_type(get_elem(atom, Es)) ++ ["{"]	++ seq(fun t_field/1, get_elem(field, Es), ["}"]).t_field(#xmlElement{content = Es}) ->    t_type(get_elem(atom, Es)) ++ [" = "] ++ t_utype(get_elem(type, Es)).t_abstype(Es) ->    ([t_name(get_elem(erlangName, Es)), "("]     ++ seq(fun t_utype_elem/1, get_elem(type, Es), [")"])).t_union(Es) ->    seq(fun t_utype_elem/1, Es, " | ", []).seq(F, Es) ->    seq(F, Es, []).seq(F, Es, Tail) ->    seq(F, Es, ", ", Tail).seq(F, [E], _Sep, Tail) ->    F(E) ++ Tail;seq(F, [E | Es], Sep, Tail) ->    F(E) ++ [Sep] ++ seq(F, Es, Sep, Tail);seq(_F, [], _Sep, Tail) ->    Tail.get_elem(Name, [#xmlElement{name = Name} = E | Es]) ->    [E | get_elem(Name, Es)];get_elem(Name, [_ | Es]) ->    get_elem(Name, Es);get_elem(_, []) ->    [].get_attr(Name, [#xmlAttribute{name = Name} = A | As]) ->    [A | get_attr(Name, As)];get_attr(Name, [_ | As]) ->    get_attr(Name, As);get_attr(_, []) ->    [].get_attrval(Name, #xmlElement{attributes = As}) ->    case get_attr(Name, As) of	[#xmlAttribute{value = V}] ->	    V;	[] -> ""    end.get_content(Name, Es) ->    case get_elem(Name, Es) of	[#xmlElement{content = Es1}] ->	    Es1;	[] -> []    end.get_text(Name, Es) ->    case get_content(Name, Es) of	[#xmlText{value = Text}] ->	    Text;	[] -> ""    end.local_label(R) ->    "#" ++ R.xhtml(Title, CSS, Body) ->    [{html, [?NL,	    {head, [?NL,		    {title, [Title]},		    ?NL] ++ CSS},	    ?NL,	    {body, [{bgcolor, "white"}], Body},	    ?NL]     },     ?NL].%% ---------------------------------------------------------------------type(E) ->    type(E, []).type(E, Ds) ->    xmerl:export_simple_content(t_utype_elem(E) ++ local_defs(Ds),				?HTML_EXPORT).package(E=#xmlElement{name = package, content = Es}, Options) ->    Opts = init_opts(E, Options),    Name = get_text(packageName, Es),    Title = io_lib:fwrite("Package ~s", [Name]),    Desc = get_content(description, Es),%    ShortDesc = get_content(briefDescription, Desc),    FullDesc = get_content(fullDescription, Desc),    Body = ([?NL, {h1, [Title]}, ?NL]%	    ++ ShortDesc	    ++ copyright(Es)	    ++ deprecated(Es, "package")	    ++ version(Es)	    ++ since(Es)	    ++ authors(Es)	    ++ references(Es)	    ++ sees(Es)	    ++ todos(Es)	    ++ FullDesc),    XML = xhtml(Title, stylesheet(Opts), Body),    xmerl:export_simple(XML, ?HTML_EXPORT, []).overview(E=#xmlElement{name = overview, content = Es}, Options) ->    Opts = init_opts(E, Options),    Title = get_text(title, Es),    Desc = get_content(description, Es),%    ShortDesc = get_content(briefDescription, Desc),    FullDesc = get_content(fullDescription, Desc),    Body = (navigation("top")	    ++ [?NL, {h1, [Title]}, ?NL]%	    ++ ShortDesc	    ++ copyright(Es)	    ++ version(Es)	    ++ since(Es)	    ++ authors(Es)	    ++ references(Es)	    ++ sees(Es)	    ++ todos(Es)	    ++ FullDesc	    ++ [?NL, hr]	    ++ navigation("bottom")	    ++ timestamp()),    XML = xhtml(Title, stylesheet(Opts), Body),    xmerl:export_simple(XML, ?HTML_EXPORT, []).

⌨️ 快捷键说明

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