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
sphinx/util/cfamily.py
CHANGED
|
@@ -25,19 +25,23 @@ logger = logging.getLogger(__name__)
|
|
|
25
25
|
|
|
26
26
|
_whitespace_re = re.compile(r'\s+')
|
|
27
27
|
anon_identifier_re = re.compile(r'(@[a-zA-Z0-9_])[a-zA-Z0-9_]*\b')
|
|
28
|
-
identifier_re = re.compile(
|
|
28
|
+
identifier_re = re.compile(
|
|
29
|
+
r"""
|
|
29
30
|
( # This 'extends' _anon_identifier_re with the ordinary identifiers,
|
|
30
31
|
# make sure they are in sync.
|
|
31
32
|
(~?\b[a-zA-Z_]) # ordinary identifiers
|
|
32
33
|
| (@[a-zA-Z0-9_]) # our extension for names of anonymous entities
|
|
33
34
|
)
|
|
34
35
|
[a-zA-Z0-9_]*\b
|
|
35
|
-
|
|
36
|
+
""",
|
|
37
|
+
flags=re.VERBOSE,
|
|
38
|
+
)
|
|
36
39
|
integer_literal_re = re.compile(r'[1-9][0-9]*(\'[0-9]+)*')
|
|
37
40
|
octal_literal_re = re.compile(r'0[0-7]*(\'[0-7]+)*')
|
|
38
41
|
hex_literal_re = re.compile(r'0[xX][0-9a-fA-F]+(\'[0-9a-fA-F]+)*')
|
|
39
42
|
binary_literal_re = re.compile(r'0[bB][01]+(\'[01]+)*')
|
|
40
|
-
integers_literal_suffix_re = re.compile(
|
|
43
|
+
integers_literal_suffix_re = re.compile(
|
|
44
|
+
r"""
|
|
41
45
|
# unsigned and/or (long) long, in any order, but at least one of them
|
|
42
46
|
(
|
|
43
47
|
([uU] ([lL] | (ll) | (LL))?)
|
|
@@ -46,8 +50,11 @@ integers_literal_suffix_re = re.compile(r'''
|
|
|
46
50
|
)\b
|
|
47
51
|
# the ending word boundary is important for distinguishing
|
|
48
52
|
# between suffixes and UDLs in C++
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
""",
|
|
54
|
+
flags=re.VERBOSE,
|
|
55
|
+
)
|
|
56
|
+
float_literal_re = re.compile(
|
|
57
|
+
r"""
|
|
51
58
|
[+-]?(
|
|
52
59
|
# decimal
|
|
53
60
|
([0-9]+(\'[0-9]+)*[eE][+-]?[0-9]+(\'[0-9]+)*)
|
|
@@ -59,10 +66,13 @@ float_literal_re = re.compile(r'''
|
|
|
59
66
|
[0-9a-fA-F]+(\'[0-9a-fA-F]+)*([pP][+-]?[0-9a-fA-F]+(\'[0-9a-fA-F]+)*)?)
|
|
60
67
|
| (0[xX][0-9a-fA-F]+(\'[0-9a-fA-F]+)*\.([pP][+-]?[0-9a-fA-F]+(\'[0-9a-fA-F]+)*)?)
|
|
61
68
|
)
|
|
62
|
-
|
|
69
|
+
""",
|
|
70
|
+
flags=re.VERBOSE,
|
|
71
|
+
)
|
|
63
72
|
float_literal_suffix_re = re.compile(r'[fFlL]\b')
|
|
64
73
|
# the ending word boundary is important for distinguishing between suffixes and UDLs in C++
|
|
65
|
-
char_literal_re = re.compile(
|
|
74
|
+
char_literal_re = re.compile(
|
|
75
|
+
r"""
|
|
66
76
|
((?:u8)|u|U|L)?
|
|
67
77
|
'(
|
|
68
78
|
(?:[^\\'])
|
|
@@ -74,7 +84,9 @@ char_literal_re = re.compile(r'''
|
|
|
74
84
|
| (?:U[0-9a-fA-F]{8})
|
|
75
85
|
))
|
|
76
86
|
)'
|
|
77
|
-
|
|
87
|
+
""",
|
|
88
|
+
flags=re.VERBOSE,
|
|
89
|
+
)
|
|
78
90
|
|
|
79
91
|
|
|
80
92
|
def verify_description_mode(mode: str) -> None:
|
|
@@ -116,6 +128,7 @@ class ASTBaseBase:
|
|
|
116
128
|
# Attributes
|
|
117
129
|
################################################################################
|
|
118
130
|
|
|
131
|
+
|
|
119
132
|
class ASTAttribute(ASTBaseBase):
|
|
120
133
|
def describe_signature(self, signode: TextElement) -> None:
|
|
121
134
|
raise NotImplementedError(repr(self))
|
|
@@ -134,7 +147,7 @@ class ASTCPPAttribute(ASTAttribute):
|
|
|
134
147
|
return hash(self.arg)
|
|
135
148
|
|
|
136
149
|
def _stringify(self, transform: StringifyTransform) -> str:
|
|
137
|
-
return f
|
|
150
|
+
return f'[[{self.arg}]]'
|
|
138
151
|
|
|
139
152
|
def describe_signature(self, signode: TextElement) -> None:
|
|
140
153
|
signode.append(addnodes.desc_sig_punctuation('[[', '[['))
|
|
@@ -258,12 +271,14 @@ class ASTAttributeList(ASTBaseBase):
|
|
|
258
271
|
|
|
259
272
|
################################################################################
|
|
260
273
|
|
|
274
|
+
|
|
261
275
|
class ASTBaseParenExprList(ASTBaseBase):
|
|
262
276
|
pass
|
|
263
277
|
|
|
264
278
|
|
|
265
279
|
################################################################################
|
|
266
280
|
|
|
281
|
+
|
|
267
282
|
class UnsupportedMultiCharacterCharLiteral(Exception):
|
|
268
283
|
pass
|
|
269
284
|
|
|
@@ -273,9 +288,13 @@ class DefinitionError(Exception):
|
|
|
273
288
|
|
|
274
289
|
|
|
275
290
|
class BaseParser:
|
|
276
|
-
def __init__(
|
|
277
|
-
|
|
278
|
-
|
|
291
|
+
def __init__(
|
|
292
|
+
self,
|
|
293
|
+
definition: str,
|
|
294
|
+
*,
|
|
295
|
+
location: nodes.Node | tuple[str, int] | str,
|
|
296
|
+
config: Config,
|
|
297
|
+
) -> None:
|
|
279
298
|
self.definition = definition.strip()
|
|
280
299
|
self.location = location # for warnings
|
|
281
300
|
self.config = config
|
|
@@ -315,16 +334,19 @@ class BaseParser:
|
|
|
315
334
|
def status(self, msg: str) -> None:
|
|
316
335
|
# for debugging
|
|
317
336
|
indicator = '-' * self.pos + '^'
|
|
318
|
-
logger.debug(f
|
|
337
|
+
logger.debug(f'{msg}\n{self.definition}\n{indicator}') # NoQA: G004
|
|
319
338
|
|
|
320
339
|
def fail(self, msg: str) -> None:
|
|
321
340
|
errors = []
|
|
322
341
|
indicator = '-' * self.pos + '^'
|
|
323
|
-
|
|
324
|
-
'Invalid
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
342
|
+
msg = (
|
|
343
|
+
f'Invalid {self.language} declaration: {msg} [error at {self.pos}]\n'
|
|
344
|
+
f' {self.definition}\n'
|
|
345
|
+
f' {indicator}'
|
|
346
|
+
)
|
|
347
|
+
exc_main = DefinitionError(msg)
|
|
348
|
+
errors.append((exc_main, 'Main error'))
|
|
349
|
+
errors.extend((err, 'Potential other error') for err in self.otherErrors)
|
|
328
350
|
self.otherErrors = []
|
|
329
351
|
raise self._make_multi_error(errors, '')
|
|
330
352
|
|
|
@@ -342,7 +364,7 @@ class BaseParser:
|
|
|
342
364
|
|
|
343
365
|
def skip_string(self, string: str) -> bool:
|
|
344
366
|
strlen = len(string)
|
|
345
|
-
if self.definition[self.pos:self.pos + strlen] == string:
|
|
367
|
+
if self.definition[self.pos : self.pos + strlen] == string:
|
|
346
368
|
self.pos += strlen
|
|
347
369
|
return True
|
|
348
370
|
return False
|
|
@@ -383,14 +405,14 @@ class BaseParser:
|
|
|
383
405
|
return ''
|
|
384
406
|
|
|
385
407
|
def read_rest(self) -> str:
|
|
386
|
-
rv = self.definition[self.pos:]
|
|
408
|
+
rv = self.definition[self.pos :]
|
|
387
409
|
self.pos = self.end
|
|
388
410
|
return rv
|
|
389
411
|
|
|
390
412
|
def assert_end(self, *, allowSemicolon: bool = False) -> None:
|
|
391
413
|
self.skip_ws()
|
|
392
414
|
if allowSemicolon:
|
|
393
|
-
if not self.eof and self.definition[self.pos:] != ';':
|
|
415
|
+
if not self.eof and self.definition[self.pos :] != ';':
|
|
394
416
|
self.fail('Expected end of definition or ;.')
|
|
395
417
|
else:
|
|
396
418
|
if not self.eof:
|
|
@@ -418,13 +440,14 @@ class BaseParser:
|
|
|
418
440
|
symbols.append(brackets[self.current_char])
|
|
419
441
|
elif len(symbols) > 0 and self.current_char == symbols[-1]:
|
|
420
442
|
symbols.pop()
|
|
421
|
-
elif self.current_char in
|
|
443
|
+
elif self.current_char in ')]}':
|
|
422
444
|
self.fail("Unexpected '%s' in balanced-token-seq." % self.current_char)
|
|
423
445
|
self.pos += 1
|
|
424
446
|
if self.eof:
|
|
425
|
-
self.fail(
|
|
426
|
-
|
|
427
|
-
|
|
447
|
+
self.fail(
|
|
448
|
+
f'Could not find end of balanced-token-seq starting at {startPos}.'
|
|
449
|
+
)
|
|
450
|
+
return self.definition[startPos : self.pos]
|
|
428
451
|
|
|
429
452
|
def _parse_attribute(self) -> ASTAttribute | None:
|
|
430
453
|
self.skip_ws()
|
sphinx/util/console.py
CHANGED
sphinx/util/display.py
CHANGED
|
@@ -78,7 +78,7 @@ class progress_message:
|
|
|
78
78
|
val: BaseException | None,
|
|
79
79
|
tb: TracebackType | None,
|
|
80
80
|
) -> bool:
|
|
81
|
-
prefix =
|
|
81
|
+
prefix = '' if self.nonl else bold(self.message + ': ')
|
|
82
82
|
if isinstance(val, SkipProgressMessage):
|
|
83
83
|
logger.info(prefix + __('skipped'))
|
|
84
84
|
if val.args:
|
sphinx/util/docfields.py
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
"Doc fields" are reST field lists in object descriptions that will
|
|
4
4
|
be domain-specifically transformed to a more appealing presentation.
|
|
5
5
|
"""
|
|
6
|
+
|
|
6
7
|
from __future__ import annotations
|
|
7
8
|
|
|
8
9
|
import contextlib
|
|
@@ -31,7 +32,7 @@ def _is_single_paragraph(node: nodes.field_body) -> bool:
|
|
|
31
32
|
if len(node) == 0:
|
|
32
33
|
return False
|
|
33
34
|
elif len(node) > 1:
|
|
34
|
-
for subnode in node[1:]:
|
|
35
|
+
for subnode in node[1:]:
|
|
35
36
|
if not isinstance(subnode, nodes.system_message):
|
|
36
37
|
return False
|
|
37
38
|
return isinstance(node[0], nodes.paragraph)
|
|
@@ -70,10 +71,17 @@ class Field:
|
|
|
70
71
|
self.rolename = rolename
|
|
71
72
|
self.bodyrolename = bodyrolename
|
|
72
73
|
|
|
73
|
-
def make_xref(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
def make_xref(
|
|
75
|
+
self,
|
|
76
|
+
rolename: str,
|
|
77
|
+
domain: str,
|
|
78
|
+
target: str,
|
|
79
|
+
innernode: type[TextlikeNode] = addnodes.literal_emphasis,
|
|
80
|
+
contnode: Node | None = None,
|
|
81
|
+
env: BuildEnvironment | None = None,
|
|
82
|
+
inliner: Inliner | None = None,
|
|
83
|
+
location: Element | None = None,
|
|
84
|
+
) -> Node:
|
|
77
85
|
# note: for backwards compatibility env is last, but not optional
|
|
78
86
|
assert env is not None
|
|
79
87
|
assert (inliner is None) == (location is None), (inliner, location)
|
|
@@ -84,11 +92,18 @@ class Field:
|
|
|
84
92
|
role = env.get_domain(domain).role(rolename)
|
|
85
93
|
if role is None or inliner is None:
|
|
86
94
|
if role is None and inliner is not None:
|
|
87
|
-
msg = __(
|
|
88
|
-
|
|
95
|
+
msg = __(
|
|
96
|
+
'Problem in %s domain: field is supposed '
|
|
97
|
+
"to use role '%s', but that role is not in the domain."
|
|
98
|
+
)
|
|
89
99
|
logger.warning(__(msg), domain, rolename, location=location)
|
|
90
|
-
refnode = addnodes.pending_xref(
|
|
91
|
-
|
|
100
|
+
refnode = addnodes.pending_xref(
|
|
101
|
+
'',
|
|
102
|
+
refdomain=domain,
|
|
103
|
+
refexplicit=False,
|
|
104
|
+
reftype=rolename,
|
|
105
|
+
reftarget=target,
|
|
106
|
+
)
|
|
92
107
|
refnode += contnode or innernode(target, target) # type: ignore[call-arg]
|
|
93
108
|
env.get_domain(domain).process_field_xref(refnode)
|
|
94
109
|
return refnode
|
|
@@ -99,13 +114,22 @@ class Field:
|
|
|
99
114
|
ns, messages = role(rolename, target, target, lineno, inliner, {}, [])
|
|
100
115
|
return nodes.inline(target, '', *ns)
|
|
101
116
|
|
|
102
|
-
def make_xrefs(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
117
|
+
def make_xrefs(
|
|
118
|
+
self,
|
|
119
|
+
rolename: str,
|
|
120
|
+
domain: str,
|
|
121
|
+
target: str,
|
|
122
|
+
innernode: type[TextlikeNode] = addnodes.literal_emphasis,
|
|
123
|
+
contnode: Node | None = None,
|
|
124
|
+
env: BuildEnvironment | None = None,
|
|
125
|
+
inliner: Inliner | None = None,
|
|
126
|
+
location: Element | None = None,
|
|
127
|
+
) -> list[Node]:
|
|
128
|
+
return [
|
|
129
|
+
self.make_xref(
|
|
130
|
+
rolename, domain, target, innernode, contnode, env, inliner, location
|
|
131
|
+
)
|
|
132
|
+
]
|
|
109
133
|
|
|
110
134
|
def make_entry(self, fieldarg: str, content: list[Node]) -> tuple[str, list[Node]]:
|
|
111
135
|
return (fieldarg, content)
|
|
@@ -123,17 +147,35 @@ class Field:
|
|
|
123
147
|
fieldname = nodes.field_name('', self.label)
|
|
124
148
|
if fieldarg:
|
|
125
149
|
fieldname += nodes.Text(' ')
|
|
126
|
-
fieldname.extend(
|
|
127
|
-
|
|
128
|
-
|
|
150
|
+
fieldname.extend(
|
|
151
|
+
self.make_xrefs(
|
|
152
|
+
self.rolename,
|
|
153
|
+
domain,
|
|
154
|
+
fieldarg,
|
|
155
|
+
nodes.Text,
|
|
156
|
+
env=env,
|
|
157
|
+
inliner=inliner,
|
|
158
|
+
location=location,
|
|
159
|
+
)
|
|
160
|
+
)
|
|
129
161
|
|
|
130
162
|
if len(content) == 1 and (
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
163
|
+
isinstance(content[0], nodes.Text)
|
|
164
|
+
or (
|
|
165
|
+
isinstance(content[0], nodes.inline)
|
|
166
|
+
and len(content[0]) == 1
|
|
167
|
+
and isinstance(content[0][0], nodes.Text)
|
|
168
|
+
)
|
|
169
|
+
):
|
|
170
|
+
content = self.make_xrefs(
|
|
171
|
+
self.bodyrolename,
|
|
172
|
+
domain,
|
|
173
|
+
content[0].astext(),
|
|
174
|
+
contnode=content[0],
|
|
175
|
+
env=env,
|
|
176
|
+
inliner=inliner,
|
|
177
|
+
location=location,
|
|
178
|
+
)
|
|
137
179
|
fieldbody = nodes.field_body('', nodes.paragraph('', '', *content))
|
|
138
180
|
return nodes.field('', fieldname, fieldbody)
|
|
139
181
|
|
|
@@ -155,8 +197,14 @@ class GroupedField(Field):
|
|
|
155
197
|
is_grouped = True
|
|
156
198
|
list_type = nodes.bullet_list
|
|
157
199
|
|
|
158
|
-
def __init__(
|
|
159
|
-
|
|
200
|
+
def __init__(
|
|
201
|
+
self,
|
|
202
|
+
name: str,
|
|
203
|
+
names: tuple[str, ...] = (),
|
|
204
|
+
label: str = '',
|
|
205
|
+
rolename: str = '',
|
|
206
|
+
can_collapse: bool = False,
|
|
207
|
+
) -> None:
|
|
160
208
|
super().__init__(name, names, label, True, rolename)
|
|
161
209
|
self.can_collapse = can_collapse
|
|
162
210
|
|
|
@@ -173,9 +221,17 @@ class GroupedField(Field):
|
|
|
173
221
|
listnode = self.list_type()
|
|
174
222
|
for fieldarg, content in items:
|
|
175
223
|
par = nodes.paragraph()
|
|
176
|
-
par.extend(
|
|
177
|
-
|
|
178
|
-
|
|
224
|
+
par.extend(
|
|
225
|
+
self.make_xrefs(
|
|
226
|
+
self.rolename,
|
|
227
|
+
domain,
|
|
228
|
+
fieldarg,
|
|
229
|
+
addnodes.literal_strong,
|
|
230
|
+
env=env,
|
|
231
|
+
inliner=inliner,
|
|
232
|
+
location=location,
|
|
233
|
+
)
|
|
234
|
+
)
|
|
179
235
|
par += nodes.Text(' -- ')
|
|
180
236
|
par += content
|
|
181
237
|
listnode += nodes.list_item('', par)
|
|
@@ -236,8 +292,11 @@ class TypedField(GroupedField):
|
|
|
236
292
|
) -> nodes.field:
|
|
237
293
|
def handle_item(fieldarg: str, content: list[Node]) -> nodes.paragraph:
|
|
238
294
|
par = nodes.paragraph()
|
|
239
|
-
par.extend(
|
|
240
|
-
|
|
295
|
+
par.extend(
|
|
296
|
+
self.make_xrefs(
|
|
297
|
+
self.rolename, domain, fieldarg, addnodes.literal_strong, env=env
|
|
298
|
+
)
|
|
299
|
+
)
|
|
241
300
|
if fieldarg in types:
|
|
242
301
|
par += nodes.Text(' (')
|
|
243
302
|
# NOTE: using .pop() here to prevent a single type node to be
|
|
@@ -246,9 +305,17 @@ class TypedField(GroupedField):
|
|
|
246
305
|
fieldtype = types.pop(fieldarg)
|
|
247
306
|
if len(fieldtype) == 1 and isinstance(fieldtype[0], nodes.Text):
|
|
248
307
|
typename = fieldtype[0].astext()
|
|
249
|
-
par.extend(
|
|
250
|
-
|
|
251
|
-
|
|
308
|
+
par.extend(
|
|
309
|
+
self.make_xrefs(
|
|
310
|
+
self.typerolename,
|
|
311
|
+
domain,
|
|
312
|
+
typename,
|
|
313
|
+
addnodes.literal_emphasis,
|
|
314
|
+
env=env,
|
|
315
|
+
inliner=inliner,
|
|
316
|
+
location=location,
|
|
317
|
+
)
|
|
318
|
+
)
|
|
252
319
|
else:
|
|
253
320
|
par += fieldtype
|
|
254
321
|
par += nodes.Text(')')
|
|
@@ -329,8 +396,13 @@ class DocFieldTransformer:
|
|
|
329
396
|
entries.append(field)
|
|
330
397
|
|
|
331
398
|
# but if this has a type then we can at least link it
|
|
332
|
-
if (
|
|
333
|
-
|
|
399
|
+
if (
|
|
400
|
+
typedesc
|
|
401
|
+
and is_typefield
|
|
402
|
+
and content
|
|
403
|
+
and len(content) == 1
|
|
404
|
+
and isinstance(content[0], nodes.Text)
|
|
405
|
+
):
|
|
334
406
|
typed_field = cast(TypedField, typedesc)
|
|
335
407
|
target = content[0].astext()
|
|
336
408
|
xrefs = typed_field.make_xrefs(
|
|
@@ -356,7 +428,9 @@ class DocFieldTransformer:
|
|
|
356
428
|
if is_typefield:
|
|
357
429
|
# filter out only inline nodes; others will result in invalid
|
|
358
430
|
# markup being written out
|
|
359
|
-
content = [
|
|
431
|
+
content = [
|
|
432
|
+
n for n in content if isinstance(n, nodes.Inline | nodes.Text)
|
|
433
|
+
]
|
|
360
434
|
if content:
|
|
361
435
|
types.setdefault(typename, {})[fieldarg] = content
|
|
362
436
|
continue
|
|
@@ -368,12 +442,10 @@ class DocFieldTransformer:
|
|
|
368
442
|
except ValueError:
|
|
369
443
|
pass
|
|
370
444
|
else:
|
|
371
|
-
types.setdefault(typename, {})[argname] =
|
|
372
|
-
[nodes.Text(argtype)]
|
|
445
|
+
types.setdefault(typename, {})[argname] = [nodes.Text(argtype)]
|
|
373
446
|
fieldarg = argname
|
|
374
447
|
|
|
375
|
-
translatable_content = nodes.inline(field_body.rawsource,
|
|
376
|
-
translatable=True)
|
|
448
|
+
translatable_content = nodes.inline(field_body.rawsource, translatable=True)
|
|
377
449
|
translatable_content.document = field_body.parent.document
|
|
378
450
|
translatable_content.source = field_body.parent.source
|
|
379
451
|
translatable_content.line = field_body.parent.line
|
|
@@ -383,7 +455,9 @@ class DocFieldTransformer:
|
|
|
383
455
|
# get one entry per field
|
|
384
456
|
if typedesc.is_grouped:
|
|
385
457
|
if typename in groupindices:
|
|
386
|
-
group = cast(
|
|
458
|
+
group = cast(
|
|
459
|
+
tuple[Field, list, Node], entries[groupindices[typename]]
|
|
460
|
+
)
|
|
387
461
|
else:
|
|
388
462
|
groupindices[typename] = len(entries)
|
|
389
463
|
group = (typedesc, [], field)
|
|
@@ -406,7 +480,13 @@ class DocFieldTransformer:
|
|
|
406
480
|
env = self.directive.state.document.settings.env
|
|
407
481
|
inliner = self.directive.state.inliner
|
|
408
482
|
domain = self.directive.domain or ''
|
|
409
|
-
new_list += fieldtype.make_field(
|
|
410
|
-
|
|
483
|
+
new_list += fieldtype.make_field(
|
|
484
|
+
fieldtypes,
|
|
485
|
+
domain,
|
|
486
|
+
items,
|
|
487
|
+
env=env,
|
|
488
|
+
inliner=inliner,
|
|
489
|
+
location=location,
|
|
490
|
+
)
|
|
411
491
|
|
|
412
492
|
node.replace_self(new_list)
|
sphinx/util/docstrings.py
CHANGED
|
@@ -29,7 +29,7 @@ def separate_metadata(s: str | None) -> tuple[str | None, dict[str, str]]:
|
|
|
29
29
|
field_name = matched.group()[1:].split(':', 1)[0]
|
|
30
30
|
if field_name.startswith('meta '):
|
|
31
31
|
name = field_name[5:].strip()
|
|
32
|
-
metadata[name] = line[matched.end():].strip()
|
|
32
|
+
metadata[name] = line[matched.end() :].strip()
|
|
33
33
|
else:
|
|
34
34
|
lines.append(line)
|
|
35
35
|
else:
|