在RST中,我们在块前面使用一些空格来说这是一个代码块。因为Python也使用空格来缩进代码块,所以如果我编写Python代码,我希望我的RST代码块保留这些空格。我怎么能这样做?
假设我们有一个班级:
class Test(object):
我们想要编写一个名为__init__
的方法,该方法是该类的成员。这个方法属于另一个代码块,但我们希望有一些视觉线索,以便读者知道第二个块是前一个块的延续。目前,我使用#
标记代码块的垂直引导线,如下所示:
def __init__(self):
pass
#
如果没有#
,def __init__(self)
将以与class Test(object)
相同的缩进级别打印。必须有更优雅的方式。
答案 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)