Боковая панель сфинкса

Я пытаюсь создать новый шаблон 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, позволяющее отображать на боковой панели полное оглавление, а не только локальные заголовки.

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