是否有可能将Sphinx automodule扩展到Python以外的域?

我正在寻找使用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中提取所有的字段 - 如果是我的话。

我已经创建了一个狮身人面像领域,但对我来说,仅凭这一点还不够 - 这真的只是一堆自定义指令。 我真正想要的东西类似于autoclass或automodule,它扫描Python源文件以生成指令。

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


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

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

我的autodoc系统的组件是:

  • 新指令VHDLAutoDirectiveAutoDirective一个子类,它为文档管理员和特殊的attrgetters维护独立的注册表,并从指令名称开始修剪“vhdl:auto”而不是“auto”。 与原文一样,这会调用特定于对象的记录器。
  • 新的记录员。 一个通用的VHDL记录器基类VHDLDocumenter ,然后是每个VHDL对象的子类。 这些文档编写者完成所有繁重的工作,从指令中获取选项和内容,并解析VHDL以生成内容。 这里的关键问题是Python autodoc依赖于正在记录安装的模块。 由于Sphinx是用Python编写的,所以很容易import这些已安装的模块并以这种方式提取所有必需的信息,例如可以使用__doc__来提取文档。 对于任何其他语言,您将必须首先找到包含您想要记录的对象的文件,然后对其进行解析。 为了解决第一个问题,我添加了一个current-file指令来为所有后续的auto指令指定一个文件,并为我的documenter基类指定一个file选项,以允许指定每个指令的文件。 这有点笨拙,因为文件的路径与我的版本库相关,并且假设Sphinx在那里运行 - 如果Sphinx运行在子目录中,它将不起作用。 对于第二个我写了一个基本的记号器和解析器,然后才想到将原始源代码复制到code-block指令中可能会更好 - 现在我可以选择执行任一操作。
  • 我的域中有一个add_autodocumenter函数,它在域中注册一个指令,然后导入我的autodoc模块并调用add_documenter函数来注册文档。 autodoc模块的设置函数然后使用auto指令调用每个对象记录器上的add_autodocumenter 。 这与Python autodoc所做的相似,但是Python版本会将其指令注册到应用程序而不是域。
  • 还有很多需要改进的空间,但至少它可以作为概念证明,可以做到这一点。

    链接地址: http://www.djcxy.com/p/84131.html

    上一篇: Is it possible to extend Sphinx automodule to domains other than Python?

    下一篇: How to display a sidebar TOC for all parts in sphinx