gpt4 book ai didi

python - 将外部文档包含到 Sphinx 项目中

转载 作者:太空狗 更新时间:2023-10-29 22:27:48 25 4
gpt4 key购买 nike

我们使用 SVN 中的 Sphinx 维护了相当大的文档。

作为生成输出的一部分,我们希望将相关 Python 模块的发行说明作为主要内容(而不是超链接!)。外部模块的发行说明也在 SVN 中维护。是否有一些类似 Sphinx 的方法可以从其他(SVN)来源提取文档的部分内容?好吧,使用 SVN externals 是解决问题的一种方法,但也许不是最聪明的方法……还有更好的选择吗?

最佳答案

我能想到的两个选项是:

  1. 添加一个 svn:externals 链接到远程项目(您已经知道)。
  2. 使用自定义指令扩展 Sphinx,以包含来自远程颠覆存储库的文件。

我不是 Sphinx 内部专家,但能够拼凑出一个快速扩展,该扩展嵌入了来自远程 Subversion 存储库的文件。

该扩展添加了一个 svninclude 指令,该指令接受 1 个参数,即您的文档所在的存储库的 url。它将此存储库 check out 到位于项目根目录中的临时目录 _svncache 中,然后继续读取每个文件的内容并将它们插入到解析器的状态机中。

这是svninclude.py 扩展的代码。它过于简单,目前没有错误检查。如果您打算实现此功能,请告诉我,如果您遇到困难,我可以提供一些额外的提示:

import os, re, subprocess, sys
from docutils import nodes, statemachine
from docutils.parsers.rst import directives
from sphinx.util.compat import Directive, directive_dwim

class SvnInclude(Directive):

has_content = True
required_arguments = 1
optional_arguments = 0
final_argument_whitespace = False

def _setup_repo(self, repo):
env = self.state.document.settings.env
path = os.path.normpath(env.doc2path(env.docname, base=None))
cache = os.path.join(os.path.dirname(path), '_svncache')
root = os.path.join(cache, re.sub('[\W\-]+', '_', repo))
if not os.path.exists(root):
os.makedirs(root)
subprocess.call(['svn', 'co', repo, root])
return root

def run(self):
root = self._setup_repo(self.arguments[0])
for path in self.content:
data = open(os.path.join(root, path), 'rb').read()
lines = statemachine.string2lines(data)
self.state_machine.insert_input(lines, path)
return []

def setup(app):
app.add_directive('svninclude', directive_dwim(SvnInclude))

这是您要包含在 index.rst(或其他文件)中的标记示例:

.. svninclude:: http://svn.domain.com/svn/project

one.rst
doc/two.rst

其中路径 one.rstdoc/two.rst 是相对于 subversion url 的,例如 http://svn.domain.com/svn/project/one.rst.

您当然希望打包 svninclude.py 并将其安装在您的 Python 路径中。这是我为测试它所做的:

  1. 'svninclude' 添加到 source/conf.pyextensions 列表中。
  2. svninclude.py 放在项目根目录中。

然后运行:

% PYTHONPATH=. sphinx-build -b html ./source ./build

关于python - 将外部文档包含到 Sphinx 项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com