From c46ccd3484faed63b9a04e0bf9cb7a0f3d9334f0 Mon Sep 17 00:00:00 2001
From: PLanCompS <62553846+plancomps-admin@users.noreply.github.com>
Date: Sat, 25 Apr 2020 14:53:45 +0200
Subject: [PATCH] Made case-insenstive sorting the default

Added a configuration option to determine whether the sort order is case-sensitive.
The default is case-insensitive.

To test:
- open `/just-the-docs/docs/utilities/` in the browser,
  and check that the navigation links in `Utilities` are sorted alphabetically;
- in `docs/utilities/layout.md', change the preamble to `title: layout`,
  and check that the  links in `Utilities` are still sorted alphabetically;
- add `nav_sort: case_sensitive` in the configuration file,
  and check that the link to `layout` is now listed last under `Utilities`.
---
 _config.yml                  |  4 ++++
 _includes/nav.html           | 13 ++++++++++---
 docs/navigation-structure.md |  2 ++
 3 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/_config.yml b/_config.yml
index a0906708..92ab71ea 100644
--- a/_config.yml
+++ b/_config.yml
@@ -38,6 +38,10 @@ aux_links:
   "Just the Docs on GitHub":
     - "//github.com/pmarsceill/just-the-docs"
 
+# Sort order for navigation links
+nav_sort: case_insensitive # default, equivalent to nil
+# nav_sort: case_sensitive # Capital letters sorted before lowercase
+
 # Footer content appears at the bottom of every page's main content
 footer_content: "Copyright &copy; 2017-2019 Patrick Marsceill. Distributed by an <a href=\"https://github.com/pmarsceill/just-the-docs/tree/master/LICENSE.txt\">MIT license.</a>"
 
diff --git a/_includes/nav.html b/_includes/nav.html
index a691f4f6..ec6c786b 100644
--- a/_includes/nav.html
+++ b/_includes/nav.html
@@ -1,8 +1,15 @@
 <nav role="navigation" aria-label="Main navigation">
   <ul class="navigation-list">
-    {%- 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 -%}
+    {%- assign ordered_pages_list = site.html_pages | where_exp:"item", "item.nav_order != nil" -%}
+    {%- assign unordered_pages_list = site.html_pages | where_exp:"item", "item.nav_order == nil" -%}
+    {%- if site.nav_sort == 'case_sensitive' -%}
+      {%- assign sorted_ordered_pages_list = ordered_pages_list | sort:"nav_order" -%}
+      {%- assign sorted_unordered_pages_list = unordered_pages_list | sort:"title" -%}
+    {%- else -%}
+      {%- assign sorted_ordered_pages_list = ordered_pages_list | sort_natural:"nav_order" -%}
+      {%- assign sorted_unordered_pages_list = unordered_pages_list | sort_natural:"title" -%}
+    {%- endif -%}
+    {%- assign pages_list = sorted_ordered_pages_list | concat: sorted_unordered_pages_list -%}
     {%- for node in pages_list -%}
       {%- unless node.nav_exclude -%}
         {%- if node.parent == nil -%}
diff --git a/docs/navigation-structure.md b/docs/navigation-structure.md
index d6d58444..e5f29ad2 100644
--- a/docs/navigation-structure.md
+++ b/docs/navigation-structure.md
@@ -41,6 +41,8 @@ nav_order: 4
 The specified `nav_order` parameters on a site should be all integers or all strings.
 Pages without a `nav_order` parameter are ordered alphabetically by their `title`,
 and appear after the explicitly-ordered pages at each level.
+To sort all Capital letters before lowercase letters,
+add `nav_sort: case_sensitive` in the configuration file.
 
 ---
 
-- 
GitLab