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
|
@@ -12,7 +12,11 @@ from docutils.frontend import OptionParser
|
|
|
12
12
|
import sphinx.builders.latex.nodes # NoQA: F401,E501 # Workaround: import this before writer to avoid ImportError
|
|
13
13
|
from sphinx import addnodes, highlighting, package_dir
|
|
14
14
|
from sphinx.builders import Builder
|
|
15
|
-
from sphinx.builders.latex.constants import
|
|
15
|
+
from sphinx.builders.latex.constants import (
|
|
16
|
+
ADDITIONAL_SETTINGS,
|
|
17
|
+
DEFAULT_SETTINGS,
|
|
18
|
+
SHORTHANDOFF,
|
|
19
|
+
)
|
|
16
20
|
from sphinx.builders.latex.theming import Theme, ThemeFactory
|
|
17
21
|
from sphinx.builders.latex.util import ExtBabel
|
|
18
22
|
from sphinx.config import ENUM, Config
|
|
@@ -34,7 +38,7 @@ from sphinx.writers.latex import LaTeXTranslator, LaTeXWriter
|
|
|
34
38
|
from docutils import nodes # isort:skip
|
|
35
39
|
|
|
36
40
|
if TYPE_CHECKING:
|
|
37
|
-
from collections.abc import Iterable
|
|
41
|
+
from collections.abc import Iterable, Set
|
|
38
42
|
|
|
39
43
|
from docutils.nodes import Node
|
|
40
44
|
|
|
@@ -96,11 +100,9 @@ XINDY_LANG_OPTIONS = {
|
|
|
96
100
|
'el': '-L greek -C utf8 ',
|
|
97
101
|
# FIXME, not compatible with [:2] slice but does Sphinx support Greek ?
|
|
98
102
|
'el-polyton': '-L greek-polytonic -C utf8 ',
|
|
99
|
-
}
|
|
103
|
+
} # fmt: skip
|
|
100
104
|
|
|
101
|
-
XINDY_CYRILLIC_SCRIPTS = [
|
|
102
|
-
'be', 'bg', 'mk', 'mn', 'ru', 'sr', 'sh', 'uk',
|
|
103
|
-
]
|
|
105
|
+
XINDY_CYRILLIC_SCRIPTS = ['be', 'bg', 'mk', 'mn', 'ru', 'sr', 'sh', 'uk']
|
|
104
106
|
|
|
105
107
|
logger = logging.getLogger(__name__)
|
|
106
108
|
|
|
@@ -114,9 +116,11 @@ class LaTeXBuilder(Builder):
|
|
|
114
116
|
format = 'latex'
|
|
115
117
|
epilog = __('The LaTeX files are in %(outdir)s.')
|
|
116
118
|
if os.name == 'posix':
|
|
117
|
-
epilog += __(
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
epilog += __(
|
|
120
|
+
"\nRun 'make' in that directory to run these through "
|
|
121
|
+
'(pdf)latex\n'
|
|
122
|
+
"(use `make latexpdf' here to do that automatically)."
|
|
123
|
+
)
|
|
120
124
|
|
|
121
125
|
supported_image_types = ['application/pdf', 'image/png', 'image/jpeg']
|
|
122
126
|
supported_remote_images = False
|
|
@@ -149,20 +153,28 @@ class LaTeXBuilder(Builder):
|
|
|
149
153
|
def init_document_data(self) -> None:
|
|
150
154
|
preliminary_document_data = [list(x) for x in self.config.latex_documents]
|
|
151
155
|
if not preliminary_document_data:
|
|
152
|
-
logger.warning(
|
|
153
|
-
|
|
156
|
+
logger.warning(
|
|
157
|
+
__(
|
|
158
|
+
'no "latex_documents" config value found; no documents '
|
|
159
|
+
'will be written'
|
|
160
|
+
)
|
|
161
|
+
)
|
|
154
162
|
return
|
|
155
163
|
# assign subdirs to titles
|
|
156
164
|
self.titles: list[tuple[str, str]] = []
|
|
157
165
|
for entry in preliminary_document_data:
|
|
158
166
|
docname = entry[0]
|
|
159
167
|
if docname not in self.env.all_docs:
|
|
160
|
-
logger.warning(
|
|
161
|
-
|
|
168
|
+
logger.warning(
|
|
169
|
+
__(
|
|
170
|
+
'"latex_documents" config value references unknown '
|
|
171
|
+
'document %s'
|
|
172
|
+
),
|
|
173
|
+
docname,
|
|
174
|
+
)
|
|
162
175
|
continue
|
|
163
176
|
self.document_data.append(entry) # type: ignore[arg-type]
|
|
164
|
-
|
|
165
|
-
docname = docname[:-5]
|
|
177
|
+
docname = docname.removesuffix(SEP + 'index')
|
|
166
178
|
self.titles.append((docname, entry[2]))
|
|
167
179
|
|
|
168
180
|
def init_context(self) -> None:
|
|
@@ -186,8 +198,8 @@ class LaTeXBuilder(Builder):
|
|
|
186
198
|
if self.config.today:
|
|
187
199
|
self.context['date'] = self.config.today
|
|
188
200
|
else:
|
|
189
|
-
|
|
190
|
-
|
|
201
|
+
today_fmt = self.config.today_fmt or _('%b %d, %Y')
|
|
202
|
+
self.context['date'] = format_date(today_fmt, language=self.config.language)
|
|
191
203
|
|
|
192
204
|
if self.config.latex_logo:
|
|
193
205
|
self.context['logofilename'] = path.basename(self.config.latex_logo)
|
|
@@ -210,25 +222,31 @@ class LaTeXBuilder(Builder):
|
|
|
210
222
|
if not self.babel.is_supported_language():
|
|
211
223
|
# emit warning if specified language is invalid
|
|
212
224
|
# (only emitting, nothing changed to processing)
|
|
213
|
-
logger.warning(
|
|
214
|
-
|
|
225
|
+
logger.warning(
|
|
226
|
+
__('no Babel option known for language %r'), self.config.language
|
|
227
|
+
)
|
|
215
228
|
|
|
216
229
|
def init_multilingual(self) -> None:
|
|
217
230
|
if self.context['latex_engine'] == 'pdflatex':
|
|
218
231
|
if not self.babel.uses_cyrillic():
|
|
219
232
|
if 'X2' in self.context['fontenc']:
|
|
220
|
-
self.context['substitutefont'] = (
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
233
|
+
self.context['substitutefont'] = (
|
|
234
|
+
'\\usepackage{sphinxpackagesubstitutefont}'
|
|
235
|
+
)
|
|
236
|
+
self.context['textcyrillic'] = (
|
|
237
|
+
'\\usepackage[Xtwo]{sphinxpackagecyrillic}'
|
|
238
|
+
)
|
|
224
239
|
elif 'T2A' in self.context['fontenc']:
|
|
225
|
-
self.context['substitutefont'] = (
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
240
|
+
self.context['substitutefont'] = (
|
|
241
|
+
'\\usepackage{sphinxpackagesubstitutefont}'
|
|
242
|
+
)
|
|
243
|
+
self.context['textcyrillic'] = (
|
|
244
|
+
'\\usepackage[TtwoA]{sphinxpackagecyrillic}'
|
|
245
|
+
)
|
|
229
246
|
if 'LGR' in self.context['fontenc']:
|
|
230
|
-
self.context['substitutefont'] = (
|
|
231
|
-
|
|
247
|
+
self.context['substitutefont'] = (
|
|
248
|
+
'\\usepackage{sphinxpackagesubstitutefont}'
|
|
249
|
+
)
|
|
232
250
|
else:
|
|
233
251
|
self.context['textgreek'] = ''
|
|
234
252
|
if self.context['substitutefont'] == '':
|
|
@@ -242,13 +260,18 @@ class LaTeXBuilder(Builder):
|
|
|
242
260
|
self.context['shorthandoff'] = SHORTHANDOFF
|
|
243
261
|
|
|
244
262
|
# Times fonts don't work with Cyrillic languages
|
|
245
|
-
if
|
|
263
|
+
if (
|
|
264
|
+
self.babel.uses_cyrillic()
|
|
265
|
+
and 'fontpkg' not in self.config.latex_elements
|
|
266
|
+
):
|
|
246
267
|
self.context['fontpkg'] = ''
|
|
247
268
|
elif self.context['polyglossia']:
|
|
248
269
|
self.context['classoptions'] += ',' + self.babel.get_language()
|
|
249
270
|
options = self.babel.get_mainlanguage_options()
|
|
250
271
|
if options:
|
|
251
|
-
language =
|
|
272
|
+
language = (
|
|
273
|
+
rf'\setmainlanguage[{options}]{{{self.babel.get_language()}}}'
|
|
274
|
+
)
|
|
252
275
|
else:
|
|
253
276
|
language = r'\setmainlanguage{%s}' % self.babel.get_language()
|
|
254
277
|
|
|
@@ -257,20 +280,28 @@ class LaTeXBuilder(Builder):
|
|
|
257
280
|
def write_stylesheet(self) -> None:
|
|
258
281
|
highlighter = highlighting.PygmentsBridge('latex', self.config.pygments_style)
|
|
259
282
|
stylesheet = path.join(self.outdir, 'sphinxhighlight.sty')
|
|
260
|
-
with open(stylesheet, 'w', encoding=
|
|
283
|
+
with open(stylesheet, 'w', encoding='utf-8') as f:
|
|
261
284
|
f.write('\\NeedsTeXFormat{LaTeX2e}[1995/12/01]\n')
|
|
262
|
-
f.write(
|
|
263
|
-
|
|
264
|
-
|
|
285
|
+
f.write(
|
|
286
|
+
'\\ProvidesPackage{sphinxhighlight}'
|
|
287
|
+
'[2022/06/30 stylesheet for highlighting with pygments]\n'
|
|
288
|
+
)
|
|
289
|
+
f.write(
|
|
290
|
+
'% Its contents depend on pygments_style configuration variable.\n\n'
|
|
291
|
+
)
|
|
265
292
|
f.write(highlighter.get_stylesheet())
|
|
266
293
|
|
|
294
|
+
def prepare_writing(self, docnames: Set[str]) -> None:
|
|
295
|
+
self.init_document_data()
|
|
296
|
+
self.write_stylesheet()
|
|
297
|
+
|
|
267
298
|
def copy_assets(self) -> None:
|
|
268
299
|
self.copy_support_files()
|
|
269
300
|
|
|
270
301
|
if self.config.latex_additional_files:
|
|
271
302
|
self.copy_latex_additional_files()
|
|
272
303
|
|
|
273
|
-
def
|
|
304
|
+
def write_documents(self, _docnames: Set[str]) -> None:
|
|
274
305
|
docwriter = LaTeXWriter(self)
|
|
275
306
|
with warnings.catch_warnings():
|
|
276
307
|
warnings.filterwarnings('ignore', category=DeprecationWarning)
|
|
@@ -279,11 +310,8 @@ class LaTeXBuilder(Builder):
|
|
|
279
310
|
docsettings: Any = OptionParser(
|
|
280
311
|
defaults=self.env.settings,
|
|
281
312
|
components=(docwriter,),
|
|
282
|
-
read_config_files=True
|
|
283
|
-
|
|
284
|
-
self.init_document_data()
|
|
285
|
-
self.write_stylesheet()
|
|
286
|
-
self.copy_assets()
|
|
313
|
+
read_config_files=True,
|
|
314
|
+
).get_default_values()
|
|
287
315
|
|
|
288
316
|
for entry in self.document_data:
|
|
289
317
|
docname, targetname, title, author, themename = entry[:5]
|
|
@@ -291,9 +319,12 @@ class LaTeXBuilder(Builder):
|
|
|
291
319
|
toctree_only = False
|
|
292
320
|
if len(entry) > 5:
|
|
293
321
|
toctree_only = entry[5]
|
|
294
|
-
destination = SphinxFileOutput(
|
|
295
|
-
|
|
296
|
-
|
|
322
|
+
destination = SphinxFileOutput(
|
|
323
|
+
destination_path=path.join(self.outdir, targetname),
|
|
324
|
+
encoding='utf-8',
|
|
325
|
+
overwrite_if_changed=True,
|
|
326
|
+
)
|
|
327
|
+
with progress_message(__('processing %s') % targetname, nonl=False):
|
|
297
328
|
doctree = self.env.get_doctree(docname)
|
|
298
329
|
toctree = next(doctree.findall(addnodes.toctree), None)
|
|
299
330
|
if toctree and toctree.get('maxdepth') > 0:
|
|
@@ -302,8 +333,12 @@ class LaTeXBuilder(Builder):
|
|
|
302
333
|
tocdepth = None
|
|
303
334
|
|
|
304
335
|
doctree = self.assemble_doctree(
|
|
305
|
-
docname,
|
|
306
|
-
|
|
336
|
+
docname,
|
|
337
|
+
toctree_only,
|
|
338
|
+
appendices=(
|
|
339
|
+
self.config.latex_appendices if theme.name != 'howto' else []
|
|
340
|
+
),
|
|
341
|
+
)
|
|
307
342
|
doctree['docclass'] = theme.docclass
|
|
308
343
|
doctree['contentsname'] = self.get_contentsname(docname)
|
|
309
344
|
doctree['tocdepth'] = tocdepth
|
|
@@ -311,7 +346,7 @@ class LaTeXBuilder(Builder):
|
|
|
311
346
|
self.update_doc_context(title, author, theme)
|
|
312
347
|
self.update_context()
|
|
313
348
|
|
|
314
|
-
with progress_message(__(
|
|
349
|
+
with progress_message(__('writing')):
|
|
315
350
|
docsettings._author = author
|
|
316
351
|
docsettings._title = title
|
|
317
352
|
docsettings._contentsname = doctree['contentsname']
|
|
@@ -341,10 +376,13 @@ class LaTeXBuilder(Builder):
|
|
|
341
376
|
self.context['wrapperclass'] = theme.wrapperclass
|
|
342
377
|
|
|
343
378
|
def assemble_doctree(
|
|
344
|
-
self,
|
|
379
|
+
self,
|
|
380
|
+
indexfile: str,
|
|
381
|
+
toctree_only: bool,
|
|
382
|
+
appendices: list[str],
|
|
345
383
|
) -> nodes.document:
|
|
346
384
|
self.docnames = {indexfile, *appendices}
|
|
347
|
-
logger.info(darkgreen(indexfile)
|
|
385
|
+
logger.info(darkgreen(indexfile))
|
|
348
386
|
tree = self.env.get_doctree(indexfile)
|
|
349
387
|
tree['docname'] = indexfile
|
|
350
388
|
if toctree_only:
|
|
@@ -352,21 +390,21 @@ class LaTeXBuilder(Builder):
|
|
|
352
390
|
# fresh document
|
|
353
391
|
new_tree = new_document('<latex output>')
|
|
354
392
|
new_sect = nodes.section()
|
|
355
|
-
new_sect += nodes.title('<Set title in conf.py>',
|
|
356
|
-
'<Set title in conf.py>')
|
|
393
|
+
new_sect += nodes.title('<Set title in conf.py>', '<Set title in conf.py>')
|
|
357
394
|
new_tree += new_sect
|
|
358
395
|
for node in tree.findall(addnodes.toctree):
|
|
359
396
|
new_sect += node
|
|
360
397
|
tree = new_tree
|
|
361
|
-
largetree = inline_all_toctrees(
|
|
362
|
-
|
|
398
|
+
largetree = inline_all_toctrees(
|
|
399
|
+
self, self.docnames, indexfile, tree, darkgreen, [indexfile]
|
|
400
|
+
)
|
|
363
401
|
largetree['docname'] = indexfile
|
|
364
402
|
for docname in appendices:
|
|
365
403
|
appendix = self.env.get_doctree(docname)
|
|
366
404
|
appendix['docname'] = docname
|
|
367
405
|
largetree.append(appendix)
|
|
368
406
|
logger.info('')
|
|
369
|
-
logger.info(__(
|
|
407
|
+
logger.info(__('resolving references...'))
|
|
370
408
|
self.env.resolve_references(largetree, indexfile, self)
|
|
371
409
|
# resolve :ref:s to distant tex files -- we can't add a cross-reference,
|
|
372
410
|
# but append the document name
|
|
@@ -397,15 +435,16 @@ class LaTeXBuilder(Builder):
|
|
|
397
435
|
# configure usage of xindy (impacts Makefile and latexmkrc)
|
|
398
436
|
# FIXME: convert this rather to a confval with suitable default
|
|
399
437
|
# according to language ? but would require extra documentation
|
|
400
|
-
xindy_lang_option = XINDY_LANG_OPTIONS.get(
|
|
401
|
-
|
|
438
|
+
xindy_lang_option = XINDY_LANG_OPTIONS.get(
|
|
439
|
+
self.config.language[:2], '-L general -C utf8 '
|
|
440
|
+
)
|
|
402
441
|
xindy_cyrillic = self.config.language[:2] in XINDY_CYRILLIC_SCRIPTS
|
|
403
442
|
|
|
404
443
|
context = {
|
|
405
|
-
'latex_engine':
|
|
406
|
-
'xindy_use':
|
|
444
|
+
'latex_engine': self.config.latex_engine,
|
|
445
|
+
'xindy_use': self.config.latex_use_xindy,
|
|
407
446
|
'xindy_lang_option': xindy_lang_option,
|
|
408
|
-
'xindy_cyrillic':
|
|
447
|
+
'xindy_cyrillic': xindy_cyrillic,
|
|
409
448
|
}
|
|
410
449
|
staticdirname = path.join(package_dir, 'texinputs')
|
|
411
450
|
for filename in os.listdir(staticdirname):
|
|
@@ -441,9 +480,14 @@ class LaTeXBuilder(Builder):
|
|
|
441
480
|
def copy_image_files(self) -> None:
|
|
442
481
|
if self.images:
|
|
443
482
|
stringify_func = ImageAdapter(self.app.env).get_original_image_uri
|
|
444
|
-
for src in status_iterator(
|
|
445
|
-
|
|
446
|
-
|
|
483
|
+
for src in status_iterator(
|
|
484
|
+
self.images,
|
|
485
|
+
__('copying images... '),
|
|
486
|
+
'brown',
|
|
487
|
+
len(self.images),
|
|
488
|
+
self.app.verbosity,
|
|
489
|
+
stringify_func=stringify_func,
|
|
490
|
+
):
|
|
447
491
|
dest = self.images[src]
|
|
448
492
|
try:
|
|
449
493
|
copyfile(
|
|
@@ -452,11 +496,16 @@ class LaTeXBuilder(Builder):
|
|
|
452
496
|
force=True,
|
|
453
497
|
)
|
|
454
498
|
except Exception as err:
|
|
455
|
-
logger.warning(
|
|
456
|
-
|
|
499
|
+
logger.warning(
|
|
500
|
+
__('cannot copy image file %r: %s'),
|
|
501
|
+
path.join(self.srcdir, src),
|
|
502
|
+
err,
|
|
503
|
+
)
|
|
457
504
|
if self.config.latex_logo:
|
|
458
505
|
if not path.isfile(path.join(self.confdir, self.config.latex_logo)):
|
|
459
|
-
raise SphinxError(
|
|
506
|
+
raise SphinxError(
|
|
507
|
+
__('logo file %r does not exist') % self.config.latex_logo
|
|
508
|
+
)
|
|
460
509
|
source = self.confdir / self.config.latex_logo
|
|
461
510
|
copyfile(
|
|
462
511
|
source,
|
|
@@ -476,7 +525,9 @@ class LaTeXBuilder(Builder):
|
|
|
476
525
|
if self.context['babel'] or self.context['polyglossia']:
|
|
477
526
|
context['addtocaptions'] = r'\addto\captions%s' % self.babel.get_language()
|
|
478
527
|
|
|
479
|
-
filename = path.join(
|
|
528
|
+
filename = path.join(
|
|
529
|
+
package_dir, 'templates', 'latex', 'sphinxmessages.sty.jinja'
|
|
530
|
+
)
|
|
480
531
|
copy_asset_file(
|
|
481
532
|
filename,
|
|
482
533
|
self.outdir,
|
|
@@ -489,7 +540,7 @@ class LaTeXBuilder(Builder):
|
|
|
489
540
|
def validate_config_values(app: Sphinx, config: Config) -> None:
|
|
490
541
|
for key in list(config.latex_elements):
|
|
491
542
|
if key not in DEFAULT_SETTINGS:
|
|
492
|
-
msg = __(
|
|
543
|
+
msg = __('Unknown configure key: latex_elements[%r], ignored.')
|
|
493
544
|
logger.warning(msg, key)
|
|
494
545
|
config.latex_elements.pop(key)
|
|
495
546
|
|
|
@@ -497,7 +548,7 @@ def validate_config_values(app: Sphinx, config: Config) -> None:
|
|
|
497
548
|
def validate_latex_theme_options(app: Sphinx, config: Config) -> None:
|
|
498
549
|
for key in list(config.latex_theme_options):
|
|
499
550
|
if key not in Theme.UPDATABLE_KEYS:
|
|
500
|
-
msg = __(
|
|
551
|
+
msg = __('Unknown theme option: latex_theme_options[%r], ignored.')
|
|
501
552
|
logger.warning(msg, key)
|
|
502
553
|
config.latex_theme_options.pop(key)
|
|
503
554
|
|
|
@@ -523,11 +574,9 @@ def default_latex_docclass(config: Config) -> dict[str, str]:
|
|
|
523
574
|
"""Better default latex_docclass settings for specific languages."""
|
|
524
575
|
if config.language == 'ja':
|
|
525
576
|
if config.latex_engine == 'uplatex':
|
|
526
|
-
return {'manual': 'ujbook',
|
|
527
|
-
'howto': 'ujreport'}
|
|
577
|
+
return {'manual': 'ujbook', 'howto': 'ujreport'}
|
|
528
578
|
else:
|
|
529
|
-
return {'manual': 'jsbook',
|
|
530
|
-
'howto': 'jreport'}
|
|
579
|
+
return {'manual': 'jsbook', 'howto': 'jreport'}
|
|
531
580
|
else:
|
|
532
581
|
return {}
|
|
533
582
|
|
|
@@ -541,11 +590,15 @@ def default_latex_documents(config: Config) -> list[tuple[str, str, str, str, st
|
|
|
541
590
|
"""Better default latex_documents settings."""
|
|
542
591
|
project = texescape.escape(config.project, config.latex_engine)
|
|
543
592
|
author = texescape.escape(config.author, config.latex_engine)
|
|
544
|
-
return [
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
593
|
+
return [
|
|
594
|
+
(
|
|
595
|
+
config.root_doc,
|
|
596
|
+
make_filename_from_project(config.project) + '.tex',
|
|
597
|
+
texescape.escape_abbr(project),
|
|
598
|
+
texescape.escape_abbr(author),
|
|
599
|
+
config.latex_theme,
|
|
600
|
+
)
|
|
601
|
+
]
|
|
549
602
|
|
|
550
603
|
|
|
551
604
|
def setup(app: Sphinx) -> ExtensionMetadata:
|
|
@@ -556,15 +609,20 @@ def setup(app: Sphinx) -> ExtensionMetadata:
|
|
|
556
609
|
app.connect('config-inited', validate_latex_theme_options, priority=800)
|
|
557
610
|
app.connect('builder-inited', install_packages_for_ja)
|
|
558
611
|
|
|
559
|
-
app.add_config_value(
|
|
560
|
-
|
|
612
|
+
app.add_config_value(
|
|
613
|
+
'latex_engine',
|
|
614
|
+
default_latex_engine,
|
|
615
|
+
'',
|
|
616
|
+
ENUM('pdflatex', 'xelatex', 'lualatex', 'platex', 'uplatex'),
|
|
617
|
+
)
|
|
561
618
|
app.add_config_value('latex_documents', default_latex_documents, '')
|
|
562
619
|
app.add_config_value('latex_logo', None, '', str)
|
|
563
620
|
app.add_config_value('latex_appendices', [], '')
|
|
564
621
|
app.add_config_value('latex_use_latex_multicolumn', False, '')
|
|
565
622
|
app.add_config_value('latex_use_xindy', default_latex_use_xindy, '', bool)
|
|
566
|
-
app.add_config_value(
|
|
567
|
-
|
|
623
|
+
app.add_config_value(
|
|
624
|
+
'latex_toplevel_sectioning', None, '', ENUM(None, 'part', 'chapter', 'section')
|
|
625
|
+
)
|
|
568
626
|
app.add_config_value('latex_domain_indices', True, '', types={set, list})
|
|
569
627
|
app.add_config_value('latex_show_urls', 'no', '')
|
|
570
628
|
app.add_config_value('latex_show_pagerefs', False, '')
|
|
@@ -49,7 +49,7 @@ XELATEX_DEFAULT_FONTPKG = r'''
|
|
|
49
49
|
BoldFont = *Bold,
|
|
50
50
|
BoldItalicFont = *BoldOblique,
|
|
51
51
|
]
|
|
52
|
-
\setmonofont{FreeMono}[
|
|
52
|
+
\setmonofont{FreeMono}[Scale=0.9,
|
|
53
53
|
Extension = .otf,
|
|
54
54
|
UprightFont = *,
|
|
55
55
|
ItalicFont = *Oblique,
|
|
@@ -58,10 +58,12 @@ XELATEX_DEFAULT_FONTPKG = r'''
|
|
|
58
58
|
]
|
|
59
59
|
'''
|
|
60
60
|
|
|
61
|
-
XELATEX_GREEK_DEFAULT_FONTPKG = (
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
XELATEX_GREEK_DEFAULT_FONTPKG = (
|
|
62
|
+
XELATEX_DEFAULT_FONTPKG
|
|
63
|
+
+ '\n\\newfontfamily\\greekfont{FreeSerif}'
|
|
64
|
+
+ '\n\\newfontfamily\\greekfontsf{FreeSans}'
|
|
65
|
+
+ '\n\\newfontfamily\\greekfonttt{FreeMono}'
|
|
66
|
+
)
|
|
65
67
|
|
|
66
68
|
LUALATEX_DEFAULT_FONTPKG = XELATEX_DEFAULT_FONTPKG
|
|
67
69
|
|
|
@@ -142,7 +144,6 @@ ADDITIONAL_SETTINGS: dict[Any, dict[str, Any]] = {
|
|
|
142
144
|
'fontenc': ('\\usepackage{fontspec}\n'
|
|
143
145
|
'\\defaultfontfeatures[\\rmfamily,\\sffamily,\\ttfamily]{}'),
|
|
144
146
|
'fontpkg': XELATEX_DEFAULT_FONTPKG,
|
|
145
|
-
'fvset': '\\fvset{fontsize=\\small}',
|
|
146
147
|
'fontsubstitution': '',
|
|
147
148
|
'textgreek': '',
|
|
148
149
|
'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0'
|
|
@@ -155,7 +156,6 @@ ADDITIONAL_SETTINGS: dict[Any, dict[str, Any]] = {
|
|
|
155
156
|
'fontenc': ('\\usepackage{fontspec}\n'
|
|
156
157
|
'\\defaultfontfeatures[\\rmfamily,\\sffamily,\\ttfamily]{}'),
|
|
157
158
|
'fontpkg': LUALATEX_DEFAULT_FONTPKG,
|
|
158
|
-
'fvset': '\\fvset{fontsize=\\small}',
|
|
159
159
|
'fontsubstitution': '',
|
|
160
160
|
'textgreek': '',
|
|
161
161
|
'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0'
|
sphinx/builders/latex/nodes.py
CHANGED
|
@@ -15,8 +15,9 @@ class footnotemark(nodes.Inline, nodes.Referential, nodes.TextElement):
|
|
|
15
15
|
pass
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class footnotetext(
|
|
19
|
-
|
|
18
|
+
class footnotetext(
|
|
19
|
+
nodes.General, nodes.BackLinkable, nodes.Element, nodes.Labeled, nodes.Targetable
|
|
20
|
+
):
|
|
20
21
|
r"""A node represents ``\footnotetext``."""
|
|
21
22
|
|
|
22
23
|
|
sphinx/builders/latex/theming.py
CHANGED
|
@@ -84,11 +84,11 @@ class UserTheme(Theme):
|
|
|
84
84
|
value = self.config.get('theme', key)
|
|
85
85
|
setattr(self, key, value)
|
|
86
86
|
except configparser.NoSectionError as exc:
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
msg = __('%r doesn\'t have "theme" setting') % filename
|
|
88
|
+
raise ThemeError(msg) from exc
|
|
89
89
|
except configparser.NoOptionError as exc:
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
msg = __('%r doesn\'t have "%s" setting') % (filename, exc.args[0])
|
|
91
|
+
raise ThemeError(msg) from exc
|
|
92
92
|
|
|
93
93
|
for key in self.OPTIONAL_CONFIG_KEYS:
|
|
94
94
|
try:
|
|
@@ -103,7 +103,9 @@ class ThemeFactory:
|
|
|
103
103
|
|
|
104
104
|
def __init__(self, app: Sphinx) -> None:
|
|
105
105
|
self.themes: dict[str, Theme] = {}
|
|
106
|
-
self.theme_paths = [
|
|
106
|
+
self.theme_paths = [
|
|
107
|
+
path.join(app.srcdir, p) for p in app.config.latex_theme_path
|
|
108
|
+
]
|
|
107
109
|
self.config = app.config
|
|
108
110
|
self.load_builtin_themes(app.config)
|
|
109
111
|
|
|
@@ -15,7 +15,6 @@ from sphinx.builders.latex.nodes import (
|
|
|
15
15
|
math_reference,
|
|
16
16
|
thebibliography,
|
|
17
17
|
)
|
|
18
|
-
from sphinx.domains.citation import CitationDomain
|
|
19
18
|
from sphinx.locale import __
|
|
20
19
|
from sphinx.transforms import SphinxTransform
|
|
21
20
|
from sphinx.transforms.post_transforms import SphinxPostTransform
|
|
@@ -90,8 +89,7 @@ class ShowUrlsTransform(SphinxPostTransform):
|
|
|
90
89
|
for node in list(self.document.findall(nodes.reference)):
|
|
91
90
|
uri = node.get('refuri', '')
|
|
92
91
|
if uri.startswith(URI_SCHEMES):
|
|
93
|
-
|
|
94
|
-
uri = uri[7:]
|
|
92
|
+
uri = uri.removeprefix('mailto:')
|
|
95
93
|
if node.astext() != uri:
|
|
96
94
|
index = node.parent.index(node)
|
|
97
95
|
docname = self.get_docname_for_node(node)
|
|
@@ -102,7 +100,7 @@ class ShowUrlsTransform(SphinxPostTransform):
|
|
|
102
100
|
|
|
103
101
|
self.expanded = True
|
|
104
102
|
else: # all other true values (b/w compat)
|
|
105
|
-
textnode = nodes.Text(
|
|
103
|
+
textnode = nodes.Text(' (%s)' % uri)
|
|
106
104
|
node.parent.insert(index + 1, textnode)
|
|
107
105
|
|
|
108
106
|
def get_docname_for_node(self, node: Node) -> str:
|
|
@@ -118,11 +116,11 @@ class ShowUrlsTransform(SphinxPostTransform):
|
|
|
118
116
|
source = node['source']
|
|
119
117
|
except TypeError:
|
|
120
118
|
raise ValueError(__('Failed to get a docname!')) from None
|
|
121
|
-
|
|
122
|
-
|
|
119
|
+
msg = __('Failed to get a docname for source %r!') % source
|
|
120
|
+
raise ValueError(msg)
|
|
123
121
|
|
|
124
122
|
def create_footnote(
|
|
125
|
-
self, uri: str, docname: str
|
|
123
|
+
self, uri: str, docname: str
|
|
126
124
|
) -> tuple[nodes.footnote, nodes.footnote_reference]:
|
|
127
125
|
reference = nodes.reference('', nodes.Text(uri), refuri=uri, nolinkurl=True)
|
|
128
126
|
footnote = nodes.footnote(uri, auto=1, docname=docname)
|
|
@@ -131,8 +129,9 @@ class ShowUrlsTransform(SphinxPostTransform):
|
|
|
131
129
|
footnote += nodes.paragraph('', '', reference)
|
|
132
130
|
self.document.note_autofootnote(footnote)
|
|
133
131
|
|
|
134
|
-
footnote_ref = nodes.footnote_reference(
|
|
135
|
-
|
|
132
|
+
footnote_ref = nodes.footnote_reference(
|
|
133
|
+
'[#]_', auto=1, refid=footnote['ids'][0], docname=docname
|
|
134
|
+
)
|
|
136
135
|
footnote_ref += nodes.Text('#')
|
|
137
136
|
self.document.note_autofootnote_ref(footnote_ref)
|
|
138
137
|
footnote.add_backref(footnote_ref['ids'][0])
|
|
@@ -371,7 +370,9 @@ class LaTeXFootnoteTransform(SphinxPostTransform):
|
|
|
371
370
|
|
|
372
371
|
|
|
373
372
|
class LaTeXFootnoteVisitor(nodes.NodeVisitor):
|
|
374
|
-
def __init__(
|
|
373
|
+
def __init__(
|
|
374
|
+
self, document: nodes.document, footnotes: list[nodes.footnote]
|
|
375
|
+
) -> None:
|
|
375
376
|
self.appeared: dict[tuple[str, str], nodes.footnote] = {}
|
|
376
377
|
self.footnotes: list[nodes.footnote] = footnotes
|
|
377
378
|
self.pendings: list[nodes.footnote] = []
|
|
@@ -393,7 +394,7 @@ class LaTeXFootnoteVisitor(nodes.NodeVisitor):
|
|
|
393
394
|
if self.restricted == node:
|
|
394
395
|
self.restricted = None
|
|
395
396
|
pos = node.parent.index(node)
|
|
396
|
-
for i, footnote
|
|
397
|
+
for i, footnote in enumerate(self.pendings):
|
|
397
398
|
fntext = footnotetext('', *footnote.children, ids=footnote['ids'])
|
|
398
399
|
node.parent.insert(pos + i + 1, fntext)
|
|
399
400
|
self.pendings = []
|
|
@@ -455,7 +456,7 @@ class LaTeXFootnoteVisitor(nodes.NodeVisitor):
|
|
|
455
456
|
docname = node['docname']
|
|
456
457
|
if (docname, number) in self.appeared:
|
|
457
458
|
footnote = self.appeared[(docname, number)]
|
|
458
|
-
footnote[
|
|
459
|
+
footnote['referred'] = True
|
|
459
460
|
|
|
460
461
|
mark = footnotemark('', number, refid=node['refid'])
|
|
461
462
|
node.replace_self(mark)
|
|
@@ -473,7 +474,9 @@ class LaTeXFootnoteVisitor(nodes.NodeVisitor):
|
|
|
473
474
|
self.appeared[(docname, number)] = footnote
|
|
474
475
|
raise nodes.SkipNode
|
|
475
476
|
|
|
476
|
-
def get_footnote_by_reference(
|
|
477
|
+
def get_footnote_by_reference(
|
|
478
|
+
self, node: nodes.footnote_reference
|
|
479
|
+
) -> nodes.footnote:
|
|
477
480
|
docname = node['docname']
|
|
478
481
|
for footnote in self.footnotes:
|
|
479
482
|
if docname == footnote['docname'] and footnote['ids'][0] == node['refid']:
|
|
@@ -537,13 +540,16 @@ class CitationReferenceTransform(SphinxPostTransform):
|
|
|
537
540
|
formats = ('latex',)
|
|
538
541
|
|
|
539
542
|
def run(self, **kwargs: Any) -> None:
|
|
540
|
-
domain =
|
|
541
|
-
matcher = NodeMatcher(
|
|
543
|
+
domain = self.env.domains.citation_domain
|
|
544
|
+
matcher = NodeMatcher(
|
|
545
|
+
addnodes.pending_xref, refdomain='citation', reftype='ref'
|
|
546
|
+
)
|
|
542
547
|
for node in matcher.findall(self.document):
|
|
543
548
|
docname, labelid, _ = domain.citations.get(node['reftarget'], ('', '', 0))
|
|
544
549
|
if docname:
|
|
545
|
-
citation_ref = nodes.citation_reference(
|
|
546
|
-
|
|
550
|
+
citation_ref = nodes.citation_reference(
|
|
551
|
+
'', '', *node.children, docname=docname, refname=labelid
|
|
552
|
+
)
|
|
547
553
|
node.replace_self(citation_ref)
|
|
548
554
|
|
|
549
555
|
|
|
@@ -558,12 +564,14 @@ class MathReferenceTransform(SphinxPostTransform):
|
|
|
558
564
|
formats = ('latex',)
|
|
559
565
|
|
|
560
566
|
def run(self, **kwargs: Any) -> None:
|
|
561
|
-
equations = self.env.
|
|
567
|
+
equations = self.env.domains.math_domain.data['objects']
|
|
562
568
|
for node in self.document.findall(addnodes.pending_xref):
|
|
563
569
|
if node['refdomain'] == 'math' and node['reftype'] in ('eq', 'numref'):
|
|
564
570
|
docname, _ = equations.get(node['reftarget'], (None, None))
|
|
565
571
|
if docname:
|
|
566
|
-
refnode = math_reference(
|
|
572
|
+
refnode = math_reference(
|
|
573
|
+
'', docname=docname, target=node['reftarget']
|
|
574
|
+
)
|
|
567
575
|
node.replace_self(refnode)
|
|
568
576
|
|
|
569
577
|
|