Расширение сфинкса: буквальный блок с начальными и / или конечными пустыми строками?

Насколько я могу судить, невозможно создать буквенный текстовый блок (например, с code-block директива), которая начинается или заканчивается пустой строкой, потому что это было бы неоднозначно в отношении синтаксиса reStructuredText.

Это нормально.

Но теперь я хочу создать пользовательскую директиву, которая использует docutils"s literal_block() узел, и я хочу (в коде моей директивы) добавить пустые строки в начале и / или конце содержимого директивы.

Поскольку это невозможно в синтаксисе reStructuredText, я планирую использовать параметры директивы для указания количества пустых строк, но это не моя проблема и не часть моего вопроса. На всякий случай, если вам интересно...

Вот минимальный пример того, что я хочу сделать:

import docutils

class MyDirective(docutils.parsers.rst.Directive):

    has_content = True

    def run(self):
        text = '\n\n' + '\n'.join(self.content.data) + '\n\n'
        node = docutils.nodes.literal_block(text, text)
        print(node)
        return [node]

def setup(app):
    app.add_directive('mydirective', MyDirective)

Это можно использовать так:

.. mydirective::

    Hello, world!

Это работает, но новые строки, которые я добавил в директиву, каким-то образом поглощаются Sphinx (как в выходных данных HTML, так и в LaTeX).

Как я могу избежать этого?

Новые строки на самом деле хранятся в node объект (как видно на выходе print()), но они, кажется, теряются где-то позже во время обработки Сфинкса.

Я не знаю достаточно о механизме Сфинкса, чтобы отследить это самостоятельно, любая помощь будет очень признательна!

2 ответа

Решение

Я нашел ответ на свой вопрос, но он намного сложнее, чем я надеялся...

Я создал собственный класс узла и добавил literal_block экземпляр как дочерний узел. Я сохраняю количество пустых строк в качестве атрибутов пользовательского класса узла. Затем я создал функции "посещения" и "ухода" (на самом деле только последние) для HTML и LaTeX, которые берут числа из атрибутов узла и выполняют некоторую не элегантную замену строки в self.body шарить новые строки на место.

Это прекрасно работает как для HTML, так и для LaTeX, но я был бы рад услышать о более элегантном решении!

Я предпочел бы попробовать свойства CSS margin-top и margin-bottom.

Другие вопросы по тегам