diff options
Diffstat (limited to 'lib/docbuilder/src/docb_util.erl')
-rw-r--r-- | lib/docbuilder/src/docb_util.erl | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/lib/docbuilder/src/docb_util.erl b/lib/docbuilder/src/docb_util.erl new file mode 100644 index 0000000000..59673ef3a4 --- /dev/null +++ b/lib/docbuilder/src/docb_util.erl @@ -0,0 +1,237 @@ +%% ``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 | false +lookup_option(Opt, Opts) -> + case lists:keysearch(Opt, 1, Opts) of + {value, {Opt,Value}} -> Value; + false -> false + end. + +%% lookup_option(Opt, Opts, DefaultValue) -> Value | DefaultValue +lookup_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. |