mirror of
https://github.com/snachodog/just-the-docs.git
synced 2025-04-23 19:42:23 -06:00
* Optimize simple navigation cases Fix inefficiency reported in feedback on v0.4.0.rc2 (see discussion #958). This PR: * essentially reverts `_includes/nav.html` to v0.4.0.rc1 * preserves the ARIA labels added by #950 * adds a test to optimize builds of sites that rely on `title` fields to order pages. Building the `endoflife.date` site (130 pages) now takes only about 7 seconds. Building the `machinetranslate.org` site ( 350 pages) takes about 7 minutes. (Without the added test, it takes just over 5 minutes: the condition of the test is merely to compare the size of two arrays, but that is apparently enough to prevent Jekyll from applying some optimization). A warning is added to the docs about the need for numbers to be in quotes when used as title values. * Update navigation-structure.md A clarification is added to the docs about the need for numbers to be in quotes when used as title values. * Simplify the control and data flow - Defer concatenation of `string_order_pages` with `title_order_pages` until needed. - Replace tests on size with tests for `empty`. - Rename variables accordingly. * Fix child nav order This PR started from the navigation in RC1. Some cosmetic improvements had been made in RC2. This commit adds some of those changes to this PR. It also fixes a bug (revealed by a new regression test) due to a reference to `node.child_nav_order` instead of `child.child_nav_order`, which prevented reversal of the order in children of children. Presumably a top-level reversal should apply only to direct children, and not to grandchildren. The latter interpretation would be very confusing in a deep multi-level hierarchy. * Allow pages with numeric titles An omitted `nav_order` value should default to the `title` value, regardless of its type. Jekyll 3 gives build errors when numbers and strings are sorted together. This commit drops the assumption that `title` values are always strings – a 404 page naturally has a numeric title. It updates the docs page accordingly. The extra code does not affect the build time for the `endoflife.date` site (7 seconds). For the `machinetranslate` site, changing the title of the 404 page to a number increases the build time from 7 minutes to 9 minutes – the `nav_order` numbers on that site are program-generated in the range 1..1000, which might be atypical. This commit has not yet been checked using the regression tests. The gemspec used for testing specifies `spec.add_runtime_dependency "jekyll", "~> 3.8.5"`, and `Gemfile.lock` shows `jekyll (3.8.7)`. * Update nav.html Add comment about an optimization that will be possible in Jekyll 4. * Update nav.html - Update the comment about optimization possibility. - TEMPORARILY add Jekyll 3 code for conditionally optimizing. * Update nav.html Minor improvements and cosmetic changes. * Major revision This update is based on extensive experimentation and profiling with alternative versions of the Liquid code used to build the main navigation panel. Due to the fragility of Jekyll's optimizations, combining alternative approaches with conditionals turned out to be too expensive: merely adding a condition to check whether some array of pages is empty can add about 20% to the build time! The current code avoids sorting pages on `nav_order` and `title` fields together. The standard way of doing that in Jekyll is to use the `group_by` filter; but extracting the sorted pages from the groups turned out to be too inefficient (as seen in RC1), as was generating links directly from the groups (in RC2). Making all pages with `nav_order` values come before all those ordered by their `title` values is not ideal (it doesn't support tweaking the relative order of two pages in a list of pages ordered by their titles) but it appears to be necessary for efficient builds on large sites. This version has not yet been fully tested for regression, but otherwise seems to give the expected navigation on the endoflife.date and machinetranslate websites. (I'm unable to install the Python-based how2data repository on my laptop, due to package version issues on Apple silicon). Co-authored-by: Peter Mosses <18308236+pdmosses@users.noreply.github.com>
307 lines
8.1 KiB
Markdown
307 lines
8.1 KiB
Markdown
---
|
|
layout: default
|
|
title: Navigation Structure
|
|
nav_order: 5
|
|
---
|
|
|
|
# Navigation Structure
|
|
{: .no_toc }
|
|
|
|
<details open markdown="block">
|
|
<summary>
|
|
Table of contents
|
|
</summary>
|
|
{: .text-delta }
|
|
- TOC
|
|
{:toc}
|
|
</details>
|
|
|
|
---
|
|
|
|
## Main navigation
|
|
|
|
The main navigation for your Just the Docs site is on the left side of the page at large screens and on the top (behind a tap) on small screens. The main navigation can be structured to accommodate a multi-level menu system (pages with children and grandchildren).
|
|
|
|
By default, all pages will appear as top level pages in the main nav unless a parent page is defined (see [Pages with Children](#pages-with-children)).
|
|
|
|
---
|
|
|
|
## Ordering pages
|
|
|
|
To specify a page order, you can use the `nav_order` parameter in your pages' YAML front matter.
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
|
|
```yaml
|
|
---
|
|
layout: default
|
|
title: Customization
|
|
nav_order: 4
|
|
---
|
|
|
|
```
|
|
|
|
The parameter values determine the order of the top-level pages, and of child pages with the same parent. You can reuse the same parameter values (e.g., integers starting from 1) for the child pages of different parents.
|
|
|
|
The parameter values can be numbers (integers, floats) and/or strings. Pages with numerical `nav_order` parameters always come before those with string `nav_order` parameters. When you omit `nav_order` parameters, they default to the titles of the pages. If you want to make the page order independent of the page titles, you can set explicit `nav_order` parameters on all pages. All pages with explicit `nav_order` parameters
|
|
come before all pages ordered by their `title` values.
|
|
|
|
By default, all Capital letters come before all lowercase letters; you can add `nav_sort: case_insensitive` in the configuration file to ignore the case. Enclosing strings in (single or double) quotation marks is optional. Numeric values are not enclosed in quotation marks, e.g., `42`, `-1.0`; numbers in quotation marks are lexicographically ordered, so `"10"` comes before `"2"`, for example.
|
|
|
|
---
|
|
|
|
## Excluding pages
|
|
|
|
For specific pages that you do not wish to include in the main navigation, e.g. a 404 page or a landing page, use the `nav_exclude: true` parameter in the YAML front matter for that page.
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
|
|
```yaml
|
|
---
|
|
layout: default
|
|
title: 404
|
|
nav_exclude: true
|
|
---
|
|
|
|
```
|
|
|
|
The `nav_exclude` parameter does not affect the [auto-generating list of child pages](#auto-generating-table-of-contents), which you can use to access pages excluded from the main navigation.
|
|
|
|
Pages with no `title` are automatically excluded from the main navigation.
|
|
|
|
---
|
|
|
|
## Pages with children
|
|
|
|
Sometimes you will want to create a page with many children (a section). First, it is recommended that you keep pages that are related in a directory together... For example, in these docs, we keep all of the written documentation in the `./docs` directory and each of the sections in subdirectories like `./docs/ui-components` and `./docs/utilities`. This gives us an organization like:
|
|
|
|
```
|
|
+-- ..
|
|
|-- (Jekyll files)
|
|
|
|
|
|-- docs
|
|
| |-- ui-components
|
|
| | |-- index.md (parent page)
|
|
| | |-- buttons.md
|
|
| | |-- code.md
|
|
| | |-- labels.md
|
|
| | |-- tables.md
|
|
| | +-- typography.md
|
|
| |
|
|
| |-- utilities
|
|
| | |-- index.md (parent page)
|
|
| | |-- color.md
|
|
| | |-- layout.md
|
|
| | |-- responsive-modifiers.md
|
|
| | +-- typography.md
|
|
| |
|
|
| |-- (other md files, pages with no children)
|
|
| +-- ..
|
|
|
|
|
|-- (Jekyll files)
|
|
+-- ..
|
|
```
|
|
|
|
On the parent pages, add this YAML front matter parameter:
|
|
|
|
- `has_children: true` (tells us that this is a parent page)
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
|
|
```yaml
|
|
---
|
|
layout: default
|
|
title: UI Components
|
|
nav_order: 2
|
|
has_children: true
|
|
---
|
|
|
|
```
|
|
|
|
Here we're setting up the UI Components landing page that is available at `/docs/ui-components`, which has children and is ordered second in the main nav.
|
|
|
|
### Child pages
|
|
|
|
{: .text-gamma }
|
|
|
|
On child pages, simply set the `parent:` YAML front matter to whatever the parent's page title is and set a nav order (this number is now scoped within the section).
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
|
|
```yaml
|
|
---
|
|
layout: default
|
|
title: Buttons
|
|
parent: UI Components
|
|
nav_order: 2
|
|
---
|
|
|
|
```
|
|
|
|
The Buttons page appears as a child of UI Components and appears second in the UI Components section.
|
|
|
|
### Ordering child pages
|
|
|
|
You can optionally add the following to the YAML front matter to change the default sort order of child pages from ascending to descending order:
|
|
|
|
- `child_nav_order: desc`
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
```yaml
|
|
---
|
|
layout: default
|
|
title: Descending Child Pages
|
|
child_nav_order: desc
|
|
---
|
|
```
|
|
|
|
### Auto-generating Table of Contents
|
|
|
|
By default, all pages with children will automatically append a Table of Contents which lists the child pages after the parent page's content. To disable this auto Table of Contents, set `has_toc: false` in the parent page's YAML front matter.
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
|
|
```yaml
|
|
---
|
|
layout: default
|
|
title: UI Components
|
|
nav_order: 2
|
|
has_children: true
|
|
has_toc: false
|
|
---
|
|
|
|
```
|
|
|
|
### Children with children
|
|
|
|
{: .text-gamma }
|
|
|
|
Child pages can also have children (grandchildren). This is achieved by using a similar pattern on the child and grandchild pages.
|
|
|
|
1. Add the `has_children` attribute to the child
|
|
1. Add the `parent` and `grand_parent` attribute to the grandchild
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
|
|
```yaml
|
|
---
|
|
layout: default
|
|
title: Buttons
|
|
parent: UI Components
|
|
nav_order: 2
|
|
has_children: true
|
|
---
|
|
|
|
```
|
|
|
|
```yaml
|
|
---
|
|
layout: default
|
|
title: Buttons Child Page
|
|
parent: Buttons
|
|
grand_parent: UI Components
|
|
nav_order: 1
|
|
---
|
|
|
|
```
|
|
|
|
This would create the following navigation structure:
|
|
|
|
```
|
|
+-- ..
|
|
|
|
|
|-- UI Components
|
|
| |-- ..
|
|
| |
|
|
| |-- Buttons
|
|
| | |-- Button Child Page
|
|
| |
|
|
| |-- ..
|
|
|
|
|
+-- ..
|
|
```
|
|
|
|
{: .note }
|
|
Currently, the navigation structure is limited to 3 levels: grandchild pages cannot themselves have child pages.
|
|
|
|
---
|
|
|
|
## Auxiliary Links
|
|
|
|
To add auxiliary links to your site (in the upper right on all pages), add it to the `aux_links` [configuration option]({{ site.baseurl }}{% link docs/configuration.md %}#aux-links) in your site's `_config.yml` file.
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
|
|
```yaml
|
|
# Aux links for the upper right navigation
|
|
aux_links:
|
|
"Just the Docs on GitHub":
|
|
- "//github.com/just-the-docs/just-the-docs"
|
|
```
|
|
|
|
---
|
|
|
|
## External Navigation Links
|
|
|
|
To add external links to the navigation, add them to the `nav_external_links` [configuration]({{ site.baseurl }}{% link docs/configuration.md %}) option in your site's `_config.yml` file.
|
|
External links will appear under all other items in the listing order.
|
|
|
|
#### Example
|
|
|
|
{: .no_toc }
|
|
|
|
```yaml
|
|
# External navigation links
|
|
nav_external_links:
|
|
- title: Just the Docs on GitHub
|
|
url: https://github.com/just-the-docs/just-the-docs
|
|
hide_icon: false # set to true to hide the external link icon - defaults to false
|
|
```
|
|
|
|
---
|
|
|
|
## In-page navigation with Table of Contents
|
|
|
|
To generate a Table of Contents on your docs pages, you can use the `{:toc}` method from Kramdown, immediately after an `<ol>` in Markdown. This will automatically generate an ordered list of anchor links to various sections of the page based on headings and heading levels. There may be occasions where you're using a heading and you don't want it to show up in the TOC, so to skip a particular heading use the `{: .no_toc }` CSS class.
|
|
|
|
#### Example
|
|
{: .no_toc }
|
|
|
|
```markdown
|
|
# Navigation Structure
|
|
{: .no_toc }
|
|
|
|
## Table of contents
|
|
{: .no_toc .text-delta }
|
|
|
|
1. TOC
|
|
{:toc}
|
|
```
|
|
|
|
This example skips the page name heading (`#`) from the TOC, as well as the heading for the Table of Contents itself (`##`) because it is redundant, followed by the table of contents itself. To get an unordered list, replace `1. TOC` above by `- TOC`.
|
|
|
|
### Collapsible Table of Contents
|
|
|
|
The Table of Contents can be made collapsible using the `<details>` and `<summary>` elements , as in the following example. The attribute `open` (expands the Table of Contents by default) and the styling with `{: .text-delta }` are optional.
|
|
|
|
```markdown
|
|
<details open markdown="block">
|
|
<summary>
|
|
Table of contents
|
|
</summary>
|
|
{: .text-delta }
|
|
1. TOC
|
|
{:toc}
|
|
</details>
|
|
```
|
|
|
|
The result is shown at [the top of this page](#navigation-structure) (`{:toc}` can be used only once on each page).
|