Sphinx 扩展:带有前导 and/or 尾随空行的文字块?

Sphinx extension: literal block with leading and/or trailing blank lines?

据我所知,不可能创建以空行开头或结尾的文字文本块(例如使用 code-block 指令),因为这对于reStructuredText 语法。

没关系。

但现在我想创建一个使用 docutilsliteral_block() 节点的自定义指令,并且我想(在我的指令代码中)在开头添加空行 and/or 指令内容结束。

由于这在 reStructuredText 语法中是不可能的,我打算使用指令的选项来指定空行的数量,但这不是我的问题,也不是我的问题的一部分。以防万一你想知道...

这是我想要做的事情的一个最小示例:

import docutils

class MyDirective(docutils.parsers.rst.Directive):

    has_content = True

    def run(self):
        text = '\n\n' + '\n'.join(self.content.data) + '\n\n'
        node = docutils.nodes.literal_block(text, text)
        print(node)
        return [node]

def setup(app):
    app.add_directive('mydirective', MyDirective)

可以这样使用:

.. mydirective::

    Hello, world!

这有效,但我在指令中添加的换行符以某种方式被 Sphinx 吞没了(在 HTML 和 LaTeX 输出中)。

我怎样才能避免这种情况?

换行符实际上存储在 node 对象中(从 print() 的输出中可以看出),但它们似乎在 Sphinx 处理过程中丢失了。

我对 Sphinx 机器的了解不够,无法自行追踪,如有任何帮助,我们将不胜感激!

我宁愿尝试 CSS margin-top 和 margin-bottom 属性。

我找到了自己问题的答案,但比我希望的要复杂得多...

我创建了一个自定义节点 class 并添加了一个 literal_block 实例作为子节点。 我将空行数保存为自定义节点 class 的属性。 然后我为 HTML 和 LaTeX 创建了 "visit" 和 "depart" 函数(实际上只有后者),它们从节点属性中获取数字并在 [=11= 上进行一些不优雅的字符串替换] 摸索着换行。

这对 HTML 和 LaTeX 都很好,但我很高兴听到更优雅的解决方案!