+ {%- assign titled_pages = include.pages
+ | 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 = titled_pages
+ | where_exp:"item", "item.nav_order == nil" -%}
+ {%- assign nav_ordered_pages = titled_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_string_ordered_groups = string_ordered_groups | sort_natural:"name" -%}
+ {%- else -%}
+ {%- assign sorted_string_ordered_groups = string_ordered_groups | sort:"name" -%}
+ {%- endif -%}
+ {%- 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 -%}
+ {%- if node.parent == nil -%}
+ {%- unless node.nav_exclude -%}
+