5  EEP-48: 文档存储和格式

5 EEP-48: 文档存储和格式

本用户指南描述了最初在 EEP-48 中描述的文档存储格式。通过标准化 API 文档的存储方式,可以编写跨语言工作的工具。

要获取模块的 EEP-48 文档,可以使用 code:get_doc/1

要渲染 Erlang 模块的 EEP-48 文档,可以使用 shell_docs:render/2

要查找模块名称示例的文档,工具应该

在代码路径中查找 example.beam,解析 BEAM 文件并检索 Docs 块。如果块不可用,它应该在代码路径中查找“example.beam”并在定义 example 模块的应用程序中找到 doc/chunks/example.chunk 文件。如果 .chunk 文件不可用,则文档不可用。

使用块或文件系统完全取决于语言或库。在这两种情况下,都可以通过剥离 Docs 块或删除 doc/chunks 目录来随时添加或删除文档。

例如,像 Elixir 和 LFE 这样的语言在编译时附加 Docs 块,这可以通过编译器标志来控制。另一方面,像 OTP 本身这样的项目可能会在与代码编译无关的单独命令上生成 doc/chunks 条目。

在两种存储中,文档都以完全相同的格式编写:通过 term_to_binary/1 序列化为二进制的 Erlang 项。在序列化时,该项可以可选地进行压缩。它必须遵循下面的类型规范

{docs_v1,
 Anno :: erl_anno:anno(),
 BeamLanguage :: atom(),
 Format :: binary(),
 ModuleDoc :: #{DocLanguage := DocValue} | none | hidden,
 Metadata :: map(),
 Docs ::
   [{{Kind, Name, Arity},
     Anno :: erl_anno:anno(),
     Signature :: [binary()],
     Doc :: #{DocLanguage := DocValue} | none | hidden,
     Metadata :: map()
    }]} when DocLanguage :: binary(),
             DocValue :: binary() | term()

其中,在根元组中,我们有

定义本身的注释(行、列、文件)(参见 erl_anno(3)
表示语言的原子,例如:erlang、elixir、lfe、alpaca 等
文档的 MIME 类型,例如 <<"text/markdown">> 或 <<"application/erlang+html">>。有关 Erlang 使用的格式的详细信息,请参阅 Erl_Docgen 用户指南中的 EEP-48 章节
一个以文档语言为键的映射,例如 <<"en">><<"pt_BR">>,以及文档作为二进制值。如果没有任何文档,它可能是原子 none,如果已明确禁用此条目的文档,则可能是原子 hidden
一个以原子键为键、以任何项为值的映射。这可以用于添加注释,例如模块的 authorsdeprecated,或任何其他语言或文档工具可能认为相关的注释。
模块中其他实体(如函数和类型)的文档列表。

对于 Docs 中的每个条目,我们都有

标识函数、回调、类型等的种类、名称和元数。官方实体是:functiontypecallback。其他语言将添加自己的实体。例如,Elixir 和 LFE 可能会添加宏。
模块文档或定义本身的注释(行、列、文件)(参见 erl_anno(3))。
实体的签名。它是一个二进制列表。每个条目代表签名中的一个二进制,可以使用空格或换行符连接起来。例如,[<<"binary_to_atom(Binary, Encoding)">>, <<"when is_binary(Binary)">>] 可以渲染为一行或两行。它仅出于展示目的存在。
一个以文档语言为键的映射,例如 <<"en">> 或 <<"pt_BR">>,以及文档作为值。文档可以是二进制或任何 Erlang 项,两者都由 Format 描述。如果它是 Erlang 项,则 Format 必须为 <<"application/erlang+SUFFIX",>>,例如 <<"application/erlang+html">>,当文档是 HTML 文档的 Erlang 表示时。Doc 也可以是原子 none,如果没有任何文档,或者原子 hidden,如果已明确禁用此条目的文档。
一个以原子键为键、以任何项为值的映射。

这种共享格式是 EEP 的核心,因为它实际上允许跨语言协作。

Metadata 字段允许语言、工具和库为每个条目添加自定义信息。本 EEP 文档以下元数据键

一个以二进制表示的作者列表。
一个模块或模块条目的列表,这些模块或模块条目可以用作生成文档时的交叉引用。
如果存在,则表示当前条目已弃用,并使用二进制表示弃用原因以及替换已弃用代码的建议。
一个表示添加此条目的版本的二进制,例如 <<"1.3.0">> 或 <<"20.0">>。
一个表示更改文档本身的 URL 的二进制。

任何键都可以随时添加到 Metadata 中。社区经常使用的键可以在将来的版本中进行标准化。

erl_anno(3)shell_docs(3)Erl_Docgen 用户指南中的 EEP-48 章节code:get_doc/1