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