docb_util.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 238 行
ERL
238 行
%% ``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 expressed 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-2000, Ericsson %% Utvecklings AB. All Rights Reserved.''%% %% $Id$%%-module(docb_util). -export([version/0, old_docb_dir/0, dtd_dir/0]).-export([html_snippet/2, html_snippet/3]).-export([lookup_option/2, lookup_option/3, lookup_options/2, an_option/2]).-export([outfile/3, full_file_name/4]).-export([message/2, message/3]).-export([ltrim/1, rtrim/1, trim/1]).-export([join/2]).-export([fknidx/2]).-include("docb_util.hrl").%%--DocBuilder info-----------------------------------------------------%% version() -> string()%% Returns the DocBuilder application version.version() -> DocbDir = code:lib_dir(docbuilder), case string:tokens(filename:basename(DocbDir), "-") of [_, Vsn] -> Vsn; _ -> "unknown" end.%% old_docb_dir() -> string()%% Returns the root directory of Old_DocBuilder (OTP internal).old_docb_dir() -> "/home/otp/sgml/docb".%% dtd_dir() -> string()%% Returns the directory where the XML DTDs are located.dtd_dir() -> DocbDir = code:lib_dir(docbuilder), filename:join(DocbDir, "dtd").%%--User defined HTML snippets------------------------------------------%% html_snippet(What, Opts) -> HTML%% html_snippet(What, Arg, Opts) -> HTML%% What = head | seealso%% HTML = string()html_snippet(What, Opts) -> case lookup_option(html_mod, Opts) of false -> ""; Module -> case catch apply(Module, What, []) of HTML when is_list(HTML) -> HTML; {'EXIT', {undef, _}} -> ""; {'EXIT', Reason} -> message(warning, "Callback function ~p:~p() => ~p", [Module, What, Reason]), ""; Other -> message(warning, "Callback function ~p:~p() => ~p", [Module, What, Other]), "" end end.html_snippet(What, Arg, Opts) -> case lookup_option(html_mod, Opts) of false -> ""; Module -> case catch apply(Module, What, [Arg]) of HTML when is_list(HTML) -> HTML; {'EXIT', {undef, _}} -> ""; {'EXIT', Reason} -> message(warning, "Callback function ~p:~p(~p) => ~p", [Module, What, Arg, Reason]), ""; Other -> message(warning, "Callback function ~p:~p(~p) => ~p", [Module, What, Arg, Other]), "" end end.%%--Option utilities----------------------------------------------------%% Opts = [{Opt,Value} | Opt]%% lookup_option(Opt, Opts) -> Value | falselookup_option(Opt, Opts) -> case lists:keysearch(Opt, 1, Opts) of {value, {Opt,Value}} -> Value; false -> false end.%% lookup_option(Opt, Opts, DefaultValue) -> Value | DefaultValuelookup_option(Opt, Opts, DefaultValue) -> case lookup_option(Opt,Opts) of false -> DefaultValue; Value -> Value end.%% lookup_options(Opt, Opts) -> [Value]%% Used when the same option can be defined several times and returns%% the (possibly empty) list of values.lookup_options(Opt, Opts) -> [V || {O, V} <- Opts, O == Opt].%% an_option(Opt, Opts) -> bool()an_option(Opt, Opts) -> lists:member(Opt, Opts).%%--File handling-------------------------------------------------------%% outfile(File0, Extension, Opts) -> File%% Build the full filename for where to place a resulting file.outfile(File0, Extension, Opts) -> File = case regexp:match(File0, "[^/]*\$") of {match,Start,Length} -> string:substr(File0, Start, Length); _ -> File0 end, full_file_name(File, Extension, outdir, Opts).%% full_file_name(File, Extension, What, Opts) -> File'%% File = string()%% What = outdir | includepath%% Prepend the full path name.full_file_name(File, Extension, What, Opts) -> Path = lookup_option(What, Opts, ""), full_file_name(File, Extension, Path).full_file_name(File0, Extension, Path) -> File = case filename:extension(File0) of Extension -> File0; _ -> File0++Extension end, case File of [$/|_] -> File; [$~|_] -> File; _ when Path=/="" -> filename:join(Path, File); _ -> File end.%%--Messages to the user------------------------------------------------%% message(Class, Format)%% message(Class, Format, Values) -> ok%% Class = info | warning | error%% Format, Values -- as in io:format/2%% Prints a warning or error message.%% Call as util:message(warning, "~w is undefined", [foo]).message(Class, Format) -> message(Class, Format, []).message(Class, Format, Values) -> Prefix = case Class of info -> ""; warning -> "*** Warning: "; error -> "*** Error: " end, case get(option_silent) of true when Class==warning -> ok; _ -> io:format(Prefix, []), io:format(Format, Values), io:nl() end.%%--String handling-----------------------------------------------------%% ltrim(Str) -> Str'%% rtrim(Str) -> Str'%% trim(Str) -> Str'%% Strips whitespace from left, right or both.ltrim(Str) -> lists:dropwhile(fun white_space/1, Str).rtrim(Str) -> lists:reverse(ltrim(lists:reverse(Str))).trim(Str) -> rtrim(ltrim(Str)).white_space($ ) -> true;white_space(C) when C<$ -> true;white_space($\n) -> true;white_space($\t) -> true;white_space(_) -> false.%% join(Strings, With) -> string()join([H1, H2| T], S) -> H1 ++ S ++ join([H2| T], S);join([H], _) -> H;join([], _) -> [].%%--Other---------------------------------------------------------------%% fknidx(FNdef0, Fn_arity_sep) -> string()%% Get me the function name and arity.fknidx(FNdef0, Fn_arity_sep) -> FNdef = string:strip(FNdef0), case string:tokens(FNdef,"(") of [FNdef] -> %% No parentheses, assume variable: remove nl:s at end, %% and strip blanks. string:strip(string:strip(FNdef, right, $\n)); [Name0|Args0] -> [Args1|_] = string:tokens(string:strip(hd(Args0)), "-"), Arity = case Args1 of [$)|_] -> 0; _ -> length(string:tokens(Args1, ",")) end, string:strip(Name0)++Fn_arity_sep++integer_to_list(Arity) end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?