我正在记录一组使用sphinx的项目,这些项目从intersphinx扩展中受益匪浅。从本质上讲,大约有3个实用程序项目提供给较大的项目,在较大的项目中,我需要从较小的项目中引用文档。我把Intersphinx设置为

extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.intersphinx',
    ...
]

intersphinx_mapping = {
    'project1': ('http://internal.url/to/project1/latest', None),
    'project2': ('http://internal.url/to/project2/latest', None),
    'project3': ('http://internal.url/to/project3/latest', None),
}

这让我可以正常使用intersphinx:
:any:`project1.Class1`

它被呈现为文本project1.Class1的链接不过,我宁愿用不合格的名字,所以我最后还是写了
:any:`Class1 <project1.Class1>`

很多。这真烦人。我真的很想扮演几个角色
* :p1:`Class1` is from ``project1``
* :p2:`Class2` is from ``project2``
* :p3:`function1` is from ``project3``

其中:p1:`{text}`替换为:any:`{text} <project1.{text}>`等。
有什么简单的方法可以做到这一点吗?我所有的搜索都得到了非常无用的信息,intersphinx的源代码很难阅读理想情况下我有办法
def p1_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
    return sphinx.some_module.parse(':any:`{0} <project1.{0}>`'.format(text))

def setup(app):
    app.add_role('p1', p1_role)

会是最好的,但我不知道那里是否有。

最佳答案

根据third bullet point of Cross-referencing syntax
如果在内容前面加上~,则链接文本将仅是目标的最后一个组件。例如:

:py:meth:`~Queue.Queue.get`

将引用Queue.Queue.get,但仅将get显示为链接文本。
它可以与classfuncmethattr一起工作,也可能与any一起工作(我无法让它与any一起工作)。
按照模式,尝试以下操作:
:class:`~project1.Class1`

我刚刚在金字塔和webob上做了一个测试,结果成功了:
:class:`~webob.request.Request`

只有文本Request显示并链接到webob api。

10-04 09:55