Sphinx 8.0.2__py3-none-any.whl → 8.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Sphinx might be problematic. Click here for more details.
- sphinx/__init__.py +6 -3
- sphinx/_cli/__init__.py +40 -20
- sphinx/_cli/util/colour.py +5 -4
- sphinx/_cli/util/errors.py +28 -11
- sphinx/application.py +361 -38
- sphinx/builders/__init__.py +229 -83
- sphinx/builders/_epub_base.py +118 -71
- sphinx/builders/changes.py +39 -21
- sphinx/builders/dirhtml.py +4 -4
- sphinx/builders/dummy.py +2 -5
- sphinx/builders/epub3.py +43 -22
- sphinx/builders/gettext.py +43 -25
- sphinx/builders/html/__init__.py +284 -218
- sphinx/builders/html/_assets.py +62 -26
- sphinx/builders/html/_build_info.py +76 -0
- sphinx/builders/html/transforms.py +11 -9
- sphinx/builders/latex/__init__.py +139 -81
- sphinx/builders/latex/constants.py +7 -7
- sphinx/builders/latex/nodes.py +3 -2
- sphinx/builders/latex/theming.py +7 -5
- sphinx/builders/latex/transforms.py +27 -19
- sphinx/builders/linkcheck.py +146 -72
- sphinx/builders/manpage.py +30 -13
- sphinx/builders/singlehtml.py +22 -14
- sphinx/builders/texinfo.py +67 -37
- sphinx/builders/text.py +5 -5
- sphinx/builders/xml.py +6 -9
- sphinx/cmd/build.py +282 -103
- sphinx/cmd/make_mode.py +106 -63
- sphinx/cmd/quickstart.py +341 -145
- sphinx/config.py +45 -12
- sphinx/deprecation.py +8 -2
- sphinx/directives/__init__.py +28 -19
- sphinx/directives/code.py +86 -56
- sphinx/directives/other.py +50 -36
- sphinx/directives/patches.py +29 -19
- sphinx/domains/__init__.py +20 -120
- sphinx/domains/_domains_container.py +281 -0
- sphinx/domains/_index.py +110 -0
- sphinx/domains/c/__init__.py +3 -3
- sphinx/domains/c/_parser.py +10 -6
- sphinx/domains/changeset.py +5 -3
- sphinx/domains/citation.py +5 -3
- sphinx/domains/cpp/__init__.py +9 -11
- sphinx/domains/cpp/_parser.py +8 -7
- sphinx/domains/index.py +3 -3
- sphinx/domains/javascript.py +12 -7
- sphinx/domains/math.py +2 -2
- sphinx/domains/python/__init__.py +10 -5
- sphinx/domains/python/_object.py +1 -1
- sphinx/domains/rst.py +5 -5
- sphinx/domains/std/__init__.py +16 -11
- sphinx/environment/__init__.py +202 -146
- sphinx/environment/adapters/asset.py +3 -2
- sphinx/environment/adapters/indexentries.py +74 -33
- sphinx/environment/adapters/toctree.py +100 -43
- sphinx/environment/collectors/__init__.py +19 -8
- sphinx/environment/collectors/asset.py +47 -15
- sphinx/environment/collectors/dependencies.py +8 -4
- sphinx/environment/collectors/metadata.py +7 -2
- sphinx/environment/collectors/title.py +7 -2
- sphinx/environment/collectors/toctree.py +54 -22
- sphinx/errors.py +4 -1
- sphinx/events.py +314 -7
- sphinx/ext/apidoc.py +42 -18
- sphinx/ext/autodoc/__init__.py +52 -24
- sphinx/ext/autodoc/importer.py +6 -9
- sphinx/ext/autosectionlabel.py +1 -2
- sphinx/ext/autosummary/__init__.py +3 -1
- sphinx/ext/autosummary/generate.py +28 -14
- sphinx/ext/coverage.py +7 -7
- sphinx/ext/doctest.py +4 -8
- sphinx/ext/duration.py +6 -5
- sphinx/ext/inheritance_diagram.py +1 -1
- sphinx/ext/intersphinx/_cli.py +6 -4
- sphinx/ext/intersphinx/_load.py +77 -32
- sphinx/ext/intersphinx/_resolve.py +173 -79
- sphinx/ext/intersphinx/_shared.py +7 -5
- sphinx/ext/linkcode.py +7 -1
- sphinx/ext/mathjax.py +1 -2
- sphinx/ext/napoleon/__init__.py +37 -24
- sphinx/ext/napoleon/docstring.py +202 -134
- sphinx/ext/todo.py +5 -3
- sphinx/highlighting.py +9 -2
- sphinx/io.py +1 -1
- sphinx/jinja2glue.py +27 -6
- sphinx/locale/__init__.py +6 -2
- sphinx/locale/ar/LC_MESSAGES/sphinx.js +8 -1
- sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ar/LC_MESSAGES/sphinx.po +2246 -2288
- sphinx/locale/bg/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bg/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/bn/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bn/LC_MESSAGES/sphinx.po +2349 -2395
- sphinx/locale/ca/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ca/LC_MESSAGES/sphinx.po +2846 -2892
- sphinx/locale/cak/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cak/LC_MESSAGES/sphinx.po +2213 -2259
- sphinx/locale/cs/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cs/LC_MESSAGES/sphinx.po +2225 -2269
- sphinx/locale/cy/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cy/LC_MESSAGES/sphinx.po +2403 -2447
- sphinx/locale/da/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/da/LC_MESSAGES/sphinx.po +2214 -2260
- sphinx/locale/de/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de/LC_MESSAGES/sphinx.po +2230 -2276
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/el/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/el/LC_MESSAGES/sphinx.po +2619 -2665
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2519 -2565
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/eo/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eo/LC_MESSAGES/sphinx.po +2232 -2278
- sphinx/locale/es/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es/LC_MESSAGES/sphinx.po +2516 -2561
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/et/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/et/LC_MESSAGES/sphinx.po +2317 -2363
- sphinx/locale/eu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eu/LC_MESSAGES/sphinx.po +2218 -2264
- sphinx/locale/fa/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fa/LC_MESSAGES/sphinx.po +2505 -2551
- sphinx/locale/fi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fi/LC_MESSAGES/sphinx.po +2303 -2349
- sphinx/locale/fr/LC_MESSAGES/sphinx.js +6 -2
- sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr/LC_MESSAGES/sphinx.po +2863 -2908
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/gl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/gl/LC_MESSAGES/sphinx.po +2571 -2617
- sphinx/locale/he/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/he/LC_MESSAGES/sphinx.po +2307 -2352
- sphinx/locale/hi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi/LC_MESSAGES/sphinx.po +2580 -2626
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/hr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hr/LC_MESSAGES/sphinx.po +2238 -2283
- sphinx/locale/hu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hu/LC_MESSAGES/sphinx.po +2228 -2274
- sphinx/locale/id/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/id/LC_MESSAGES/sphinx.po +2787 -2834
- sphinx/locale/is/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/is/LC_MESSAGES/sphinx.po +2224 -2270
- sphinx/locale/it/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/it/LC_MESSAGES/sphinx.po +2231 -2276
- sphinx/locale/ja/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ja/LC_MESSAGES/sphinx.po +2507 -2554
- sphinx/locale/ka/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ka/LC_MESSAGES/sphinx.po +2428 -2474
- sphinx/locale/ko/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ko/LC_MESSAGES/sphinx.po +2516 -2563
- sphinx/locale/lt/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lt/LC_MESSAGES/sphinx.po +2425 -2469
- sphinx/locale/lv/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lv/LC_MESSAGES/sphinx.po +2362 -2407
- sphinx/locale/mk/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/mk/LC_MESSAGES/sphinx.po +2121 -2167
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2220 -2266
- sphinx/locale/ne/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ne/LC_MESSAGES/sphinx.po +2221 -2267
- sphinx/locale/nl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nl/LC_MESSAGES/sphinx.po +2240 -2286
- sphinx/locale/pl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pl/LC_MESSAGES/sphinx.po +2319 -2363
- sphinx/locale/pt/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2854 -2899
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2224 -2269
- sphinx/locale/ro/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ro/LC_MESSAGES/sphinx.po +2226 -2271
- sphinx/locale/ru/LC_MESSAGES/sphinx.js +8 -3
- sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ru/LC_MESSAGES/sphinx.po +2841 -2885
- sphinx/locale/si/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/si/LC_MESSAGES/sphinx.po +2294 -2340
- sphinx/locale/sk/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sk/LC_MESSAGES/sphinx.po +2497 -2541
- sphinx/locale/sl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sl/LC_MESSAGES/sphinx.po +2331 -2375
- sphinx/locale/sphinx.pot +2121 -2167
- sphinx/locale/sq/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sq/LC_MESSAGES/sphinx.po +2855 -2901
- sphinx/locale/sr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr/LC_MESSAGES/sphinx.po +2203 -2248
- sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.po +2423 -2469
- sphinx/locale/te/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/te/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/tr/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/tr/LC_MESSAGES/sphinx.po +2443 -2489
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2329 -2373
- sphinx/locale/ur/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ur/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/vi/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/vi/LC_MESSAGES/sphinx.po +2199 -2246
- sphinx/locale/yue/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/yue/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2845 -2892
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/parsers.py +3 -1
- sphinx/project.py +6 -2
- sphinx/pycode/__init__.py +11 -4
- sphinx/pycode/ast.py +58 -58
- sphinx/pycode/parser.py +49 -28
- sphinx/pygments_styles.py +49 -49
- sphinx/registry.py +8 -3
- sphinx/roles.py +136 -13
- sphinx/search/__init__.py +146 -87
- sphinx/search/da.py +2 -4
- sphinx/search/de.py +2 -4
- sphinx/search/en.py +4 -4
- sphinx/search/es.py +2 -4
- sphinx/search/fi.py +2 -4
- sphinx/search/fr.py +2 -4
- sphinx/search/hu.py +2 -4
- sphinx/search/it.py +2 -4
- sphinx/search/ja.py +55 -32
- sphinx/search/nl.py +2 -4
- sphinx/search/no.py +2 -4
- sphinx/search/pt.py +2 -4
- sphinx/search/ro.py +0 -2
- sphinx/search/ru.py +2 -4
- sphinx/search/sv.py +2 -4
- sphinx/search/tr.py +0 -2
- sphinx/search/zh.py +18 -13
- sphinx/templates/graphviz/graphviz.css +0 -7
- sphinx/testing/fixtures.py +6 -5
- sphinx/testing/path.py +7 -5
- sphinx/testing/util.py +63 -29
- sphinx/texinputs/sphinx.sty +115 -50
- sphinx/texinputs/sphinxlatexadmonitions.sty +56 -38
- sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
- sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
- sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
- sphinx/texinputs/sphinxlatexlists.sty +1 -1
- sphinx/texinputs/sphinxlatexliterals.sty +4 -1
- sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
- sphinx/texinputs/sphinxlatexobjects.sty +1 -1
- sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
- sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
- sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
- sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
- sphinx/texinputs/sphinxlatextables.sty +1 -1
- sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
- sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
- sphinx/themes/agogo/layout.html +1 -10
- sphinx/themes/agogo/static/agogo.css.jinja +0 -7
- sphinx/themes/basic/defindex.html +1 -8
- sphinx/themes/basic/domainindex.html +1 -9
- sphinx/themes/basic/genindex-single.html +1 -9
- sphinx/themes/basic/genindex-split.html +1 -9
- sphinx/themes/basic/genindex.html +1 -9
- sphinx/themes/basic/globaltoc.html +1 -9
- sphinx/themes/basic/layout.html +1 -9
- sphinx/themes/basic/localtoc.html +1 -9
- sphinx/themes/basic/page.html +1 -9
- sphinx/themes/basic/relations.html +1 -9
- sphinx/themes/basic/search.html +1 -9
- sphinx/themes/basic/searchbox.html +1 -9
- sphinx/themes/basic/searchfield.html +4 -10
- sphinx/themes/basic/sourcelink.html +1 -9
- sphinx/themes/basic/static/basic.css.jinja +2 -13
- sphinx/themes/basic/static/doctools.js +0 -7
- sphinx/themes/basic/static/language_data.js.jinja +0 -7
- sphinx/themes/basic/static/searchtools.js +25 -13
- sphinx/themes/bizstyle/layout.html +1 -9
- sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
- sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
- sphinx/themes/classic/layout.html +1 -9
- sphinx/themes/classic/static/classic.css.jinja +0 -7
- sphinx/themes/classic/static/sidebar.js.jinja +0 -6
- sphinx/themes/epub/epub-cover.html +1 -9
- sphinx/themes/epub/layout.html +1 -9
- sphinx/themes/epub/static/epub.css.jinja +0 -7
- sphinx/themes/haiku/layout.html +1 -9
- sphinx/themes/haiku/static/haiku.css.jinja +0 -6
- sphinx/themes/nature/static/nature.css.jinja +0 -7
- sphinx/themes/nonav/layout.html +1 -9
- sphinx/themes/nonav/static/nonav.css.jinja +0 -7
- sphinx/themes/pyramid/static/epub.css.jinja +0 -7
- sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
- sphinx/themes/scrolls/layout.html +1 -10
- sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
- sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
- sphinx/themes/traditional/static/traditional.css.jinja +0 -7
- sphinx/theming.py +18 -6
- sphinx/transforms/__init__.py +56 -35
- sphinx/transforms/compact_bullet_list.py +3 -2
- sphinx/transforms/i18n.py +132 -50
- sphinx/transforms/post_transforms/__init__.py +94 -43
- sphinx/transforms/post_transforms/code.py +7 -6
- sphinx/transforms/post_transforms/images.py +71 -54
- sphinx/transforms/references.py +1 -2
- sphinx/util/__init__.py +23 -194
- sphinx/util/_files.py +80 -0
- sphinx/util/_importer.py +27 -0
- sphinx/util/_io.py +1 -2
- sphinx/util/_lines.py +26 -0
- sphinx/util/_pathlib.py +5 -2
- sphinx/util/_serialise.py +53 -0
- sphinx/util/_timestamps.py +2 -1
- sphinx/util/_uri.py +16 -0
- sphinx/util/cfamily.py +48 -25
- sphinx/util/console.py +1 -0
- sphinx/util/display.py +1 -1
- sphinx/util/docfields.py +125 -45
- sphinx/util/docstrings.py +1 -1
- sphinx/util/docutils.py +118 -44
- sphinx/util/exceptions.py +11 -5
- sphinx/util/fileutil.py +53 -32
- sphinx/util/http_date.py +9 -7
- sphinx/util/i18n.py +49 -16
- sphinx/util/images.py +7 -6
- sphinx/util/inspect.py +29 -12
- sphinx/util/inventory.py +47 -29
- sphinx/util/logging.py +58 -85
- sphinx/util/matching.py +3 -3
- sphinx/util/math.py +1 -1
- sphinx/util/nodes.py +176 -108
- sphinx/util/osutil.py +13 -10
- sphinx/util/parallel.py +5 -4
- sphinx/util/parsing.py +5 -3
- sphinx/util/png.py +3 -3
- sphinx/util/requests.py +8 -4
- sphinx/util/rst.py +5 -3
- sphinx/util/tags.py +5 -2
- sphinx/util/template.py +26 -11
- sphinx/util/texescape.py +2 -2
- sphinx/util/typing.py +89 -38
- sphinx/versioning.py +3 -1
- sphinx/writers/html.py +22 -7
- sphinx/writers/html5.py +113 -64
- sphinx/writers/latex.py +408 -221
- sphinx/writers/manpage.py +25 -15
- sphinx/writers/texinfo.py +94 -82
- sphinx/writers/text.py +87 -53
- sphinx/writers/xml.py +5 -4
- sphinx-8.1.1.dist-info/LICENSE.rst +31 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.1.dist-info}/METADATA +13 -11
- sphinx-8.1.1.dist-info/RECORD +598 -0
- sphinx-8.0.2.dist-info/LICENSE.rst +0 -67
- sphinx-8.0.2.dist-info/RECORD +0 -590
- {sphinx-8.0.2.dist-info → sphinx-8.1.1.dist-info}/WHEEL +0 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.1.dist-info}/entry_points.txt +0 -0
|
@@ -40,10 +40,10 @@ if TYPE_CHECKING:
|
|
|
40
40
|
tuple[
|
|
41
41
|
_IndexEntryTargets,
|
|
42
42
|
list[tuple[str, _IndexEntryTargets]],
|
|
43
|
-
_IndexEntryCategoryKey
|
|
44
|
-
]
|
|
43
|
+
_IndexEntryCategoryKey,
|
|
44
|
+
],
|
|
45
45
|
]
|
|
46
|
-
]
|
|
46
|
+
],
|
|
47
47
|
]
|
|
48
48
|
]
|
|
49
49
|
|
|
@@ -65,7 +65,7 @@ class IndexEntries:
|
|
|
65
65
|
new: _IndexEntryMap = {}
|
|
66
66
|
|
|
67
67
|
rel_uri: str | Literal[False]
|
|
68
|
-
index_domain = self.env.domains
|
|
68
|
+
index_domain = self.env.domains.index_domain
|
|
69
69
|
for docname, entries in index_domain.entries.items():
|
|
70
70
|
try:
|
|
71
71
|
rel_uri = builder.get_relative_uri('genindex', docname)
|
|
@@ -80,41 +80,77 @@ class IndexEntries:
|
|
|
80
80
|
try:
|
|
81
81
|
entry, sub_entry = _split_into(2, 'single', value)
|
|
82
82
|
except ValueError:
|
|
83
|
-
entry, = _split_into(1, 'single', value)
|
|
83
|
+
(entry,) = _split_into(1, 'single', value)
|
|
84
84
|
sub_entry = ''
|
|
85
|
-
_add_entry(
|
|
86
|
-
|
|
85
|
+
_add_entry(
|
|
86
|
+
entry, sub_entry, main, dic=new, link=uri, key=category_key
|
|
87
|
+
)
|
|
87
88
|
elif entry_type == 'pair':
|
|
88
89
|
first, second = _split_into(2, 'pair', value)
|
|
89
|
-
_add_entry(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
_add_entry(
|
|
91
|
+
first, second, main, dic=new, link=uri, key=category_key
|
|
92
|
+
)
|
|
93
|
+
_add_entry(
|
|
94
|
+
second, first, main, dic=new, link=uri, key=category_key
|
|
95
|
+
)
|
|
93
96
|
elif entry_type == 'triple':
|
|
94
97
|
first, second, third = _split_into(3, 'triple', value)
|
|
95
|
-
_add_entry(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
_add_entry(
|
|
99
|
+
first,
|
|
100
|
+
second + ' ' + third,
|
|
101
|
+
main,
|
|
102
|
+
dic=new,
|
|
103
|
+
link=uri,
|
|
104
|
+
key=category_key,
|
|
105
|
+
)
|
|
106
|
+
_add_entry(
|
|
107
|
+
second,
|
|
108
|
+
third + ', ' + first,
|
|
109
|
+
main,
|
|
110
|
+
dic=new,
|
|
111
|
+
link=uri,
|
|
112
|
+
key=category_key,
|
|
113
|
+
)
|
|
114
|
+
_add_entry(
|
|
115
|
+
third,
|
|
116
|
+
first + ' ' + second,
|
|
117
|
+
main,
|
|
118
|
+
dic=new,
|
|
119
|
+
link=uri,
|
|
120
|
+
key=category_key,
|
|
121
|
+
)
|
|
101
122
|
elif entry_type == 'see':
|
|
102
123
|
first, second = _split_into(2, 'see', value)
|
|
103
|
-
_add_entry(
|
|
104
|
-
|
|
124
|
+
_add_entry(
|
|
125
|
+
first,
|
|
126
|
+
_('see %s') % second,
|
|
127
|
+
None,
|
|
128
|
+
dic=new,
|
|
129
|
+
link=False,
|
|
130
|
+
key=category_key,
|
|
131
|
+
)
|
|
105
132
|
elif entry_type == 'seealso':
|
|
106
133
|
first, second = _split_into(2, 'see', value)
|
|
107
|
-
_add_entry(
|
|
108
|
-
|
|
134
|
+
_add_entry(
|
|
135
|
+
first,
|
|
136
|
+
_('see also %s') % second,
|
|
137
|
+
None,
|
|
138
|
+
dic=new,
|
|
139
|
+
link=False,
|
|
140
|
+
key=category_key,
|
|
141
|
+
)
|
|
109
142
|
else:
|
|
110
|
-
logger.warning(
|
|
111
|
-
|
|
143
|
+
logger.warning(
|
|
144
|
+
__('unknown index entry type %r'),
|
|
145
|
+
entry_type,
|
|
146
|
+
location=docname,
|
|
147
|
+
)
|
|
112
148
|
except ValueError as err:
|
|
113
149
|
logger.warning(str(err), location=docname)
|
|
114
150
|
|
|
115
|
-
for
|
|
151
|
+
for targets, sub_items, _category_key in new.values():
|
|
116
152
|
targets.sort(key=_key_func_0)
|
|
117
|
-
for
|
|
153
|
+
for sub_targets, _sub_category_key in sub_items.values():
|
|
118
154
|
sub_targets.sort(key=_key_func_0)
|
|
119
155
|
|
|
120
156
|
new_list: list[tuple[str, _IndexEntry]] = sorted(new.items(), key=_key_func_1)
|
|
@@ -139,8 +175,8 @@ class IndexEntries:
|
|
|
139
175
|
if old_key == m.group(1):
|
|
140
176
|
# prefixes match: add entry as subitem of the
|
|
141
177
|
# previous entry
|
|
142
|
-
old_sub_items.setdefault(
|
|
143
|
-
|
|
178
|
+
prev = old_sub_items.setdefault(m[2], ([], category_key))
|
|
179
|
+
prev[0].extend(targets)
|
|
144
180
|
del new_list[i]
|
|
145
181
|
continue
|
|
146
182
|
old_key = m.group(1)
|
|
@@ -150,14 +186,13 @@ class IndexEntries:
|
|
|
150
186
|
i += 1
|
|
151
187
|
|
|
152
188
|
grouped = []
|
|
153
|
-
for
|
|
189
|
+
for group_key, group in groupby(new_list, _group_by_func):
|
|
154
190
|
group_list = []
|
|
155
191
|
for group_entry in group:
|
|
156
192
|
entry_key, (targets, sub_items, category_key) = group_entry
|
|
157
193
|
pairs = [
|
|
158
194
|
(sub_key, sub_targets)
|
|
159
|
-
for (sub_key, (sub_targets, _sub_category_key))
|
|
160
|
-
in sub_items.items()
|
|
195
|
+
for (sub_key, (sub_targets, _sub_category_key)) in sub_items.items()
|
|
161
196
|
]
|
|
162
197
|
pairs.sort(key=_key_func_2)
|
|
163
198
|
group_list.append((entry_key, (targets, pairs, category_key)))
|
|
@@ -165,9 +200,15 @@ class IndexEntries:
|
|
|
165
200
|
return grouped
|
|
166
201
|
|
|
167
202
|
|
|
168
|
-
def _add_entry(
|
|
169
|
-
|
|
170
|
-
|
|
203
|
+
def _add_entry(
|
|
204
|
+
word: str,
|
|
205
|
+
subword: str,
|
|
206
|
+
main: str | None,
|
|
207
|
+
*,
|
|
208
|
+
dic: _IndexEntryMap,
|
|
209
|
+
link: str | Literal[False],
|
|
210
|
+
key: _IndexEntryCategoryKey,
|
|
211
|
+
) -> None:
|
|
171
212
|
entry = dic.setdefault(word, ([], {}, key))
|
|
172
213
|
if subword:
|
|
173
214
|
targets = entry[1].setdefault(subword, ([], key))[0]
|
|
@@ -24,7 +24,9 @@ if TYPE_CHECKING:
|
|
|
24
24
|
logger = logging.getLogger(__name__)
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def note_toctree(
|
|
27
|
+
def note_toctree(
|
|
28
|
+
env: BuildEnvironment, docname: str, toctreenode: addnodes.toctree
|
|
29
|
+
) -> None:
|
|
28
30
|
"""Note a TOC tree directive in a document and gather information about
|
|
29
31
|
file relations from it.
|
|
30
32
|
"""
|
|
@@ -87,9 +89,7 @@ def global_toctree_for_doc(
|
|
|
87
89
|
)
|
|
88
90
|
for toctree_node in env.master_doctree.findall(addnodes.toctree)
|
|
89
91
|
)
|
|
90
|
-
toctrees = [
|
|
91
|
-
toctree for toctree in resolved if toctree is not None
|
|
92
|
-
]
|
|
92
|
+
toctrees = [toctree for toctree in resolved if toctree is not None]
|
|
93
93
|
|
|
94
94
|
if not toctrees:
|
|
95
95
|
return None
|
|
@@ -100,9 +100,16 @@ def global_toctree_for_doc(
|
|
|
100
100
|
|
|
101
101
|
|
|
102
102
|
def _resolve_toctree(
|
|
103
|
-
env: BuildEnvironment,
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
env: BuildEnvironment,
|
|
104
|
+
docname: str,
|
|
105
|
+
builder: Builder,
|
|
106
|
+
toctree: addnodes.toctree,
|
|
107
|
+
*,
|
|
108
|
+
prune: bool = True,
|
|
109
|
+
maxdepth: int = 0,
|
|
110
|
+
titles_only: bool = False,
|
|
111
|
+
collapse: bool = False,
|
|
112
|
+
includehidden: bool = False,
|
|
106
113
|
) -> Element | None:
|
|
107
114
|
"""Resolve a *toctree* node into individual bullet lists with titles
|
|
108
115
|
as items, returning None (if no containing titles are found) or
|
|
@@ -178,9 +185,13 @@ def _resolve_toctree(
|
|
|
178
185
|
|
|
179
186
|
# prune the tree to maxdepth, also set toc depth and current classes
|
|
180
187
|
_toctree_add_classes(newnode, 1, docname)
|
|
181
|
-
newnode = _toctree_copy(
|
|
188
|
+
newnode = _toctree_copy(
|
|
189
|
+
newnode, 1, maxdepth if prune else 0, collapse, builder.tags
|
|
190
|
+
)
|
|
182
191
|
|
|
183
|
-
if
|
|
192
|
+
if (
|
|
193
|
+
isinstance(newnode[-1], nodes.Element) and len(newnode[-1]) == 0
|
|
194
|
+
): # No titles found
|
|
184
195
|
return None
|
|
185
196
|
|
|
186
197
|
# set the target paths in the toctrees (they are not known at TOC
|
|
@@ -208,11 +219,20 @@ def _entries_from_toctree(
|
|
|
208
219
|
) -> list[Element]:
|
|
209
220
|
"""Return TOC entries for a toctree node."""
|
|
210
221
|
entries: list[Element] = []
|
|
211
|
-
for
|
|
222
|
+
for title, ref in toctreenode['entries']:
|
|
212
223
|
try:
|
|
213
224
|
toc, refdoc = _toctree_entry(
|
|
214
|
-
title,
|
|
215
|
-
|
|
225
|
+
title,
|
|
226
|
+
ref,
|
|
227
|
+
env,
|
|
228
|
+
prune,
|
|
229
|
+
collapse,
|
|
230
|
+
tags,
|
|
231
|
+
toctree_ancestors,
|
|
232
|
+
included,
|
|
233
|
+
excluded,
|
|
234
|
+
toctreenode,
|
|
235
|
+
parents,
|
|
216
236
|
)
|
|
217
237
|
except LookupError:
|
|
218
238
|
continue
|
|
@@ -294,10 +314,14 @@ def _toctree_entry(
|
|
|
294
314
|
toc = _toctree_generated_entry(title, ref)
|
|
295
315
|
else:
|
|
296
316
|
if ref in parents:
|
|
297
|
-
logger.warning(
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
317
|
+
logger.warning(
|
|
318
|
+
__('circular toctree references ' 'detected, ignoring: %s <- %s'),
|
|
319
|
+
ref,
|
|
320
|
+
' <- '.join(parents),
|
|
321
|
+
location=ref,
|
|
322
|
+
type='toc',
|
|
323
|
+
subtype='circular',
|
|
324
|
+
)
|
|
301
325
|
msg = 'circular reference'
|
|
302
326
|
raise LookupError(msg)
|
|
303
327
|
|
|
@@ -314,9 +338,16 @@ def _toctree_entry(
|
|
|
314
338
|
|
|
315
339
|
if not toc.children:
|
|
316
340
|
# empty toc means: no titles will show up in the toctree
|
|
317
|
-
logger.warning(
|
|
318
|
-
|
|
319
|
-
|
|
341
|
+
logger.warning(
|
|
342
|
+
__(
|
|
343
|
+
'toctree contains reference to document %r that '
|
|
344
|
+
"doesn't have a title: no link will be generated"
|
|
345
|
+
),
|
|
346
|
+
ref,
|
|
347
|
+
location=toctreenode,
|
|
348
|
+
type='toc',
|
|
349
|
+
subtype='no_title',
|
|
350
|
+
)
|
|
320
351
|
except KeyError:
|
|
321
352
|
# this is raised if the included file does not exist
|
|
322
353
|
ref_path = str(env.doc2path(ref, False))
|
|
@@ -335,9 +366,9 @@ def _toctree_entry(
|
|
|
335
366
|
def _toctree_url_entry(title: str, ref: str) -> nodes.bullet_list:
|
|
336
367
|
if title is None:
|
|
337
368
|
title = ref
|
|
338
|
-
reference = nodes.reference(
|
|
339
|
-
|
|
340
|
-
|
|
369
|
+
reference = nodes.reference(
|
|
370
|
+
'', '', internal=False, refuri=ref, anchorname='', *[nodes.Text(title)]
|
|
371
|
+
)
|
|
341
372
|
para = addnodes.compact_paragraph('', '', reference)
|
|
342
373
|
item = nodes.list_item('', para)
|
|
343
374
|
toc = nodes.bullet_list('', item)
|
|
@@ -345,16 +376,17 @@ def _toctree_url_entry(title: str, ref: str) -> nodes.bullet_list:
|
|
|
345
376
|
|
|
346
377
|
|
|
347
378
|
def _toctree_self_entry(
|
|
348
|
-
title: str,
|
|
379
|
+
title: str,
|
|
380
|
+
ref: str,
|
|
381
|
+
titles: dict[str, nodes.title],
|
|
349
382
|
) -> nodes.bullet_list:
|
|
350
383
|
# 'self' refers to the document from which this
|
|
351
384
|
# toctree originates
|
|
352
385
|
if not title:
|
|
353
386
|
title = clean_astext(titles[ref])
|
|
354
|
-
reference = nodes.reference(
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
*[nodes.Text(title)])
|
|
387
|
+
reference = nodes.reference(
|
|
388
|
+
'', '', internal=True, refuri=ref, anchorname='', *[nodes.Text(title)]
|
|
389
|
+
)
|
|
358
390
|
para = addnodes.compact_paragraph('', '', reference)
|
|
359
391
|
item = nodes.list_item('', para)
|
|
360
392
|
# don't show subitems
|
|
@@ -368,8 +400,7 @@ def _toctree_generated_entry(title: str, ref: str) -> nodes.bullet_list:
|
|
|
368
400
|
docname, sectionname = StandardDomain._virtual_doc_names[ref]
|
|
369
401
|
if not title:
|
|
370
402
|
title = sectionname
|
|
371
|
-
reference = nodes.reference('', title, internal=True,
|
|
372
|
-
refuri=docname, anchorname='')
|
|
403
|
+
reference = nodes.reference('', title, internal=True, refuri=docname, anchorname='')
|
|
373
404
|
para = addnodes.compact_paragraph('', '', reference)
|
|
374
405
|
item = nodes.list_item('', para)
|
|
375
406
|
# don't show subitems
|
|
@@ -434,11 +465,13 @@ def _toctree_add_classes(node: Element, depth: int, docname: str) -> None:
|
|
|
434
465
|
ET = TypeVar('ET', bound=Element)
|
|
435
466
|
|
|
436
467
|
|
|
437
|
-
def _toctree_copy(
|
|
468
|
+
def _toctree_copy(
|
|
469
|
+
node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tags
|
|
470
|
+
) -> ET:
|
|
438
471
|
"""Utility: Cut and deep-copy a TOC at a specified depth."""
|
|
439
|
-
keep_bullet_list_sub_nodes =
|
|
440
|
-
|
|
441
|
-
|
|
472
|
+
keep_bullet_list_sub_nodes = depth <= 1 or (
|
|
473
|
+
(depth <= maxdepth or maxdepth <= 0) and (not collapse or 'iscurrent' in node)
|
|
474
|
+
)
|
|
442
475
|
|
|
443
476
|
copy = node.copy()
|
|
444
477
|
for subnode in node.children:
|
|
@@ -459,9 +492,15 @@ def _toctree_copy(node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tag
|
|
|
459
492
|
# only keep children if the only node matches the tags
|
|
460
493
|
if _only_node_keep_children(subnode, tags):
|
|
461
494
|
for child in subnode.children:
|
|
462
|
-
copy.append(
|
|
463
|
-
|
|
464
|
-
|
|
495
|
+
copy.append(
|
|
496
|
+
_toctree_copy(
|
|
497
|
+
child,
|
|
498
|
+
depth,
|
|
499
|
+
maxdepth,
|
|
500
|
+
collapse,
|
|
501
|
+
tags, # type: ignore[type-var]
|
|
502
|
+
)
|
|
503
|
+
)
|
|
465
504
|
elif isinstance(subnode, nodes.reference | nodes.title):
|
|
466
505
|
# deep copy references and captions
|
|
467
506
|
sub_node_copy = subnode.copy()
|
|
@@ -476,7 +515,8 @@ def _toctree_copy(node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tag
|
|
|
476
515
|
|
|
477
516
|
|
|
478
517
|
def _get_toctree_ancestors(
|
|
479
|
-
toctree_includes: dict[str, list[str]],
|
|
518
|
+
toctree_includes: dict[str, list[str]],
|
|
519
|
+
docname: str,
|
|
480
520
|
) -> Set[str]:
|
|
481
521
|
parent: dict[str, str] = {}
|
|
482
522
|
for p, children in toctree_includes.items():
|
|
@@ -497,11 +537,22 @@ class TocTree:
|
|
|
497
537
|
def note(self, docname: str, toctreenode: addnodes.toctree) -> None:
|
|
498
538
|
note_toctree(self.env, docname, toctreenode)
|
|
499
539
|
|
|
500
|
-
def resolve(
|
|
501
|
-
|
|
502
|
-
|
|
540
|
+
def resolve(
|
|
541
|
+
self,
|
|
542
|
+
docname: str,
|
|
543
|
+
builder: Builder,
|
|
544
|
+
toctree: addnodes.toctree,
|
|
545
|
+
prune: bool = True,
|
|
546
|
+
maxdepth: int = 0,
|
|
547
|
+
titles_only: bool = False,
|
|
548
|
+
collapse: bool = False,
|
|
549
|
+
includehidden: bool = False,
|
|
550
|
+
) -> Element | None:
|
|
503
551
|
return _resolve_toctree(
|
|
504
|
-
self.env,
|
|
552
|
+
self.env,
|
|
553
|
+
docname,
|
|
554
|
+
builder,
|
|
555
|
+
toctree,
|
|
505
556
|
prune=prune,
|
|
506
557
|
maxdepth=maxdepth,
|
|
507
558
|
titles_only=titles_only,
|
|
@@ -516,6 +567,12 @@ class TocTree:
|
|
|
516
567
|
return document_toc(self.env, docname, self.env.app.builder.tags)
|
|
517
568
|
|
|
518
569
|
def get_toctree_for(
|
|
519
|
-
self,
|
|
570
|
+
self,
|
|
571
|
+
docname: str,
|
|
572
|
+
builder: Builder,
|
|
573
|
+
collapse: bool,
|
|
574
|
+
**kwargs: Any,
|
|
520
575
|
) -> Element | None:
|
|
521
|
-
return global_toctree_for_doc(
|
|
576
|
+
return global_toctree_for_doc(
|
|
577
|
+
self.env, docname, builder, collapse=collapse, **kwargs
|
|
578
|
+
)
|
|
@@ -29,10 +29,10 @@ class EnvironmentCollector:
|
|
|
29
29
|
def enable(self, app: Sphinx) -> None:
|
|
30
30
|
assert self.listener_ids is None
|
|
31
31
|
self.listener_ids = {
|
|
32
|
-
'doctree-read':
|
|
33
|
-
'env-merge-info':
|
|
34
|
-
'env-purge-doc':
|
|
35
|
-
'env-get-updated':
|
|
32
|
+
'doctree-read': app.connect('doctree-read', self.process_doc),
|
|
33
|
+
'env-merge-info': app.connect('env-merge-info', self.merge_other),
|
|
34
|
+
'env-purge-doc': app.connect('env-purge-doc', self.clear_doc),
|
|
35
|
+
'env-get-updated': app.connect('env-get-updated', self.get_updated_docs),
|
|
36
36
|
'env-get-outdated': app.connect('env-get-outdated', self.get_outdated_docs),
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -51,8 +51,13 @@ class EnvironmentCollector:
|
|
|
51
51
|
"""
|
|
52
52
|
raise NotImplementedError
|
|
53
53
|
|
|
54
|
-
def merge_other(
|
|
55
|
-
|
|
54
|
+
def merge_other(
|
|
55
|
+
self,
|
|
56
|
+
app: Sphinx,
|
|
57
|
+
env: BuildEnvironment,
|
|
58
|
+
docnames: set[str],
|
|
59
|
+
other: BuildEnvironment,
|
|
60
|
+
) -> None:
|
|
56
61
|
"""Merge in specified data regarding docnames from a different `BuildEnvironment`
|
|
57
62
|
object which coming from a subprocess in parallel builds.
|
|
58
63
|
|
|
@@ -78,8 +83,14 @@ class EnvironmentCollector:
|
|
|
78
83
|
"""
|
|
79
84
|
return []
|
|
80
85
|
|
|
81
|
-
def get_outdated_docs(
|
|
82
|
-
|
|
86
|
+
def get_outdated_docs(
|
|
87
|
+
self,
|
|
88
|
+
app: Sphinx,
|
|
89
|
+
env: BuildEnvironment,
|
|
90
|
+
added: set[str],
|
|
91
|
+
changed: set[str],
|
|
92
|
+
removed: set[str],
|
|
93
|
+
) -> list[str]:
|
|
83
94
|
"""Return a list of docnames to re-read.
|
|
84
95
|
|
|
85
96
|
This method is called before reading the documents.
|
|
@@ -33,8 +33,13 @@ class ImageCollector(EnvironmentCollector):
|
|
|
33
33
|
def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
|
|
34
34
|
env.images.purge_doc(docname)
|
|
35
35
|
|
|
36
|
-
def merge_other(
|
|
37
|
-
|
|
36
|
+
def merge_other(
|
|
37
|
+
self,
|
|
38
|
+
app: Sphinx,
|
|
39
|
+
env: BuildEnvironment,
|
|
40
|
+
docnames: set[str],
|
|
41
|
+
other: BuildEnvironment,
|
|
42
|
+
) -> None:
|
|
38
43
|
env.images.merge_other(docnames, other.images)
|
|
39
44
|
|
|
40
45
|
def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
|
|
@@ -86,17 +91,26 @@ class ImageCollector(EnvironmentCollector):
|
|
|
86
91
|
for imgpath in candidates.values():
|
|
87
92
|
app.env.dependencies[docname].add(imgpath)
|
|
88
93
|
if not os.access(path.join(app.srcdir, imgpath), os.R_OK):
|
|
89
|
-
logger.warning(
|
|
90
|
-
|
|
94
|
+
logger.warning(
|
|
95
|
+
__('image file not readable: %s'),
|
|
96
|
+
imgpath,
|
|
97
|
+
location=node,
|
|
98
|
+
type='image',
|
|
99
|
+
subtype='not_readable',
|
|
100
|
+
)
|
|
91
101
|
continue
|
|
92
102
|
app.env.images.add_file(docname, imgpath)
|
|
93
103
|
|
|
94
|
-
def collect_candidates(
|
|
95
|
-
|
|
104
|
+
def collect_candidates(
|
|
105
|
+
self,
|
|
106
|
+
env: BuildEnvironment,
|
|
107
|
+
imgpath: str,
|
|
108
|
+
candidates: dict[str, str],
|
|
109
|
+
node: Node,
|
|
110
|
+
) -> None:
|
|
96
111
|
globbed: dict[str, list[str]] = {}
|
|
97
112
|
for filename in glob(imgpath):
|
|
98
|
-
new_imgpath = relative_path(path.join(env.srcdir, 'dummy'),
|
|
99
|
-
filename)
|
|
113
|
+
new_imgpath = relative_path(path.join(env.srcdir, 'dummy'), filename)
|
|
100
114
|
try:
|
|
101
115
|
mimetype = guess_mimetype(filename)
|
|
102
116
|
if mimetype is None:
|
|
@@ -105,8 +119,14 @@ class ImageCollector(EnvironmentCollector):
|
|
|
105
119
|
if mimetype not in candidates:
|
|
106
120
|
globbed.setdefault(mimetype, []).append(new_imgpath)
|
|
107
121
|
except OSError as err:
|
|
108
|
-
logger.warning(
|
|
109
|
-
|
|
122
|
+
logger.warning(
|
|
123
|
+
__('image file %s not readable: %s'),
|
|
124
|
+
filename,
|
|
125
|
+
err,
|
|
126
|
+
location=node,
|
|
127
|
+
type='image',
|
|
128
|
+
subtype='not_readable',
|
|
129
|
+
)
|
|
110
130
|
for key, files in globbed.items():
|
|
111
131
|
candidates[key] = min(files, key=len) # select by similarity
|
|
112
132
|
|
|
@@ -117,8 +137,13 @@ class DownloadFileCollector(EnvironmentCollector):
|
|
|
117
137
|
def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
|
|
118
138
|
env.dlfiles.purge_doc(docname)
|
|
119
139
|
|
|
120
|
-
def merge_other(
|
|
121
|
-
|
|
140
|
+
def merge_other(
|
|
141
|
+
self,
|
|
142
|
+
app: Sphinx,
|
|
143
|
+
env: BuildEnvironment,
|
|
144
|
+
docnames: set[str],
|
|
145
|
+
other: BuildEnvironment,
|
|
146
|
+
) -> None:
|
|
122
147
|
env.dlfiles.merge_other(docnames, other.dlfiles)
|
|
123
148
|
|
|
124
149
|
def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
|
|
@@ -131,10 +156,17 @@ class DownloadFileCollector(EnvironmentCollector):
|
|
|
131
156
|
rel_filename, filename = app.env.relfn2path(targetname, app.env.docname)
|
|
132
157
|
app.env.dependencies[app.env.docname].add(rel_filename)
|
|
133
158
|
if not os.access(filename, os.R_OK):
|
|
134
|
-
logger.warning(
|
|
135
|
-
|
|
159
|
+
logger.warning(
|
|
160
|
+
__('download file not readable: %s'),
|
|
161
|
+
filename,
|
|
162
|
+
location=node,
|
|
163
|
+
type='download',
|
|
164
|
+
subtype='not_readable',
|
|
165
|
+
)
|
|
136
166
|
continue
|
|
137
|
-
node['filename'] = app.env.dlfiles.add_file(
|
|
167
|
+
node['filename'] = app.env.dlfiles.add_file(
|
|
168
|
+
app.env.docname, rel_filename
|
|
169
|
+
)
|
|
138
170
|
|
|
139
171
|
|
|
140
172
|
def setup(app: Sphinx) -> ExtensionMetadata:
|
|
@@ -25,8 +25,13 @@ class DependenciesCollector(EnvironmentCollector):
|
|
|
25
25
|
def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
|
|
26
26
|
env.dependencies.pop(docname, None)
|
|
27
27
|
|
|
28
|
-
def merge_other(
|
|
29
|
-
|
|
28
|
+
def merge_other(
|
|
29
|
+
self,
|
|
30
|
+
app: Sphinx,
|
|
31
|
+
env: BuildEnvironment,
|
|
32
|
+
docnames: set[str],
|
|
33
|
+
other: BuildEnvironment,
|
|
34
|
+
) -> None:
|
|
30
35
|
for docname in docnames:
|
|
31
36
|
if docname in other.dependencies:
|
|
32
37
|
env.dependencies[docname] = other.dependencies[docname]
|
|
@@ -43,8 +48,7 @@ class DependenciesCollector(EnvironmentCollector):
|
|
|
43
48
|
# one relative to the srcdir
|
|
44
49
|
if isinstance(dep, bytes):
|
|
45
50
|
dep = dep.decode(fs_encoding)
|
|
46
|
-
relpath = relative_path(frompath,
|
|
47
|
-
path.normpath(path.join(cwd, dep)))
|
|
51
|
+
relpath = relative_path(frompath, path.normpath(path.join(cwd, dep)))
|
|
48
52
|
app.env.dependencies[app.env.docname].add(relpath)
|
|
49
53
|
|
|
50
54
|
|
|
@@ -20,8 +20,13 @@ class MetadataCollector(EnvironmentCollector):
|
|
|
20
20
|
def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
|
|
21
21
|
env.metadata.pop(docname, None)
|
|
22
22
|
|
|
23
|
-
def merge_other(
|
|
24
|
-
|
|
23
|
+
def merge_other(
|
|
24
|
+
self,
|
|
25
|
+
app: Sphinx,
|
|
26
|
+
env: BuildEnvironment,
|
|
27
|
+
docnames: set[str],
|
|
28
|
+
other: BuildEnvironment,
|
|
29
|
+
) -> None:
|
|
25
30
|
for docname in docnames:
|
|
26
31
|
env.metadata[docname] = other.metadata[docname]
|
|
27
32
|
|
|
@@ -22,8 +22,13 @@ class TitleCollector(EnvironmentCollector):
|
|
|
22
22
|
env.titles.pop(docname, None)
|
|
23
23
|
env.longtitles.pop(docname, None)
|
|
24
24
|
|
|
25
|
-
def merge_other(
|
|
26
|
-
|
|
25
|
+
def merge_other(
|
|
26
|
+
self,
|
|
27
|
+
app: Sphinx,
|
|
28
|
+
env: BuildEnvironment,
|
|
29
|
+
docnames: set[str],
|
|
30
|
+
other: BuildEnvironment,
|
|
31
|
+
) -> None:
|
|
27
32
|
for docname in docnames:
|
|
28
33
|
env.titles[docname] = other.titles[docname]
|
|
29
34
|
env.longtitles[docname] = other.longtitles[docname]
|