Как заставить пробелы в блоке кода в reStructuredText - PullRequest
7 голосов
/ 12 августа 2011

В RST мы используем несколько пробелов перед блоком, чтобы сказать, что это блок кода. Поскольку Python также использует пробелы для отступа блока кода, я хотел бы, чтобы мой блок кода RST сохранил эти пробелы, если бы я писал код Python. Как я могу это сделать?

Допустим, у нас есть класс:

class Test(object):

И мы хотим написать метод с именем __init__, который является членом этого класса. Этот метод принадлежит другому блоку кода, но мы хотим иметь некоторую визуальную подсказку, чтобы читатели знали, что этот второй блок является продолжением предыдущего. В настоящее время я использую #, чтобы отметить вертикальную направляющую линию блока кода следующим образом:

    def __init__(self):
        pass
#

Без #, def __init__(self) будет напечатан на том же уровне отступа, что и class Test(object). Должен быть более элегантный способ.

Ответы [ 3 ]

1 голос
/ 26 мая 2017

Вам нужно определить свою собственную директиву (это правда, что стандартная директива .. 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:: и этим.

0 голосов
/ 10 декабря 2011

Вы также можете попробовать линейные блоки , которые выглядят следующим образом:

|     def foo(x):
|         pass

, хотя они не являются специфическими для примеров кода.

0 голосов
/ 12 августа 2011

Ах ... я сталкивался с этим раньше;).Увы, обычно я использую трюк #.Если вы читаете спецификацию, это звучит так, как будто это всегда удалит ведущий отступ.[1]

Вы также можете использовать альтернативный синтаксис:

::

>     def foo(x):
>         pass

С начальным ">", который сохранит начальный пробел.

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

РЕДАКТИРОВАТЬ

Просто покопался в коде документооборота (это меня тоже сильно беспокоило) и могу подтвердить, что он всегда удалит общий отступ, без вопросов.Это было бы легко изменить, чтобы изменить это поведение, но это сделало бы полученный реструктурированный текст нестандартным.

...