edoc.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 772 行 · 第 1/2 页
ERL
772 行
%% =====================================================================%% This library is free software; you can redistribute it and/or modify%% it under the terms of the GNU Lesser General Public License as%% published by the Free Software Foundation; either version 2 of the%% License, or (at your option) any later version.%%%% This library is distributed in the hope that it will be useful, but%% WITHOUT ANY WARRANTY; without even the implied warranty of%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU%% Lesser General Public License for more details.%%%% You should have received a copy of the GNU Lesser General Public%% License along with this library; if not, write to the Free Software%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307%% USA%%%% $Id$%%%% @copyright 2001-2007 Richard Carlsson%% @author Richard Carlsson <richardc@it.uu.se>%% @version {@version}%% @end%% =====================================================================%% TODO: check weirdness in name generation for @spec f(TypeName, ...) -> ...%% TODO: option for ignoring functions matching some pattern ('..._test_'/0)%% TODO: @private_type tag, opaque unless generating private docs?%% TODO: document the record type syntax%% TODO: some 'skip' option for ignoring particular modules/packages?%% TODO: intermediate-level packages: document even if no local sources.%% TODO: multiline comment support (needs modified comment representation)%% TODO: config-file for default settings%% TODO: config: locations of all local docdirs; generate local doc-index page%% TODO: config: URL:s of offline packages/apps%% TODO: config: default stylesheet%% TODO: config: default header/footer, etc.%% TODO: offline linkage%% TODO: including source code, explicitly and/or automatically%% @doc EDoc - the Erlang program documentation generator.%%%% This module provides the main user interface to EDoc.%% <ul>%% <li><a href="overview-summary.html">EDoc User Manual</a></li>%% <li><a href="overview-summary.html#Running_EDoc">Running EDoc</a></li>%% </ul>-module(edoc).-export([packages/1, packages/2, files/1, files/2, application/1, application/2, application/3, toc/1, toc/2, toc/3, run/3, file/1, file/2, read/1, read/2, layout/1, layout/2, get_doc/1, get_doc/2, get_doc/3, read_comments/1, read_comments/2, read_source/1, read_source/2]).-import(edoc_report, [report/2, report/3, error/1, error/3]).-include("edoc.hrl").%% @spec (Name::filename()) -> ok%% @equiv file(Name, [])%% @deprecated See {@link file/2} for details.file(Name) -> file(Name, []).%% @spec file(filename(), proplist()) -> ok %%%% @type filename() = //kernel/file:filename()%% @type proplist() = [term()]%%%% @deprecated This is part of the old interface to EDoc and is mainly%% kept for backwards compatibility. The preferred way of generating%% documentation is through one of the functions {@link application/2},%% {@link packages/2} and {@link files/2}.%%%% @doc Reads a source code file and outputs formatted documentation to%% a corresponding file.%%%% Options:%% <dl>%% <dt>{@type {dir, filename()@}}%% </dt>%% <dd>Specifies the output directory for the created file. (By%% default, the output is written to the directory of the source%% file.)%% </dd>%% <dt>{@type {source_suffix, string()@}}%% </dt>%% <dd>Specifies the expected suffix of the input file. The default%% value is `".erl"'.%% </dd>%% <dt>{@type {file_suffix, string()@}}%% </dt>%% <dd>Specifies the suffix for the created file. The default value is%% `".html"'.%% </dd>%% </dl>%%%% See {@link get_doc/2} and {@link layout/2} for further%% options.%%%% For running EDoc from a Makefile or similar, see%% {@link edoc_run:file/1}.%%%% @see read/2%% NEW-OPTIONS: source_suffix, file_suffix, dir%% INHERIT-OPTIONS: read/2file(Name, Options) -> Text = read(Name, Options), SrcSuffix = proplists:get_value(source_suffix, Options, ?DEFAULT_SOURCE_SUFFIX), BaseName = filename:basename(Name, SrcSuffix), Suffix = proplists:get_value(file_suffix, Options, ?DEFAULT_FILE_SUFFIX), Dir = proplists:get_value(dir, Options, filename:dirname(Name)), edoc_lib:write_file(Text, Dir, BaseName ++ Suffix).%% TODO: better documentation of files/1/2, packages/1/2, application/1/2/3%% @spec (Files::[filename() | {package(), [filename()]}]) -> ok%% @equiv packages(Packages, [])files(Files) -> files(Files, []).%% @spec (Files::[filename() | {package(), [filename()]}],%% Options::proplist()) -> ok%% @doc Runs EDoc on a given set of source files. See {@link run/3} for%% details, including options.%% @equiv run([], Files, Options)files(Files, Options) -> run([], Files, Options).%% @spec (Packages::[package()]) -> ok%% @equiv packages(Packages, [])packages(Packages) -> packages(Packages, []).%% @spec (Packages::[package()], Options::proplist()) -> ok%% @type package() = atom() | string()%%%% @doc Runs EDoc on a set of packages. The `source_path' option is used%% to locate the files; see {@link run/3} for details, including%% options. This function automatically appends the current directory to%% the source path.%%%% @equiv run(Packages, [], Options)packages(Packages, Options) -> run(Packages, [], Options ++ [{source_path, [?CURRENT_DIR]}]).%% @spec (Application::atom()) -> ok%% @equiv application(Application, [])application(App) -> application(App, []).%% @spec (Application::atom(), Options::proplist()) -> ok%% @doc Run EDoc on an application in its default app-directory. See%% {@link application/3} for details.%% @see application/1application(App, Options) when is_atom(App) -> case code:lib_dir(App) of Dir when is_list(Dir) -> application(App, Dir, Options); _ -> report("cannot find application directory for '~s'.", [App]), exit(error) end.%% @spec (Application::atom(), Dir::filename(), Options::proplist())%% -> ok%% @doc Run EDoc on an application located in the specified directory.%% Tries to automatically set up good defaults. Unless the user%% specifies otherwise:%% <ul>%% <li>The `doc' subdirectory will be used as the target directory, if%% it exists; otherwise the application directory is used.%% </li>%% <li>The source code is assumed to be located in the `src'%% subdirectory, if it exists, or otherwise in the application%% directory itself.%% </li>%% <li>The {@link run/3. `subpackages'} option is turned on. All found%% source files will be processed.%% </li>%% <li>The `include' subdirectory is automatically added to the%% include path. (Only important if {@link read_source/2.%% preprocessing} is turned on.)%% </li>%% </ul>%%%% See {@link run/3} for details, including options.%%%% @see application/2application(App, Dir, Options) when is_atom(App) -> Src = edoc_lib:try_subdir(Dir, ?SOURCE_DIR), Overview = filename:join(edoc_lib:try_subdir(Dir, ?EDOC_DIR), ?OVERVIEW_FILE), Opts = Options ++ [{source_path, [Src]}, subpackages, {title, io_lib:fwrite("The ~s application", [App])}, {overview, Overview}, {dir, filename:join(Dir, ?EDOC_DIR)}, {includes, [filename:join(Dir, "include")]}], Opts1 = set_app_default(App, Dir, Opts), %% Recursively document all subpackages of '' - i.e., everything. run([''], [], [{application, App} | Opts1]).%% Try to set up a default application base URI in a smart way if the%% user has not specified it explicitly.set_app_default(App, Dir0, Opts) -> case proplists:get_value(app_default, Opts) of undefined -> AppName = atom_to_list(App), Dir = edoc_lib:simplify_path(filename:absname(Dir0)), AppDir = case filename:basename(Dir) of AppName -> filename:dirname(Dir); _ -> ?APP_DEFAULT end, [{app_default, AppDir} | Opts]; _ -> Opts end.%% If no source files are found for a (specified) package, no package%% documentation will be generated either (even if there is a%% package-documentation file). This is the way it should be. For%% specified files, use empty package (unless otherwise specified). The%% assumed package is always used for creating the output. If the actual%% module or package of the source differs from the assumption gathered%% from the path and file name, a warning should be issued (since links%% are likely to be incorrect).opt_defaults() -> [packages].opt_negations() -> [{no_preprocess, preprocess}, {no_subpackages, subpackages}, {no_packages, packages}].%% @spec run(Packages::[package()],%% Files::[filename() | {package(), [filename()]}],%% Options::proplist()) -> ok%% @doc Runs EDoc on a given set of source files and/or packages. Note%% that the doclet plugin module has its own particular options; see the%% `doclet' option below.%% %% Also see {@link layout/2} for layout-related options, and%% {@link get_doc/2} for options related to reading source%% files.%%%% Options:%% <dl>%% <dt>{@type {app_default, string()@}}%% </dt>%% <dd>Specifies the default base URI for unknown applications.%% </dd>%% <dt>{@type {application, App::atom()@}}%% </dt>%% <dd>Specifies that the generated documentation describes the%% application `App'. This mainly affects generated references.%% </dd>%% <dt>{@type {dir, filename()@}}%% </dt>%% <dd>Specifies the target directory for the generated documentation.%% </dd>%% <dt>{@type {doc_path, [string()]@}}%% </dt>%% <dd>Specifies a list of URI:s pointing to directories that contain%% EDoc-generated documentation. URI without a `scheme://' part are%% taken as relative to `file://'. (Note that such paths must use%% `/' as separator, regardless of the host operating system.)%% </dd>%% <dt>{@type {doclet, Module::atom()@}}%% </dt>%% <dd>Specifies a callback module to be used for creating the%% documentation. The module must export a function `run(Cmd, Ctxt)'.%% The default doclet module is {@link edoc_doclet}; see {@link%% edoc_doclet:run/2} for doclet-specific options.%% </dd>%% <dt>{@type {exclude_packages, [package()]@}}%% </dt>%% <dd>Lists packages to be excluded from the documentation. Typically%% used in conjunction with the `subpackages' option.%% </dd>%% <dt>{@type {file_suffix, string()@}}%% </dt>%% <dd>Specifies the suffix used for output files. The default value is%% `".html"'. Note that this also affects generated references.%% </dd>%% <dt>{@type {new, bool()@}}%% </dt>%% <dd>If the value is `true', any existing `edoc-info' file in the%% target directory will be ignored and overwritten. The default%% value is `false'.%% </dd>%% <dt>{@type {packages, bool()@}}%% </dt>%% <dd>If the value is `true', it it assumed that packages (module%% namespaces) are being used, and that the source code directory%% structure reflects this. The default value is `true'. (Usually,%% this does the right thing even if all the modules belong to the%% top-level "empty" package.) `no_packages' is an alias for%% `{packages, false}'. See the `subpackages' option below for%% further details.%%%% If the source code is organized in a hierarchy of%% subdirectories although it does not use packages, use%% `no_packages' together with the recursive-search `subpackages'%% option (on by default) to automatically generate documentation%% for all the modules.%% </dd>%% <dt>{@type {source_path, [filename()]@}}%% </dt>%% <dd>Specifies a list of file system paths used to locate the source%% code for packages.%% </dd>%% <dt>{@type {source_suffix, string()@}}%% </dt>%% <dd>Specifies the expected suffix of input files. The default%% value is `".erl"'.%% </dd>%% <dt>{@type {subpackages, bool()@}}%% </dt>%% <dd>If the value is `true', all subpackages of specified packages%% will also be included in the documentation. The default value is%% `false'. `no_subpackages' is an alias for `{subpackages,%% false}'. See also the `exclude_packages' option.%%%% Subpackage source files are found by recursively searching%% for source code files in subdirectories of the known source code%% root directories. (Also see the `source_path' option.) Directory%% names must begin with a lowercase letter and contain only%% alphanumeric characters and underscore, or they will be ignored.%% (For example, a subdirectory named `test-files' will not be%% searched.)%% </dd>%% </dl>%%%% @see files/2%% @see packages/2%% @see application/2%% NEW-OPTIONS: source_path, application%% INHERIT-OPTIONS: init_context/1%% INHERIT-OPTIONS: expand_sources/2%% INHERIT-OPTIONS: target_dir_info/5%% INHERIT-OPTIONS: edoc_lib:find_sources/3%% INHERIT-OPTIONS: edoc_lib:run_doclet/2%% INHERIT-OPTIONS: edoc_lib:get_doc_env/4run(Packages, Files, Opts0) -> Opts = expand_opts(Opts0), Ctxt = init_context(Opts), Dir = Ctxt#context.dir, Path = proplists:append_values(source_path, Opts), Ss = sources(Path, Packages, Opts), {Ss1, Ms} = expand_sources(expand_files(Files) ++ Ss, Opts), Ps = [P || {_, P, _, _} <- Ss1], App = proplists:get_value(application, Opts, ?NO_APP), {App1, Ps1, Ms1} = target_dir_info(Dir, App, Ps, Ms, Opts), %% The "empty package" is never included in the list of packages. Ps2 = edoc_lib:unique(lists:sort(Ps1)) -- [''], Ms2 = edoc_lib:unique(lists:sort(Ms1)), Fs = package_files(Path, Ps2), Env = edoc_lib:get_doc_env(App1, Ps2, Ms2, Opts),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?