Sphinx 8.0.2__py3-none-any.whl → 8.1.0__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 +206 -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 +133 -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 +107 -39
- sphinx/texinputs/sphinxlatexadmonitions.sty +51 -35
- 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.0.dist-info/LICENSE.rst +31 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
- sphinx-8.1.0.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.0.dist-info}/WHEEL +0 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
sphinx/util/tags.py
CHANGED
|
@@ -69,8 +69,11 @@ class Tags:
|
|
|
69
69
|
|
|
70
70
|
@property
|
|
71
71
|
def tags(self) -> dict[str, Literal[True]]:
|
|
72
|
-
warnings.warn(
|
|
73
|
-
|
|
72
|
+
warnings.warn(
|
|
73
|
+
'Tags.tags is deprecated, use methods on Tags.',
|
|
74
|
+
RemovedInSphinx90Warning,
|
|
75
|
+
stacklevel=2,
|
|
76
|
+
)
|
|
74
77
|
return dict.fromkeys(self._tags, True)
|
|
75
78
|
|
|
76
79
|
def eval_condition(self, condition: str) -> bool:
|
sphinx/util/template.py
CHANGED
|
@@ -49,7 +49,7 @@ class FileRenderer(BaseRenderer):
|
|
|
49
49
|
|
|
50
50
|
@classmethod
|
|
51
51
|
def render_from_file(
|
|
52
|
-
cls: type[FileRenderer], filename: str, context: dict[str, Any]
|
|
52
|
+
cls: type[FileRenderer], filename: str, context: dict[str, Any]
|
|
53
53
|
) -> str:
|
|
54
54
|
dirname = os.path.dirname(filename)
|
|
55
55
|
basename = os.path.basename(filename)
|
|
@@ -57,21 +57,26 @@ class FileRenderer(BaseRenderer):
|
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
class SphinxRenderer(FileRenderer):
|
|
60
|
-
def __init__(
|
|
60
|
+
def __init__(
|
|
61
|
+
self, template_path: Sequence[str | os.PathLike[str]] | None = None
|
|
62
|
+
) -> None:
|
|
61
63
|
if template_path is None:
|
|
62
64
|
template_path = os.path.join(package_dir, 'templates')
|
|
63
65
|
super().__init__(template_path)
|
|
64
66
|
|
|
65
67
|
@classmethod
|
|
66
68
|
def render_from_file(
|
|
67
|
-
cls: type[FileRenderer], filename: str, context: dict[str, Any]
|
|
69
|
+
cls: type[FileRenderer], filename: str, context: dict[str, Any]
|
|
68
70
|
) -> str:
|
|
69
71
|
return FileRenderer.render_from_file(filename, context)
|
|
70
72
|
|
|
71
73
|
|
|
72
74
|
class LaTeXRenderer(SphinxRenderer):
|
|
73
|
-
def __init__(
|
|
74
|
-
|
|
75
|
+
def __init__(
|
|
76
|
+
self,
|
|
77
|
+
template_path: Sequence[str | os.PathLike[str]] | None = None,
|
|
78
|
+
latex_engine: str | None = None,
|
|
79
|
+
) -> None:
|
|
75
80
|
if template_path is None:
|
|
76
81
|
template_path = [os.path.join(package_dir, 'templates', 'latex')]
|
|
77
82
|
super().__init__(template_path)
|
|
@@ -93,8 +98,11 @@ class LaTeXRenderer(SphinxRenderer):
|
|
|
93
98
|
|
|
94
99
|
|
|
95
100
|
class ReSTRenderer(SphinxRenderer):
|
|
96
|
-
def __init__(
|
|
97
|
-
|
|
101
|
+
def __init__(
|
|
102
|
+
self,
|
|
103
|
+
template_path: Sequence[str | os.PathLike[str]] | None = None,
|
|
104
|
+
language: str | None = None,
|
|
105
|
+
) -> None:
|
|
98
106
|
super().__init__(template_path)
|
|
99
107
|
|
|
100
108
|
# add language to environment
|
|
@@ -109,9 +117,12 @@ class ReSTRenderer(SphinxRenderer):
|
|
|
109
117
|
class SphinxTemplateLoader(BaseLoader):
|
|
110
118
|
"""A loader supporting template inheritance"""
|
|
111
119
|
|
|
112
|
-
def __init__(
|
|
113
|
-
|
|
114
|
-
|
|
120
|
+
def __init__(
|
|
121
|
+
self,
|
|
122
|
+
confdir: str | os.PathLike[str],
|
|
123
|
+
templates_paths: Sequence[str | os.PathLike[str]],
|
|
124
|
+
system_templates_paths: Sequence[str | os.PathLike[str]],
|
|
125
|
+
) -> None:
|
|
115
126
|
self.loaders = []
|
|
116
127
|
self.sysloaders = []
|
|
117
128
|
|
|
@@ -124,7 +135,11 @@ class SphinxTemplateLoader(BaseLoader):
|
|
|
124
135
|
self.loaders.append(loader)
|
|
125
136
|
self.sysloaders.append(loader)
|
|
126
137
|
|
|
127
|
-
def get_source(
|
|
138
|
+
def get_source(
|
|
139
|
+
self,
|
|
140
|
+
environment: Environment,
|
|
141
|
+
template: str,
|
|
142
|
+
) -> tuple[str, str, Callable[[], bool]]:
|
|
128
143
|
if template.startswith('!'):
|
|
129
144
|
# search a template from ``system_templates_paths``
|
|
130
145
|
loaders = self.sysloaders
|
sphinx/util/texescape.py
CHANGED
|
@@ -47,8 +47,8 @@ ascii_tex_replacements = [
|
|
|
47
47
|
# complications (whether by {}, or a macro) and is not done
|
|
48
48
|
# the next two require textcomp package
|
|
49
49
|
("'", r'\textquotesingle{}'), # else ' renders curly, and '' is a ligature
|
|
50
|
-
('`', r'\textasciigrave{}'),
|
|
51
|
-
('<', r'\textless{}'),
|
|
50
|
+
('`', r'\textasciigrave{}'), # else \` and \`\` render curly
|
|
51
|
+
('<', r'\textless{}'), # < is inv. exclam in OT1, << is a T1-ligature
|
|
52
52
|
('>', r'\textgreater{}'), # > is inv. quest. mark in 0T1, >> a T1-ligature
|
|
53
53
|
]
|
|
54
54
|
|
sphinx/util/typing.py
CHANGED
|
@@ -23,6 +23,8 @@ from typing import (
|
|
|
23
23
|
from docutils import nodes
|
|
24
24
|
from docutils.parsers.rst.states import Inliner
|
|
25
25
|
|
|
26
|
+
from sphinx.util import logging
|
|
27
|
+
|
|
26
28
|
if TYPE_CHECKING:
|
|
27
29
|
from collections.abc import Mapping
|
|
28
30
|
from typing import Final, Literal, Protocol, TypeAlias
|
|
@@ -41,6 +43,8 @@ if TYPE_CHECKING:
|
|
|
41
43
|
'smart',
|
|
42
44
|
]
|
|
43
45
|
|
|
46
|
+
logger = logging.getLogger(__name__)
|
|
47
|
+
|
|
44
48
|
|
|
45
49
|
# classes that have an incorrect .__module__ attribute
|
|
46
50
|
_INVALID_BUILTIN_CLASSES: Final[Mapping[object, str]] = {
|
|
@@ -88,8 +92,9 @@ PathMatcher: TypeAlias = Callable[[str], bool]
|
|
|
88
92
|
|
|
89
93
|
# common role functions
|
|
90
94
|
if TYPE_CHECKING:
|
|
95
|
+
|
|
91
96
|
class RoleFunction(Protocol):
|
|
92
|
-
def __call__(
|
|
97
|
+
def __call__( # NoQA: E704
|
|
93
98
|
self,
|
|
94
99
|
name: str,
|
|
95
100
|
rawtext: str,
|
|
@@ -99,8 +104,8 @@ if TYPE_CHECKING:
|
|
|
99
104
|
/,
|
|
100
105
|
options: dict[str, Any] | None = None,
|
|
101
106
|
content: Sequence[str] = (),
|
|
102
|
-
) -> tuple[list[nodes.Node], list[nodes.system_message]]:
|
|
103
|
-
|
|
107
|
+
) -> tuple[list[nodes.Node], list[nodes.system_message]]: ...
|
|
108
|
+
|
|
104
109
|
else:
|
|
105
110
|
RoleFunction: TypeAlias = Callable[
|
|
106
111
|
[str, str, str, int, Inliner, dict[str, Any], Sequence[str]],
|
|
@@ -113,6 +118,27 @@ OptionSpec: TypeAlias = dict[str, Callable[[str], Any]]
|
|
|
113
118
|
# title getter functions for enumerable nodes (see sphinx.domains.std)
|
|
114
119
|
TitleGetter: TypeAlias = Callable[[nodes.Node], str]
|
|
115
120
|
|
|
121
|
+
# Readable file stream for inventory loading
|
|
122
|
+
if TYPE_CHECKING:
|
|
123
|
+
from types import TracebackType
|
|
124
|
+
|
|
125
|
+
from typing_extensions import Self
|
|
126
|
+
|
|
127
|
+
_T_co = TypeVar('_T_co', str, bytes, covariant=True)
|
|
128
|
+
|
|
129
|
+
class _ReadableStream(Protocol[_T_co]):
|
|
130
|
+
def read(self, size: int = ...) -> _T_co: ... # NoQA: E704
|
|
131
|
+
|
|
132
|
+
def __enter__(self) -> Self: ... # NoQA: E704
|
|
133
|
+
|
|
134
|
+
def __exit__( # NoQA: E704
|
|
135
|
+
self,
|
|
136
|
+
exc_type: type[BaseException] | None,
|
|
137
|
+
exc_val: BaseException | None,
|
|
138
|
+
exc_tb: TracebackType | None,
|
|
139
|
+
) -> None: ...
|
|
140
|
+
|
|
141
|
+
|
|
116
142
|
# inventory data on memory
|
|
117
143
|
InventoryItem: TypeAlias = tuple[
|
|
118
144
|
str, # project name
|
|
@@ -162,7 +188,9 @@ def get_type_hints(
|
|
|
162
188
|
from sphinx.util.inspect import safe_getattr # lazy loading
|
|
163
189
|
|
|
164
190
|
try:
|
|
165
|
-
return typing.get_type_hints(
|
|
191
|
+
return typing.get_type_hints(
|
|
192
|
+
obj, globalns, localns, include_extras=include_extras
|
|
193
|
+
)
|
|
166
194
|
except NameError:
|
|
167
195
|
# Failed to evaluate ForwardRef (maybe TYPE_CHECKING)
|
|
168
196
|
return safe_getattr(obj, '__annotations__', {})
|
|
@@ -185,7 +213,10 @@ def is_system_TypeVar(typ: Any) -> bool:
|
|
|
185
213
|
|
|
186
214
|
def _is_annotated_form(obj: Any) -> TypeIs[Annotated[Any, ...]]:
|
|
187
215
|
"""Check if *obj* is an annotated type."""
|
|
188
|
-
return
|
|
216
|
+
return (
|
|
217
|
+
typing.get_origin(obj) is Annotated
|
|
218
|
+
or str(obj).startswith('typing.Annotated')
|
|
219
|
+
) # fmt: skip
|
|
189
220
|
|
|
190
221
|
|
|
191
222
|
def _is_unpack_form(obj: Any) -> bool:
|
|
@@ -259,18 +290,21 @@ def restify(cls: Any, mode: _RestifyMode = 'fully-qualified-except-typing') -> s
|
|
|
259
290
|
elif dataclasses.is_dataclass(m):
|
|
260
291
|
# use restify for the repr of field values rather than repr
|
|
261
292
|
d_fields = ', '.join([
|
|
262
|
-
|
|
263
|
-
for f in dataclasses.fields(m)
|
|
293
|
+
rf'{f.name}=\ {restify(getattr(m, f.name), mode)}'
|
|
294
|
+
for f in dataclasses.fields(m)
|
|
295
|
+
if f.repr
|
|
264
296
|
])
|
|
265
|
-
meta_args.append(
|
|
297
|
+
meta_args.append(rf'{restify(type(m), mode)}\ ({d_fields})')
|
|
266
298
|
else:
|
|
267
299
|
meta_args.append(repr(m))
|
|
268
300
|
meta = ', '.join(meta_args)
|
|
269
301
|
if sys.version_info[:2] <= (3, 11):
|
|
270
302
|
# Hardcoded to fix errors on Python 3.11 and earlier.
|
|
271
|
-
return
|
|
272
|
-
return (
|
|
273
|
-
|
|
303
|
+
return rf':py:class:`~typing.Annotated`\ [{args}, {meta}]'
|
|
304
|
+
return (
|
|
305
|
+
f':py:class:`{module_prefix}{cls.__module__}.{cls.__name__}`'
|
|
306
|
+
rf'\ [{args}, {meta}]'
|
|
307
|
+
)
|
|
274
308
|
elif isinstance(cls, NewType):
|
|
275
309
|
return f':py:class:`{module_prefix}{cls.__module__}.{cls.__name__}`' # type: ignore[attr-defined]
|
|
276
310
|
elif isinstance(cls, types.UnionType):
|
|
@@ -280,14 +314,14 @@ def restify(cls: Any, mode: _RestifyMode = 'fully-qualified-except-typing') -> s
|
|
|
280
314
|
elif cls.__module__ in ('__builtin__', 'builtins'):
|
|
281
315
|
if hasattr(cls, '__args__'):
|
|
282
316
|
if not cls.__args__: # Empty tuple, list, ...
|
|
283
|
-
return
|
|
317
|
+
return rf':py:class:`{cls.__name__}`\ [{cls.__args__!r}]'
|
|
284
318
|
|
|
285
|
-
concatenated_args = ', '.join(
|
|
286
|
-
|
|
319
|
+
concatenated_args = ', '.join(
|
|
320
|
+
restify(arg, mode) for arg in cls.__args__
|
|
321
|
+
)
|
|
322
|
+
return rf':py:class:`{cls.__name__}`\ [{concatenated_args}]'
|
|
287
323
|
return f':py:class:`{cls.__name__}`'
|
|
288
|
-
elif
|
|
289
|
-
and cls_module_is_typing
|
|
290
|
-
and cls.__origin__ is Union):
|
|
324
|
+
elif isgenericalias(cls) and cls_module_is_typing and cls.__origin__ is Union:
|
|
291
325
|
# *cls* is defined in ``typing``, and thus ``__args__`` must exist
|
|
292
326
|
return ' | '.join(restify(a, mode) for a in cls.__args__)
|
|
293
327
|
elif isgenericalias(cls):
|
|
@@ -311,19 +345,20 @@ def restify(cls: Any, mode: _RestifyMode = 'fully-qualified-except-typing') -> s
|
|
|
311
345
|
if (
|
|
312
346
|
(cls_module_is_typing and cls.__name__ == 'Callable')
|
|
313
347
|
or (cls.__module__ == 'collections.abc' and cls.__name__ == 'Callable')
|
|
314
|
-
):
|
|
348
|
+
): # fmt: skip
|
|
315
349
|
args = ', '.join(restify(a, mode) for a in __args__[:-1])
|
|
316
350
|
returns = restify(__args__[-1], mode)
|
|
317
|
-
return
|
|
351
|
+
return rf'{text}\ [[{args}], {returns}]'
|
|
318
352
|
|
|
319
353
|
if cls_module_is_typing and cls.__origin__.__name__ == 'Literal':
|
|
320
|
-
args = ', '.join(
|
|
321
|
-
|
|
322
|
-
|
|
354
|
+
args = ', '.join(
|
|
355
|
+
_format_literal_arg_restify(a, mode=mode) for a in cls.__args__
|
|
356
|
+
)
|
|
357
|
+
return rf'{text}\ [{args}]'
|
|
323
358
|
|
|
324
359
|
# generic representation of the parameters
|
|
325
360
|
args = ', '.join(restify(a, mode) for a in __args__)
|
|
326
|
-
return
|
|
361
|
+
return rf'{text}\ [{args}]'
|
|
327
362
|
elif isinstance(cls, typing._SpecialForm):
|
|
328
363
|
return f':py:obj:`~{cls.__module__}.{cls.__name__}`' # type: ignore[attr-defined]
|
|
329
364
|
elif sys.version_info[:2] >= (3, 11) and cls is typing.Any:
|
|
@@ -336,7 +371,8 @@ def restify(cls: Any, mode: _RestifyMode = 'fully-qualified-except-typing') -> s
|
|
|
336
371
|
else:
|
|
337
372
|
# not a class (ex. TypeVar) but should have a __name__
|
|
338
373
|
return f':py:obj:`{module_prefix}{cls.__module__}.{cls.__name__}`'
|
|
339
|
-
except (AttributeError, TypeError):
|
|
374
|
+
except (AttributeError, TypeError) as exc:
|
|
375
|
+
logger.debug('restify on %r in mode %r failed: %r', cls, mode, exc)
|
|
340
376
|
return object_description(cls)
|
|
341
377
|
|
|
342
378
|
|
|
@@ -347,7 +383,9 @@ def _format_literal_arg_restify(arg: Any, /, *, mode: str) -> str:
|
|
|
347
383
|
enum_cls = arg.__class__
|
|
348
384
|
if mode == 'smart' or enum_cls.__module__ == 'typing':
|
|
349
385
|
# MyEnum.member
|
|
350
|
-
return
|
|
386
|
+
return (
|
|
387
|
+
f':py:attr:`~{enum_cls.__module__}.{enum_cls.__qualname__}.{arg.name}`'
|
|
388
|
+
)
|
|
351
389
|
# module.MyEnum.member
|
|
352
390
|
return f':py:attr:`{enum_cls.__module__}.{enum_cls.__qualname__}.{arg.name}`'
|
|
353
391
|
return repr(arg)
|
|
@@ -403,7 +441,10 @@ def stringify_annotation(
|
|
|
403
441
|
# Extract the annotation's base type by considering formattable cases
|
|
404
442
|
if isinstance(annotation, TypeVar) and not _is_unpack_form(annotation):
|
|
405
443
|
# typing_extensions.Unpack is incorrectly determined as a TypeVar
|
|
406
|
-
if annotation_module_is_typing and mode in {
|
|
444
|
+
if annotation_module_is_typing and mode in {
|
|
445
|
+
'fully-qualified-except-typing',
|
|
446
|
+
'smart',
|
|
447
|
+
}:
|
|
407
448
|
return annotation_name
|
|
408
449
|
return module_prefix + f'{annotation_module}.{annotation_name}'
|
|
409
450
|
elif isinstance(annotation, NewType):
|
|
@@ -433,7 +474,9 @@ def stringify_annotation(
|
|
|
433
474
|
|
|
434
475
|
module_prefix = f'{annotation_module}.'
|
|
435
476
|
annotation_forward_arg: str | None = getattr(annotation, '__forward_arg__', None)
|
|
436
|
-
if annotation_qualname or (
|
|
477
|
+
if annotation_qualname or (
|
|
478
|
+
annotation_module_is_typing and not annotation_forward_arg
|
|
479
|
+
):
|
|
437
480
|
if mode == 'smart':
|
|
438
481
|
module_prefix = f'~{module_prefix}'
|
|
439
482
|
if annotation_module_is_typing and mode == 'fully-qualified-except-typing':
|
|
@@ -456,7 +499,8 @@ def stringify_annotation(
|
|
|
456
499
|
# in this case, we know that the annotation is a member
|
|
457
500
|
# of ``typing`` and all of them define ``__origin__``
|
|
458
501
|
qualname = stringify_annotation(
|
|
459
|
-
annotation.__origin__,
|
|
502
|
+
annotation.__origin__,
|
|
503
|
+
'fully-qualified-except-typing',
|
|
460
504
|
).replace('typing.', '') # ex. Union
|
|
461
505
|
elif annotation_qualname:
|
|
462
506
|
qualname = annotation_qualname
|
|
@@ -477,21 +521,25 @@ def stringify_annotation(
|
|
|
477
521
|
if (
|
|
478
522
|
qualname in {'Union', 'types.UnionType'}
|
|
479
523
|
and all(getattr(a, '__origin__', ...) is typing.Literal for a in annotation_args)
|
|
480
|
-
):
|
|
524
|
+
): # fmt: skip
|
|
481
525
|
# special case to flatten a Union of Literals into a literal
|
|
482
526
|
flattened_args = typing.Literal[annotation_args].__args__ # type: ignore[attr-defined]
|
|
483
|
-
args = ', '.join(
|
|
484
|
-
|
|
527
|
+
args = ', '.join(
|
|
528
|
+
_format_literal_arg_stringify(a, mode=mode) for a in flattened_args
|
|
529
|
+
)
|
|
485
530
|
return f'{module_prefix}Literal[{args}]'
|
|
486
531
|
if qualname in {'Optional', 'Union', 'types.UnionType'}:
|
|
487
532
|
return ' | '.join(stringify_annotation(a, mode) for a in annotation_args)
|
|
488
533
|
elif qualname == 'Callable':
|
|
489
|
-
args = ', '.join(
|
|
534
|
+
args = ', '.join(
|
|
535
|
+
stringify_annotation(a, mode) for a in annotation_args[:-1]
|
|
536
|
+
)
|
|
490
537
|
returns = stringify_annotation(annotation_args[-1], mode)
|
|
491
538
|
return f'{module_prefix}Callable[[{args}], {returns}]'
|
|
492
539
|
elif qualname == 'Literal':
|
|
493
|
-
args = ', '.join(
|
|
494
|
-
|
|
540
|
+
args = ', '.join(
|
|
541
|
+
_format_literal_arg_stringify(a, mode=mode) for a in annotation_args
|
|
542
|
+
)
|
|
495
543
|
return f'{module_prefix}Literal[{args}]'
|
|
496
544
|
elif _is_annotated_form(annotation): # for py310+
|
|
497
545
|
args = stringify_annotation(annotation_args[0], mode)
|
|
@@ -502,10 +550,13 @@ def stringify_annotation(
|
|
|
502
550
|
elif dataclasses.is_dataclass(m):
|
|
503
551
|
# use stringify_annotation for the repr of field values rather than repr
|
|
504
552
|
d_fields = ', '.join([
|
|
505
|
-
f
|
|
506
|
-
for f in dataclasses.fields(m)
|
|
553
|
+
f'{f.name}={stringify_annotation(getattr(m, f.name), mode)}'
|
|
554
|
+
for f in dataclasses.fields(m)
|
|
555
|
+
if f.repr
|
|
507
556
|
])
|
|
508
|
-
meta_args.append(
|
|
557
|
+
meta_args.append(
|
|
558
|
+
f'{stringify_annotation(type(m), mode)}({d_fields})'
|
|
559
|
+
)
|
|
509
560
|
else:
|
|
510
561
|
meta_args.append(repr(m))
|
|
511
562
|
meta = ', '.join(meta_args)
|
|
@@ -540,7 +591,7 @@ def _format_literal_arg_stringify(arg: Any, /, *, mode: str) -> str:
|
|
|
540
591
|
|
|
541
592
|
# deprecated name -> (object to return, canonical path or empty string, removal version)
|
|
542
593
|
_DEPRECATED_OBJECTS: dict[str, tuple[Any, str, tuple[int, int]]] = {
|
|
543
|
-
}
|
|
594
|
+
} # fmt: skip
|
|
544
595
|
|
|
545
596
|
|
|
546
597
|
def __getattr__(name: str) -> Any:
|
sphinx/versioning.py
CHANGED
|
@@ -45,7 +45,9 @@ def add_uids(doctree: Node, condition: Callable[[Node], bool]) -> Iterator[Node]
|
|
|
45
45
|
yield node
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def merge_doctrees(
|
|
48
|
+
def merge_doctrees(
|
|
49
|
+
old: Node, new: Node, condition: Callable[[Node], bool]
|
|
50
|
+
) -> Iterator[Node]:
|
|
49
51
|
"""Merge the `old` doctree with the `new` one while looking at nodes
|
|
50
52
|
matching the `condition`.
|
|
51
53
|
|
sphinx/writers/html.py
CHANGED
|
@@ -21,9 +21,8 @@ HTMLTranslator = HTML5Translator
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class HTMLWriter(Writer): # type: ignore[misc]
|
|
24
|
-
|
|
25
24
|
# override embed-stylesheet default value to False.
|
|
26
|
-
settings_default_overrides = {
|
|
25
|
+
settings_default_overrides = {'embed_stylesheet': False}
|
|
27
26
|
|
|
28
27
|
def __init__(self, builder: StandaloneHTMLBuilder) -> None:
|
|
29
28
|
super().__init__()
|
|
@@ -35,10 +34,26 @@ class HTMLWriter(Writer): # type: ignore[misc]
|
|
|
35
34
|
self.visitor = cast(HTML5Translator, visitor)
|
|
36
35
|
self.document.walkabout(visitor)
|
|
37
36
|
self.output = self.visitor.astext()
|
|
38
|
-
for attr in (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
for attr in (
|
|
38
|
+
'head_prefix',
|
|
39
|
+
'stylesheet',
|
|
40
|
+
'head',
|
|
41
|
+
'body_prefix',
|
|
42
|
+
'body_pre_docinfo',
|
|
43
|
+
'docinfo',
|
|
44
|
+
'body',
|
|
45
|
+
'fragment',
|
|
46
|
+
'body_suffix',
|
|
47
|
+
'meta',
|
|
48
|
+
'title',
|
|
49
|
+
'subtitle',
|
|
50
|
+
'header',
|
|
51
|
+
'footer',
|
|
52
|
+
'html_prolog',
|
|
53
|
+
'html_head',
|
|
54
|
+
'html_title',
|
|
55
|
+
'html_subtitle',
|
|
56
|
+
'html_body',
|
|
57
|
+
):
|
|
43
58
|
setattr(self, attr, getattr(visitor, attr, None))
|
|
44
59
|
self.clean_meta = ''.join(self.visitor.meta[2:])
|