Боковая панель сфинкса
Я пытаюсь создать новый шаблон Sphinx, который бы создал пользовательское дерево для боковой панели.
Используя язык шаблонов Jinja, кажется, доступна только одна функция: toctree()
который отображает все toctree одновременно, но мне нужно перебрать отдельные элементы toctree.
Это будет выглядеть так:
{% for element in toctree_elements %}
{{ ... display the stuff as wanted }}
{% endfor %}
Является ли это возможным?
1 ответ
Я наконец нашел один трюк, но он не очень удовлетворяет.
Это берет html toctree из функции toctree()
и удаляет все нежелательные теги HTML. Сохраняются только URL-адреса и заголовки, и создается массив.
{% set theTocTree = toctree()
| replace("</a>", "")
| replace(" href=\"", "></a>")
| replace("</li>", "</li>;")
| striptags
| replace("\">", "%") %}
{% set theTocTree = theTocTree.split(";") %}
Затем следующие циклы над новым массивом toctree делают все, что нужно.
{% for element in theTocTree %}
{% set el = element.split("%") %}
{% set url = el[0] | trim | safe %}
{% set entry = el[1] | trim | safe %}
... here, you can use variables url and entry ...
{% endfor %}
Это решение нечисто, потому что оно зависит от рендеринга HTML toctree, который может измениться в будущих версиях Sphinx. Кроме того, он не принимает символы %
а также ;
в URL-адресах или записях toctree.
fulltoc.py в https://github.com/sphinx-contrib/fulltoc изменяетcontext['toc']
бегом html_page_context
когда html-page-context
событие запускается.
Расширение для Sphinx, позволяющее отображать на боковой панели полное оглавление, а не только локальные заголовки.