{# (Public) Entrypoint to be used by zola "pages" #} {% macro page(target) %} {% set root = get_section(path=target.ancestors | last) %} {{ nav::inner_nav(root=root, current=target) }} {% endmacro %} {# (Public) Entrypoint to be used by zola "sections" #} {% macro section(target) %} {{ nav::inner_nav(root=target, current=target) }} {% endmacro %} {# -------------------------- #} {# -------------------------- #} {# (Private) Shared+root logic to build the menu #} {% macro inner_nav(root, current) %} {{ nav::hamburger(root=root) }} {# Section title #}
{{ root.title }}
{# Choose between "tree" (has extra.parent) and "list" (default) collections #} {% set root_tree = root.pages | group_by(attribute="extra.parent") %} {% if root.relative_path in root_tree %} {% set tree_breadcrumb = nav::breadcrumb(corpus=root.pages, root=root.relative_path, target=current)|split(pat=":")|slice(start=1) %} {{ nav::tree( tree=root_tree, cursor=root.relative_path, selected=current, crumb=tree_breadcrumb) }} {% else %} {{ nav::list(list=root.pages, selected=current) }} {% endif %} {% endmacro %} {# (Private) On small screens, like a smartphone, hide the menu behind an hamburger icon #} {% macro hamburger(root) %} {% endmacro %} {# (Private) Build a breadcrumb for the page #} {# It's ugly because this is the hacky part of the project #} {% macro breadcrumb(corpus, root, target) %}{% if 'parent' in target.extra and target.extra.parent != root %}{% set new_target = get_page(path=target.extra.parent) %}{{ nav::breadcrumb(corpus=corpus, root=root, target=new_target) }}:{{ new_target.relative_path }}{% endif %}{% endmacro %} {# (Private) Render a list menu (this is the simple fallback when extra.parent is not defined #} {% macro list(list, selected) %} {% for page in list %} {% set is_selected = page.relative_path == selected.relative_path %}
{{ nav::link(page=page, is_selected=is_selected, is_parent=false) }}
{% endfor %} {% endmacro %} {# (Private) Tree menu rendering; this function is recursive #} {# this function takes a breadcrumb to know which part of the menu must be unfolded #} {% macro tree(tree, cursor, selected, crumb) %} {% for page in tree | get(key=cursor) %} {% set is_selected = page.relative_path == selected.relative_path %}
{# Link with a (possible) subsection #} {% if page.relative_path in tree %} {# Display link as a section #} {{ nav::link(page=page, is_selected=is_selected, is_parent=true) }} {# Should we unroll this part of the tree? #} {% if page.relative_path in crumb or is_selected %} {% endif %} {# Simple link, ie. a leaf of the tree #} {% else %} {{ nav::link(page=page, is_selected=is_selected, is_parent=false) }} {% endif %}
{% endfor %} {% endmacro %} {# (Private) Render a single link #} {% macro link(page, is_selected, is_parent) %} {% if is_selected %}{% endif %} {% if is_parent %}‣ {% endif %} {{ page.title }} {% if is_selected %}{% endif %} {% endmacro %}