0

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

没关系。

但是现在我想创建一个使用docutils'literal_block()节点的自定义指令,并且我希望(在我的指令的代码中)在指令内容的开头和/或结尾添加空行。

由于这在 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 处理过程中丢失了。

我对狮身人面像机器的了解不够,无法自行追踪,任何帮助将不胜感激!

4

2 回答 2

0

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

于 2015-12-03T09:27:11.727 回答
0

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

我创建了一个自定义节点类并添加了一个literal_block实例作为子节点。我将空行数保存为自定义节点类的属性。然后我为 HTML 和 LaTeX 创建了“访问”和“离开”函数(实际上只有后者),它们从节点属性中获取数字,并在self.body将换行符放置到位时进行一些不优雅的字符串替换。

这适用于 HTML 和 LaTeX,但我很高兴听到更优雅的解决方案!

于 2015-12-04T17:43:45.037 回答