Sphinx 8.0.2__py3-none-any.whl → 8.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Sphinx might be problematic. Click here for more details.
- sphinx/__init__.py +6 -3
- sphinx/_cli/__init__.py +40 -20
- sphinx/_cli/util/colour.py +5 -4
- sphinx/_cli/util/errors.py +28 -11
- sphinx/application.py +361 -38
- sphinx/builders/__init__.py +229 -83
- sphinx/builders/_epub_base.py +118 -71
- sphinx/builders/changes.py +39 -21
- sphinx/builders/dirhtml.py +4 -4
- sphinx/builders/dummy.py +2 -5
- sphinx/builders/epub3.py +43 -22
- sphinx/builders/gettext.py +43 -25
- sphinx/builders/html/__init__.py +284 -218
- sphinx/builders/html/_assets.py +62 -26
- sphinx/builders/html/_build_info.py +76 -0
- sphinx/builders/html/transforms.py +11 -9
- sphinx/builders/latex/__init__.py +139 -81
- sphinx/builders/latex/constants.py +7 -7
- sphinx/builders/latex/nodes.py +3 -2
- sphinx/builders/latex/theming.py +7 -5
- sphinx/builders/latex/transforms.py +27 -19
- sphinx/builders/linkcheck.py +146 -72
- sphinx/builders/manpage.py +30 -13
- sphinx/builders/singlehtml.py +22 -14
- sphinx/builders/texinfo.py +67 -37
- sphinx/builders/text.py +5 -5
- sphinx/builders/xml.py +6 -9
- sphinx/cmd/build.py +282 -103
- sphinx/cmd/make_mode.py +106 -63
- sphinx/cmd/quickstart.py +341 -145
- sphinx/config.py +45 -12
- sphinx/deprecation.py +8 -2
- sphinx/directives/__init__.py +28 -19
- sphinx/directives/code.py +86 -56
- sphinx/directives/other.py +50 -36
- sphinx/directives/patches.py +29 -19
- sphinx/domains/__init__.py +20 -120
- sphinx/domains/_domains_container.py +281 -0
- sphinx/domains/_index.py +110 -0
- sphinx/domains/c/__init__.py +3 -3
- sphinx/domains/c/_parser.py +10 -6
- sphinx/domains/changeset.py +5 -3
- sphinx/domains/citation.py +5 -3
- sphinx/domains/cpp/__init__.py +9 -11
- sphinx/domains/cpp/_parser.py +8 -7
- sphinx/domains/index.py +3 -3
- sphinx/domains/javascript.py +12 -7
- sphinx/domains/math.py +2 -2
- sphinx/domains/python/__init__.py +10 -5
- sphinx/domains/python/_object.py +1 -1
- sphinx/domains/rst.py +5 -5
- sphinx/domains/std/__init__.py +16 -11
- sphinx/environment/__init__.py +206 -146
- sphinx/environment/adapters/asset.py +3 -2
- sphinx/environment/adapters/indexentries.py +74 -33
- sphinx/environment/adapters/toctree.py +100 -43
- sphinx/environment/collectors/__init__.py +19 -8
- sphinx/environment/collectors/asset.py +47 -15
- sphinx/environment/collectors/dependencies.py +8 -4
- sphinx/environment/collectors/metadata.py +7 -2
- sphinx/environment/collectors/title.py +7 -2
- sphinx/environment/collectors/toctree.py +54 -22
- sphinx/errors.py +4 -1
- sphinx/events.py +314 -7
- sphinx/ext/apidoc.py +42 -18
- sphinx/ext/autodoc/__init__.py +52 -24
- sphinx/ext/autodoc/importer.py +6 -9
- sphinx/ext/autosectionlabel.py +1 -2
- sphinx/ext/autosummary/__init__.py +3 -1
- sphinx/ext/autosummary/generate.py +28 -14
- sphinx/ext/coverage.py +7 -7
- sphinx/ext/doctest.py +4 -8
- sphinx/ext/duration.py +6 -5
- sphinx/ext/inheritance_diagram.py +1 -1
- sphinx/ext/intersphinx/_cli.py +6 -4
- sphinx/ext/intersphinx/_load.py +77 -32
- sphinx/ext/intersphinx/_resolve.py +173 -79
- sphinx/ext/intersphinx/_shared.py +7 -5
- sphinx/ext/linkcode.py +7 -1
- sphinx/ext/mathjax.py +1 -2
- sphinx/ext/napoleon/__init__.py +37 -24
- sphinx/ext/napoleon/docstring.py +202 -134
- sphinx/ext/todo.py +5 -3
- sphinx/highlighting.py +9 -2
- sphinx/io.py +1 -1
- sphinx/jinja2glue.py +27 -6
- sphinx/locale/__init__.py +6 -2
- sphinx/locale/ar/LC_MESSAGES/sphinx.js +8 -1
- sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ar/LC_MESSAGES/sphinx.po +2246 -2288
- sphinx/locale/bg/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bg/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/bn/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bn/LC_MESSAGES/sphinx.po +2349 -2395
- sphinx/locale/ca/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ca/LC_MESSAGES/sphinx.po +2846 -2892
- sphinx/locale/cak/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cak/LC_MESSAGES/sphinx.po +2213 -2259
- sphinx/locale/cs/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cs/LC_MESSAGES/sphinx.po +2225 -2269
- sphinx/locale/cy/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cy/LC_MESSAGES/sphinx.po +2403 -2447
- sphinx/locale/da/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/da/LC_MESSAGES/sphinx.po +2214 -2260
- sphinx/locale/de/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de/LC_MESSAGES/sphinx.po +2230 -2276
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/el/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/el/LC_MESSAGES/sphinx.po +2619 -2665
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2519 -2565
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/eo/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eo/LC_MESSAGES/sphinx.po +2232 -2278
- sphinx/locale/es/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es/LC_MESSAGES/sphinx.po +2516 -2561
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/et/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/et/LC_MESSAGES/sphinx.po +2317 -2363
- sphinx/locale/eu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eu/LC_MESSAGES/sphinx.po +2218 -2264
- sphinx/locale/fa/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fa/LC_MESSAGES/sphinx.po +2505 -2551
- sphinx/locale/fi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fi/LC_MESSAGES/sphinx.po +2303 -2349
- sphinx/locale/fr/LC_MESSAGES/sphinx.js +6 -2
- sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr/LC_MESSAGES/sphinx.po +2863 -2908
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/gl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/gl/LC_MESSAGES/sphinx.po +2571 -2617
- sphinx/locale/he/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/he/LC_MESSAGES/sphinx.po +2307 -2352
- sphinx/locale/hi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi/LC_MESSAGES/sphinx.po +2580 -2626
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/hr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hr/LC_MESSAGES/sphinx.po +2238 -2283
- sphinx/locale/hu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hu/LC_MESSAGES/sphinx.po +2228 -2274
- sphinx/locale/id/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/id/LC_MESSAGES/sphinx.po +2787 -2834
- sphinx/locale/is/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/is/LC_MESSAGES/sphinx.po +2224 -2270
- sphinx/locale/it/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/it/LC_MESSAGES/sphinx.po +2231 -2276
- sphinx/locale/ja/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ja/LC_MESSAGES/sphinx.po +2507 -2554
- sphinx/locale/ka/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ka/LC_MESSAGES/sphinx.po +2428 -2474
- sphinx/locale/ko/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ko/LC_MESSAGES/sphinx.po +2516 -2563
- sphinx/locale/lt/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lt/LC_MESSAGES/sphinx.po +2425 -2469
- sphinx/locale/lv/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lv/LC_MESSAGES/sphinx.po +2362 -2407
- sphinx/locale/mk/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/mk/LC_MESSAGES/sphinx.po +2121 -2167
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2220 -2266
- sphinx/locale/ne/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ne/LC_MESSAGES/sphinx.po +2221 -2267
- sphinx/locale/nl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nl/LC_MESSAGES/sphinx.po +2240 -2286
- sphinx/locale/pl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pl/LC_MESSAGES/sphinx.po +2319 -2363
- sphinx/locale/pt/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2854 -2899
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2224 -2269
- sphinx/locale/ro/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ro/LC_MESSAGES/sphinx.po +2226 -2271
- sphinx/locale/ru/LC_MESSAGES/sphinx.js +8 -3
- sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ru/LC_MESSAGES/sphinx.po +2841 -2885
- sphinx/locale/si/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/si/LC_MESSAGES/sphinx.po +2294 -2340
- sphinx/locale/sk/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sk/LC_MESSAGES/sphinx.po +2497 -2541
- sphinx/locale/sl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sl/LC_MESSAGES/sphinx.po +2331 -2375
- sphinx/locale/sphinx.pot +2121 -2167
- sphinx/locale/sq/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sq/LC_MESSAGES/sphinx.po +2855 -2901
- sphinx/locale/sr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr/LC_MESSAGES/sphinx.po +2203 -2248
- sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.po +2423 -2469
- sphinx/locale/te/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/te/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/tr/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/tr/LC_MESSAGES/sphinx.po +2443 -2489
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2329 -2373
- sphinx/locale/ur/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ur/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/vi/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/vi/LC_MESSAGES/sphinx.po +2199 -2246
- sphinx/locale/yue/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/yue/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2845 -2892
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/parsers.py +3 -1
- sphinx/project.py +6 -2
- sphinx/pycode/__init__.py +11 -4
- sphinx/pycode/ast.py +58 -58
- sphinx/pycode/parser.py +49 -28
- sphinx/pygments_styles.py +49 -49
- sphinx/registry.py +8 -3
- sphinx/roles.py +133 -13
- sphinx/search/__init__.py +146 -87
- sphinx/search/da.py +2 -4
- sphinx/search/de.py +2 -4
- sphinx/search/en.py +4 -4
- sphinx/search/es.py +2 -4
- sphinx/search/fi.py +2 -4
- sphinx/search/fr.py +2 -4
- sphinx/search/hu.py +2 -4
- sphinx/search/it.py +2 -4
- sphinx/search/ja.py +55 -32
- sphinx/search/nl.py +2 -4
- sphinx/search/no.py +2 -4
- sphinx/search/pt.py +2 -4
- sphinx/search/ro.py +0 -2
- sphinx/search/ru.py +2 -4
- sphinx/search/sv.py +2 -4
- sphinx/search/tr.py +0 -2
- sphinx/search/zh.py +18 -13
- sphinx/templates/graphviz/graphviz.css +0 -7
- sphinx/testing/fixtures.py +6 -5
- sphinx/testing/path.py +7 -5
- sphinx/testing/util.py +63 -29
- sphinx/texinputs/sphinx.sty +107 -39
- sphinx/texinputs/sphinxlatexadmonitions.sty +51 -35
- sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
- sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
- sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
- sphinx/texinputs/sphinxlatexlists.sty +1 -1
- sphinx/texinputs/sphinxlatexliterals.sty +4 -1
- sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
- sphinx/texinputs/sphinxlatexobjects.sty +1 -1
- sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
- sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
- sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
- sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
- sphinx/texinputs/sphinxlatextables.sty +1 -1
- sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
- sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
- sphinx/themes/agogo/layout.html +1 -10
- sphinx/themes/agogo/static/agogo.css.jinja +0 -7
- sphinx/themes/basic/defindex.html +1 -8
- sphinx/themes/basic/domainindex.html +1 -9
- sphinx/themes/basic/genindex-single.html +1 -9
- sphinx/themes/basic/genindex-split.html +1 -9
- sphinx/themes/basic/genindex.html +1 -9
- sphinx/themes/basic/globaltoc.html +1 -9
- sphinx/themes/basic/layout.html +1 -9
- sphinx/themes/basic/localtoc.html +1 -9
- sphinx/themes/basic/page.html +1 -9
- sphinx/themes/basic/relations.html +1 -9
- sphinx/themes/basic/search.html +1 -9
- sphinx/themes/basic/searchbox.html +1 -9
- sphinx/themes/basic/searchfield.html +4 -10
- sphinx/themes/basic/sourcelink.html +1 -9
- sphinx/themes/basic/static/basic.css.jinja +2 -13
- sphinx/themes/basic/static/doctools.js +0 -7
- sphinx/themes/basic/static/language_data.js.jinja +0 -7
- sphinx/themes/basic/static/searchtools.js +25 -13
- sphinx/themes/bizstyle/layout.html +1 -9
- sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
- sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
- sphinx/themes/classic/layout.html +1 -9
- sphinx/themes/classic/static/classic.css.jinja +0 -7
- sphinx/themes/classic/static/sidebar.js.jinja +0 -6
- sphinx/themes/epub/epub-cover.html +1 -9
- sphinx/themes/epub/layout.html +1 -9
- sphinx/themes/epub/static/epub.css.jinja +0 -7
- sphinx/themes/haiku/layout.html +1 -9
- sphinx/themes/haiku/static/haiku.css.jinja +0 -6
- sphinx/themes/nature/static/nature.css.jinja +0 -7
- sphinx/themes/nonav/layout.html +1 -9
- sphinx/themes/nonav/static/nonav.css.jinja +0 -7
- sphinx/themes/pyramid/static/epub.css.jinja +0 -7
- sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
- sphinx/themes/scrolls/layout.html +1 -10
- sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
- sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
- sphinx/themes/traditional/static/traditional.css.jinja +0 -7
- sphinx/theming.py +18 -6
- sphinx/transforms/__init__.py +56 -35
- sphinx/transforms/compact_bullet_list.py +3 -2
- sphinx/transforms/i18n.py +132 -50
- sphinx/transforms/post_transforms/__init__.py +94 -43
- sphinx/transforms/post_transforms/code.py +7 -6
- sphinx/transforms/post_transforms/images.py +71 -54
- sphinx/transforms/references.py +1 -2
- sphinx/util/__init__.py +23 -194
- sphinx/util/_files.py +80 -0
- sphinx/util/_importer.py +27 -0
- sphinx/util/_io.py +1 -2
- sphinx/util/_lines.py +26 -0
- sphinx/util/_pathlib.py +5 -2
- sphinx/util/_serialise.py +53 -0
- sphinx/util/_timestamps.py +2 -1
- sphinx/util/_uri.py +16 -0
- sphinx/util/cfamily.py +48 -25
- sphinx/util/console.py +1 -0
- sphinx/util/display.py +1 -1
- sphinx/util/docfields.py +125 -45
- sphinx/util/docstrings.py +1 -1
- sphinx/util/docutils.py +118 -44
- sphinx/util/exceptions.py +11 -5
- sphinx/util/fileutil.py +53 -32
- sphinx/util/http_date.py +9 -7
- sphinx/util/i18n.py +49 -16
- sphinx/util/images.py +7 -6
- sphinx/util/inspect.py +29 -12
- sphinx/util/inventory.py +47 -29
- sphinx/util/logging.py +58 -85
- sphinx/util/matching.py +3 -3
- sphinx/util/math.py +1 -1
- sphinx/util/nodes.py +176 -108
- sphinx/util/osutil.py +13 -10
- sphinx/util/parallel.py +5 -4
- sphinx/util/parsing.py +5 -3
- sphinx/util/png.py +3 -3
- sphinx/util/requests.py +8 -4
- sphinx/util/rst.py +5 -3
- sphinx/util/tags.py +5 -2
- sphinx/util/template.py +26 -11
- sphinx/util/texescape.py +2 -2
- sphinx/util/typing.py +89 -38
- sphinx/versioning.py +3 -1
- sphinx/writers/html.py +22 -7
- sphinx/writers/html5.py +113 -64
- sphinx/writers/latex.py +408 -221
- sphinx/writers/manpage.py +25 -15
- sphinx/writers/texinfo.py +94 -82
- sphinx/writers/text.py +87 -53
- sphinx/writers/xml.py +5 -4
- sphinx-8.1.0.dist-info/LICENSE.rst +31 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
- sphinx-8.1.0.dist-info/RECORD +598 -0
- sphinx-8.0.2.dist-info/LICENSE.rst +0 -67
- sphinx-8.0.2.dist-info/RECORD +0 -590
- {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/WHEEL +0 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
sphinx/writers/manpage.py
CHANGED
|
@@ -98,8 +98,10 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
|
|
|
98
98
|
if self.config.today:
|
|
99
99
|
self._docinfo['date'] = self.config.today
|
|
100
100
|
else:
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
today_fmt = self.config.today_fmt or _('%b %d, %Y')
|
|
102
|
+
self._docinfo['date'] = format_date(
|
|
103
|
+
today_fmt, language=self.config.language
|
|
104
|
+
)
|
|
103
105
|
self._docinfo['copyright'] = self.config.copyright
|
|
104
106
|
self._docinfo['version'] = self.config.version
|
|
105
107
|
self._docinfo['manual_group'] = self.config.project
|
|
@@ -110,11 +112,12 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
|
|
|
110
112
|
|
|
111
113
|
# overwritten -- added quotes around all .TH arguments
|
|
112
114
|
def header(self) -> str:
|
|
113
|
-
tmpl = (
|
|
114
|
-
|
|
115
|
+
tmpl = (
|
|
116
|
+
'.TH "%(title_upper)s" "%(manual_section)s"'
|
|
117
|
+
' "%(date)s" "%(version)s" "%(manual_group)s"\n'
|
|
118
|
+
)
|
|
115
119
|
if self._docinfo['subtitle']:
|
|
116
|
-
tmpl +=
|
|
117
|
-
"%(title)s \\- %(subtitle)s\n")
|
|
120
|
+
tmpl += '.SH NAME\n' '%(title)s \\- %(subtitle)s\n'
|
|
118
121
|
return tmpl % self._docinfo
|
|
119
122
|
|
|
120
123
|
def visit_start_of_file(self, node: Element) -> None:
|
|
@@ -312,7 +315,7 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
|
|
|
312
315
|
is_safe_to_click = uri.startswith(('mailto:', 'http:', 'https:', 'ftp:'))
|
|
313
316
|
if is_safe_to_click:
|
|
314
317
|
# OSC 8 link start (using groff's device control directive).
|
|
315
|
-
self.body.append(
|
|
318
|
+
self.body.append(rf"\X'tty: link {uri}'")
|
|
316
319
|
|
|
317
320
|
self.body.append(self.defs['reference'][0])
|
|
318
321
|
# avoid repeating escaping code... fine since
|
|
@@ -323,12 +326,14 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
|
|
|
323
326
|
if uri and not uri.startswith('#'):
|
|
324
327
|
# if configured, put the URL after the link
|
|
325
328
|
if self.config.man_show_urls and node.astext() != uri:
|
|
326
|
-
|
|
327
|
-
uri = uri[7:]
|
|
329
|
+
uri = uri.removeprefix('mailto:')
|
|
328
330
|
self.body.extend([
|
|
329
331
|
' <',
|
|
330
|
-
self.defs['strong'][0],
|
|
331
|
-
|
|
332
|
+
self.defs['strong'][0],
|
|
333
|
+
uri,
|
|
334
|
+
self.defs['strong'][1],
|
|
335
|
+
'>',
|
|
336
|
+
])
|
|
332
337
|
if is_safe_to_click:
|
|
333
338
|
# OSC 8 link end.
|
|
334
339
|
self.body.append(r"\X'tty: link'")
|
|
@@ -421,13 +426,19 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
|
|
|
421
426
|
|
|
422
427
|
# overwritten: handle section titles better than in 0.6 release
|
|
423
428
|
def visit_caption(self, node: Element) -> None:
|
|
424
|
-
if
|
|
429
|
+
if (
|
|
430
|
+
isinstance(node.parent, nodes.container)
|
|
431
|
+
and node.parent.get('literal_block')
|
|
432
|
+
): # fmt: skip
|
|
425
433
|
self.body.append('.sp\n')
|
|
426
434
|
else:
|
|
427
435
|
super().visit_caption(node)
|
|
428
436
|
|
|
429
437
|
def depart_caption(self, node: Element) -> None:
|
|
430
|
-
if
|
|
438
|
+
if (
|
|
439
|
+
isinstance(node.parent, nodes.container)
|
|
440
|
+
and node.parent.get('literal_block')
|
|
441
|
+
): # fmt: skip
|
|
431
442
|
self.body.append('\n')
|
|
432
443
|
else:
|
|
433
444
|
super().depart_caption(node)
|
|
@@ -442,8 +453,7 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
|
|
|
442
453
|
# skip the document title
|
|
443
454
|
raise nodes.SkipNode
|
|
444
455
|
elif self.section_level == 1:
|
|
445
|
-
self.body.append('.SH
|
|
446
|
-
self.deunicode(node.astext().upper()))
|
|
456
|
+
self.body.append(f'.SH {self.deunicode(node.astext().upper())}\n')
|
|
447
457
|
raise nodes.SkipNode
|
|
448
458
|
return super().visit_title(node)
|
|
449
459
|
|
sphinx/writers/texinfo.py
CHANGED
|
@@ -6,12 +6,11 @@ import re
|
|
|
6
6
|
import textwrap
|
|
7
7
|
from collections.abc import Iterable, Iterator
|
|
8
8
|
from os import path
|
|
9
|
-
from typing import TYPE_CHECKING, Any, cast
|
|
9
|
+
from typing import TYPE_CHECKING, Any, ClassVar, cast
|
|
10
10
|
|
|
11
11
|
from docutils import nodes, writers
|
|
12
12
|
|
|
13
13
|
from sphinx import __display_version__, addnodes
|
|
14
|
-
from sphinx.domains.index import IndexDomain
|
|
15
14
|
from sphinx.errors import ExtensionError
|
|
16
15
|
from sphinx.locale import _, __, admonitionlabels
|
|
17
16
|
from sphinx.util import logging
|
|
@@ -39,13 +38,13 @@ Copyright @copyright{} %(copyright)s
|
|
|
39
38
|
@end quotation
|
|
40
39
|
"""
|
|
41
40
|
|
|
42
|
-
TEMPLATE = """\
|
|
41
|
+
TEMPLATE = f"""\
|
|
43
42
|
\\input texinfo @c -*-texinfo-*-
|
|
44
43
|
@c %%**start of header
|
|
45
44
|
@setfilename %(filename)s
|
|
46
45
|
@documentencoding UTF-8
|
|
47
46
|
@ifinfo
|
|
48
|
-
@*Generated by Sphinx
|
|
47
|
+
@*Generated by Sphinx {__display_version__}.@*
|
|
49
48
|
@end ifinfo
|
|
50
49
|
@settitle %(title)s
|
|
51
50
|
@defindex ge
|
|
@@ -105,20 +104,23 @@ def smart_capwords(s: str, sep: str | None = None) -> str:
|
|
|
105
104
|
return (sep or ' ').join(words)
|
|
106
105
|
|
|
107
106
|
|
|
108
|
-
class TexinfoWriter(writers.Writer): # type: ignore[
|
|
107
|
+
class TexinfoWriter(writers.Writer): # type: ignore[type-arg]
|
|
109
108
|
"""Texinfo writer for generating Texinfo documents."""
|
|
110
109
|
|
|
111
110
|
supported = ('texinfo', 'texi')
|
|
112
111
|
|
|
113
|
-
settings_spec
|
|
114
|
-
'Texinfo Specific Options',
|
|
115
|
-
|
|
112
|
+
settings_spec = (
|
|
113
|
+
'Texinfo Specific Options',
|
|
114
|
+
None,
|
|
115
|
+
(
|
|
116
|
+
('Name of the Info file', ['--texinfo-filename'], {'default': ''}),
|
|
116
117
|
('Dir entry', ['--texinfo-dir-entry'], {'default': ''}),
|
|
117
118
|
('Description', ['--texinfo-dir-description'], {'default': ''}),
|
|
118
|
-
('Category', ['--texinfo-dir-category'], {'default':
|
|
119
|
-
|
|
119
|
+
('Category', ['--texinfo-dir-category'], {'default': 'Miscellaneous'}),
|
|
120
|
+
),
|
|
121
|
+
)
|
|
120
122
|
|
|
121
|
-
settings_defaults: dict[str, Any] = {}
|
|
123
|
+
settings_defaults: ClassVar[dict[str, Any]] = {}
|
|
122
124
|
|
|
123
125
|
output: str
|
|
124
126
|
|
|
@@ -129,6 +131,7 @@ class TexinfoWriter(writers.Writer): # type: ignore[misc]
|
|
|
129
131
|
self.builder = builder
|
|
130
132
|
|
|
131
133
|
def translate(self) -> None:
|
|
134
|
+
assert isinstance(self.document, nodes.document)
|
|
132
135
|
visitor = self.builder.create_translator(self.document, self.builder)
|
|
133
136
|
self.visitor = cast(TexinfoTranslator, visitor)
|
|
134
137
|
self.document.walkabout(visitor)
|
|
@@ -138,7 +141,6 @@ class TexinfoWriter(writers.Writer): # type: ignore[misc]
|
|
|
138
141
|
|
|
139
142
|
|
|
140
143
|
class TexinfoTranslator(SphinxTranslator):
|
|
141
|
-
|
|
142
144
|
ignore_missing_images = False
|
|
143
145
|
builder: TexinfoBuilder
|
|
144
146
|
|
|
@@ -161,14 +163,14 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
161
163
|
super().__init__(document, builder)
|
|
162
164
|
self.init_settings()
|
|
163
165
|
|
|
164
|
-
self.written_ids: set[str] = set()
|
|
166
|
+
self.written_ids: set[str] = set() # node names and anchors in output
|
|
165
167
|
# node names and anchors that should be in output
|
|
166
168
|
self.referenced_ids: set[str] = set()
|
|
167
|
-
self.indices: list[tuple[str, str]] = []
|
|
168
|
-
self.short_ids: dict[str, str] = {}
|
|
169
|
-
self.node_names: dict[str, str] = {}
|
|
169
|
+
self.indices: list[tuple[str, str]] = [] # (node name, content)
|
|
170
|
+
self.short_ids: dict[str, str] = {} # anchors --> short ids
|
|
171
|
+
self.node_names: dict[str, str] = {} # node name --> node's name to display
|
|
170
172
|
self.node_menus: dict[str, list[str]] = {} # node name --> node's menu entries
|
|
171
|
-
self.rellinks: dict[str, list[str]] = {}
|
|
173
|
+
self.rellinks: dict[str, list[str]] = {} # node name --> (next, previous, up)
|
|
172
174
|
|
|
173
175
|
self.collect_indices()
|
|
174
176
|
self.collect_node_names()
|
|
@@ -213,6 +215,10 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
213
215
|
# -- Helper routines
|
|
214
216
|
|
|
215
217
|
def init_settings(self) -> None:
|
|
218
|
+
today_fmt = self.config.today_fmt or _('%b %d, %Y')
|
|
219
|
+
today = self.config.today or format_date(
|
|
220
|
+
today_fmt, language=self.config.language
|
|
221
|
+
)
|
|
216
222
|
elements = self.elements = self.default_elements.copy()
|
|
217
223
|
elements.update({
|
|
218
224
|
# if empty, the title is set to the first section title
|
|
@@ -223,9 +229,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
223
229
|
'release': self.escape(self.config.release),
|
|
224
230
|
'project': self.escape(self.config.project),
|
|
225
231
|
'copyright': self.escape(self.config.copyright),
|
|
226
|
-
'date': self.escape(
|
|
227
|
-
format_date(self.config.today_fmt or _('%b %d, %Y'),
|
|
228
|
-
language=self.config.language)),
|
|
232
|
+
'date': self.escape(today),
|
|
229
233
|
})
|
|
230
234
|
# title
|
|
231
235
|
title: str = self.settings.title
|
|
@@ -244,12 +248,11 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
244
248
|
entry = self.format_menu_entry(
|
|
245
249
|
self.escape_menu(self.settings.texinfo_dir_entry),
|
|
246
250
|
'(%s)' % elements['filename'],
|
|
247
|
-
self.escape_arg(self.settings.texinfo_dir_description)
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
self.escape_id(self.settings.texinfo_dir_category), entry)
|
|
251
|
+
self.escape_arg(self.settings.texinfo_dir_description),
|
|
252
|
+
)
|
|
253
|
+
elements['direntry'] = (
|
|
254
|
+
'@dircategory %s\n' '@direntry\n' '%s' '@end direntry\n'
|
|
255
|
+
) % (self.escape_id(self.settings.texinfo_dir_category), entry)
|
|
253
256
|
elements['copying'] = COPYING % elements
|
|
254
257
|
# allow the user to override them all
|
|
255
258
|
elements.update(self.settings.texinfo_elements)
|
|
@@ -263,8 +266,10 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
263
266
|
def add_node_name(name: str) -> str:
|
|
264
267
|
node_id = self.escape_id(name)
|
|
265
268
|
nth, suffix = 1, ''
|
|
266
|
-
while
|
|
267
|
-
|
|
269
|
+
while (
|
|
270
|
+
node_id + suffix in self.written_ids
|
|
271
|
+
or node_id + suffix in self.node_names
|
|
272
|
+
):
|
|
268
273
|
nth += 1
|
|
269
274
|
suffix = '<%s>' % nth
|
|
270
275
|
node_id += suffix
|
|
@@ -277,8 +282,9 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
277
282
|
add_node_name('Top')
|
|
278
283
|
add_node_name('top')
|
|
279
284
|
# each index is a node
|
|
280
|
-
self.indices = [
|
|
281
|
-
|
|
285
|
+
self.indices = [
|
|
286
|
+
(add_node_name(name), content) for name, content in self.indices
|
|
287
|
+
]
|
|
282
288
|
# each section is also a node
|
|
283
289
|
for section in self.document.findall(nodes.section):
|
|
284
290
|
title = cast(nodes.TextElement, section.next_node(nodes.Titular)) # type: ignore[type-var]
|
|
@@ -349,7 +355,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
349
355
|
s = s.replace('{', '@{')
|
|
350
356
|
s = s.replace('}', '@}')
|
|
351
357
|
# prevent `` and '' quote conversion
|
|
352
|
-
s = s.replace('``',
|
|
358
|
+
s = s.replace('``', '`@w{`}')
|
|
353
359
|
s = s.replace("''", "'@w{'}")
|
|
354
360
|
return s
|
|
355
361
|
|
|
@@ -393,8 +399,9 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
393
399
|
else:
|
|
394
400
|
s = f'* {name}: {node_name}. '
|
|
395
401
|
offset = max((24, (len(name) + 4) % 78))
|
|
396
|
-
wdesc = '\n'.join(
|
|
397
|
-
|
|
402
|
+
wdesc = '\n'.join(
|
|
403
|
+
' ' * offset + l for l in textwrap.wrap(desc, width=78 - offset)
|
|
404
|
+
)
|
|
398
405
|
return s + wdesc.strip() + '\n'
|
|
399
406
|
|
|
400
407
|
def add_menu_entries(
|
|
@@ -424,9 +431,11 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
424
431
|
return
|
|
425
432
|
self.body.append('\n@menu\n')
|
|
426
433
|
self.add_menu_entries(entries)
|
|
427
|
-
if (
|
|
428
|
-
|
|
429
|
-
|
|
434
|
+
if (
|
|
435
|
+
node_name != 'Top'
|
|
436
|
+
or not self.node_menus[entries[0]]
|
|
437
|
+
or self.config.texinfo_no_detailmenu
|
|
438
|
+
):
|
|
430
439
|
self.body.append('\n@end menu\n')
|
|
431
440
|
return
|
|
432
441
|
|
|
@@ -439,12 +448,10 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
439
448
|
for subentry in entries:
|
|
440
449
|
_add_detailed_menu(subentry)
|
|
441
450
|
|
|
442
|
-
self.body.append('\n@detailmenu\n'
|
|
443
|
-
' --- The Detailed Node Listing ---\n')
|
|
451
|
+
self.body.append('\n@detailmenu\n' ' --- The Detailed Node Listing ---\n')
|
|
444
452
|
for entry in entries:
|
|
445
453
|
_add_detailed_menu(entry)
|
|
446
|
-
self.body.append('\n@end detailmenu\n'
|
|
447
|
-
'@end menu\n')
|
|
454
|
+
self.body.append('\n@end detailmenu\n' '@end menu\n')
|
|
448
455
|
|
|
449
456
|
def tex_image_length(self, width_str: str) -> str:
|
|
450
457
|
match = re.match(r'(\d*\.?\d*)\s*(\S*)', width_str)
|
|
@@ -453,16 +460,18 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
453
460
|
return width_str
|
|
454
461
|
res = width_str
|
|
455
462
|
amount, unit = match.groups()[:2]
|
|
456
|
-
if not unit or unit ==
|
|
463
|
+
if not unit or unit == 'px':
|
|
457
464
|
# pixels: let TeX alone
|
|
458
465
|
return ''
|
|
459
|
-
elif unit ==
|
|
466
|
+
elif unit == '%':
|
|
460
467
|
# a4paper: textwidth=418.25368pt
|
|
461
|
-
res =
|
|
468
|
+
res = '%d.0pt' % (float(amount) * 4.1825368)
|
|
462
469
|
return res
|
|
463
470
|
|
|
464
471
|
def collect_indices(self) -> None:
|
|
465
|
-
def generate(
|
|
472
|
+
def generate(
|
|
473
|
+
content: list[tuple[str, list[IndexEntry]]], collapsed: bool
|
|
474
|
+
) -> str:
|
|
466
475
|
ret = ['\n@menu\n']
|
|
467
476
|
for _letter, entries in content:
|
|
468
477
|
for entry in entries:
|
|
@@ -482,21 +491,21 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
482
491
|
indices_config = frozenset(indices_config)
|
|
483
492
|
else:
|
|
484
493
|
check_names = False
|
|
485
|
-
for
|
|
486
|
-
domain = self.builder.env.domains[domain_name]
|
|
494
|
+
for domain in self.builder.env.domains.sorted():
|
|
487
495
|
for index_cls in domain.indices:
|
|
488
496
|
index_name = f'{domain.name}-{index_cls.name}'
|
|
489
497
|
if check_names and index_name not in indices_config:
|
|
490
498
|
continue
|
|
491
499
|
content, collapsed = index_cls(domain).generate(
|
|
492
|
-
self.builder.docnames
|
|
500
|
+
self.builder.docnames
|
|
501
|
+
)
|
|
493
502
|
if content:
|
|
494
503
|
self.indices.append((
|
|
495
504
|
index_cls.localname,
|
|
496
505
|
generate(content, collapsed),
|
|
497
506
|
))
|
|
498
507
|
# only add the main Index if it's not empty
|
|
499
|
-
domain =
|
|
508
|
+
domain = self.builder.env.domains.index_domain
|
|
500
509
|
for docname in self.builder.docnames:
|
|
501
510
|
if domain.entries[docname]:
|
|
502
511
|
self.indices.append((_('Index'), '\n@printindex ge\n'))
|
|
@@ -506,7 +515,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
506
515
|
# TODO: move this to sphinx.util
|
|
507
516
|
|
|
508
517
|
def collect_footnotes(
|
|
509
|
-
self, node: Element
|
|
518
|
+
self, node: Element
|
|
510
519
|
) -> dict[str, list[collected_footnote | bool]]:
|
|
511
520
|
def footnotes_under(n: Element) -> Iterator[nodes.footnote]:
|
|
512
521
|
if isinstance(n, nodes.footnote):
|
|
@@ -517,6 +526,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
517
526
|
continue
|
|
518
527
|
elif isinstance(c, nodes.Element):
|
|
519
528
|
yield from footnotes_under(c)
|
|
529
|
+
|
|
520
530
|
fnotes: dict[str, list[collected_footnote | bool]] = {}
|
|
521
531
|
for fn in footnotes_under(node):
|
|
522
532
|
label = cast(nodes.label, fn[0])
|
|
@@ -628,9 +638,13 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
628
638
|
if isinstance(parent, nodes.Admonition | nodes.sidebar | nodes.topic):
|
|
629
639
|
raise nodes.SkipNode
|
|
630
640
|
if not isinstance(parent, nodes.section):
|
|
631
|
-
logger.warning(
|
|
632
|
-
|
|
633
|
-
|
|
641
|
+
logger.warning(
|
|
642
|
+
__(
|
|
643
|
+
'encountered title node not in section, topic, table, '
|
|
644
|
+
'admonition or sidebar'
|
|
645
|
+
),
|
|
646
|
+
location=node,
|
|
647
|
+
)
|
|
634
648
|
self.visit_rubric(node)
|
|
635
649
|
else:
|
|
636
650
|
try:
|
|
@@ -904,9 +918,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
904
918
|
def visit_enumerated_list(self, node: Element) -> None:
|
|
905
919
|
# doesn't support Roman numerals
|
|
906
920
|
enum = node.get('enumtype', 'arabic')
|
|
907
|
-
starters = {'arabic': '',
|
|
908
|
-
'loweralpha': 'a',
|
|
909
|
-
'upperalpha': 'A'}
|
|
921
|
+
starters = {'arabic': '', 'loweralpha': 'a', 'upperalpha': 'A'}
|
|
910
922
|
start = node.get('start', starters.get(enum, ''))
|
|
911
923
|
self.body.append('\n\n@enumerate %s\n' % start)
|
|
912
924
|
|
|
@@ -1107,8 +1119,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1107
1119
|
|
|
1108
1120
|
def depart_admonition(self, node: Element) -> None:
|
|
1109
1121
|
self.ensure_eol()
|
|
1110
|
-
self.body.append('@end quotation\n'
|
|
1111
|
-
'@end cartouche\n')
|
|
1122
|
+
self.body.append('@end quotation\n' '@end cartouche\n')
|
|
1112
1123
|
|
|
1113
1124
|
visit_attention = _visit_named_admonition
|
|
1114
1125
|
depart_attention = depart_admonition
|
|
@@ -1194,18 +1205,19 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1194
1205
|
self.body.append('\n@end float\n\n')
|
|
1195
1206
|
|
|
1196
1207
|
def visit_caption(self, node: Element) -> None:
|
|
1197
|
-
if
|
|
1198
|
-
|
|
1199
|
-
|
|
1208
|
+
if isinstance(node.parent, nodes.figure) or (
|
|
1209
|
+
isinstance(node.parent, nodes.container)
|
|
1210
|
+
and node.parent.get('literal_block')
|
|
1211
|
+
):
|
|
1200
1212
|
self.body.append('\n@caption{')
|
|
1201
1213
|
else:
|
|
1202
|
-
logger.warning(__('caption not inside a figure.'),
|
|
1203
|
-
location=node)
|
|
1214
|
+
logger.warning(__('caption not inside a figure.'), location=node)
|
|
1204
1215
|
|
|
1205
1216
|
def depart_caption(self, node: Element) -> None:
|
|
1206
|
-
if
|
|
1207
|
-
|
|
1208
|
-
|
|
1217
|
+
if isinstance(node.parent, nodes.figure) or (
|
|
1218
|
+
isinstance(node.parent, nodes.container)
|
|
1219
|
+
and node.parent.get('literal_block')
|
|
1220
|
+
):
|
|
1209
1221
|
self.body.append('}\n')
|
|
1210
1222
|
|
|
1211
1223
|
def visit_image(self, node: Element) -> None:
|
|
@@ -1225,8 +1237,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1225
1237
|
height = self.tex_image_length(node.get('height', ''))
|
|
1226
1238
|
alt = self.escape_arg(node.get('alt', ''))
|
|
1227
1239
|
filename = f"{self.elements['filename'][:-5]}-figures/{name}" # type: ignore[index]
|
|
1228
|
-
self.body.append('\n@image{
|
|
1229
|
-
(filename, width, height, alt, ext[1:]))
|
|
1240
|
+
self.body.append(f'\n@image{{{filename},{width},{height},{alt},{ext[1:]}}}\n')
|
|
1230
1241
|
|
|
1231
1242
|
def depart_image(self, node: Element) -> None:
|
|
1232
1243
|
pass
|
|
@@ -1268,9 +1279,9 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1268
1279
|
raise nodes.SkipNode
|
|
1269
1280
|
|
|
1270
1281
|
def visit_system_message(self, node: Element) -> None:
|
|
1271
|
-
self.body.append(
|
|
1272
|
-
|
|
1273
|
-
|
|
1282
|
+
self.body.append(
|
|
1283
|
+
'\n@verbatim\n' '<SYSTEM MESSAGE: %s>\n' '@end verbatim\n' % node.astext()
|
|
1284
|
+
)
|
|
1274
1285
|
raise nodes.SkipNode
|
|
1275
1286
|
|
|
1276
1287
|
def visit_comment(self, node: Element) -> None:
|
|
@@ -1286,8 +1297,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1286
1297
|
self.body.append('<<')
|
|
1287
1298
|
|
|
1288
1299
|
def unimplemented_visit(self, node: Element) -> None:
|
|
1289
|
-
logger.warning(__(
|
|
1290
|
-
location=node)
|
|
1300
|
+
logger.warning(__('unimplemented node type: %r'), node, location=node)
|
|
1291
1301
|
|
|
1292
1302
|
def unknown_departure(self, node: Node) -> None:
|
|
1293
1303
|
pass
|
|
@@ -1336,7 +1346,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1336
1346
|
self.ensure_eol()
|
|
1337
1347
|
else:
|
|
1338
1348
|
self.body.append('\n')
|
|
1339
|
-
for
|
|
1349
|
+
for _entry_type, value, _target_id, _main, _category_key in node['entries']:
|
|
1340
1350
|
text = self.escape_menu(value)
|
|
1341
1351
|
self.body.append('@geindex %s\n' % text)
|
|
1342
1352
|
|
|
@@ -1362,8 +1372,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1362
1372
|
raise nodes.SkipNode
|
|
1363
1373
|
|
|
1364
1374
|
def visit_seealso(self, node: Element) -> None:
|
|
1365
|
-
self.body.append('\n\n@subsubheading %s\n\n' %
|
|
1366
|
-
admonitionlabels['seealso'])
|
|
1375
|
+
self.body.append('\n\n@subsubheading %s\n\n' % admonitionlabels['seealso'])
|
|
1367
1376
|
|
|
1368
1377
|
def depart_seealso(self, node: Element) -> None:
|
|
1369
1378
|
self.body.append('\n')
|
|
@@ -1410,8 +1419,9 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1410
1419
|
# use the full name of the objtype for the category
|
|
1411
1420
|
try:
|
|
1412
1421
|
domain = self.builder.env.get_domain(node.parent['domain'])
|
|
1413
|
-
name = domain.get_type_name(
|
|
1414
|
-
|
|
1422
|
+
name = domain.get_type_name(
|
|
1423
|
+
domain.object_types[objtype], self.config.primary_domain == domain.name
|
|
1424
|
+
)
|
|
1415
1425
|
except (KeyError, ExtensionError):
|
|
1416
1426
|
name = objtype
|
|
1417
1427
|
# by convention, the deffn category should be capitalized like a title
|
|
@@ -1421,7 +1431,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1421
1431
|
self.desc_type_name: str | None = name
|
|
1422
1432
|
|
|
1423
1433
|
def depart_desc_signature(self, node: Element) -> None:
|
|
1424
|
-
self.body.append(
|
|
1434
|
+
self.body.append('\n')
|
|
1425
1435
|
self.escape_hyphens -= 1
|
|
1426
1436
|
self.desc_type_name = None
|
|
1427
1437
|
|
|
@@ -1511,8 +1521,9 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1511
1521
|
# -- instead of --
|
|
1512
1522
|
# @deffn {Class} class Foo
|
|
1513
1523
|
txt = node.astext().strip()
|
|
1514
|
-
if (
|
|
1515
|
-
|
|
1524
|
+
if (self.descs and txt == self.descs[-1]['objtype']) or (
|
|
1525
|
+
self.desc_type_name and txt in self.desc_type_name.split()
|
|
1526
|
+
):
|
|
1516
1527
|
raise nodes.SkipNode
|
|
1517
1528
|
|
|
1518
1529
|
def depart_desc_annotation(self, node: Element) -> None:
|
|
@@ -1575,6 +1586,7 @@ class TexinfoTranslator(SphinxTranslator):
|
|
|
1575
1586
|
def visit_math_block(self, node: Element) -> None:
|
|
1576
1587
|
if node.get('label'):
|
|
1577
1588
|
self.add_anchor(node['label'], node)
|
|
1578
|
-
self.body.append(
|
|
1579
|
-
|
|
1589
|
+
self.body.append(
|
|
1590
|
+
f'\n\n@example\n{self.escape_arg(node.astext())}\n@end example\n\n'
|
|
1591
|
+
)
|
|
1580
1592
|
raise nodes.SkipNode
|