Sphinx 8.0.1__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 +10 -3
- 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.1.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
- sphinx-8.1.0.dist-info/RECORD +598 -0
- sphinx-8.0.1.dist-info/LICENSE.rst +0 -67
- sphinx-8.0.1.dist-info/RECORD +0 -590
- {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/WHEEL +0 -0
- {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
|
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, TypeVar, cast
|
|
|
7
7
|
from docutils import nodes
|
|
8
8
|
|
|
9
9
|
from sphinx import addnodes
|
|
10
|
+
from sphinx.domains.std import StandardDomain
|
|
10
11
|
from sphinx.environment.adapters.toctree import note_toctree
|
|
11
12
|
from sphinx.environment.collectors import EnvironmentCollector
|
|
12
13
|
from sphinx.locale import __
|
|
@@ -42,8 +43,13 @@ class TocTreeCollector(EnvironmentCollector):
|
|
|
42
43
|
if not fnset:
|
|
43
44
|
del env.files_to_rebuild[subfn]
|
|
44
45
|
|
|
45
|
-
def merge_other(
|
|
46
|
-
|
|
46
|
+
def merge_other(
|
|
47
|
+
self,
|
|
48
|
+
app: Sphinx,
|
|
49
|
+
env: BuildEnvironment,
|
|
50
|
+
docnames: set[str],
|
|
51
|
+
other: BuildEnvironment,
|
|
52
|
+
) -> None:
|
|
47
53
|
for docname in docnames:
|
|
48
54
|
env.tocs[docname] = other.tocs[docname]
|
|
49
55
|
env.toc_num_entries[docname] = other.toc_num_entries[docname]
|
|
@@ -83,8 +89,13 @@ class TocTreeCollector(EnvironmentCollector):
|
|
|
83
89
|
# make these nodes:
|
|
84
90
|
# list_item -> compact_paragraph -> reference
|
|
85
91
|
reference = nodes.reference(
|
|
86
|
-
'',
|
|
87
|
-
|
|
92
|
+
'',
|
|
93
|
+
'',
|
|
94
|
+
internal=True,
|
|
95
|
+
refuri=docname,
|
|
96
|
+
anchorname=anchorname,
|
|
97
|
+
*nodetext,
|
|
98
|
+
)
|
|
88
99
|
para = addnodes.compact_paragraph('', '', reference)
|
|
89
100
|
item: Element = nodes.list_item('', para)
|
|
90
101
|
sub_item = build_toc(sectionnode, depth + 1)
|
|
@@ -135,15 +146,23 @@ class TocTreeCollector(EnvironmentCollector):
|
|
|
135
146
|
anchorname = _make_anchor_name(ids, numentries)
|
|
136
147
|
|
|
137
148
|
reference = nodes.reference(
|
|
138
|
-
'',
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
149
|
+
'',
|
|
150
|
+
'',
|
|
151
|
+
nodes.literal('', sig_node['_toc_name']),
|
|
152
|
+
internal=True,
|
|
153
|
+
refuri=docname,
|
|
154
|
+
anchorname=anchorname,
|
|
155
|
+
)
|
|
156
|
+
para = addnodes.compact_paragraph(
|
|
157
|
+
'', '', reference, skip_section_number=True
|
|
158
|
+
)
|
|
142
159
|
entry = nodes.list_item('', para)
|
|
143
160
|
|
|
144
161
|
# Find parent node
|
|
145
162
|
parent = sig_node.parent
|
|
146
|
-
while
|
|
163
|
+
while (
|
|
164
|
+
parent not in memo_parents and parent != sectionnode
|
|
165
|
+
):
|
|
147
166
|
parent = parent.parent
|
|
148
167
|
# Note, it may both be the limit and in memo_parents,
|
|
149
168
|
# prefer memo_parents, so we get the nesting.
|
|
@@ -230,14 +249,21 @@ class TocTreeCollector(EnvironmentCollector):
|
|
|
230
249
|
def _walk_toctree(toctreenode: addnodes.toctree, depth: int) -> None:
|
|
231
250
|
if depth == 0:
|
|
232
251
|
return
|
|
233
|
-
for
|
|
252
|
+
for _title, ref in toctreenode['entries']:
|
|
234
253
|
if url_re.match(ref) or ref == 'self':
|
|
235
254
|
# don't mess with those
|
|
236
255
|
continue
|
|
237
256
|
if ref in assigned:
|
|
238
|
-
logger.warning(
|
|
239
|
-
|
|
240
|
-
|
|
257
|
+
logger.warning(
|
|
258
|
+
__(
|
|
259
|
+
'%s is already assigned section numbers '
|
|
260
|
+
'(nested numbered toctree?)'
|
|
261
|
+
),
|
|
262
|
+
ref,
|
|
263
|
+
location=toctreenode,
|
|
264
|
+
type='toc',
|
|
265
|
+
subtype='secnum',
|
|
266
|
+
)
|
|
241
267
|
elif ref in env.tocs:
|
|
242
268
|
secnums: dict[str, tuple[int, ...]] = {}
|
|
243
269
|
env.toc_secnumbers[ref] = secnums
|
|
@@ -260,7 +286,7 @@ class TocTreeCollector(EnvironmentCollector):
|
|
|
260
286
|
|
|
261
287
|
def assign_figure_numbers(self, env: BuildEnvironment) -> list[str]:
|
|
262
288
|
"""Assign a figure number to each figure under a numbered toctree."""
|
|
263
|
-
generated_docnames = frozenset(env.domains
|
|
289
|
+
generated_docnames = frozenset(env.domains.standard_domain._virtual_doc_names)
|
|
264
290
|
|
|
265
291
|
rewrite_needed = []
|
|
266
292
|
|
|
@@ -270,10 +296,11 @@ class TocTreeCollector(EnvironmentCollector):
|
|
|
270
296
|
fignum_counter: dict[str, dict[tuple[int, ...], int]] = {}
|
|
271
297
|
|
|
272
298
|
def get_figtype(node: Node) -> str | None:
|
|
273
|
-
for domain in env.domains.
|
|
299
|
+
for domain in env.domains.sorted():
|
|
274
300
|
figtype = domain.get_enumerable_node_type(node)
|
|
275
|
-
if (domain
|
|
276
|
-
|
|
301
|
+
if isinstance(domain, StandardDomain) and not domain.get_numfig_title(
|
|
302
|
+
node
|
|
303
|
+
):
|
|
277
304
|
# Skip if uncaptioned node
|
|
278
305
|
continue
|
|
279
306
|
|
|
@@ -292,22 +319,27 @@ class TocTreeCollector(EnvironmentCollector):
|
|
|
292
319
|
|
|
293
320
|
return secnum or ()
|
|
294
321
|
|
|
295
|
-
def get_next_fignumber(
|
|
322
|
+
def get_next_fignumber(
|
|
323
|
+
figtype: str, secnum: tuple[int, ...]
|
|
324
|
+
) -> tuple[int, ...]:
|
|
296
325
|
counter = fignum_counter.setdefault(figtype, {})
|
|
297
326
|
|
|
298
|
-
secnum = secnum[:env.config.numfig_secnum_depth]
|
|
327
|
+
secnum = secnum[: env.config.numfig_secnum_depth]
|
|
299
328
|
counter[secnum] = counter.get(secnum, 0) + 1
|
|
300
329
|
return (*secnum, counter[secnum])
|
|
301
330
|
|
|
302
|
-
def register_fignumber(
|
|
303
|
-
|
|
331
|
+
def register_fignumber(
|
|
332
|
+
docname: str, secnum: tuple[int, ...], figtype: str, fignode: Element
|
|
333
|
+
) -> None:
|
|
304
334
|
env.toc_fignumbers.setdefault(docname, {})
|
|
305
335
|
fignumbers = env.toc_fignumbers[docname].setdefault(figtype, {})
|
|
306
336
|
figure_id = fignode['ids'][0]
|
|
307
337
|
|
|
308
338
|
fignumbers[figure_id] = get_next_fignumber(figtype, secnum)
|
|
309
339
|
|
|
310
|
-
def _walk_doctree(
|
|
340
|
+
def _walk_doctree(
|
|
341
|
+
docname: str, doctree: Element, secnum: tuple[int, ...]
|
|
342
|
+
) -> None:
|
|
311
343
|
nonlocal generated_docnames
|
|
312
344
|
for subnode in doctree.children:
|
|
313
345
|
if isinstance(subnode, nodes.section):
|
sphinx/errors.py
CHANGED
|
@@ -45,7 +45,10 @@ class ExtensionError(SphinxError):
|
|
|
45
45
|
"""Extension error."""
|
|
46
46
|
|
|
47
47
|
def __init__(
|
|
48
|
-
self,
|
|
48
|
+
self,
|
|
49
|
+
message: str,
|
|
50
|
+
orig_exc: Exception | None = None,
|
|
51
|
+
modname: str | None = None,
|
|
49
52
|
) -> None:
|
|
50
53
|
super().__init__(message)
|
|
51
54
|
self.message = message
|
sphinx/events.py
CHANGED
|
@@ -5,10 +5,9 @@ Gracefully adapted from the TextPress system by Armin.
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
-
import contextlib
|
|
9
8
|
from collections import defaultdict
|
|
10
9
|
from operator import attrgetter
|
|
11
|
-
from typing import TYPE_CHECKING,
|
|
10
|
+
from typing import TYPE_CHECKING, NamedTuple, overload
|
|
12
11
|
|
|
13
12
|
from sphinx.errors import ExtensionError, SphinxError
|
|
14
13
|
from sphinx.locale import __
|
|
@@ -16,9 +15,20 @@ from sphinx.util import logging
|
|
|
16
15
|
from sphinx.util.inspect import safe_getattr
|
|
17
16
|
|
|
18
17
|
if TYPE_CHECKING:
|
|
19
|
-
from collections.abc import Callable
|
|
18
|
+
from collections.abc import Callable, Iterable, Sequence, Set
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any, Literal
|
|
20
21
|
|
|
22
|
+
from docutils import nodes
|
|
23
|
+
|
|
24
|
+
from sphinx import addnodes
|
|
21
25
|
from sphinx.application import Sphinx
|
|
26
|
+
from sphinx.builders import Builder
|
|
27
|
+
from sphinx.config import Config
|
|
28
|
+
from sphinx.domains import Domain
|
|
29
|
+
from sphinx.environment import BuildEnvironment
|
|
30
|
+
from sphinx.ext.autodoc import _AutodocProcessDocstringListener
|
|
31
|
+
from sphinx.ext.todo import todo_node
|
|
22
32
|
|
|
23
33
|
|
|
24
34
|
logger = logging.getLogger(__name__)
|
|
@@ -67,6 +77,293 @@ class EventManager:
|
|
|
67
77
|
raise ExtensionError(__('Event %r already present') % name)
|
|
68
78
|
self.events[name] = ''
|
|
69
79
|
|
|
80
|
+
# ---- Core events -------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
@overload
|
|
83
|
+
def connect(
|
|
84
|
+
self,
|
|
85
|
+
name: Literal['config-inited'],
|
|
86
|
+
callback: Callable[[Sphinx, Config], None],
|
|
87
|
+
priority: int,
|
|
88
|
+
) -> int: ...
|
|
89
|
+
|
|
90
|
+
@overload
|
|
91
|
+
def connect(
|
|
92
|
+
self,
|
|
93
|
+
name: Literal['builder-inited'],
|
|
94
|
+
callback: Callable[[Sphinx], None],
|
|
95
|
+
priority: int,
|
|
96
|
+
) -> int: ...
|
|
97
|
+
|
|
98
|
+
@overload
|
|
99
|
+
def connect(
|
|
100
|
+
self,
|
|
101
|
+
name: Literal['env-get-outdated'],
|
|
102
|
+
callback: Callable[
|
|
103
|
+
[Sphinx, BuildEnvironment, Set[str], Set[str], Set[str]], Sequence[str]
|
|
104
|
+
],
|
|
105
|
+
priority: int,
|
|
106
|
+
) -> int: ...
|
|
107
|
+
|
|
108
|
+
@overload
|
|
109
|
+
def connect(
|
|
110
|
+
self,
|
|
111
|
+
name: Literal['env-before-read-docs'],
|
|
112
|
+
callback: Callable[[Sphinx, BuildEnvironment, list[str]], None],
|
|
113
|
+
priority: int,
|
|
114
|
+
) -> int: ...
|
|
115
|
+
|
|
116
|
+
@overload
|
|
117
|
+
def connect(
|
|
118
|
+
self,
|
|
119
|
+
name: Literal['env-purge-doc'],
|
|
120
|
+
callback: Callable[[Sphinx, BuildEnvironment, str], None],
|
|
121
|
+
priority: int,
|
|
122
|
+
) -> int: ...
|
|
123
|
+
|
|
124
|
+
@overload
|
|
125
|
+
def connect(
|
|
126
|
+
self,
|
|
127
|
+
name: Literal['source-read'],
|
|
128
|
+
callback: Callable[[Sphinx, str, list[str]], None],
|
|
129
|
+
priority: int,
|
|
130
|
+
) -> int: ...
|
|
131
|
+
|
|
132
|
+
@overload
|
|
133
|
+
def connect(
|
|
134
|
+
self,
|
|
135
|
+
name: Literal['include-read'],
|
|
136
|
+
callback: Callable[[Sphinx, Path, str, list[str]], None],
|
|
137
|
+
priority: int,
|
|
138
|
+
) -> int: ...
|
|
139
|
+
|
|
140
|
+
@overload
|
|
141
|
+
def connect(
|
|
142
|
+
self,
|
|
143
|
+
name: Literal['doctree-read'],
|
|
144
|
+
callback: Callable[[Sphinx, nodes.document], None],
|
|
145
|
+
priority: int,
|
|
146
|
+
) -> int: ...
|
|
147
|
+
|
|
148
|
+
@overload
|
|
149
|
+
def connect(
|
|
150
|
+
self,
|
|
151
|
+
name: Literal['env-merge-info'],
|
|
152
|
+
callback: Callable[
|
|
153
|
+
[Sphinx, BuildEnvironment, list[str], BuildEnvironment], None
|
|
154
|
+
],
|
|
155
|
+
priority: int,
|
|
156
|
+
) -> int: ...
|
|
157
|
+
|
|
158
|
+
@overload
|
|
159
|
+
def connect(
|
|
160
|
+
self,
|
|
161
|
+
name: Literal['env-updated'],
|
|
162
|
+
callback: Callable[[Sphinx, BuildEnvironment], str],
|
|
163
|
+
priority: int,
|
|
164
|
+
) -> int: ...
|
|
165
|
+
|
|
166
|
+
@overload
|
|
167
|
+
def connect(
|
|
168
|
+
self,
|
|
169
|
+
name: Literal['env-get-updated'],
|
|
170
|
+
callback: Callable[[Sphinx, BuildEnvironment], Iterable[str]],
|
|
171
|
+
priority: int,
|
|
172
|
+
) -> int: ...
|
|
173
|
+
|
|
174
|
+
@overload
|
|
175
|
+
def connect(
|
|
176
|
+
self,
|
|
177
|
+
name: Literal['env-check-consistency'],
|
|
178
|
+
callback: Callable[[Sphinx, BuildEnvironment], None],
|
|
179
|
+
priority: int,
|
|
180
|
+
) -> int: ...
|
|
181
|
+
|
|
182
|
+
@overload
|
|
183
|
+
def connect(
|
|
184
|
+
self,
|
|
185
|
+
name: Literal['write-started'],
|
|
186
|
+
callback: Callable[[Sphinx, Builder], None],
|
|
187
|
+
priority: int,
|
|
188
|
+
) -> int: ...
|
|
189
|
+
|
|
190
|
+
@overload
|
|
191
|
+
def connect(
|
|
192
|
+
self,
|
|
193
|
+
name: Literal['doctree-resolved'],
|
|
194
|
+
callback: Callable[[Sphinx, nodes.document, str], None],
|
|
195
|
+
priority: int,
|
|
196
|
+
) -> int: ...
|
|
197
|
+
|
|
198
|
+
@overload
|
|
199
|
+
def connect(
|
|
200
|
+
self,
|
|
201
|
+
name: Literal['missing-reference'],
|
|
202
|
+
callback: Callable[
|
|
203
|
+
[Sphinx, BuildEnvironment, addnodes.pending_xref, nodes.TextElement],
|
|
204
|
+
nodes.reference | None,
|
|
205
|
+
],
|
|
206
|
+
priority: int,
|
|
207
|
+
) -> int: ...
|
|
208
|
+
|
|
209
|
+
@overload
|
|
210
|
+
def connect(
|
|
211
|
+
self,
|
|
212
|
+
name: Literal['warn-missing-reference'],
|
|
213
|
+
callback: Callable[[Sphinx, Domain, addnodes.pending_xref], bool | None],
|
|
214
|
+
priority: int,
|
|
215
|
+
) -> int: ...
|
|
216
|
+
|
|
217
|
+
@overload
|
|
218
|
+
def connect(
|
|
219
|
+
self,
|
|
220
|
+
name: Literal['build-finished'],
|
|
221
|
+
callback: Callable[[Sphinx, Exception | None], None],
|
|
222
|
+
priority: int,
|
|
223
|
+
) -> int: ...
|
|
224
|
+
|
|
225
|
+
# ---- Events from builtin builders --------------------------------------
|
|
226
|
+
|
|
227
|
+
@overload
|
|
228
|
+
def connect(
|
|
229
|
+
self,
|
|
230
|
+
name: Literal['html-collect-pages'],
|
|
231
|
+
callback: Callable[[Sphinx], Iterable[tuple[str, dict[str, Any], str]]],
|
|
232
|
+
priority: int,
|
|
233
|
+
) -> int: ...
|
|
234
|
+
|
|
235
|
+
@overload
|
|
236
|
+
def connect(
|
|
237
|
+
self,
|
|
238
|
+
name: Literal['html-page-context'],
|
|
239
|
+
callback: Callable[
|
|
240
|
+
[Sphinx, str, str, dict[str, Any], nodes.document], str | None
|
|
241
|
+
],
|
|
242
|
+
priority: int,
|
|
243
|
+
) -> int: ...
|
|
244
|
+
|
|
245
|
+
@overload
|
|
246
|
+
def connect(
|
|
247
|
+
self,
|
|
248
|
+
name: Literal['linkcheck-process-uri'],
|
|
249
|
+
callback: Callable[[Sphinx, str], str | None],
|
|
250
|
+
priority: int,
|
|
251
|
+
) -> int: ...
|
|
252
|
+
|
|
253
|
+
# ---- Events from builtin extensions-- ----------------------------------
|
|
254
|
+
|
|
255
|
+
@overload
|
|
256
|
+
def connect(
|
|
257
|
+
self,
|
|
258
|
+
name: Literal['object-description-transform'],
|
|
259
|
+
callback: Callable[[Sphinx, str, str, addnodes.desc_content], None],
|
|
260
|
+
priority: int,
|
|
261
|
+
) -> int: ...
|
|
262
|
+
|
|
263
|
+
# ---- Events from first-party extensions --------------------------------
|
|
264
|
+
|
|
265
|
+
@overload
|
|
266
|
+
def connect(
|
|
267
|
+
self,
|
|
268
|
+
name: Literal['autodoc-process-docstring'],
|
|
269
|
+
callback: _AutodocProcessDocstringListener,
|
|
270
|
+
priority: int,
|
|
271
|
+
) -> int: ...
|
|
272
|
+
|
|
273
|
+
@overload
|
|
274
|
+
def connect(
|
|
275
|
+
self,
|
|
276
|
+
name: Literal['autodoc-before-process-signature'],
|
|
277
|
+
callback: Callable[[Sphinx, Any, bool], None],
|
|
278
|
+
priority: int,
|
|
279
|
+
) -> int: ...
|
|
280
|
+
|
|
281
|
+
@overload
|
|
282
|
+
def connect(
|
|
283
|
+
self,
|
|
284
|
+
name: Literal['autodoc-process-signature'],
|
|
285
|
+
callback: Callable[
|
|
286
|
+
[
|
|
287
|
+
Sphinx,
|
|
288
|
+
Literal[
|
|
289
|
+
'module', 'class', 'exception', 'function', 'method', 'attribute'
|
|
290
|
+
],
|
|
291
|
+
str,
|
|
292
|
+
Any,
|
|
293
|
+
dict[str, bool],
|
|
294
|
+
str | None,
|
|
295
|
+
str | None,
|
|
296
|
+
],
|
|
297
|
+
tuple[str | None, str | None] | None,
|
|
298
|
+
],
|
|
299
|
+
priority: int,
|
|
300
|
+
) -> int: ...
|
|
301
|
+
|
|
302
|
+
@overload
|
|
303
|
+
def connect(
|
|
304
|
+
self,
|
|
305
|
+
name: Literal['autodoc-process-bases'],
|
|
306
|
+
callback: Callable[[Sphinx, str, Any, dict[str, bool], list[str]], None],
|
|
307
|
+
priority: int,
|
|
308
|
+
) -> int: ...
|
|
309
|
+
|
|
310
|
+
@overload
|
|
311
|
+
def connect(
|
|
312
|
+
self,
|
|
313
|
+
name: Literal['autodoc-skip-member'],
|
|
314
|
+
callback: Callable[
|
|
315
|
+
[
|
|
316
|
+
Sphinx,
|
|
317
|
+
Literal[
|
|
318
|
+
'module', 'class', 'exception', 'function', 'method', 'attribute'
|
|
319
|
+
],
|
|
320
|
+
str,
|
|
321
|
+
Any,
|
|
322
|
+
bool,
|
|
323
|
+
dict[str, bool],
|
|
324
|
+
],
|
|
325
|
+
bool,
|
|
326
|
+
],
|
|
327
|
+
priority: int,
|
|
328
|
+
) -> int: ...
|
|
329
|
+
|
|
330
|
+
@overload
|
|
331
|
+
def connect(
|
|
332
|
+
self,
|
|
333
|
+
name: Literal['todo-defined'],
|
|
334
|
+
callback: Callable[[Sphinx, todo_node], None],
|
|
335
|
+
priority: int,
|
|
336
|
+
) -> int: ...
|
|
337
|
+
|
|
338
|
+
@overload
|
|
339
|
+
def connect(
|
|
340
|
+
self,
|
|
341
|
+
name: Literal['viewcode-find-source'],
|
|
342
|
+
callback: Callable[
|
|
343
|
+
[Sphinx, str],
|
|
344
|
+
tuple[str, dict[str, tuple[Literal['class', 'def', 'other'], int, int]]],
|
|
345
|
+
],
|
|
346
|
+
priority: int,
|
|
347
|
+
) -> int: ...
|
|
348
|
+
|
|
349
|
+
@overload
|
|
350
|
+
def connect(
|
|
351
|
+
self,
|
|
352
|
+
name: Literal['viewcode-follow-imported'],
|
|
353
|
+
callback: Callable[[Sphinx, str, str], str | None],
|
|
354
|
+
priority: int,
|
|
355
|
+
) -> int: ...
|
|
356
|
+
|
|
357
|
+
# ---- Catch-all ---------------------------------------------------------
|
|
358
|
+
|
|
359
|
+
@overload
|
|
360
|
+
def connect(
|
|
361
|
+
self,
|
|
362
|
+
name: str,
|
|
363
|
+
callback: Callable[..., Any],
|
|
364
|
+
priority: int,
|
|
365
|
+
) -> int: ...
|
|
366
|
+
|
|
70
367
|
def connect(self, name: str, callback: Callable, priority: int) -> int:
|
|
71
368
|
"""Connect a handler to specific event."""
|
|
72
369
|
if name not in self.events:
|
|
@@ -85,13 +382,20 @@ class EventManager:
|
|
|
85
382
|
listeners.remove(listener)
|
|
86
383
|
|
|
87
384
|
def emit(
|
|
88
|
-
self,
|
|
385
|
+
self,
|
|
386
|
+
name: str,
|
|
387
|
+
*args: Any,
|
|
388
|
+
allowed_exceptions: tuple[type[Exception], ...] = (),
|
|
89
389
|
) -> list:
|
|
90
390
|
"""Emit a Sphinx event."""
|
|
91
391
|
# not every object likes to be repr()'d (think
|
|
92
392
|
# random stuff coming via autodoc)
|
|
93
|
-
|
|
94
|
-
|
|
393
|
+
try:
|
|
394
|
+
repr_args = repr(args)
|
|
395
|
+
except Exception:
|
|
396
|
+
pass
|
|
397
|
+
else:
|
|
398
|
+
logger.debug('[app] emitting event: %r%s', name, repr_args)
|
|
95
399
|
|
|
96
400
|
results = []
|
|
97
401
|
listeners = sorted(self.listeners[name], key=attrgetter('priority'))
|
|
@@ -117,7 +421,10 @@ class EventManager:
|
|
|
117
421
|
return results
|
|
118
422
|
|
|
119
423
|
def emit_firstresult(
|
|
120
|
-
self,
|
|
424
|
+
self,
|
|
425
|
+
name: str,
|
|
426
|
+
*args: Any,
|
|
427
|
+
allowed_exceptions: tuple[type[Exception], ...] = (),
|
|
121
428
|
) -> Any:
|
|
122
429
|
"""Emit a Sphinx event and returns first result.
|
|
123
430
|
|
sphinx/ext/apidoc.py
CHANGED
|
@@ -69,7 +69,7 @@ def module_join(*modnames: str | None) -> str:
|
|
|
69
69
|
|
|
70
70
|
def is_packagedir(dirname: str | None = None, files: list[str] | None = None) -> bool:
|
|
71
71
|
"""Check given *files* contains __init__ file."""
|
|
72
|
-
if files is dirname is None:
|
|
72
|
+
if files is None and dirname is None:
|
|
73
73
|
return False
|
|
74
74
|
|
|
75
75
|
if files is None:
|
|
@@ -96,7 +96,10 @@ def write_file(name: str, text: str, opts: CliOptions) -> Path:
|
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
def create_module_file(
|
|
99
|
-
package: str | None,
|
|
99
|
+
package: str | None,
|
|
100
|
+
basename: str,
|
|
101
|
+
opts: CliOptions,
|
|
102
|
+
user_template_dir: str | None = None,
|
|
100
103
|
) -> Path:
|
|
101
104
|
"""Build the text of the file and write the file."""
|
|
102
105
|
options = copy(OPTIONS)
|
|
@@ -148,7 +151,9 @@ def create_package_file(
|
|
|
148
151
|
if not is_skipped_module(Path(root, sub), opts, excludes) and not is_initpy(sub)
|
|
149
152
|
]
|
|
150
153
|
submodules = sorted(set(submodules))
|
|
151
|
-
submodules = [
|
|
154
|
+
submodules = [
|
|
155
|
+
module_join(master_package, subroot, modname) for modname in submodules
|
|
156
|
+
]
|
|
152
157
|
options = copy(OPTIONS)
|
|
153
158
|
if opts.includeprivate and 'private-members' not in options:
|
|
154
159
|
options.append('private-members')
|
|
@@ -316,7 +321,9 @@ def recurse_tree(
|
|
|
316
321
|
if is_pkg or is_namespace:
|
|
317
322
|
# we are in a package with something to document
|
|
318
323
|
if subs or len(files) > 1 or not is_skipped_package(root, opts):
|
|
319
|
-
subpackage =
|
|
324
|
+
subpackage = (
|
|
325
|
+
root[len(rootpath) :].lstrip(path.sep).replace(path.sep, '.')
|
|
326
|
+
)
|
|
320
327
|
# if this is not a namespace or
|
|
321
328
|
# a namespace and there is something there to document
|
|
322
329
|
if not is_namespace or has_child_module(root, excludes, opts):
|
|
@@ -342,7 +349,9 @@ def recurse_tree(
|
|
|
342
349
|
if not is_skipped_module(Path(rootpath, py_file), opts, excludes):
|
|
343
350
|
module = py_file.split('.')[0]
|
|
344
351
|
written_files.append(
|
|
345
|
-
create_module_file(
|
|
352
|
+
create_module_file(
|
|
353
|
+
root_package, module, opts, user_template_dir
|
|
354
|
+
)
|
|
346
355
|
)
|
|
347
356
|
toplevels.append(module)
|
|
348
357
|
|
|
@@ -361,7 +370,7 @@ def is_excluded(root: str | Path, excludes: Sequence[re.Pattern[str]]) -> bool:
|
|
|
361
370
|
|
|
362
371
|
def get_parser() -> argparse.ArgumentParser:
|
|
363
372
|
parser = argparse.ArgumentParser(
|
|
364
|
-
usage='%(prog)s [OPTIONS] -o <OUTPUT_PATH> <MODULE_PATH>
|
|
373
|
+
usage='%(prog)s [OPTIONS] -o <OUTPUT_PATH> <MODULE_PATH> [EXCLUDE_PATTERN, ...]',
|
|
365
374
|
epilog=__('For more information, visit <https://www.sphinx-doc.org/>.'),
|
|
366
375
|
description=__("""
|
|
367
376
|
Look recursively in <MODULE_PATH> for Python modules and packages and create
|
|
@@ -384,7 +393,9 @@ Note: By default this script will not overwrite already created files."""),
|
|
|
384
393
|
parser.add_argument(
|
|
385
394
|
'exclude_pattern',
|
|
386
395
|
nargs='*',
|
|
387
|
-
help=__(
|
|
396
|
+
help=__(
|
|
397
|
+
'fnmatch-style file and/or directory patterns to exclude from generation'
|
|
398
|
+
),
|
|
388
399
|
)
|
|
389
400
|
|
|
390
401
|
parser.add_argument(
|
|
@@ -408,10 +419,14 @@ Note: By default this script will not overwrite already created files."""),
|
|
|
408
419
|
dest='maxdepth',
|
|
409
420
|
type=int,
|
|
410
421
|
default=4,
|
|
411
|
-
help=__('maximum depth of submodules to show in the TOC
|
|
422
|
+
help=__('maximum depth of submodules to show in the TOC (default: 4)'),
|
|
412
423
|
)
|
|
413
424
|
parser.add_argument(
|
|
414
|
-
'-f',
|
|
425
|
+
'-f',
|
|
426
|
+
'--force',
|
|
427
|
+
action='store_true',
|
|
428
|
+
dest='force',
|
|
429
|
+
help=__('overwrite existing files'),
|
|
415
430
|
)
|
|
416
431
|
parser.add_argument(
|
|
417
432
|
'-l',
|
|
@@ -420,7 +435,7 @@ Note: By default this script will not overwrite already created files."""),
|
|
|
420
435
|
dest='followlinks',
|
|
421
436
|
default=False,
|
|
422
437
|
help=__(
|
|
423
|
-
'follow symbolic links. Powerful when combined
|
|
438
|
+
'follow symbolic links. Powerful when combined with collective.recipe.omelette.'
|
|
424
439
|
),
|
|
425
440
|
)
|
|
426
441
|
parser.add_argument(
|
|
@@ -474,14 +489,14 @@ Note: By default this script will not overwrite already created files."""),
|
|
|
474
489
|
'--module-first',
|
|
475
490
|
action='store_true',
|
|
476
491
|
dest='modulefirst',
|
|
477
|
-
help=__('put module documentation before submodule
|
|
492
|
+
help=__('put module documentation before submodule documentation'),
|
|
478
493
|
)
|
|
479
494
|
parser.add_argument(
|
|
480
495
|
'--implicit-namespaces',
|
|
481
496
|
action='store_true',
|
|
482
497
|
dest='implicit_namespaces',
|
|
483
498
|
help=__(
|
|
484
|
-
'interpret module paths according to PEP-0420
|
|
499
|
+
'interpret module paths according to PEP-0420 implicit namespaces specification'
|
|
485
500
|
),
|
|
486
501
|
)
|
|
487
502
|
parser.add_argument(
|
|
@@ -497,7 +512,9 @@ Note: By default this script will not overwrite already created files."""),
|
|
|
497
512
|
'--remove-old',
|
|
498
513
|
action='store_true',
|
|
499
514
|
dest='remove_old',
|
|
500
|
-
help=__(
|
|
515
|
+
help=__(
|
|
516
|
+
'Remove existing files in the output directory that were not generated'
|
|
517
|
+
),
|
|
501
518
|
)
|
|
502
519
|
exclusive_group.add_argument(
|
|
503
520
|
'-F',
|
|
@@ -539,7 +556,9 @@ Note: By default this script will not overwrite already created files."""),
|
|
|
539
556
|
'--doc-release',
|
|
540
557
|
action='store',
|
|
541
558
|
dest='release',
|
|
542
|
-
help=__(
|
|
559
|
+
help=__(
|
|
560
|
+
'project release, used when --full is given, defaults to --doc-version'
|
|
561
|
+
),
|
|
543
562
|
)
|
|
544
563
|
|
|
545
564
|
group = parser.add_argument_group(__('extension options'))
|
|
@@ -614,8 +633,7 @@ def main(argv: Sequence[str] = (), /) -> int:
|
|
|
614
633
|
|
|
615
634
|
if args.header is None:
|
|
616
635
|
args.header = rootpath.split(path.sep)[-1]
|
|
617
|
-
|
|
618
|
-
args.suffix = args.suffix[1:]
|
|
636
|
+
args.suffix = args.suffix.removeprefix('.')
|
|
619
637
|
if not Path(rootpath).is_dir():
|
|
620
638
|
logger.error(__('%s is not a directory.'), rootpath)
|
|
621
639
|
raise SystemExit(1)
|
|
@@ -649,7 +667,11 @@ def main(argv: Sequence[str] = (), /) -> int:
|
|
|
649
667
|
'suffix': '.' + args.suffix,
|
|
650
668
|
'master': 'index',
|
|
651
669
|
'epub': True,
|
|
652
|
-
'extensions': [
|
|
670
|
+
'extensions': [
|
|
671
|
+
'sphinx.ext.autodoc',
|
|
672
|
+
'sphinx.ext.viewcode',
|
|
673
|
+
'sphinx.ext.todo',
|
|
674
|
+
],
|
|
653
675
|
'makefile': True,
|
|
654
676
|
'batchfile': True,
|
|
655
677
|
'make_mode': True,
|
|
@@ -670,7 +692,9 @@ def main(argv: Sequence[str] = (), /) -> int:
|
|
|
670
692
|
d['extensions'].extend(ext.split(','))
|
|
671
693
|
|
|
672
694
|
if not args.dryrun:
|
|
673
|
-
qs.generate(
|
|
695
|
+
qs.generate(
|
|
696
|
+
d, silent=True, overwrite=args.force, templatedir=args.templatedir
|
|
697
|
+
)
|
|
674
698
|
elif args.tocfile:
|
|
675
699
|
written_files.append(
|
|
676
700
|
create_modules_toc_file(modules, args, args.tocfile, args.templatedir)
|