Получить переменные в шаблонах Sphinx
Я не могу понять, как получить переменные в документы Sphinx через шаблон. Я, конечно, делаю элементарную ошибку, но пока есть много документации для использования шаблонов Jinja/Flask для веб-сервиса и некоторой документации для Sphinx, использующей ее, у меня возникают проблемы делая следующее. Возможно, это невозможно, и я лаю неправильное дерево, но тогда это довольно отличается от того, как переменные работают вообще в веб-шаблонах (в отличие от doc)?
Я работаю в гораздо более крупном проекте. Предположим, что в моем проекте conf.py
я делаю переменную, скажем
LANGS = ['en', 'de', 'cn']
Я знаю, что это работает, потому что, если я делаю docbuild (у нас есть пользовательский docbuild, но я не думаю, что он делает что-то действительно сумасшедшее, кроме настраиваемого регистратора, и есть кучу "болтовни" ) со следующей строкой в conf.py
print len(LANGS)
он появляется во время docbuild.
Но теперь, конечно, я хочу получить доступ к этой переменной в моем шаблоне. Насколько я могу судить, мы переопределяем index.rst
с помощью templates/index.html
, который наследуется от основного layout.html для Sphinx. И если я делаю
<p>We have {{ LANGS|len }} languages</p>
Я получаю
У нас есть 0 языков
Теперь это странно, потому что иногда я могу вызвать ошибку в сборке, ссылаясь на переменные, которые не определены (хотя и не последовательно), так что как-то он "знает", что переменная определена, но думает, что она имеет нулевую длину. Или переменная "null" имеет длину нуля автоматически?
Как мне определить эту переменную - или это невозможно?
То, что я хочу сделать, - это сделать что-то для каждого языка в списке (в частности, сделать внешнюю ссылку), но я считаю, что нет смысла пытаться {% for %}/{% endfor %}
или что-то еще, если я не могу получить эту работу, Может быть, Sphinx реализует только подмножество Jinja?
В любом случае, пожалуйста, помогите!
Ответы
Ответ 1
Есть как минимум два способа передачи переменных в шаблон:
-
Через html_context
:
Словарь значений для перехода в контекст шаблонов шаблонов для всех страниц. Отдельные значения можно также поместить в этот словарь, используя опцию -A командной строки sphinx-build.
Пример:
# conf.py:
html_context = {'num_langs': len(LANGS)}
<!-- template: -->
<p>We have {{ num_langs }} languages</p>
-
Через html_theme_options
. Для этого нужно добавить опцию theme.conf
(вы можете создать тему, наследуя ее от стандартной):
[options]
num_langs = 1
Затем вы можете установить num_langs
в conf.py
через html_theme_options
:
html_theme_options = {'num_langs': len(LANGS)}
и использовать его в шаблоне:
<p>We have {{ theme_num_langs }} languages</p>