10

RST では、ブロックの前にいくつかの空白を使用して、これがコード ブロックであることを示します。Python も空白を使用してコード ブロックをインデントするため、Python コードを記述している場合は、RST コード ブロックでこれらの空白を保持したいと考えています。どうやってやるの?

クラスがあるとしましょう:

class Test(object):

__init__そして、このクラスのメンバーであるというメソッドを書きたいと思います。このメソッドは別のコード ブロックに属していますが、この 2 番目のブロックが前のブロックの続きであることが読者にわかるように、視覚的な手がかりが必要です。現時点では、次#のようにコード ブロックの垂直方向のガイドラインをマークするために使用します。

    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

次のようなライン ブロックを試すこともできます。

|     def foo(x):
|         pass

ただし、コード例に固有のものではありません。

于 2011-12-09T20:00:14.737 に答える
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 に答える