如何在自定义 python-sphinx Directive/extension 中使用现有指令?
How can I use an existing Directive within a custom python-sphinx Directive/extension?
我想创建一个自定义 Directive
,它在其实现中使用现有指令(本例中为 code-block
)。
reStructuredText 中与此对应的手册为:
.. mydirective:: py
.. code-block: py
print("Hello world")
但是,我希望在 my-directive
的定义中创建 code-block
。我找到了一个示例,它为现有指令(如下)硬编码了适当的 reStructuredText
,但这取决于使用 rST
.
的解析器
class MyDirective(Directive):
has_content = True
def run(self):
# Do custom stuff...
# Use code-block Directive
new_content = [
'.. tab:: {}'.format(json.dumps(tab_args)),
' {}'.format(tab_name),
'',
' .. code-block:: {}'.format(lang),
]
if 'linenos' in self.options:
new_content.append(' :linenos:')
new_content.append('')
for idx, line in enumerate(new_content):
self.content.data.insert(idx, line)
self.content.items.insert(idx, (None, idx))
node = nodes.container()
self.state.nested_parse(self.content, self.content_offset, node)
return node.children
我如何以独立于解析器的方式实现它?
最后,我的解决方案是:
from sphinx.directives.code import CodeBlock
class CodeTabDirective(CodeBlock):
""" Tab directive with a codeblock as its content"""
def run(self):
self.assert_has_content()
code_block = super().run()[0]
# Set anything required by OtherDirective
node = OtherDirective.run(self)[0] # Generates container
node.append(code_block) # Put code block inside container
return [node]
其中 OtherDirective
是另一个现有指令。
我无法将这两个指令子类化并通过 super
使用它们的功能,因为我需要从这两个指令调用一个名为 run
的方法。
更新
您可以在 sphinx-tabs
的 CodeTabDirective 中看到最终解决方案。
我想创建一个自定义 Directive
,它在其实现中使用现有指令(本例中为 code-block
)。
reStructuredText 中与此对应的手册为:
.. mydirective:: py
.. code-block: py
print("Hello world")
但是,我希望在 my-directive
的定义中创建 code-block
。我找到了一个示例,它为现有指令(如下)硬编码了适当的 reStructuredText
,但这取决于使用 rST
.
class MyDirective(Directive):
has_content = True
def run(self):
# Do custom stuff...
# Use code-block Directive
new_content = [
'.. tab:: {}'.format(json.dumps(tab_args)),
' {}'.format(tab_name),
'',
' .. code-block:: {}'.format(lang),
]
if 'linenos' in self.options:
new_content.append(' :linenos:')
new_content.append('')
for idx, line in enumerate(new_content):
self.content.data.insert(idx, line)
self.content.items.insert(idx, (None, idx))
node = nodes.container()
self.state.nested_parse(self.content, self.content_offset, node)
return node.children
我如何以独立于解析器的方式实现它?
最后,我的解决方案是:
from sphinx.directives.code import CodeBlock
class CodeTabDirective(CodeBlock):
""" Tab directive with a codeblock as its content"""
def run(self):
self.assert_has_content()
code_block = super().run()[0]
# Set anything required by OtherDirective
node = OtherDirective.run(self)[0] # Generates container
node.append(code_block) # Put code block inside container
return [node]
其中 OtherDirective
是另一个现有指令。
我无法将这两个指令子类化并通过 super
使用它们的功能,因为我需要从这两个指令调用一个名为 run
的方法。
更新
您可以在 sphinx-tabs
的 CodeTabDirective 中看到最终解决方案。