Sphinx 8.0.2__py3-none-any.whl → 8.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Sphinx might be problematic. Click here for more details.
- sphinx/__init__.py +6 -3
- sphinx/_cli/__init__.py +40 -20
- sphinx/_cli/util/colour.py +5 -4
- sphinx/_cli/util/errors.py +28 -11
- sphinx/application.py +361 -38
- sphinx/builders/__init__.py +229 -83
- sphinx/builders/_epub_base.py +118 -71
- sphinx/builders/changes.py +39 -21
- sphinx/builders/dirhtml.py +4 -4
- sphinx/builders/dummy.py +2 -5
- sphinx/builders/epub3.py +43 -22
- sphinx/builders/gettext.py +43 -25
- sphinx/builders/html/__init__.py +284 -218
- sphinx/builders/html/_assets.py +62 -26
- sphinx/builders/html/_build_info.py +76 -0
- sphinx/builders/html/transforms.py +11 -9
- sphinx/builders/latex/__init__.py +139 -81
- sphinx/builders/latex/constants.py +7 -7
- sphinx/builders/latex/nodes.py +3 -2
- sphinx/builders/latex/theming.py +7 -5
- sphinx/builders/latex/transforms.py +27 -19
- sphinx/builders/linkcheck.py +146 -72
- sphinx/builders/manpage.py +30 -13
- sphinx/builders/singlehtml.py +22 -14
- sphinx/builders/texinfo.py +67 -37
- sphinx/builders/text.py +5 -5
- sphinx/builders/xml.py +6 -9
- sphinx/cmd/build.py +282 -103
- sphinx/cmd/make_mode.py +106 -63
- sphinx/cmd/quickstart.py +341 -145
- sphinx/config.py +45 -12
- sphinx/deprecation.py +8 -2
- sphinx/directives/__init__.py +28 -19
- sphinx/directives/code.py +86 -56
- sphinx/directives/other.py +50 -36
- sphinx/directives/patches.py +29 -19
- sphinx/domains/__init__.py +20 -120
- sphinx/domains/_domains_container.py +281 -0
- sphinx/domains/_index.py +110 -0
- sphinx/domains/c/__init__.py +3 -3
- sphinx/domains/c/_parser.py +10 -6
- sphinx/domains/changeset.py +5 -3
- sphinx/domains/citation.py +5 -3
- sphinx/domains/cpp/__init__.py +9 -11
- sphinx/domains/cpp/_parser.py +8 -7
- sphinx/domains/index.py +3 -3
- sphinx/domains/javascript.py +12 -7
- sphinx/domains/math.py +2 -2
- sphinx/domains/python/__init__.py +10 -5
- sphinx/domains/python/_object.py +1 -1
- sphinx/domains/rst.py +5 -5
- sphinx/domains/std/__init__.py +16 -11
- sphinx/environment/__init__.py +202 -146
- sphinx/environment/adapters/asset.py +3 -2
- sphinx/environment/adapters/indexentries.py +74 -33
- sphinx/environment/adapters/toctree.py +100 -43
- sphinx/environment/collectors/__init__.py +19 -8
- sphinx/environment/collectors/asset.py +47 -15
- sphinx/environment/collectors/dependencies.py +8 -4
- sphinx/environment/collectors/metadata.py +7 -2
- sphinx/environment/collectors/title.py +7 -2
- sphinx/environment/collectors/toctree.py +54 -22
- sphinx/errors.py +4 -1
- sphinx/events.py +314 -7
- sphinx/ext/apidoc.py +42 -18
- sphinx/ext/autodoc/__init__.py +52 -24
- sphinx/ext/autodoc/importer.py +6 -9
- sphinx/ext/autosectionlabel.py +1 -2
- sphinx/ext/autosummary/__init__.py +3 -1
- sphinx/ext/autosummary/generate.py +28 -14
- sphinx/ext/coverage.py +7 -7
- sphinx/ext/doctest.py +4 -8
- sphinx/ext/duration.py +6 -5
- sphinx/ext/inheritance_diagram.py +1 -1
- sphinx/ext/intersphinx/_cli.py +6 -4
- sphinx/ext/intersphinx/_load.py +77 -32
- sphinx/ext/intersphinx/_resolve.py +173 -79
- sphinx/ext/intersphinx/_shared.py +7 -5
- sphinx/ext/linkcode.py +7 -1
- sphinx/ext/mathjax.py +1 -2
- sphinx/ext/napoleon/__init__.py +37 -24
- sphinx/ext/napoleon/docstring.py +202 -134
- sphinx/ext/todo.py +5 -3
- sphinx/highlighting.py +9 -2
- sphinx/io.py +1 -1
- sphinx/jinja2glue.py +27 -6
- sphinx/locale/__init__.py +6 -2
- sphinx/locale/ar/LC_MESSAGES/sphinx.js +8 -1
- sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ar/LC_MESSAGES/sphinx.po +2246 -2288
- sphinx/locale/bg/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bg/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/bn/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bn/LC_MESSAGES/sphinx.po +2349 -2395
- sphinx/locale/ca/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ca/LC_MESSAGES/sphinx.po +2846 -2892
- sphinx/locale/cak/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cak/LC_MESSAGES/sphinx.po +2213 -2259
- sphinx/locale/cs/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cs/LC_MESSAGES/sphinx.po +2225 -2269
- sphinx/locale/cy/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cy/LC_MESSAGES/sphinx.po +2403 -2447
- sphinx/locale/da/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/da/LC_MESSAGES/sphinx.po +2214 -2260
- sphinx/locale/de/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de/LC_MESSAGES/sphinx.po +2230 -2276
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/el/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/el/LC_MESSAGES/sphinx.po +2619 -2665
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2519 -2565
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/eo/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eo/LC_MESSAGES/sphinx.po +2232 -2278
- sphinx/locale/es/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es/LC_MESSAGES/sphinx.po +2516 -2561
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/et/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/et/LC_MESSAGES/sphinx.po +2317 -2363
- sphinx/locale/eu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eu/LC_MESSAGES/sphinx.po +2218 -2264
- sphinx/locale/fa/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fa/LC_MESSAGES/sphinx.po +2505 -2551
- sphinx/locale/fi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fi/LC_MESSAGES/sphinx.po +2303 -2349
- sphinx/locale/fr/LC_MESSAGES/sphinx.js +6 -2
- sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr/LC_MESSAGES/sphinx.po +2863 -2908
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/gl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/gl/LC_MESSAGES/sphinx.po +2571 -2617
- sphinx/locale/he/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/he/LC_MESSAGES/sphinx.po +2307 -2352
- sphinx/locale/hi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi/LC_MESSAGES/sphinx.po +2580 -2626
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/hr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hr/LC_MESSAGES/sphinx.po +2238 -2283
- sphinx/locale/hu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hu/LC_MESSAGES/sphinx.po +2228 -2274
- sphinx/locale/id/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/id/LC_MESSAGES/sphinx.po +2787 -2834
- sphinx/locale/is/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/is/LC_MESSAGES/sphinx.po +2224 -2270
- sphinx/locale/it/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/it/LC_MESSAGES/sphinx.po +2231 -2276
- sphinx/locale/ja/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ja/LC_MESSAGES/sphinx.po +2507 -2554
- sphinx/locale/ka/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ka/LC_MESSAGES/sphinx.po +2428 -2474
- sphinx/locale/ko/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ko/LC_MESSAGES/sphinx.po +2516 -2563
- sphinx/locale/lt/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lt/LC_MESSAGES/sphinx.po +2425 -2469
- sphinx/locale/lv/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lv/LC_MESSAGES/sphinx.po +2362 -2407
- sphinx/locale/mk/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/mk/LC_MESSAGES/sphinx.po +2121 -2167
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2220 -2266
- sphinx/locale/ne/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ne/LC_MESSAGES/sphinx.po +2221 -2267
- sphinx/locale/nl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nl/LC_MESSAGES/sphinx.po +2240 -2286
- sphinx/locale/pl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pl/LC_MESSAGES/sphinx.po +2319 -2363
- sphinx/locale/pt/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2854 -2899
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2224 -2269
- sphinx/locale/ro/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ro/LC_MESSAGES/sphinx.po +2226 -2271
- sphinx/locale/ru/LC_MESSAGES/sphinx.js +8 -3
- sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ru/LC_MESSAGES/sphinx.po +2841 -2885
- sphinx/locale/si/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/si/LC_MESSAGES/sphinx.po +2294 -2340
- sphinx/locale/sk/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sk/LC_MESSAGES/sphinx.po +2497 -2541
- sphinx/locale/sl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sl/LC_MESSAGES/sphinx.po +2331 -2375
- sphinx/locale/sphinx.pot +2121 -2167
- sphinx/locale/sq/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sq/LC_MESSAGES/sphinx.po +2855 -2901
- sphinx/locale/sr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr/LC_MESSAGES/sphinx.po +2203 -2248
- sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.po +2423 -2469
- sphinx/locale/te/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/te/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/tr/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/tr/LC_MESSAGES/sphinx.po +2443 -2489
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2329 -2373
- sphinx/locale/ur/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ur/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/vi/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/vi/LC_MESSAGES/sphinx.po +2199 -2246
- sphinx/locale/yue/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/yue/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2845 -2892
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/parsers.py +3 -1
- sphinx/project.py +6 -2
- sphinx/pycode/__init__.py +11 -4
- sphinx/pycode/ast.py +58 -58
- sphinx/pycode/parser.py +49 -28
- sphinx/pygments_styles.py +49 -49
- sphinx/registry.py +8 -3
- sphinx/roles.py +136 -13
- sphinx/search/__init__.py +146 -87
- sphinx/search/da.py +2 -4
- sphinx/search/de.py +2 -4
- sphinx/search/en.py +4 -4
- sphinx/search/es.py +2 -4
- sphinx/search/fi.py +2 -4
- sphinx/search/fr.py +2 -4
- sphinx/search/hu.py +2 -4
- sphinx/search/it.py +2 -4
- sphinx/search/ja.py +55 -32
- sphinx/search/nl.py +2 -4
- sphinx/search/no.py +2 -4
- sphinx/search/pt.py +2 -4
- sphinx/search/ro.py +0 -2
- sphinx/search/ru.py +2 -4
- sphinx/search/sv.py +2 -4
- sphinx/search/tr.py +0 -2
- sphinx/search/zh.py +18 -13
- sphinx/templates/graphviz/graphviz.css +0 -7
- sphinx/testing/fixtures.py +6 -5
- sphinx/testing/path.py +7 -5
- sphinx/testing/util.py +63 -29
- sphinx/texinputs/sphinx.sty +115 -50
- sphinx/texinputs/sphinxlatexadmonitions.sty +56 -38
- sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
- sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
- sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
- sphinx/texinputs/sphinxlatexlists.sty +1 -1
- sphinx/texinputs/sphinxlatexliterals.sty +4 -1
- sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
- sphinx/texinputs/sphinxlatexobjects.sty +1 -1
- sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
- sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
- sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
- sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
- sphinx/texinputs/sphinxlatextables.sty +1 -1
- sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
- sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
- sphinx/themes/agogo/layout.html +1 -10
- sphinx/themes/agogo/static/agogo.css.jinja +0 -7
- sphinx/themes/basic/defindex.html +1 -8
- sphinx/themes/basic/domainindex.html +1 -9
- sphinx/themes/basic/genindex-single.html +1 -9
- sphinx/themes/basic/genindex-split.html +1 -9
- sphinx/themes/basic/genindex.html +1 -9
- sphinx/themes/basic/globaltoc.html +1 -9
- sphinx/themes/basic/layout.html +1 -9
- sphinx/themes/basic/localtoc.html +1 -9
- sphinx/themes/basic/page.html +1 -9
- sphinx/themes/basic/relations.html +1 -9
- sphinx/themes/basic/search.html +1 -9
- sphinx/themes/basic/searchbox.html +1 -9
- sphinx/themes/basic/searchfield.html +4 -10
- sphinx/themes/basic/sourcelink.html +1 -9
- sphinx/themes/basic/static/basic.css.jinja +2 -13
- sphinx/themes/basic/static/doctools.js +0 -7
- sphinx/themes/basic/static/language_data.js.jinja +0 -7
- sphinx/themes/basic/static/searchtools.js +25 -13
- sphinx/themes/bizstyle/layout.html +1 -9
- sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
- sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
- sphinx/themes/classic/layout.html +1 -9
- sphinx/themes/classic/static/classic.css.jinja +0 -7
- sphinx/themes/classic/static/sidebar.js.jinja +0 -6
- sphinx/themes/epub/epub-cover.html +1 -9
- sphinx/themes/epub/layout.html +1 -9
- sphinx/themes/epub/static/epub.css.jinja +0 -7
- sphinx/themes/haiku/layout.html +1 -9
- sphinx/themes/haiku/static/haiku.css.jinja +0 -6
- sphinx/themes/nature/static/nature.css.jinja +0 -7
- sphinx/themes/nonav/layout.html +1 -9
- sphinx/themes/nonav/static/nonav.css.jinja +0 -7
- sphinx/themes/pyramid/static/epub.css.jinja +0 -7
- sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
- sphinx/themes/scrolls/layout.html +1 -10
- sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
- sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
- sphinx/themes/traditional/static/traditional.css.jinja +0 -7
- sphinx/theming.py +18 -6
- sphinx/transforms/__init__.py +56 -35
- sphinx/transforms/compact_bullet_list.py +3 -2
- sphinx/transforms/i18n.py +132 -50
- sphinx/transforms/post_transforms/__init__.py +94 -43
- sphinx/transforms/post_transforms/code.py +7 -6
- sphinx/transforms/post_transforms/images.py +71 -54
- sphinx/transforms/references.py +1 -2
- sphinx/util/__init__.py +23 -194
- sphinx/util/_files.py +80 -0
- sphinx/util/_importer.py +27 -0
- sphinx/util/_io.py +1 -2
- sphinx/util/_lines.py +26 -0
- sphinx/util/_pathlib.py +5 -2
- sphinx/util/_serialise.py +53 -0
- sphinx/util/_timestamps.py +2 -1
- sphinx/util/_uri.py +16 -0
- sphinx/util/cfamily.py +48 -25
- sphinx/util/console.py +1 -0
- sphinx/util/display.py +1 -1
- sphinx/util/docfields.py +125 -45
- sphinx/util/docstrings.py +1 -1
- sphinx/util/docutils.py +118 -44
- sphinx/util/exceptions.py +11 -5
- sphinx/util/fileutil.py +53 -32
- sphinx/util/http_date.py +9 -7
- sphinx/util/i18n.py +49 -16
- sphinx/util/images.py +7 -6
- sphinx/util/inspect.py +29 -12
- sphinx/util/inventory.py +47 -29
- sphinx/util/logging.py +58 -85
- sphinx/util/matching.py +3 -3
- sphinx/util/math.py +1 -1
- sphinx/util/nodes.py +176 -108
- sphinx/util/osutil.py +13 -10
- sphinx/util/parallel.py +5 -4
- sphinx/util/parsing.py +5 -3
- sphinx/util/png.py +3 -3
- sphinx/util/requests.py +8 -4
- sphinx/util/rst.py +5 -3
- sphinx/util/tags.py +5 -2
- sphinx/util/template.py +26 -11
- sphinx/util/texescape.py +2 -2
- sphinx/util/typing.py +89 -38
- sphinx/versioning.py +3 -1
- sphinx/writers/html.py +22 -7
- sphinx/writers/html5.py +113 -64
- sphinx/writers/latex.py +408 -221
- sphinx/writers/manpage.py +25 -15
- sphinx/writers/texinfo.py +94 -82
- sphinx/writers/text.py +87 -53
- sphinx/writers/xml.py +5 -4
- sphinx-8.1.1.dist-info/LICENSE.rst +31 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.1.dist-info}/METADATA +13 -11
- sphinx-8.1.1.dist-info/RECORD +598 -0
- sphinx-8.0.2.dist-info/LICENSE.rst +0 -67
- sphinx-8.0.2.dist-info/RECORD +0 -590
- {sphinx-8.0.2.dist-info → sphinx-8.1.1.dist-info}/WHEEL +0 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.1.dist-info}/entry_points.txt +0 -0
sphinx/parsers.py
CHANGED
|
@@ -72,7 +72,9 @@ class RSTParser(docutils.parsers.rst.Parser, Parser):
|
|
|
72
72
|
# preprocess inputstring
|
|
73
73
|
if isinstance(inputstring, str):
|
|
74
74
|
lines = docutils.statemachine.string2lines(
|
|
75
|
-
inputstring,
|
|
75
|
+
inputstring,
|
|
76
|
+
tab_width=document.settings.tab_width,
|
|
77
|
+
convert_whitespace=True,
|
|
76
78
|
)
|
|
77
79
|
|
|
78
80
|
inputlines = StringList(lines, document.current_source)
|
sphinx/project.py
CHANGED
|
@@ -23,7 +23,9 @@ EXCLUDE_PATHS = ['**/_sources', '.#*', '**/.#*', '*.lproj/**']
|
|
|
23
23
|
class Project:
|
|
24
24
|
"""A project is the source code set of the Sphinx document(s)."""
|
|
25
25
|
|
|
26
|
-
def __init__(
|
|
26
|
+
def __init__(
|
|
27
|
+
self, srcdir: str | os.PathLike[str], source_suffix: Iterable[str]
|
|
28
|
+
) -> None:
|
|
27
29
|
#: Source directory.
|
|
28
30
|
self.srcdir = _StrPath(srcdir)
|
|
29
31
|
|
|
@@ -82,7 +84,9 @@ class Project:
|
|
|
82
84
|
self._docname_to_path[docname] = path
|
|
83
85
|
else:
|
|
84
86
|
logger.warning(
|
|
85
|
-
__('Ignored unreadable document %r.'),
|
|
87
|
+
__('Ignored unreadable document %r.'),
|
|
88
|
+
filename,
|
|
89
|
+
location=docname,
|
|
86
90
|
)
|
|
87
91
|
|
|
88
92
|
return self.docnames
|
sphinx/pycode/__init__.py
CHANGED
|
@@ -52,7 +52,9 @@ class ModuleAnalyzer:
|
|
|
52
52
|
try:
|
|
53
53
|
filename = loader.get_filename(modname)
|
|
54
54
|
except ImportError as err:
|
|
55
|
-
raise PycodeError(
|
|
55
|
+
raise PycodeError(
|
|
56
|
+
'error getting filename for %r' % modname, err
|
|
57
|
+
) from err
|
|
56
58
|
if filename is None:
|
|
57
59
|
# all methods for getting filename failed, so raise...
|
|
58
60
|
raise PycodeError('no source found for module %r' % modname)
|
|
@@ -70,12 +72,17 @@ class ModuleAnalyzer:
|
|
|
70
72
|
|
|
71
73
|
@classmethod
|
|
72
74
|
def for_string(
|
|
73
|
-
cls: type[ModuleAnalyzer],
|
|
75
|
+
cls: type[ModuleAnalyzer],
|
|
76
|
+
string: str,
|
|
77
|
+
modname: str,
|
|
78
|
+
srcname: str = '<string>',
|
|
74
79
|
) -> ModuleAnalyzer:
|
|
75
80
|
return cls(string, modname, srcname)
|
|
76
81
|
|
|
77
82
|
@classmethod
|
|
78
|
-
def for_file(
|
|
83
|
+
def for_file(
|
|
84
|
+
cls: type[ModuleAnalyzer], filename: str, modname: str
|
|
85
|
+
) -> ModuleAnalyzer:
|
|
79
86
|
if ('file', filename) in cls.cache:
|
|
80
87
|
return cls.cache['file', filename]
|
|
81
88
|
try:
|
|
@@ -126,7 +133,7 @@ class ModuleAnalyzer:
|
|
|
126
133
|
parser.parse()
|
|
127
134
|
|
|
128
135
|
self.attr_docs = {}
|
|
129
|
-
for
|
|
136
|
+
for scope, comment in parser.comments.items():
|
|
130
137
|
if comment:
|
|
131
138
|
self.attr_docs[scope] = [*comment.splitlines(), '']
|
|
132
139
|
else:
|
sphinx/pycode/ast.py
CHANGED
|
@@ -6,36 +6,34 @@ import ast
|
|
|
6
6
|
from typing import NoReturn, overload
|
|
7
7
|
|
|
8
8
|
OPERATORS: dict[type[ast.AST], str] = {
|
|
9
|
-
ast.Add:
|
|
10
|
-
ast.And:
|
|
11
|
-
ast.BitAnd:
|
|
12
|
-
ast.BitOr:
|
|
13
|
-
ast.BitXor:
|
|
14
|
-
ast.Div:
|
|
15
|
-
ast.FloorDiv:
|
|
16
|
-
ast.Invert:
|
|
17
|
-
ast.LShift:
|
|
18
|
-
ast.MatMult:
|
|
19
|
-
ast.Mult:
|
|
20
|
-
ast.Mod:
|
|
21
|
-
ast.Not:
|
|
22
|
-
ast.Pow:
|
|
23
|
-
ast.Or:
|
|
24
|
-
ast.RShift:
|
|
25
|
-
ast.Sub:
|
|
26
|
-
ast.UAdd:
|
|
27
|
-
ast.USub:
|
|
9
|
+
ast.Add: '+',
|
|
10
|
+
ast.And: 'and',
|
|
11
|
+
ast.BitAnd: '&',
|
|
12
|
+
ast.BitOr: '|',
|
|
13
|
+
ast.BitXor: '^',
|
|
14
|
+
ast.Div: '/',
|
|
15
|
+
ast.FloorDiv: '//',
|
|
16
|
+
ast.Invert: '~',
|
|
17
|
+
ast.LShift: '<<',
|
|
18
|
+
ast.MatMult: '@',
|
|
19
|
+
ast.Mult: '*',
|
|
20
|
+
ast.Mod: '%',
|
|
21
|
+
ast.Not: 'not',
|
|
22
|
+
ast.Pow: '**',
|
|
23
|
+
ast.Or: 'or',
|
|
24
|
+
ast.RShift: '>>',
|
|
25
|
+
ast.Sub: '-',
|
|
26
|
+
ast.UAdd: '+',
|
|
27
|
+
ast.USub: '-',
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
@overload
|
|
32
|
-
def unparse(node: None, code: str = '') -> None:
|
|
33
|
-
...
|
|
32
|
+
def unparse(node: None, code: str = '') -> None: ... # NoQA: E704
|
|
34
33
|
|
|
35
34
|
|
|
36
35
|
@overload
|
|
37
|
-
def unparse(node: ast.AST, code: str = '') -> str:
|
|
38
|
-
...
|
|
36
|
+
def unparse(node: ast.AST, code: str = '') -> str: ... # NoQA: E704
|
|
39
37
|
|
|
40
38
|
|
|
41
39
|
def unparse(node: ast.AST | None, code: str = '') -> str | None:
|
|
@@ -54,12 +52,13 @@ class _UnparseVisitor(ast.NodeVisitor):
|
|
|
54
52
|
|
|
55
53
|
def _visit_op(self, node: ast.AST) -> str:
|
|
56
54
|
return OPERATORS[node.__class__]
|
|
55
|
+
|
|
57
56
|
for _op in OPERATORS:
|
|
58
57
|
locals()[f'visit_{_op.__name__}'] = _visit_op
|
|
59
58
|
|
|
60
59
|
def visit_arg(self, node: ast.arg) -> str:
|
|
61
60
|
if node.annotation:
|
|
62
|
-
return f
|
|
61
|
+
return f'{node.arg}: {self.visit(node.annotation)}'
|
|
63
62
|
else:
|
|
64
63
|
return node.arg
|
|
65
64
|
|
|
@@ -68,9 +67,9 @@ class _UnparseVisitor(ast.NodeVisitor):
|
|
|
68
67
|
name = self.visit(arg)
|
|
69
68
|
if default:
|
|
70
69
|
if arg.annotation:
|
|
71
|
-
name +=
|
|
70
|
+
name += ' = %s' % self.visit(default)
|
|
72
71
|
else:
|
|
73
|
-
name +=
|
|
72
|
+
name += '=%s' % self.visit(default)
|
|
74
73
|
return name
|
|
75
74
|
|
|
76
75
|
def visit_arguments(self, node: ast.arguments) -> str:
|
|
@@ -85,8 +84,10 @@ class _UnparseVisitor(ast.NodeVisitor):
|
|
|
85
84
|
for _ in range(len(kw_defaults), len(node.kwonlyargs)):
|
|
86
85
|
kw_defaults.insert(0, None)
|
|
87
86
|
|
|
88
|
-
args: list[str] = [
|
|
89
|
-
|
|
87
|
+
args: list[str] = [
|
|
88
|
+
self._visit_arg_with_default(arg, defaults[i])
|
|
89
|
+
for i, arg in enumerate(node.posonlyargs)
|
|
90
|
+
]
|
|
90
91
|
|
|
91
92
|
if node.posonlyargs:
|
|
92
93
|
args.append('/')
|
|
@@ -95,7 +96,7 @@ class _UnparseVisitor(ast.NodeVisitor):
|
|
|
95
96
|
args.append(self._visit_arg_with_default(arg, defaults[i + posonlyargs]))
|
|
96
97
|
|
|
97
98
|
if node.vararg:
|
|
98
|
-
args.append(
|
|
99
|
+
args.append('*' + self.visit(node.vararg))
|
|
99
100
|
|
|
100
101
|
if node.kwonlyargs and not node.vararg:
|
|
101
102
|
args.append('*')
|
|
@@ -103,33 +104,33 @@ class _UnparseVisitor(ast.NodeVisitor):
|
|
|
103
104
|
args.append(self._visit_arg_with_default(arg, kw_defaults[i]))
|
|
104
105
|
|
|
105
106
|
if node.kwarg:
|
|
106
|
-
args.append(
|
|
107
|
+
args.append('**' + self.visit(node.kwarg))
|
|
107
108
|
|
|
108
|
-
return
|
|
109
|
+
return ', '.join(args)
|
|
109
110
|
|
|
110
111
|
def visit_Attribute(self, node: ast.Attribute) -> str:
|
|
111
|
-
return f
|
|
112
|
+
return f'{self.visit(node.value)}.{node.attr}'
|
|
112
113
|
|
|
113
114
|
def visit_BinOp(self, node: ast.BinOp) -> str:
|
|
114
115
|
# Special case ``**`` to not have surrounding spaces.
|
|
115
116
|
if isinstance(node.op, ast.Pow):
|
|
116
|
-
return
|
|
117
|
-
return
|
|
117
|
+
return ''.join(map(self.visit, (node.left, node.op, node.right)))
|
|
118
|
+
return ' '.join(map(self.visit, (node.left, node.op, node.right)))
|
|
118
119
|
|
|
119
120
|
def visit_BoolOp(self, node: ast.BoolOp) -> str:
|
|
120
|
-
op =
|
|
121
|
+
op = ' %s ' % self.visit(node.op)
|
|
121
122
|
return op.join(self.visit(e) for e in node.values)
|
|
122
123
|
|
|
123
124
|
def visit_Call(self, node: ast.Call) -> str:
|
|
124
125
|
args = ', '.join(
|
|
125
126
|
[self.visit(e) for e in node.args]
|
|
126
|
-
+ [f
|
|
127
|
+
+ [f'{k.arg}={self.visit(k.value)}' for k in node.keywords],
|
|
127
128
|
)
|
|
128
|
-
return f
|
|
129
|
+
return f'{self.visit(node.func)}({args})'
|
|
129
130
|
|
|
130
131
|
def visit_Constant(self, node: ast.Constant) -> str:
|
|
131
132
|
if node.value is Ellipsis:
|
|
132
|
-
return
|
|
133
|
+
return '...'
|
|
133
134
|
elif isinstance(node.value, int | float | complex):
|
|
134
135
|
if self.code:
|
|
135
136
|
return ast.get_source_segment(self.code, node) or repr(node.value)
|
|
@@ -141,34 +142,34 @@ class _UnparseVisitor(ast.NodeVisitor):
|
|
|
141
142
|
def visit_Dict(self, node: ast.Dict) -> str:
|
|
142
143
|
keys = (self.visit(k) for k in node.keys if k is not None)
|
|
143
144
|
values = (self.visit(v) for v in node.values)
|
|
144
|
-
items = (k +
|
|
145
|
-
return
|
|
145
|
+
items = (k + ': ' + v for k, v in zip(keys, values, strict=True))
|
|
146
|
+
return '{' + ', '.join(items) + '}'
|
|
146
147
|
|
|
147
148
|
def visit_Lambda(self, node: ast.Lambda) -> str:
|
|
148
|
-
return
|
|
149
|
+
return 'lambda %s: ...' % self.visit(node.args)
|
|
149
150
|
|
|
150
151
|
def visit_List(self, node: ast.List) -> str:
|
|
151
|
-
return
|
|
152
|
+
return '[' + ', '.join(self.visit(e) for e in node.elts) + ']'
|
|
152
153
|
|
|
153
154
|
def visit_Name(self, node: ast.Name) -> str:
|
|
154
155
|
return node.id
|
|
155
156
|
|
|
156
157
|
def visit_Set(self, node: ast.Set) -> str:
|
|
157
|
-
return
|
|
158
|
+
return '{' + ', '.join(self.visit(e) for e in node.elts) + '}'
|
|
158
159
|
|
|
159
160
|
def visit_Slice(self, node: ast.Slice) -> str:
|
|
160
161
|
if not node.lower and not node.upper and not node.step:
|
|
161
162
|
# Empty slice with default values -> [:]
|
|
162
|
-
return
|
|
163
|
+
return ':'
|
|
163
164
|
|
|
164
|
-
start = self.visit(node.lower) if node.lower else
|
|
165
|
-
stop = self.visit(node.upper) if node.upper else
|
|
165
|
+
start = self.visit(node.lower) if node.lower else ''
|
|
166
|
+
stop = self.visit(node.upper) if node.upper else ''
|
|
166
167
|
if not node.step:
|
|
167
168
|
# Default step size -> [start:stop]
|
|
168
|
-
return f
|
|
169
|
+
return f'{start}:{stop}'
|
|
169
170
|
|
|
170
|
-
step = self.visit(node.step) if node.step else
|
|
171
|
-
return f
|
|
171
|
+
step = self.visit(node.step) if node.step else ''
|
|
172
|
+
return f'{start}:{stop}:{step}'
|
|
172
173
|
|
|
173
174
|
def visit_Subscript(self, node: ast.Subscript) -> str:
|
|
174
175
|
def is_simple_tuple(value: ast.expr) -> bool:
|
|
@@ -179,25 +180,24 @@ class _UnparseVisitor(ast.NodeVisitor):
|
|
|
179
180
|
)
|
|
180
181
|
|
|
181
182
|
if is_simple_tuple(node.slice):
|
|
182
|
-
elts =
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
return f"{self.visit(node.value)}[{self.visit(node.slice)}]"
|
|
183
|
+
elts = ', '.join(self.visit(e) for e in node.slice.elts) # type: ignore[attr-defined]
|
|
184
|
+
return f'{self.visit(node.value)}[{elts}]'
|
|
185
|
+
return f'{self.visit(node.value)}[{self.visit(node.slice)}]'
|
|
186
186
|
|
|
187
187
|
def visit_UnaryOp(self, node: ast.UnaryOp) -> str:
|
|
188
188
|
# UnaryOp is one of {UAdd, USub, Invert, Not}, which refer to ``+x``,
|
|
189
189
|
# ``-x``, ``~x``, and ``not x``. Only Not needs a space.
|
|
190
190
|
if isinstance(node.op, ast.Not):
|
|
191
|
-
return f
|
|
192
|
-
return f
|
|
191
|
+
return f'{self.visit(node.op)} {self.visit(node.operand)}'
|
|
192
|
+
return f'{self.visit(node.op)}{self.visit(node.operand)}'
|
|
193
193
|
|
|
194
194
|
def visit_Tuple(self, node: ast.Tuple) -> str:
|
|
195
195
|
if len(node.elts) == 0:
|
|
196
|
-
return
|
|
196
|
+
return '()'
|
|
197
197
|
elif len(node.elts) == 1:
|
|
198
|
-
return
|
|
198
|
+
return '(%s,)' % self.visit(node.elts[0])
|
|
199
199
|
else:
|
|
200
|
-
return
|
|
200
|
+
return '(' + ', '.join(self.visit(e) for e in node.elts) + ')'
|
|
201
201
|
|
|
202
202
|
def generic_visit(self, node: ast.AST) -> NoReturn:
|
|
203
203
|
raise NotImplementedError('Unable to parse %s object' % type(node).__name__)
|
sphinx/pycode/parser.py
CHANGED
|
@@ -63,11 +63,12 @@ def get_lvar_names(node: ast.AST, self: ast.arg | None = None) -> list[str]:
|
|
|
63
63
|
return members
|
|
64
64
|
elif node_name == 'Attribute':
|
|
65
65
|
if (
|
|
66
|
-
node.value.__class__.__name__ == 'Name'
|
|
67
|
-
|
|
66
|
+
node.value.__class__.__name__ == 'Name' # type: ignore[attr-defined]
|
|
67
|
+
and self
|
|
68
|
+
and node.value.id == self_id # type: ignore[attr-defined]
|
|
68
69
|
):
|
|
69
70
|
# instance variable
|
|
70
|
-
return [
|
|
71
|
+
return ['%s' % get_lvar_names(node.attr, self)[0]] # type: ignore[attr-defined]
|
|
71
72
|
else:
|
|
72
73
|
raise TypeError('The assignment %r is not instance variable' % node)
|
|
73
74
|
elif node_name == 'str':
|
|
@@ -80,6 +81,7 @@ def get_lvar_names(node: ast.AST, self: ast.arg | None = None) -> list[str]:
|
|
|
80
81
|
|
|
81
82
|
def dedent_docstring(s: str) -> str:
|
|
82
83
|
"""Remove common leading indentation from docstring."""
|
|
84
|
+
|
|
83
85
|
def dummy() -> None:
|
|
84
86
|
# dummy function to mock `inspect.getdoc`.
|
|
85
87
|
pass
|
|
@@ -87,16 +89,22 @@ def dedent_docstring(s: str) -> str:
|
|
|
87
89
|
dummy.__doc__ = s
|
|
88
90
|
docstring = inspect.getdoc(dummy)
|
|
89
91
|
if docstring:
|
|
90
|
-
return docstring.lstrip(
|
|
92
|
+
return docstring.lstrip('\r\n').rstrip('\r\n')
|
|
91
93
|
else:
|
|
92
|
-
return
|
|
94
|
+
return ''
|
|
93
95
|
|
|
94
96
|
|
|
95
97
|
class Token:
|
|
96
98
|
"""Better token wrapper for tokenize module."""
|
|
97
99
|
|
|
98
|
-
def __init__(
|
|
99
|
-
|
|
100
|
+
def __init__(
|
|
101
|
+
self,
|
|
102
|
+
kind: int,
|
|
103
|
+
value: Any,
|
|
104
|
+
start: tuple[int, int],
|
|
105
|
+
end: tuple[int, int],
|
|
106
|
+
source: str,
|
|
107
|
+
) -> None:
|
|
100
108
|
self.kind = kind
|
|
101
109
|
self.value = value
|
|
102
110
|
self.start = start
|
|
@@ -201,7 +209,9 @@ class AfterCommentParser(TokenProcessor):
|
|
|
201
209
|
def parse(self) -> None:
|
|
202
210
|
"""Parse the code and obtain comment after assignment."""
|
|
203
211
|
# skip lvalue (or whole of AnnAssign)
|
|
204
|
-
while (tok := self.fetch_token()) and not tok.match(
|
|
212
|
+
while (tok := self.fetch_token()) and not tok.match(
|
|
213
|
+
[OP, '='], NEWLINE, COMMENT
|
|
214
|
+
):
|
|
205
215
|
assert tok
|
|
206
216
|
assert tok is not None
|
|
207
217
|
|
|
@@ -239,7 +249,7 @@ class VariableCommentPicker(ast.NodeVisitor):
|
|
|
239
249
|
def get_qualname_for(self, name: str) -> list[str] | None:
|
|
240
250
|
"""Get qualified name for given object as a list of string(s)."""
|
|
241
251
|
if self.current_function:
|
|
242
|
-
if self.current_classes and self.context[-1] ==
|
|
252
|
+
if self.current_classes and self.context[-1] == '__init__':
|
|
243
253
|
# store variable comments inside __init__ method of classes
|
|
244
254
|
return self.context[:-1] + [name]
|
|
245
255
|
else:
|
|
@@ -250,31 +260,32 @@ class VariableCommentPicker(ast.NodeVisitor):
|
|
|
250
260
|
def add_entry(self, name: str) -> None:
|
|
251
261
|
qualname = self.get_qualname_for(name)
|
|
252
262
|
if qualname:
|
|
253
|
-
self.deforders[
|
|
263
|
+
self.deforders['.'.join(qualname)] = next(self.counter)
|
|
254
264
|
|
|
255
265
|
def add_final_entry(self, name: str) -> None:
|
|
256
266
|
qualname = self.get_qualname_for(name)
|
|
257
267
|
if qualname:
|
|
258
|
-
self.finals.append(
|
|
268
|
+
self.finals.append('.'.join(qualname))
|
|
259
269
|
|
|
260
270
|
def add_overload_entry(self, func: ast.FunctionDef) -> None:
|
|
261
271
|
# avoid circular import problem
|
|
262
272
|
from sphinx.util.inspect import signature_from_ast
|
|
273
|
+
|
|
263
274
|
qualname = self.get_qualname_for(func.name)
|
|
264
275
|
if qualname:
|
|
265
|
-
overloads = self.overloads.setdefault(
|
|
276
|
+
overloads = self.overloads.setdefault('.'.join(qualname), [])
|
|
266
277
|
overloads.append(signature_from_ast(func))
|
|
267
278
|
|
|
268
279
|
def add_variable_comment(self, name: str, comment: str) -> None:
|
|
269
280
|
qualname = self.get_qualname_for(name)
|
|
270
281
|
if qualname:
|
|
271
|
-
basename =
|
|
282
|
+
basename = '.'.join(qualname[:-1])
|
|
272
283
|
self.comments[(basename, name)] = comment
|
|
273
284
|
|
|
274
285
|
def add_variable_annotation(self, name: str, annotation: ast.AST) -> None:
|
|
275
286
|
qualname = self.get_qualname_for(name)
|
|
276
287
|
if qualname:
|
|
277
|
-
basename =
|
|
288
|
+
basename = '.'.join(qualname[:-1])
|
|
278
289
|
self.annotations[(basename, name)] = ast_unparse(annotation)
|
|
279
290
|
|
|
280
291
|
def is_final(self, decorators: list[ast.expr]) -> bool:
|
|
@@ -353,7 +364,10 @@ class VariableCommentPicker(ast.NodeVisitor):
|
|
|
353
364
|
try:
|
|
354
365
|
targets = get_assign_targets(node)
|
|
355
366
|
varnames: list[str] = functools.reduce(
|
|
356
|
-
operator.iadd,
|
|
367
|
+
operator.iadd,
|
|
368
|
+
[get_lvar_names(t, self=self.get_self()) for t in targets],
|
|
369
|
+
[],
|
|
370
|
+
)
|
|
357
371
|
current_line = self.get_line(node.lineno)
|
|
358
372
|
except TypeError:
|
|
359
373
|
return # this assignment is not new definition!
|
|
@@ -364,21 +378,23 @@ class VariableCommentPicker(ast.NodeVisitor):
|
|
|
364
378
|
self.add_variable_annotation(varname, node.annotation)
|
|
365
379
|
elif hasattr(node, 'type_comment') and node.type_comment:
|
|
366
380
|
for varname in varnames:
|
|
367
|
-
self.add_variable_annotation(
|
|
368
|
-
varname, node.type_comment) # type: ignore[arg-type]
|
|
381
|
+
self.add_variable_annotation(varname, node.type_comment) # type: ignore[arg-type]
|
|
369
382
|
|
|
370
383
|
# check comments after assignment
|
|
371
|
-
parser = AfterCommentParser(
|
|
372
|
-
|
|
384
|
+
parser = AfterCommentParser(
|
|
385
|
+
[current_line[node.col_offset :]] + self.buffers[node.lineno :]
|
|
386
|
+
)
|
|
373
387
|
parser.parse()
|
|
374
388
|
if parser.comment and comment_re.match(parser.comment):
|
|
375
389
|
for varname in varnames:
|
|
376
|
-
self.add_variable_comment(
|
|
390
|
+
self.add_variable_comment(
|
|
391
|
+
varname, comment_re.sub('\\1', parser.comment)
|
|
392
|
+
)
|
|
377
393
|
self.add_entry(varname)
|
|
378
394
|
return
|
|
379
395
|
|
|
380
396
|
# check comments before assignment
|
|
381
|
-
if indent_re.match(current_line[:node.col_offset]):
|
|
397
|
+
if indent_re.match(current_line[: node.col_offset]):
|
|
382
398
|
comment_lines = []
|
|
383
399
|
for i in range(node.lineno - 1):
|
|
384
400
|
before_line = self.get_line(node.lineno - 1 - i)
|
|
@@ -404,8 +420,11 @@ class VariableCommentPicker(ast.NodeVisitor):
|
|
|
404
420
|
|
|
405
421
|
def visit_Expr(self, node: ast.Expr) -> None:
|
|
406
422
|
"""Handles Expr node and pick up a comment if string."""
|
|
407
|
-
if (
|
|
408
|
-
|
|
423
|
+
if (
|
|
424
|
+
isinstance(self.previous, ast.Assign | ast.AnnAssign)
|
|
425
|
+
and isinstance(node.value, ast.Constant)
|
|
426
|
+
and isinstance(node.value.value, str)
|
|
427
|
+
):
|
|
409
428
|
try:
|
|
410
429
|
targets = get_assign_targets(self.previous)
|
|
411
430
|
varnames = get_lvar_names(targets[0], self.get_self())
|
|
@@ -446,7 +465,8 @@ class VariableCommentPicker(ast.NodeVisitor):
|
|
|
446
465
|
def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
|
|
447
466
|
"""Handles FunctionDef node and set context."""
|
|
448
467
|
if self.current_function is None:
|
|
449
|
-
|
|
468
|
+
# should be called before setting self.current_function
|
|
469
|
+
self.add_entry(node.name)
|
|
450
470
|
if self.is_final(node.decorator_list):
|
|
451
471
|
self.add_final_entry(node.name)
|
|
452
472
|
if self.is_overload(node.decorator_list):
|
|
@@ -491,8 +511,10 @@ class DefinitionFinder(TokenProcessor):
|
|
|
491
511
|
break
|
|
492
512
|
if token == COMMENT:
|
|
493
513
|
pass
|
|
494
|
-
elif token == [OP, '@'] and (
|
|
495
|
-
|
|
514
|
+
elif token == [OP, '@'] and (
|
|
515
|
+
self.previous is None
|
|
516
|
+
or self.previous.match(NEWLINE, NL, INDENT, DEDENT)
|
|
517
|
+
):
|
|
496
518
|
if self.decorator is None:
|
|
497
519
|
self.decorator = token
|
|
498
520
|
elif token.match([NAME, 'class']):
|
|
@@ -522,8 +544,7 @@ class DefinitionFinder(TokenProcessor):
|
|
|
522
544
|
self.indents.append((typ, funcname, start_pos))
|
|
523
545
|
else:
|
|
524
546
|
# one-liner
|
|
525
|
-
self.add_definition(funcname,
|
|
526
|
-
(typ, start_pos, name.end[0])) # type: ignore[union-attr]
|
|
547
|
+
self.add_definition(funcname, (typ, start_pos, name.end[0])) # type: ignore[union-attr]
|
|
527
548
|
self.context.pop()
|
|
528
549
|
|
|
529
550
|
def finalize_block(self) -> None:
|
sphinx/pygments_styles.py
CHANGED
|
@@ -43,54 +43,54 @@ class PyramidStyle(Style):
|
|
|
43
43
|
|
|
44
44
|
# work in progress...
|
|
45
45
|
|
|
46
|
-
background_color =
|
|
47
|
-
default_style =
|
|
46
|
+
background_color = '#f8f8f8'
|
|
47
|
+
default_style = ''
|
|
48
48
|
|
|
49
49
|
styles = {
|
|
50
|
-
Whitespace:
|
|
51
|
-
Comment:
|
|
52
|
-
Comment.Preproc:
|
|
53
|
-
Comment.Special:
|
|
54
|
-
|
|
55
|
-
Keyword:
|
|
56
|
-
Keyword.Pseudo:
|
|
57
|
-
Keyword.Type:
|
|
58
|
-
|
|
59
|
-
Operator:
|
|
60
|
-
Operator.Word:
|
|
61
|
-
|
|
62
|
-
Name.Builtin:
|
|
63
|
-
Name.Function:
|
|
64
|
-
Name.Class:
|
|
65
|
-
Name.Namespace:
|
|
66
|
-
Name.Exception:
|
|
67
|
-
Name.Variable:
|
|
68
|
-
Name.Constant:
|
|
69
|
-
Name.Label:
|
|
70
|
-
Name.Entity:
|
|
71
|
-
Name.Attribute:
|
|
72
|
-
Name.Tag:
|
|
73
|
-
Name.Decorator:
|
|
74
|
-
|
|
75
|
-
String:
|
|
76
|
-
String.Doc:
|
|
77
|
-
String.Interpol:
|
|
78
|
-
String.Escape:
|
|
79
|
-
String.Regex:
|
|
80
|
-
String.Symbol:
|
|
81
|
-
String.Other:
|
|
82
|
-
Number:
|
|
83
|
-
|
|
84
|
-
Generic.Heading:
|
|
85
|
-
Generic.Subheading:
|
|
86
|
-
Generic.Deleted:
|
|
87
|
-
Generic.Inserted:
|
|
88
|
-
Generic.Error:
|
|
89
|
-
Generic.Emph:
|
|
90
|
-
Generic.Strong:
|
|
91
|
-
Generic.Prompt:
|
|
92
|
-
Generic.Output:
|
|
93
|
-
Generic.Traceback:
|
|
94
|
-
|
|
95
|
-
Error:
|
|
96
|
-
}
|
|
50
|
+
Whitespace: '#bbbbbb',
|
|
51
|
+
Comment: 'italic #60a0b0',
|
|
52
|
+
Comment.Preproc: 'noitalic #007020',
|
|
53
|
+
Comment.Special: 'noitalic bg:#fff0f0',
|
|
54
|
+
|
|
55
|
+
Keyword: 'bold #007020',
|
|
56
|
+
Keyword.Pseudo: 'nobold',
|
|
57
|
+
Keyword.Type: 'nobold #902000',
|
|
58
|
+
|
|
59
|
+
Operator: '#666666',
|
|
60
|
+
Operator.Word: 'bold #007020',
|
|
61
|
+
|
|
62
|
+
Name.Builtin: '#007020',
|
|
63
|
+
Name.Function: '#06287e',
|
|
64
|
+
Name.Class: 'bold #0e84b5',
|
|
65
|
+
Name.Namespace: 'bold #0e84b5',
|
|
66
|
+
Name.Exception: '#007020',
|
|
67
|
+
Name.Variable: '#bb60d5',
|
|
68
|
+
Name.Constant: '#60add5',
|
|
69
|
+
Name.Label: 'bold #002070',
|
|
70
|
+
Name.Entity: 'bold #d55537',
|
|
71
|
+
Name.Attribute: '#0e84b5',
|
|
72
|
+
Name.Tag: 'bold #062873',
|
|
73
|
+
Name.Decorator: 'bold #555555',
|
|
74
|
+
|
|
75
|
+
String: '#4070a0',
|
|
76
|
+
String.Doc: 'italic',
|
|
77
|
+
String.Interpol: 'italic #70a0d0',
|
|
78
|
+
String.Escape: 'bold #4070a0',
|
|
79
|
+
String.Regex: '#235388',
|
|
80
|
+
String.Symbol: '#517918',
|
|
81
|
+
String.Other: '#c65d09',
|
|
82
|
+
Number: '#40a070',
|
|
83
|
+
|
|
84
|
+
Generic.Heading: 'bold #000080',
|
|
85
|
+
Generic.Subheading: 'bold #800080',
|
|
86
|
+
Generic.Deleted: '#A00000',
|
|
87
|
+
Generic.Inserted: '#00A000',
|
|
88
|
+
Generic.Error: '#FF0000',
|
|
89
|
+
Generic.Emph: 'italic',
|
|
90
|
+
Generic.Strong: 'bold',
|
|
91
|
+
Generic.Prompt: 'bold #c65d09',
|
|
92
|
+
Generic.Output: '#888',
|
|
93
|
+
Generic.Traceback: '#04D',
|
|
94
|
+
|
|
95
|
+
Error: '#a40000 bg:#fbe3e4',
|
|
96
|
+
} # fmt: skip
|
sphinx/registry.py
CHANGED
|
@@ -47,6 +47,7 @@ logger = logging.getLogger(__name__)
|
|
|
47
47
|
# Values are Sphinx version that merge the extension.
|
|
48
48
|
EXTENSION_BLACKLIST = {
|
|
49
49
|
"sphinxjp.themecore": "1.2",
|
|
50
|
+
'sphinxcontrib-napoleon': '1.3',
|
|
50
51
|
"sphinxprettysearchresults": "2.0.0",
|
|
51
52
|
}
|
|
52
53
|
|
|
@@ -54,7 +55,7 @@ EXTENSION_BLACKLIST = {
|
|
|
54
55
|
class SphinxComponentRegistry:
|
|
55
56
|
def __init__(self) -> None:
|
|
56
57
|
#: special attrgetter for autodoc; class object -> attrgetter
|
|
57
|
-
self.
|
|
58
|
+
self.autodoc_attrgetters: dict[type, Callable[[Any, str, Any], Any]] = {}
|
|
58
59
|
|
|
59
60
|
#: builders; a dict of builder name -> builder class
|
|
60
61
|
self.builders: dict[str, type[Builder]] = {}
|
|
@@ -112,7 +113,7 @@ class SphinxComponentRegistry:
|
|
|
112
113
|
#: post transforms; list of transforms
|
|
113
114
|
self.post_transforms: list[type[Transform]] = []
|
|
114
115
|
|
|
115
|
-
#: source
|
|
116
|
+
#: source parsers; file type -> parser class
|
|
116
117
|
self.source_parsers: dict[str, type[Parser]] = {}
|
|
117
118
|
|
|
118
119
|
#: source suffix: suffix -> file type
|
|
@@ -131,6 +132,10 @@ class SphinxComponentRegistry:
|
|
|
131
132
|
# private cache of Docutils Publishers (file type -> publisher object)
|
|
132
133
|
self.publishers: dict[str, Publisher] = {}
|
|
133
134
|
|
|
135
|
+
@property
|
|
136
|
+
def autodoc_attrgettrs(self) -> dict[type, Callable[[Any, str, Any], Any]]:
|
|
137
|
+
return self.autodoc_attrgetters
|
|
138
|
+
|
|
134
139
|
def add_builder(self, builder: type[Builder], override: bool = False) -> None:
|
|
135
140
|
logger.debug('[app] adding builder: %r', builder)
|
|
136
141
|
if not hasattr(builder, 'name'):
|
|
@@ -376,7 +381,7 @@ class SphinxComponentRegistry:
|
|
|
376
381
|
|
|
377
382
|
def add_autodoc_attrgetter(self, typ: type,
|
|
378
383
|
attrgetter: Callable[[Any, str, Any], Any]) -> None:
|
|
379
|
-
self.
|
|
384
|
+
self.autodoc_attrgetters[typ] = attrgetter
|
|
380
385
|
|
|
381
386
|
def add_css_files(self, filename: str, **attributes: Any) -> None:
|
|
382
387
|
self.css_files.append((filename, attributes))
|