10

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

假设我们有一个类:

class Test(object):

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

    def __init__(self):
        pass
#

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

4

3 回答 3

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::指令。

于 2017-05-26T02:19:13.930 回答
0

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

您还可以使用另一种语法:

::

>     def foo(x):
>         pass

使用前导“>”将保留前导空间。

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

编辑

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

于 2011-08-12T02:51:17.760 回答
0

您也可以尝试如下所示的线块

|     def foo(x):
|         pass

尽管它们并非特定于代码示例。

于 2011-12-09T20:00:14.737 回答