Полное руководство по отступам директив reStructuredText
Полное руководство по отступам директив reStructuredText в Sphinx. Узнайте о правильном форматировании аргументов, опций и содержимого с четкими примерами и экспертными рекомендациями.
Каковы правильные правила отступов для директив reStructuredText в документации Sphinx?
Я работаю с Sphinx для преобразования документов reStructuredText (rst) в HTML и мне нужно уточнить правила отступов для директив.
Директива reStructuredText включает в себя:
- Маркер директивы (состоящий из явного начала разметки (
..), за которым следует тип директивы, два двоеточия и пробелы) - Аргументы директивы
- Опции директивы
- Содержимое директивы
Я хотел бы уточнить мое понимание ожиданий относительно отступов для аргументов, опций и содержимого директивы:
-
Маркер директивы должен быть указан в одной строке
-
Аргументы директивы могут быть указаны через пробелы в той же строке, что и маркер.
- Аргументы могут быть указаны (или продолжены) в строке, непосредственно следующей за маркером.
- Если первый аргумент указан в той же строке, что и маркер, он задает прецедент для отступов для любых аргументов, указанных в последующих строках.
- Если первый аргумент указан в строке, следующей за маркером, он не имеет требований к отступам (кроме того, что они должны быть ненулевыми), и задает прецедент для отступов последующих аргументов.
-
Опции директивы должны быть указаны в строке, непосредственно следующей за маркером или последним аргументом.
- Первая опция не имеет требований к отступам (кроме того, что они должны быть ненулевыми), и задает прецедент для последующих опций.
-
Содержимое директивы должно быть указано в строке, следующей за пустой строкой, которая следует за последней опцией, последним аргументом или маркером (в зависимости от ситуации).
- Если у директивы есть опции, отступ опции задает прецедент для отступов содержимого.
- Если у директивы нет опций, первая строка содержимого директивы не имеет требований к отступам (кроме того, что они должны быть ненулевыми), и задает прецедент для отступов последующих строк содержимого.
Является ли мое понимание правильным?
Примеры, иллюстрирующие мое понимание:
Пример 1:
.. my_markup:: arg1
arg2_must_go_here_because_of_arg1_indentation
arg3_must_go_here_etc
:option_whose_indentation_does_not_matter: val1
:option2_must_go_here_because_of_option1_indentation: val2
:option3_must_go_here_etc: val3
Я думаю, что эта строка содержимого директивы должна иметь тот же отступ, что и опции.
Я думаю, что эта и последующие строки содержимого директивы должны иметь ...
тот же отступ, что и первая строка содержимого директивы
Пример 2:
.. my_markup:: arg1 arg2
arg3_must_go_here_because_of_arg1_indentation
:option_whose_indentation_does_not_matter: val1
:option2_must_go_here_because_of_option1_indentation: val2
:option3_must_go_here_etc: val3
Я думаю, что эта строка содержимого директивы должна иметь тот же отступ, что и опции.
Я думаю, что эта и последующие строки содержимого директивы должны иметь ...
тот же отступ, что и первая строка содержимого директивы.
Пример 3:
.. my_markup:: arg1 arg2
arg3_must_go_here_because_of_arg1_indentation
Я думаю, что эта строка содержимого директивы может иметь любой ненулевой отступ.
Я думаю, что эта и последующие строки содержимого директивы должны иметь ...
тот же отступ, что и первая строка содержимого директивы.
Правила правильного отступа для директив reStructuredText в документации Sphinx следуют структурированному шаблону, где последовательность отступов имеет решающее значение для корректного разбора. Ваше понимание в основном верно, но есть важные нюансы, которые нужно прояснить, особенно в отношении отступов содержимого директивы, когда параметры отсутствуют.
Вот разбор правильных правил отступов:
.. my_markup:: arg1
arg2_must_go_here_because_of_arg1_indentation
arg3_must_go_here_etc
:option_whose_indentation_does_not_matter: val1
:option2_must_go_here_because_of_option1_indentation: val2
:option3_must_go_here_etc: val3
Content must be indented the same as options when present
and maintain consistent indentation throughout
Содержание
- Базовая структура директивы
- Отступы аргументов директивы
- Отступы параметров директивы
- Отступы содержимого директивы
- Специальные случаи и распространенные ошибки
- Полные примеры
Базовая структура директивы
Директива reStructuredText состоит из четырех основных компонентов в определенном порядке:
- Маркер директивы (всегда в одной строке)
- Аргументы директивы (необязательные)
- Параметры директивы (необязательные, в формате списка полей)
- Содержимое директивы (необязательное)
В документации Sphinx подчеркивается, что “синтаксис RST чувствителен к отступам” и что компоненты должны следовать этой последовательности для корректного разбора.
Отступы аргументов директивы
Ваше понимание отступов аргументов в основном верно:
- Аргументы могут быть разделены пробелами в той же строке, что и маркер директивы
- Аргументы могут продолжаться в следующих строках
- Первый аргумент задает прецедент для последующих аргументов
- Аргументы должны иметь последовательные отступы после установления прецедента
.. my_markup:: argument1
argument2_continuation
argument3_continuation
Согласно официальной документации, “оставшаяся часть первой строки и вторая строка, а также один модуль параметров” рассматриваются как аргументы.
Отступы параметров директивы
Ваше понимание отступов параметров верно:
- Параметры должны быть указаны в строке, непосредственно следующей за маркером или последним аргументом
- Первый параметр не требует определенного отступа (кроме ненулевого)
- Последующие параметры должны быть отступлены на том же уровне, что и первый параметр
На Stack Overflow подтверждается: “Первый параметр не требует определенного отступа (кроме ненулевого) и задает прецедент для последующих параметров”.
Отступы содержимого директивы
Вот где ваше понимание требует исправления:
- Содержимое всегда должно следовать после пустой строки после последнего параметра или аргумента
- Содержимое всегда должно иметь последовательные отступы - это относится даже к случаям, когда параметры отсутствуют
- Когда параметры присутствуют, содержимое должно быть отступлено на том же уровне, что и параметры
- Когда параметры отсутствуют, содержимое все равно нуждается в последовательных отступах (не “в любом ненулевом количестве”)
Как указано в документации Sphinx: “Содержимое директивы следует после пустой строки и отступлено относительно начала директивы, или если параметры присутствуют, на том же уровне, что и параметры”.
Ключевой принцип заключается в том, что отступы содержимого никогда не произвольны - они должны следовать установленному шаблону.
Специальные случаи и распространенные ошибки
Директивы со смешанным содержимым
Некоторые директивы, такие как code-block, имеют конкретные требования форматирования:
.. code-block:: python
:linenos:
def hello():
print("Hello, world!")
Правила прецедента отступов
- Первая строка любого компонента задает стандарт для последующих строк
- Нулевой отступ (без пробелов) для строки компонента обычно недопустим
- Непоследовательные отступы внутри компонента вызовут ошибки разбора
Параметры в формате списка полей
Параметры должны следовать синтаксису списка полей с двоеточиями:
.. directive:: arg
:option1: value1
:option2: value2
Полные примеры
Пример 1: С аргументами и параметрами (Правильно)
.. my_markup:: arg1
arg2_continuation
:option1: value1
:option2: value2
Content indented same as options
Maintains consistent indentation
Пример 2: Только с аргументами (Пример 3 пользователя - Исправлено)
.. my_markup:: arg1 arg2
arg3_continuation
Content must be indented consistently
Cannot use "any nonzero amount" arbitrarily
Must maintain the same indentation throughout
Пример 3: Только параметры (Отсутствовал в примерах пользователя)
.. my_markup::
:option1: value1
:option2: value2
Content indented same as options
Consistent indentation required
Пример 4: Только содержимое (Отсутствовал в примерах пользователя)
.. my_markup::
Content must be indented consistently
Cannot start at column 1 (no indentation)
Must maintain same indentation throughout
В спецификации reStructuredText подтверждается, что “блок директивы разделен на аргументы, параметры (список полей) и содержимое (в этом порядке), из которых каждое может присутствовать”. Этот структурированный подход обеспечивает последовательный разбор в различных реализациях Sphinx.
Источники
- reStructuredText Primer — Sphinx documentation
- Clarification on reStructuredText directive indentation rules - Stack Overflow
- reStructuredText Directives - docutils.sourceforge.io
- reStructuredText markup - Python Developer Guide
- Restructured Text (reST) and Sphinx CheatSheet
Заключение
На основе результатов исследования, вот основные выводы относительно правил отступов для директив reStructuredText:
- Структура директивы строгая: Аргументы → Параметры → Содержимое, в этом конкретном порядке
- Аргументы: Могут продолжаться в последующих строках с последовательными отступами, основанными на первом аргументе
- Параметры: Должны быть списками полей с двоеточиями, первый параметр задает прецедент для последующих параметров
- Содержимое: Всегда требует последовательных отступов, даже когда параметры отсутствуют
- Пустые строки важны: Разделяют маркер директивы от содержимого, а параметры/содержимое от предыдущих элементов
Ваши примеры 1 и 2 верны, но пример 3 неверен, потому что содержимое не может использовать “любое ненулевое количество” отступов произвольно - оно должно быть последовательным независимо от наличия параметров. Правило таково: отступы содержимого всегда последовательны, никогда не произвольны.
Для лучших практик используйте последовательные отступы во всей документации и всегда проверяйте синтаксис RST с помощью процесса сборки Sphinx, чтобы обнаруживать ошибки отступов на ранней стадии.