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 + -
显示快捷键?