是否有可能将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系统的组件是:
VHDLAutoDirective
是AutoDirective
一个子类,它为文档管理员和特殊的attrgetters维护独立的注册表,并从指令名称开始修剪“vhdl:auto”而不是“auto”。 与原文一样,这会调用特定于对象的记录器。 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?