From 36477791427ab057aa086a21c9d63b646028f3d8 Mon Sep 17 00:00:00 2001 From: Eric Arellano Date: Sat, 1 Jul 2023 08:57:55 -0600 Subject: [PATCH 1/2] Add `navigation_depth` HTML option for new theme to limit table of contents depth --- README.md | 51 +++++++----------- example_docs/docs/conf.py | 4 ++ pyproject.toml | 2 +- src/qiskit_sphinx_theme/__init__.py | 31 +++++++++-- .../theme/qiskit-sphinx-theme/theme.conf | 4 ++ ...eft-side-bar-renders-correctly-1-linux.png | Bin 36637 -> 36456 bytes 6 files changed, 55 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 37ce3063..431d83f7 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,18 @@ Then, set up the theme by updating `conf.py`: 1. Set `html_theme = "qiskit"` 2. Add `"qiskit_sphinx_theme"` to `extensions` +## Slow Sphinx build? Limit `navigation_depth` + +By default, every subpage is included in the left table of contents. This can result in incredibly slow build times, especially when you have API documentation. + +You can speed up your build by setting `navigation_depth` in `html_theme_options` in `conf.py` to a number like `1` or `2`: + +```python +html_theme_options = {"navigation_depth": 2} +``` + +However, keep in mind that it is usually a nicer experience for users to have subpages rendered because it makes it easier to navigate the site. So, experiment with a value like `2` or `3` that balances Sphinx build speed with the user experience. Nevertheless, some projects like Qiskit have so many subpages that they will need to set `1`, which is okay. + ## Enable translations First, coordinate with the Translations team at https://github.com/qiskit-community/qiskit-translations to express your interest and to coordinate setting up the infrastructure. @@ -126,41 +138,14 @@ In qiskit-sphinx-theme 1.13, we migrated to a new Sphinx theme based on Furo, wh qiskit-sphinx-theme 1.13 continues to support the legacy Pytorch theme, but support will be removed in version 2.0. -To migrate: - -1. In `conf.py`, ensure that `"qiskit_sphinx_theme"` is in the `extensions` list. -2. In `conf.py`, set `html_theme = "qiskit"` rather than `"qiskit_sphinx_theme"`. -3. In `conf.py`, remove all `html_theme_options`. -4. In `conf.py`, remove `expandable_sidebar` from `html_context`, if set. If it was set, follow the below section [How to migrate expandable_sidebar](#how-to-migrate-expandablesidebar). -5. Render the docs and check that everything looks how expected. If not, please open a GitHub issue or reach out on Slack for help. - -### How to migrate expandable_sidebar - -With the old theme, to have expandable folders, you had to have a dedicated `.. toctree ::` directive with a `:caption:` option, like this: - -```rst -.. toctree:: - :caption: My Folder - :hidden: - - Page 1 - Page 2 -``` - -Instead, the new theme will render the `:caption:` as a top-level section header in the left sidebar, with top-level entries for each page. See the screenshot in the PR description of https://github.com/Qiskit/qiskit_sphinx_theme/pull/384 for an example of how the old theme renders `:caption:` and compare to [the new theme](https://github.com/Qiskit/qiskit_sphinx_theme/blob/main/tests/js/snapshots.test.js-snapshots/left-side-bar-renders-correctly-1-linux.png). - -Additionally, the new theme renders pages with their own subpages as expandable folders, unlike the old theme. [For example](https://github.com/Qiskit/qiskit_sphinx_theme/blob/main/tests/js/snapshots.test.js-snapshots/left-side-bar-renders-correctly-1-linux.png), `` will include all subpages that are listed in the `.. toctree ::` of the page `apidocs/index.rst`. +To migrate, in `conf.py`: -So, when migrating, you have to decide which behavior you want: +1. Ensure that `"qiskit_sphinx_theme"` is in the `extensions` list. +2. Set `html_theme = "qiskit"` rather than `"qiskit_sphinx_theme"`. +3. Remove all `html_theme_options`. +4. Decide if you need to limit `navigation_depth` for the number of subfolders allowed in the left sidebar. The old theme hardcoded a value of `1`, whereas the new theme defaults to `-1` (unlimited subpages). Refer to [Slow Sphinx build? Limit `navigation_depth`](#slow-sphinx-build-limit-navigation_depth). -- Use the new theme's style. No changes necessary. -- Use the new theme's style, but get rid of the top level section header. To implement: - 1. Consolidate the `.. toctree ::` directive with earlier ones so that they are all in the same `toctree`. -- Keep the `:caption:` as an expandable folder, rather than a top-level section header. To implement: - 1. Create a new directory and RST file like `my_folder/index.rst`. - 2. Move the `.. toctree::` directive to that page. - 3. Get rid of the `:caption:` option. - 4. Link to the new file `my_folder/index.rst` in the parent `index.rst` by adding it to a `.. toctree ::` in the parent. +Then, render the docs and check that everything looks how expected. If not, please open a GitHub issue or reach out on Slack for help. ## Tip: suggested site structure diff --git a/example_docs/docs/conf.py b/example_docs/docs/conf.py index f55ae136..56ee335a 100644 --- a/example_docs/docs/conf.py +++ b/example_docs/docs/conf.py @@ -60,6 +60,10 @@ } # Sets a better style for code syntax highlighting. pygments_style = "colorful" +else: + # Most projects need to set `navigation_depth` to 1 or 2 to build quickly enough. We're + # fine with the default of -1, but this tests that setting the option works. + html_theme_options = {"navigation_depth": 2} html_context = { # Add "Was this page useful?" to the footer. diff --git a/pyproject.toml b/pyproject.toml index 892d7e30..61201424 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,7 +65,7 @@ check_untyped_defs = true [[tool.mypy.overrides]] module = [ - "furo", + "furo.*", "jupyter_sphinx.thebelab" ] ignore_missing_imports = true diff --git a/src/qiskit_sphinx_theme/__init__.py b/src/qiskit_sphinx_theme/__init__.py index f2dbff0b..15adf122 100644 --- a/src/qiskit_sphinx_theme/__init__.py +++ b/src/qiskit_sphinx_theme/__init__.py @@ -13,7 +13,9 @@ from __future__ import annotations from pathlib import Path -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any + +from furo.navigation import get_navigation_tree from qiskit_sphinx_theme import directives, previous_releases, translations @@ -35,7 +37,7 @@ def remove_thebe_if_not_needed( app: sphinx.application.Sphinx, pagename: str, templatename: str, - context: dict, + context: dict[str, Any], doctree: sphinx.addnodes.document, ) -> None: """ @@ -78,6 +80,28 @@ def activate_themes(app: sphinx.application.Sphinx, config: sphinx.config.Config app.setup_extension("sphinxcontrib.jquery") +def override_furo_toc( + app: sphinx.application.Sphinx, + pagename: str, + templatename: str, + context: dict[str, Any], + doctree: sphinx.addnodes.document, +) -> None: + """Furo always fully expands its table of contents, which takes way too long to build docs + for most Qiskit projects.""" + if "toctree" in context: + toctree = context["toctree"] + toctree_html = toctree( + collapse=False, + titles_only=True, + maxdepth=app.config.html_theme_options.get("navigation_depth", 2), + includehidden=True, + ) + else: + toctree_html = "" + context["furo_navigation_tree"] = get_navigation_tree(toctree_html) + + # See https://www.sphinx-doc.org/en/master/development/theming.html def setup(app: sphinx.application.Sphinx) -> dict[str, bool]: # Used to generate URL references. Expected to be e.g. `ecosystem/finance`. @@ -94,7 +118,8 @@ def setup(app: sphinx.application.Sphinx) -> dict[str, bool]: app.add_html_theme("qiskit_sphinx_theme", _get_theme_absolute_path("pytorch")) app.add_html_theme("qiskit", _get_theme_absolute_path("theme/qiskit-sphinx-theme")) - app.connect("html-page-context", remove_thebe_if_not_needed) app.connect("config-inited", activate_themes) + app.connect("html-page-context", override_furo_toc, priority=600) + app.connect("html-page-context", remove_thebe_if_not_needed) return {"parallel_read_safe": True, "parallel_write_safe": True} diff --git a/src/qiskit_sphinx_theme/theme/qiskit-sphinx-theme/theme.conf b/src/qiskit_sphinx_theme/theme/qiskit-sphinx-theme/theme.conf index 47eacb46..b4bfaaa6 100644 --- a/src/qiskit_sphinx_theme/theme/qiskit-sphinx-theme/theme.conf +++ b/src/qiskit_sphinx_theme/theme/qiskit-sphinx-theme/theme.conf @@ -9,3 +9,7 @@ sidebars = custom_templates/sidebar_version_list.html, sidebar/scroll-end.html, custom_templates/sidebar_languages.html + +[options] +# Default doesn't actually seem to do anything. But we still have to register the option. +navigation_depth = -1 diff --git a/tests/js/snapshots.test.js-snapshots/left-side-bar-renders-correctly-1-linux.png b/tests/js/snapshots.test.js-snapshots/left-side-bar-renders-correctly-1-linux.png index 04024060fb84200f506c123992de397646664d31..1ef5ac7eb8e88844dcb11307729f51f392a795a8 100644 GIT binary patch delta 18046 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 WWi9jbfdw@1Ph3RiZT@TB&;K8{(4)Zs From 9acaa5787cc1ab687da9fe0bbc21f52a2329ff31 Mon Sep 17 00:00:00 2001 From: Eric Arellano Date: Mon, 3 Jul 2023 10:54:31 -0600 Subject: [PATCH 2/2] Mention environment variables + page size --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 431d83f7..e0329143 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Then, set up the theme by updating `conf.py`: ## Slow Sphinx build? Limit `navigation_depth` -By default, every subpage is included in the left table of contents. This can result in incredibly slow build times, especially when you have API documentation. +By default, every subpage is included in the left table of contents. This can result in incredibly slow build times, especially when you have API documentation. It can also substantially increase the size of your HTML pages, which worsens the load time for the site. You can speed up your build by setting `navigation_depth` in `html_theme_options` in `conf.py` to a number like `1` or `2`: @@ -47,7 +47,17 @@ You can speed up your build by setting `navigation_depth` in `html_theme_options html_theme_options = {"navigation_depth": 2} ``` -However, keep in mind that it is usually a nicer experience for users to have subpages rendered because it makes it easier to navigate the site. So, experiment with a value like `2` or `3` that balances Sphinx build speed with the user experience. Nevertheless, some projects like Qiskit have so many subpages that they will need to set `1`, which is okay. +However, keep in mind that it is usually a nicer experience for users to have subpages rendered because it makes it easier to navigate the site. So, experiment with a value like `2` or `3` that balances Sphinx build speed with the user experience. Nevertheless, some projects like Qiskit have so many subpages that they may need to set `1`, which is okay. + +Another option is to dynamically set the `navigation_depth` by using environment variables; set a lower value in development and a higher value or `-1` in production builds. For example, set up your `conf.py` like this: + +```python +import os + +html_theme_options = { + "navigation_depth": os.getenv("NAVIGATION_DEPTH", 1) +} +``` ## Enable translations