如何在reStructuredText中的代码块中强制使用空格

时间:2011-08-12 01:27:06

标签: python whitespace restructuredtext

在RST中,我们在块前面使用一些空格来说这是一个代码块。因为Python也使用空格来缩进代码块,所以如果我编写Python代码,我希望我的RST代码块保留这些空格。我怎么能这样做?

假设我们有一个班级:

class Test(object):

我们想要编写一个名为__init__的方法,该方法是该类的成员。这个方法属于另一个代码块,但我们希望有一些视觉线索,以便读者知道第二个块是前一个块的延续。目前,我使用#标记代码块的垂直引导线,如下所示:

    def __init__(self):
        pass
#

如果没有#def __init__(self)将以与class Test(object)相同的缩进级别打印。必须有更优雅的方式。

3 个答案:

答案 0 :(得分:1)

你需要定义自己的指令(标准的.. code::指令确实会占用空格,但是你可以自己创建指令):

import re
from docutils.parsers.rst import directives

INDENTATION_RE = re.compile("^ *")

def measure_indentation(line):
    return INDENTATION_RE.match(line).end()

class MyCodeBlock(directives.body.CodeBlock):
    EXPECTED_INDENTATION = 3

    def run(self):
        block_lines = self.block_text.splitlines()
        block_header_len = self.content_offset - self.lineno + 1
        block_indentation = measure_indentation(self.block_text)
        code_indentation = block_indentation + MyCodeBlock.EXPECTED_INDENTATION
        self.content = [ln[code_indentation:] for ln in block_lines[block_header_len:]]
        return super(MyCodeBlock, self).run()

directives.register_directive("my-code", MyCodeBlock)

你当然可以用这个覆盖标准的.. code::指令。

答案 1 :(得分:0)

啊......我之前遇到过这个问题;)。 #技巧通常是我使用的,唉。如果您阅读规范,它听起来总会带走领先的缩进。 [1]

您还可以使用其他语法:

::

>     def foo(x):
>         pass

领先“>”这将保留领先的空间。

[1]:http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#indented-literal-blocks

修改

只是挖掘了docutils代码(这也一直困扰着我)并且可以确认它总是会删除常见的缩进,没有问题。修改它以修改此行为很容易,但这会使生成的重组文本不标准。

答案 2 :(得分:0)

您还可以尝试Line Blocks,如下所示:

|     def foo(x):
|         pass

虽然它们并非特定于代码示例。