From 6660f442b078ab9dc668c010b1e4378297f32b22 Mon Sep 17 00:00:00 2001 From: Peter Mosses <p.d.mosses@me.com> Date: Fri, 11 Oct 2019 21:40:34 +0100 Subject: [PATCH] Alphabetic navigation order When `nav_order` is omitted, the order of nodes at each menu level (and in the auto-generated TOC) is alphabetical by `title`, instead of random. Any nodes with a specified `nav_order` precede all nodes at that level where it is omitted. Note that `nav_order` fields must have a uniform site-ide type: integers and strings cannot be mixed, otherwise Jekyll reports errors. The implementation filters the ordered and unordered pages from `site.html_pages`, sorts them separately, and concatenates the resulting arrays. --- _includes/nav.html | 8 +++++--- _layouts/default.html | 3 +-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/_includes/nav.html b/_includes/nav.html index d561a42a..a691f4f6 100644 --- a/_includes/nav.html +++ b/_includes/nav.html @@ -1,6 +1,8 @@ <nav role="navigation" aria-label="Main navigation"> <ul class="navigation-list"> - {%- assign pages_list = site.html_pages | sort:"nav_order" -%} + {%- assign ordered_pages_list = site.html_pages | where_exp:"item", "item.nav_order != nil" | sort:"nav_order" -%} + {%- assign unordered_pages_list = site.html_pages | where_exp:"item", "item.nav_order == nil" | sort:"title" -%} + {%- assign pages_list = ordered_pages_list | concat: unordered_pages_list -%} {%- for node in pages_list -%} {%- unless node.nav_exclude -%} {%- if node.parent == nil -%} @@ -10,7 +12,7 @@ {%- endif -%} <a href="{{ node.url | absolute_url }}" class="navigation-list-link{% if page.url == node.url %} active{% endif %}">{{ node.title }}</a> {%- if node.has_children -%} - {%- assign children_list = site.html_pages | where: "parent", node.title | sort:"nav_order" -%} + {%- assign children_list = pages_list | where: "parent", node.title -%} <ul class="navigation-list-child-list "> {%- for child in children_list -%} <li class="navigation-list-item {% if page.url == child.url or page.parent == child.title %} active{% endif %}"> @@ -19,7 +21,7 @@ {%- endif -%} <a href="{{ child.url | absolute_url }}" class="navigation-list-link{% if page.url == child.url %} active{% endif %}">{{ child.title }}</a> {%- if child.has_children -%} - {%- assign grand_children_list = site.html_pages | where: "parent", child.title | sort:"nav_order" -%} + {%- assign grand_children_list = pages_list | where: "parent", child.title -%} <ul class="navigation-list-child-list"> {%- for grand_child in grand_children_list -%} <li class="navigation-list-item {% if page.url == grand_child.url %} active{% endif %}"> diff --git a/_layouts/default.html b/_layouts/default.html index b1d3c724..1aa6ae1f 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -74,9 +74,8 @@ layout: table_wrappers {% if page.has_children == true and page.has_toc != false %} <hr> <h2 class="text-delta">Table of contents</h2> - {% assign children_list = site.pages | sort:"nav_order" %} <ul> - {% for child in children_list %} + {% for child in pages_list %} {% if child.parent == page.title and child.title != page.title %} <li> <a href="{{ child.url | absolute_url }}">{{ child.title }}</a>{% if child.summary %} - {{ child.summary }}{% endif %} -- GitLab