Расширение сфинкса: буквальный блок с начальными и / или конечными пустыми строками?
Насколько я могу судить, невозможно создать буквенный текстовый блок (например, с 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.