首页 > 解决方案 > 如何在 Sphinx 中正确定义新的警告?

问题描述

使用 Sphinx 很容易编写扩展,但很难以正确的方式扩展 Sphinx。

我想定义一个自定义警告,所以我有:

class exercise(nodes.Admonition, nodes.Element):
    pass

class ExerciseDirective(BaseAdmonition):
    node_class = exercise

def visit_exercise(self, node, name=''):
    self.visit_admonition(node, 'exercise')

def depart_exercise(self, node=None):
    self.depart_admonition(node)

def setup(app):
    app.add_directive('exercise', ExerciseDirective)

    app.add_node(exercise,
        html=(visit_exercise, depart_exercise)
    )

不幸的是,这还不够,因为我exercise没有头衔。我注意到训诫的翻译在上面docutils/languages,以后可以用language.labels. 由于我的标签exercise没有定义,我没有文字。

正确的方法是为定义的语言添加一个新标签。我不知道怎么....

一个非常丑陋的解决方案是破解硬编码admonitionlabels

sphinx.locale.admonitionlabels['exercise'] = 'Exercise'

标签: pythonpython-sphinxdocutils

解决方案


您也可以手动执行基本visit_admonition操作并自己添加标题节点:

def visit_exercise(self, node, name=''):
    self.visit_admonition(node, 'exercise')
    if not isinstance(node[0], nodes.title):
        node.insert(0, nodes.title('exercise', _('Exercise')))

我用_('Exercise')了一个例子,但'Exercise'如果你没有本地化的意图,你也可以放。


推荐阅读