Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #411 from pdmosses/nav-sorting
Safe page sorting
- Loading branch information
Showing
58 changed files
with
918 additions
and
64 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
--- | ||
layout: default | ||
title: Page not found | ||
title: 404 | ||
permalink: /404 | ||
nav_exclude: true | ||
search_exclude: true | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,55 +1,100 @@ | ||
<ul class="nav-list"> | ||
{%- assign ordered_pages_list = include.pages | where_exp:"item", "item.nav_order != nil" -%} | ||
{%- assign unordered_pages_list = include.pages | where_exp:"item", "item.nav_order == nil" -%} | ||
{%- assign included_pages = site.html_pages | ||
| where_exp:"item", "item.nav_exclude != true" | ||
| where_exp:"item", "item.title != nil" -%} | ||
|
||
{%- comment -%} | ||
The values of `title` and `nav_order` can be numbers or strings. | ||
Jekyll gives build failures when sorting on mixtures of different types, | ||
so numbers and strings need to be sorted separately. | ||
|
||
Here, numbers are sorted by their values, and come before all strings. | ||
An omitted `nav_order` value is equivalent to the page's `title` value | ||
(except that a numerical `title` value is treated as a string). | ||
|
||
The case-sensitivity of string sorting is determined by `site.nav_sort`. | ||
{%- endcomment -%} | ||
|
||
{%- assign string_ordered_pages = included_pages | ||
| where_exp:"item", "item.nav_order == nil" -%} | ||
{%- assign nav_ordered_pages = included_pages | ||
| where_exp:"item", "item.nav_order != nil" -%} | ||
|
||
{%- comment -%} | ||
The nav_ordered_pages have to be added to number_ordered_pages and | ||
string_ordered_pages, depending on the nav_order value. | ||
The first character of the jsonify result is `"` only for strings. | ||
{%- endcomment -%} | ||
{%- assign nav_ordered_groups = nav_ordered_pages | ||
| group_by_exp:"item", "item.nav_order | jsonify | slice: 0" -%} | ||
{%- assign number_ordered_pages = "" | split:"X" -%} | ||
{%- for group in nav_ordered_groups -%} | ||
{%- if group.name == '"' -%} | ||
{%- assign string_ordered_pages = string_ordered_pages | concat: group.items -%} | ||
{%- else -%} | ||
{%- assign number_ordered_pages = number_ordered_pages | concat: group.items -%} | ||
{%- endif -%} | ||
{%- endfor -%} | ||
|
||
{%- assign sorted_number_ordered_pages = number_ordered_pages | sort:"nav_order" -%} | ||
|
||
{%- comment -%} | ||
The string_ordered_pages have to be sorted by nav_order, and otherwise title | ||
(where appending the empty string to a numeric title converts it to a string). | ||
After grouping them by those values, the groups are sorted, then the items | ||
of each group are concatenated. | ||
{%- endcomment -%} | ||
{%- assign string_ordered_groups = string_ordered_pages | ||
| group_by_exp:"item", "item.nav_order | default: item.title | append:''" -%} | ||
{%- if site.nav_sort == 'case_insensitive' -%} | ||
{%- assign sorted_ordered_pages_list = ordered_pages_list | sort_natural:"nav_order" -%} | ||
{%- assign sorted_unordered_pages_list = unordered_pages_list | sort_natural:"title" -%} | ||
{%- assign sorted_string_ordered_groups = string_ordered_groups | sort_natural:"name" -%} | ||
{%- else -%} | ||
{%- assign sorted_ordered_pages_list = ordered_pages_list | sort:"nav_order" -%} | ||
{%- assign sorted_unordered_pages_list = unordered_pages_list | sort:"title" -%} | ||
{%- assign sorted_string_ordered_groups = string_ordered_groups | sort:"name" -%} | ||
{%- endif -%} | ||
{%- assign pages_list = sorted_ordered_pages_list | concat: sorted_unordered_pages_list -%} | ||
{%- assign sorted_string_ordered_pages = "" | split:"X" -%} | ||
{%- for group in sorted_string_ordered_groups -%} | ||
{%- assign sorted_string_ordered_pages = sorted_string_ordered_pages | concat: group.items -%} | ||
{%- endfor -%} | ||
|
||
{%- assign pages_list = sorted_number_ordered_pages | concat: sorted_string_ordered_pages -%} | ||
|
||
{%- for node in pages_list -%} | ||
{%- unless node.nav_exclude -%} | ||
{%- if node.parent == nil and node.title -%} | ||
<li class="nav-list-item{% if page.url == node.url or page.parent == node.title or page.grand_parent == node.title %} active{% endif %}"> | ||
{%- if page.parent == node.title or page.grand_parent == node.title -%} | ||
{%- assign first_level_url = node.url | relative_url -%} | ||
{%- endif -%} | ||
{%- if node.has_children -%} | ||
<a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a> | ||
{%- endif -%} | ||
<a href="{{ node.url | relative_url }}" class="nav-list-link{% if page.url == node.url %} active{% endif %}">{{ node.title }}</a> | ||
{%- if node.has_children -%} | ||
{%- assign children_list = pages_list | where: "parent", node.title -%} | ||
<ul class="nav-list "> | ||
{%- for child in children_list -%} | ||
{%- unless child.nav_exclude -%} | ||
<li class="nav-list-item {% if page.url == child.url or page.parent == child.title %} active{% endif %}"> | ||
{%- if page.url == child.url or page.parent == child.title -%} | ||
{%- assign second_level_url = child.url | relative_url -%} | ||
{%- endif -%} | ||
{%- if child.has_children -%} | ||
<a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a> | ||
{%- endif -%} | ||
<a href="{{ child.url | relative_url }}" class="nav-list-link{% if page.url == child.url %} active{% endif %}">{{ child.title }}</a> | ||
{%- if child.has_children -%} | ||
{%- assign grand_children_list = pages_list | where: "parent", child.title | where: "grand_parent", node.title -%} | ||
<ul class="nav-list"> | ||
{%- for grand_child in grand_children_list -%} | ||
<li class="nav-list-item {% if page.url == grand_child.url %} active{% endif %}"> | ||
<a href="{{ grand_child.url | relative_url }}" class="nav-list-link{% if page.url == grand_child.url %} active{% endif %}">{{ grand_child.title }}</a> | ||
</li> | ||
{%- endfor -%} | ||
</ul> | ||
{%- endif -%} | ||
</li> | ||
{%- endunless -%} | ||
{%- endfor -%} | ||
</ul> | ||
{%- endif -%} | ||
</li> | ||
{%- endif -%} | ||
{%- endunless -%} | ||
{%- if node.parent == nil -%} | ||
<li class="nav-list-item{% if page.url == node.url or page.parent == node.title or page.grand_parent == node.title %} active{% endif %}"> | ||
{%- if page.parent == node.title or page.grand_parent == node.title -%} | ||
{%- assign first_level_url = node.url | absolute_url -%} | ||
{%- endif -%} | ||
{%- if node.has_children -%} | ||
<a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a> | ||
{%- endif -%} | ||
<a href="{{ node.url | absolute_url }}" class="nav-list-link{% if page.url == node.url %} active{% endif %}">{{ node.title }}</a> | ||
{%- if node.has_children -%} | ||
{%- assign children_list = pages_list | where: "parent", node.title -%} | ||
<ul class="nav-list "> | ||
{%- for child in children_list -%} | ||
<li class="nav-list-item {% if page.url == child.url or page.parent == child.title %} active{% endif %}"> | ||
{%- if page.url == child.url or page.parent == child.title -%} | ||
{%- assign second_level_url = child.url | absolute_url -%} | ||
{%- endif -%} | ||
{%- if child.has_children -%} | ||
<a href="#" class="nav-list-expander"><svg viewBox="0 0 24 24"><use xlink:href="#svg-arrow-right"></use></svg></a> | ||
{%- endif -%} | ||
<a href="{{ child.url | absolute_url }}" class="nav-list-link{% if page.url == child.url %} active{% endif %}">{{ child.title }}</a> | ||
{%- if child.has_children -%} | ||
{%- assign grand_children_list = pages_list | where: "parent", child.title | where: "grand_parent", node.title -%} | ||
<ul class="nav-list"> | ||
{%- for grand_child in grand_children_list -%} | ||
<li class="nav-list-item {% if page.url == grand_child.url %} active{% endif %}"> | ||
<a href="{{ grand_child.url | absolute_url }}" class="nav-list-link{% if page.url == grand_child.url %} active{% endif %}">{{ grand_child.title }}</a> | ||
</li> | ||
{%- endfor -%} | ||
</ul> | ||
{%- endif -%} | ||
</li> | ||
{%- endfor -%} | ||
</ul> | ||
{%- endif -%} | ||
</li> | ||
{%- endif -%} | ||
{%- endfor -%} | ||
</ul> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
--- | ||
layout: default | ||
title: Tests | ||
has_children: true | ||
nav_order: 100 | ||
--- | ||
|
||
# Tests | ||
|
||
The main documentation pages of this theme illustrate the use of many of its features, which to some extent tests their implementation. The pages linked below provide further test cases for particular features, and may be useful for regression testing when developing new features. | ||
|
||
The default configuration does not include the test pages. To include them, *commment-out* the following line in `_config.yml`: | ||
|
||
```yaml | ||
, "docs/tests/" | ||
``` | ||
so that it is: | ||
```yaml | ||
# , "docs/tests/" | ||
``` | ||
|
||
(Apparently Jekyll's `include` does *not* override `exclude` for the same folder...) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
--- | ||
layout: default | ||
title: Excluded Child | ||
parent: Not Excluded | ||
nav_exclude: true | ||
--- | ||
# Excluded Child | ||
|
||
This child page is explicitly excluded, and should not appear in the navigation. | ||
|
||
```yaml | ||
title: Excluded Child | ||
parent: Not Excluded | ||
nav_exclude: true | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
--- | ||
layout: default | ||
title: Excluded Grandchild | ||
parent: Non-excluded Child | ||
grand_parent: Non-excluded | ||
nav_exclude: true | ||
--- | ||
# Excluded Grandchild | ||
|
||
This grandchild page is explicitly excluded, and should not appear in the navigation. | ||
|
||
```yaml | ||
title: Excluded Grandchild | ||
parent: Non-excluded Child | ||
grand_parent: Non-excluded | ||
nav_exclude: true | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
--- | ||
layout: default | ||
title: Excluded | ||
has_children: true | ||
nav_exclude: true | ||
--- | ||
# Excluded | ||
|
||
This top-level page is explicitly excluded, and should not appear in the navigation. Any child pages are implicitly excluded. | ||
|
||
```yaml | ||
title: Excluded | ||
has_children: true | ||
nav_exclude: true | ||
``` |
15 changes: 15 additions & 0 deletions
15
docs/tests/navigation/exclude/non-excluded-child-of-excluded.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
--- | ||
layout: default | ||
title: Non-excluded Child of Excluded | ||
parent: Excluded | ||
nav_exclude: false | ||
--- | ||
# Non-excluded Child of Excluded | ||
|
||
This child page is explicitly not excluded, but its parent page is excluded, so it should not appear in the navigation. | ||
|
||
```yaml | ||
title: Non-excluded Child of Excluded | ||
parent: Excluded | ||
nav_exclude: false | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
--- | ||
layout: default | ||
title: Non-excluded Child | ||
parent: Non-excluded | ||
has_children: true | ||
nav_exclude: false | ||
--- | ||
# Non-excluded Child | ||
|
||
This child page is explicitly not excluded, and should appear in the navigation. | ||
|
||
```yaml | ||
title: Non-excluded Child | ||
parent: Non-excluded | ||
nav_exclude: false | ||
``` |
17 changes: 17 additions & 0 deletions
17
docs/tests/navigation/exclude/non-excluded-grandchild-of-excluded.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
--- | ||
layout: default | ||
title: Non-excluded Grandchild of Excluded | ||
parent: Non-excluded Child | ||
grand_parent: Excluded | ||
nav_exclude: false | ||
--- | ||
# Non-excluded Grandchild of Excluded | ||
|
||
This grandchild page is explicitly not excluded, and neither is its parent page; but its grandparent page is excluded, so it should not appear in the navigation. | ||
|
||
```yaml | ||
title: Non-excluded Grandchild of Excluded | ||
parent: Non-excluded Child | ||
grand_parent: Excluded | ||
nav_exclude: false | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
--- | ||
layout: default | ||
title: Non-excluded Grandchild | ||
parent: Non-excluded Child | ||
grand_parent: Non-excluded | ||
nav_exclude: false | ||
--- | ||
# Non-excluded Grandchild | ||
|
||
This grandchild page is explicitly not excluded, and neither is its parent page nor its grandparent page, so it should appear in the navigation. | ||
|
||
```yaml | ||
title: Non-excluded Grandchild of Excluded | ||
parent: Non-excluded Child | ||
grand_parent: Excluded | ||
nav_exclude: false | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
--- | ||
layout: default | ||
title: Non-excluded | ||
has_children: true | ||
nav_exclude: false | ||
--- | ||
# Non-excluded | ||
|
||
This top-level page is explicitly not excluded, and should appear in the navigation. | ||
|
||
```yaml | ||
title: Non-excluded | ||
nav_exclude: false | ||
``` |
Oops, something went wrong.