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