Отличный вопрос.
С помощью {{ myvar | inspect }}
и рекурсии, ограничивающей флаг, я успешно отладил ваш код и понял, почему происходит эта бесконечная рекурсия.
Это происходит из-за того, что что переменная section
в docs_contents. html назначена в for
l oop и freezed : ее нельзя изменить.
При первом включении nav. html, {% assign section=include.nav %}
не изменяется section
, а ваш код просто использует код, назначенный в вашем for
l oop.
Когда вы выполняете повторный вызов и вызываете nav. html во второй раз, он будет использовать ту же самую заблокированную глобальную переменную section
и будет выполнять рекурсивный процесс неопределенно долго.
Решение состоит в том, чтобы изменить имя переменной в nav. html от section
до чего-то другого. Например: sub_section
, и это будет работать, потому что эта новая переменная не будет замораживаться и может быть переназначена по мере необходимости во время рекурсии.
{% assign sub_section=include.nav %}
{{ sub_section.title }}
{% for item in sub_section.docs %}
...
Если вы хотите поэкспериментировать, вот мой тестовый код с некоторыми комментариями :
docs_contents. html
<code>{% for section in site.data.docs_nav %}
{% comment %} ++++ Try to reassign "section" ++++ {% endcomment %}
{% assign section = "yolo from docs_contents.html" %}
{% assign recursion = 0 %}
<pre>
>> docs_contents.html
++++ "recursion" var is assigned and becomes global
recursion : {{ recursion | inspect }}
++++ "section" is freezed to loop value ++++
including nav with include nav.html nav=section >> {{ section | inspect }}
{% include nav. html nav = section%} {% endfor%}
nav. html
<code>{% comment %} ++++ Try to reassign "section" ++++ {% endcomment %}
{% assign section = "yolo from nav.html" %}
<pre>
>> nav.hml
recursion : {{ recursion }}
include.nav : {{ include.nav | inspect }}
++++ "section" is freezed to loop value ++++
section : {{ section | inspect }}
{% comment%} ++++ бесполезное назначение ++++ {% endcomment%} {% assign section = include.nav%} {% для элемента в section.docs%} {% if item.link%} {% - назначить p = site.documents | где: "url", item.link | первый%} {{p.menu_name | по умолчанию: p.title}} {% endif%} {% comment%} ++++ ограничение рекурсии до 2 уровней ++++ {% endcomment%} {% if item.docs и рекурсия <2%} {% comment%} ++++ инкрементная глобальная переменная "рекурсия" ++++ {% endcomment%} {% assign recursion = recursion | плюс: 1%} {% include nav. html nav = item%} {% endif%} {% endfor%} </code>