如何在 Sphinx 中正确定义新警告?
How to properly define a new admonition in 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'
您也可以像基础 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'
。
使用 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'
您也可以像基础 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'
。