是否可以将 Sphinx 自动模块扩展到 Python 以外的域?

Posted

技术标签:

【中文标题】是否可以将 Sphinx 自动模块扩展到 Python 以外的域?【英文标题】:Is it possible to extend Sphinx automodule to domains other than Python? 【发布时间】:2016-08-18 14:14:57 【问题描述】:

我希望使用 Sphinx 来记录 VHDL 源代码。理想情况下,我希望能够采用这样的 VHDL 类型:

type T_SDRAM_REQ is record
    req     : STD_LOGIC;
    wr      : STD_LOGIC;
    address : STD_LOGIC_VECTOR;
    wr_data : STD_LOGIC_VECTOR;
    wr_ben  : STD_LOGIC_VECTOR;
end record T_SDRAM_REQ;

并使用类似这样的 RST 指令:

.. vhdl:type:: sdram_pack.T_SDRAM_REQ is record
    :members:

从源代码中提取所有字段并为我进行 RST 化。

我已经创建了一个 Sphinx 域,但我突然意识到仅此是不够的 - 这实际上只是一堆自定义指令。我真正想要的是类似于 autoclass 或 automodule 的东西,它会扫描 Python 源文件以生成指令。

但据我所知,Sphinx 自动模块功能仅适用于 Python。是否可以扩展 Sphinx 以包含其他语言的类似功能?在 VHDL 中可能被称为 autopackage 或 autoentity,在 C++ 中我猜是 autonamespace 还是不同的 autoclass?我可以以某种方式将vhdl:autopackage:: 指令添加到我的域吗?从 Sphinx 源代码中我可以看出,我认为 automodule 指令不是 Python 域的一部分。

【问题讨论】:

是的,内置的 autodoc 扩展仅适用于 Python。但是你所要求的应该是可能的。例如,对于 Java,有一个名为 javasphinx (github.com/bronto/javasphinx) 的扩展。我不明白为什么不能为 VHDL 实现类似的东西。 @mzjn 感谢您指出这一点,但是虽然它正在添加 Java 域和 apidoc 功能,但据我所知,它并没有添加 autodoc,这正是我所追求的。不能老实说我有 Java 设置来测试它。 相关:***.com/q/37420560/407651 【参考方案1】:

我自己的问题的答案是:是的。我设法做到了,但这并不容易,而且结果远非完美。

虽然 Sphinx 域 API 已经设置了一些通用基类和特定于 Python 的子类,但对于 autodoc 则不能这样说。一些 Python autodoc 类可以用作基类,但需要大量覆盖。

我的自动文档系统的组件是:

新指令VHDLAutoDirectiveAutoDirective 的子类,它为文档和特殊属性维护单独的注册表,并从指令名称的开头修剪“vhdl:auto”,而不仅仅是“auto”。与原来一样,这调用了特定于对象的文档记录器。 新的记录器。一个通用 VHDL 文档器基类 VHDLDocumenter,然后是每个 VHDL 对象的子类。这些记录器完成所有繁重的工作,从指令中获取选项和内容,并解析 VHDL 以生成内容。这里的关键问题是 Python autodoc 依赖于它所记录的正在安装的模块。由于 Sphinx 是用 Python 编写的,因此很容易 import 那些已安装的模块并以这种方式提取所有必需的信息,例如 __doc__ 可用于提取文档字符串。对于任何其他语言,您必须首先找到包含要记录的对象的文件,然后对其进行解析。为了解决第一个问题,我添加了一个current-file 指令来为所有后续自动指令指定一个文件,并为我的文档器基类添加一个file 选项以允许按指令指定文件。这有点笨拙,因为文件的路径是相对于我的存储库的基础,并假设 Sphinx 在那里运行 - 如果 Sphinx 在子目录中运行,它将无法工作。第二次我编写了一个基本的分词器和解析器,之前我认为将原始源代码复制到 code-block 指令中可能会更好 - 现在我可以选择两者都做。 我的域中的一个add_autodocumenter 函数,它在域中注册一个指令,然后导入我的autodoc 模块并调用一个add_documenter 函数来注册documenter。然后,autodoc 模块的 setup 函数使用 auto 指令在每个对象记录器上调用 add_autodocumenter。这类似于 Python autodoc 所做的,但 Python 版本将其指令注册到应用程序而不是域。

还有很大的改进空间,但至少它可以证明这是可能的。

【讨论】:

嗨,安迪,你的作品在 GitHub 或其他地方有链接吗? @JosephGlover 恐怕不会。完成工作后不久我离开了公司,所以我不知道发生了什么事。

以上是关于是否可以将 Sphinx 自动模块扩展到 Python 以外的域?的主要内容,如果未能解决你的问题,请参考以下文章

安装php的sphinx扩展模块

使用Sphinx ImageMagick扩展名sphinx.ext.imgconverter更改已转换图像的分辨率

Sphinx:如何排除自动模块中的导入?

将版权信息添加到 Sphinx 文档

是否可以阻止 requireJS 自动添加 .js 文件扩展名?

将 sphinx 输出中的部分链接到 RST 源