otpsgml_layout.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 854 行 · 第 1/2 页
ERL
854 行
[] -> [{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, [{li, [{tt, localdef(E)}]} || 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]; [] -> index_desc(Es);% Desc -> [{p, Desc}, ?NL] Desc -> {Short,Long} = find_first_p(Desc,[]), [?NL,{p,Short}|Long] ++[?NL] end.find_first_p([#xmlElement{name=p}|_]=Long,Short) -> {lists:reverse(Short),Long};find_first_p([H|T],Short) -> find_first_p(T,[H|Short]);find_first_p([],Short) -> {lists:reverse(Short),[]}.sees1(Es) -> case get_elem(see, Es) of [] -> []; Es1 -> {section,[{title,["See also"]},{p,seq(fun see/1, Es1, [])}]} end.sees(Es) -> case get_elem(see, Es) of [] -> []; Es1 -> [{p, [{em, ["See also:"]}, " "] ++ seq(fun see/1, Es1, ["."])}, ?NL] end.see(E=#xmlElement{content = Es}) -> see(E,Es).see(E, Es) -> case get_attrval(href, E) of "" -> Es; Ref -> case lists:reverse(Ref) of "lmgs.ppa_"++Ppa -> App = lists:reverse(Ppa), [{seealso, [{marker, App++"_app"}], [App]},"(6)"]; "lmgs."++Dom -> Mod = lists:reverse(Dom), [{seealso, [{marker, Mod}], [Mod]},"(3)"]; _ -> [{seealso, [{marker, Ref}], Es}] end end.equiv(Es) -> case get_content(equiv, Es) of [] -> ["\s"]; Es1 -> case get_content(expr, Es1) of [] -> []; [Expr] ->% Expr1 = {tt, [Expr]},% Expr1 = {c, [Expr]}, Expr1 = [Expr], Expr2 = case get_elem(see, Es1) of [] -> {c,Expr1}; [E=#xmlElement{}] ->% see(E,Expr1) case get_attrval(href, E) of "" -> {c,Expr1}; Ref -> {seealso, [{marker, Ref}], Expr1} end end, [{p, ["Equivalent to ", Expr2, "."]}, ?NL] end end.% replace_minus_with_percent([$-|T]) ->% [$%|T];% replace_minus_with_percent([H|T]) ->% [H|replace_minus_with_percent(T)].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) ->% case get_elem(behaviour, Es) of% [] -> [];% Es1 ->% [{p, [{b, ["Behaviour:"]}, " "] ++ seq(fun behaviour/1, Es1, ["."])},% ?NL]% end.% behaviour(E=#xmlElement{content = Es}) ->% case get_attrval(href, E) of% "" -> [{tt, Es}];% Ref -> [{a, [{href, Ref}], [{tt, Es}]}]% end.authors(Es) -> case get_elem(author, Es) of [] -> [?NL,{aname,["\s"]},?NL,{email,["\s"]}]; Es1 -> [?NL|seq(fun author/1, Es1, [])]%% [{p, [{b, ["Authors:"]}, " "] ++ seq(fun author/1, Es1, ["."])},% ?NL] end.%% <!ATTLIST author%% name CDATA #REQUIRED%% email CDATA #IMPLIED%% website CDATA #IMPLIED>author(E=#xmlElement{}) -> Name = case get_attrval(name, E) of [] -> "\s"; N -> N end, Mail = case get_attrval(email, E) of [] -> "\s"; M -> M end, [?NL,{aname,[Name]},?NL,{email,[Mail]}].% 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}], [URI]}]}, "]"]% end).references(Es) -> case get_elem(reference, Es) of [] -> []; Es1 -> [{p, [{b, ["References"]}, {ul, [{li, C} || #xmlElement{content = C} <- Es1]}]}, ?NL] end.t_name([E]) -> N = get_attrval(name, E), case get_attrval(module, E) of "" -> N; M -> S = M ++ ":" ++ N, case get_attrval(app, E) of "" -> S; A -> "//" ++ 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([E = #xmlElement{name = abstype, content = Es}]) -> T = t_abstype(Es),% see(E,T); case get_attrval(href, E) of "" -> T; % Ref -> [{seealso, [{marker, Ref}], T}] _Ref -> T end;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_abstype(Es) ->% ([t_name(get_elem(qualifiedName, Es)), "("]% ++ seq(fun t_type_elem/1, get_elem(type, Es), [")"])). case split_at_colon(t_name(get_elem(erlangName, Es)),[]) of {Mod,Type} -> [Type, "("] ++ seq(fun t_utype_elem/1, get_elem(type, Es), [")"]) ++ [" (see module ", Mod, ")"]; Type -> [Type, "("] ++ seq(fun t_utype_elem/1, get_elem(type, Es), [")"]) end.%% Split at one colon, but not at two (or more)split_at_colon([$:,$:|_]=Rest,Acc) -> lists:reverse(Acc)++Rest;split_at_colon([$:|Type],Acc) -> {lists:reverse(Acc),Type};split_at_colon([Char|Rest],Acc) -> split_at_colon(Rest,[Char|Acc]);split_at_colon([],Acc) -> lists:reverse(Acc).% t_par(Es) ->% T = t_type(get_content(type, Es)),% case get_elem(variable, Es) of% [] -> T;% [V0] -> case t_variable(V0) of% T -> T;% V -> V ++ ["::"] ++ T% end% end.% t_par_elem(#xmlElement{content = Es}) -> t_par(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.xml(Title, CSS, Body) -> {html, [?NL, {head, [?NL, {title, [Title]}, ?NL] ++ CSS}, ?NL, {body, [{bgcolor, "white"}], Body}, ?NL] }.%% --------------------------------------------------------------------- type(E) -> type(E, []).% type(E, Ds) ->% xmerl:export_simple_content(t_utype_elem(E) ++ local_defs(Ds),% ?HTML_EXPORT). type(E, Ds) -> xmerl:export_simple_content(t_utype_elem(E) ++ local_defs(Ds), ?SGML_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) ++ FullDesc), XML = xml(Title, stylesheet(Opts), Body), xmerl:export_simple([XML], ?SGML_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 = ([?NL, {h1, [Title]}, ?NL]% ++ ShortDesc ++ copyright(Es) ++ version(Es) ++ since(Es) ++ authors(Es) ++ references(Es) ++ sees(Es) ++ FullDesc), XML = xml(Title, stylesheet(Opts), Body), xmerl:export_simple([XML], ?SGML_EXPORT, []).
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?