Sphinx 8.0.1__py3-none-any.whl → 8.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Sphinx might be problematic. Click here for more details.
- sphinx/__init__.py +6 -3
- sphinx/_cli/__init__.py +40 -20
- sphinx/_cli/util/colour.py +5 -4
- sphinx/_cli/util/errors.py +28 -11
- sphinx/application.py +361 -38
- sphinx/builders/__init__.py +229 -83
- sphinx/builders/_epub_base.py +118 -71
- sphinx/builders/changes.py +39 -21
- sphinx/builders/dirhtml.py +4 -4
- sphinx/builders/dummy.py +2 -5
- sphinx/builders/epub3.py +43 -22
- sphinx/builders/gettext.py +43 -25
- sphinx/builders/html/__init__.py +284 -218
- sphinx/builders/html/_assets.py +62 -26
- sphinx/builders/html/_build_info.py +76 -0
- sphinx/builders/html/transforms.py +11 -9
- sphinx/builders/latex/__init__.py +139 -81
- sphinx/builders/latex/constants.py +7 -7
- sphinx/builders/latex/nodes.py +3 -2
- sphinx/builders/latex/theming.py +7 -5
- sphinx/builders/latex/transforms.py +27 -19
- sphinx/builders/linkcheck.py +146 -72
- sphinx/builders/manpage.py +30 -13
- sphinx/builders/singlehtml.py +22 -14
- sphinx/builders/texinfo.py +67 -37
- sphinx/builders/text.py +5 -5
- sphinx/builders/xml.py +6 -9
- sphinx/cmd/build.py +282 -103
- sphinx/cmd/make_mode.py +106 -63
- sphinx/cmd/quickstart.py +341 -145
- sphinx/config.py +45 -12
- sphinx/deprecation.py +8 -2
- sphinx/directives/__init__.py +28 -19
- sphinx/directives/code.py +86 -56
- sphinx/directives/other.py +50 -36
- sphinx/directives/patches.py +29 -19
- sphinx/domains/__init__.py +20 -120
- sphinx/domains/_domains_container.py +281 -0
- sphinx/domains/_index.py +110 -0
- sphinx/domains/c/__init__.py +3 -3
- sphinx/domains/c/_parser.py +10 -6
- sphinx/domains/changeset.py +5 -3
- sphinx/domains/citation.py +5 -3
- sphinx/domains/cpp/__init__.py +9 -11
- sphinx/domains/cpp/_parser.py +8 -7
- sphinx/domains/index.py +3 -3
- sphinx/domains/javascript.py +12 -7
- sphinx/domains/math.py +2 -2
- sphinx/domains/python/__init__.py +10 -5
- sphinx/domains/python/_object.py +1 -1
- sphinx/domains/rst.py +5 -5
- sphinx/domains/std/__init__.py +16 -11
- sphinx/environment/__init__.py +206 -146
- sphinx/environment/adapters/asset.py +3 -2
- sphinx/environment/adapters/indexentries.py +74 -33
- sphinx/environment/adapters/toctree.py +100 -43
- sphinx/environment/collectors/__init__.py +19 -8
- sphinx/environment/collectors/asset.py +47 -15
- sphinx/environment/collectors/dependencies.py +8 -4
- sphinx/environment/collectors/metadata.py +7 -2
- sphinx/environment/collectors/title.py +7 -2
- sphinx/environment/collectors/toctree.py +54 -22
- sphinx/errors.py +4 -1
- sphinx/events.py +314 -7
- sphinx/ext/apidoc.py +42 -18
- sphinx/ext/autodoc/__init__.py +52 -24
- sphinx/ext/autodoc/importer.py +6 -9
- sphinx/ext/autosectionlabel.py +1 -2
- sphinx/ext/autosummary/__init__.py +3 -1
- sphinx/ext/autosummary/generate.py +28 -14
- sphinx/ext/coverage.py +7 -7
- sphinx/ext/doctest.py +4 -8
- sphinx/ext/duration.py +6 -5
- sphinx/ext/inheritance_diagram.py +1 -1
- sphinx/ext/intersphinx/_cli.py +6 -4
- sphinx/ext/intersphinx/_load.py +77 -32
- sphinx/ext/intersphinx/_resolve.py +173 -79
- sphinx/ext/intersphinx/_shared.py +7 -5
- sphinx/ext/linkcode.py +7 -1
- sphinx/ext/mathjax.py +1 -2
- sphinx/ext/napoleon/__init__.py +37 -24
- sphinx/ext/napoleon/docstring.py +202 -134
- sphinx/ext/todo.py +5 -3
- sphinx/highlighting.py +10 -3
- sphinx/io.py +1 -1
- sphinx/jinja2glue.py +27 -6
- sphinx/locale/__init__.py +6 -2
- sphinx/locale/ar/LC_MESSAGES/sphinx.js +8 -1
- sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ar/LC_MESSAGES/sphinx.po +2246 -2288
- sphinx/locale/bg/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bg/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/bn/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bn/LC_MESSAGES/sphinx.po +2349 -2395
- sphinx/locale/ca/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ca/LC_MESSAGES/sphinx.po +2846 -2892
- sphinx/locale/cak/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cak/LC_MESSAGES/sphinx.po +2213 -2259
- sphinx/locale/cs/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cs/LC_MESSAGES/sphinx.po +2225 -2269
- sphinx/locale/cy/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cy/LC_MESSAGES/sphinx.po +2403 -2447
- sphinx/locale/da/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/da/LC_MESSAGES/sphinx.po +2214 -2260
- sphinx/locale/de/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de/LC_MESSAGES/sphinx.po +2230 -2276
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/el/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/el/LC_MESSAGES/sphinx.po +2619 -2665
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2519 -2565
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/eo/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eo/LC_MESSAGES/sphinx.po +2232 -2278
- sphinx/locale/es/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es/LC_MESSAGES/sphinx.po +2516 -2561
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/et/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/et/LC_MESSAGES/sphinx.po +2317 -2363
- sphinx/locale/eu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eu/LC_MESSAGES/sphinx.po +2218 -2264
- sphinx/locale/fa/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fa/LC_MESSAGES/sphinx.po +2505 -2551
- sphinx/locale/fi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fi/LC_MESSAGES/sphinx.po +2303 -2349
- sphinx/locale/fr/LC_MESSAGES/sphinx.js +6 -2
- sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr/LC_MESSAGES/sphinx.po +2863 -2908
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/gl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/gl/LC_MESSAGES/sphinx.po +2571 -2617
- sphinx/locale/he/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/he/LC_MESSAGES/sphinx.po +2307 -2352
- sphinx/locale/hi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi/LC_MESSAGES/sphinx.po +2580 -2626
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/hr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hr/LC_MESSAGES/sphinx.po +2238 -2283
- sphinx/locale/hu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hu/LC_MESSAGES/sphinx.po +2228 -2274
- sphinx/locale/id/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/id/LC_MESSAGES/sphinx.po +2787 -2834
- sphinx/locale/is/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/is/LC_MESSAGES/sphinx.po +2224 -2270
- sphinx/locale/it/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/it/LC_MESSAGES/sphinx.po +2231 -2276
- sphinx/locale/ja/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ja/LC_MESSAGES/sphinx.po +2507 -2554
- sphinx/locale/ka/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ka/LC_MESSAGES/sphinx.po +2428 -2474
- sphinx/locale/ko/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ko/LC_MESSAGES/sphinx.po +2516 -2563
- sphinx/locale/lt/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lt/LC_MESSAGES/sphinx.po +2425 -2469
- sphinx/locale/lv/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lv/LC_MESSAGES/sphinx.po +2362 -2407
- sphinx/locale/mk/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/mk/LC_MESSAGES/sphinx.po +2121 -2167
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2220 -2266
- sphinx/locale/ne/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ne/LC_MESSAGES/sphinx.po +2221 -2267
- sphinx/locale/nl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nl/LC_MESSAGES/sphinx.po +2240 -2286
- sphinx/locale/pl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pl/LC_MESSAGES/sphinx.po +2319 -2363
- sphinx/locale/pt/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2854 -2899
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2224 -2269
- sphinx/locale/ro/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ro/LC_MESSAGES/sphinx.po +2226 -2271
- sphinx/locale/ru/LC_MESSAGES/sphinx.js +8 -3
- sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ru/LC_MESSAGES/sphinx.po +2841 -2885
- sphinx/locale/si/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/si/LC_MESSAGES/sphinx.po +2294 -2340
- sphinx/locale/sk/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sk/LC_MESSAGES/sphinx.po +2497 -2541
- sphinx/locale/sl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sl/LC_MESSAGES/sphinx.po +2331 -2375
- sphinx/locale/sphinx.pot +2121 -2167
- sphinx/locale/sq/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sq/LC_MESSAGES/sphinx.po +2855 -2901
- sphinx/locale/sr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr/LC_MESSAGES/sphinx.po +2203 -2248
- sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.po +2423 -2469
- sphinx/locale/te/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/te/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/tr/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/tr/LC_MESSAGES/sphinx.po +2443 -2489
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2329 -2373
- sphinx/locale/ur/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ur/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/vi/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/vi/LC_MESSAGES/sphinx.po +2199 -2246
- sphinx/locale/yue/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/yue/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2845 -2892
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/parsers.py +3 -1
- sphinx/project.py +6 -2
- sphinx/pycode/__init__.py +11 -4
- sphinx/pycode/ast.py +58 -58
- sphinx/pycode/parser.py +49 -28
- sphinx/pygments_styles.py +49 -49
- sphinx/registry.py +8 -3
- sphinx/roles.py +133 -13
- sphinx/search/__init__.py +146 -87
- sphinx/search/da.py +2 -4
- sphinx/search/de.py +2 -4
- sphinx/search/en.py +4 -4
- sphinx/search/es.py +2 -4
- sphinx/search/fi.py +2 -4
- sphinx/search/fr.py +2 -4
- sphinx/search/hu.py +2 -4
- sphinx/search/it.py +2 -4
- sphinx/search/ja.py +55 -32
- sphinx/search/nl.py +2 -4
- sphinx/search/no.py +2 -4
- sphinx/search/pt.py +2 -4
- sphinx/search/ro.py +0 -2
- sphinx/search/ru.py +2 -4
- sphinx/search/sv.py +2 -4
- sphinx/search/tr.py +0 -2
- sphinx/search/zh.py +18 -13
- sphinx/templates/graphviz/graphviz.css +0 -7
- sphinx/testing/fixtures.py +6 -5
- sphinx/testing/path.py +7 -5
- sphinx/testing/util.py +63 -29
- sphinx/texinputs/sphinx.sty +107 -39
- sphinx/texinputs/sphinxlatexadmonitions.sty +51 -35
- sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
- sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
- sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
- sphinx/texinputs/sphinxlatexlists.sty +1 -1
- sphinx/texinputs/sphinxlatexliterals.sty +4 -1
- sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
- sphinx/texinputs/sphinxlatexobjects.sty +1 -1
- sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
- sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
- sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
- sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
- sphinx/texinputs/sphinxlatextables.sty +1 -1
- sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
- sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
- sphinx/themes/agogo/layout.html +1 -10
- sphinx/themes/agogo/static/agogo.css.jinja +0 -7
- sphinx/themes/basic/defindex.html +1 -8
- sphinx/themes/basic/domainindex.html +1 -9
- sphinx/themes/basic/genindex-single.html +1 -9
- sphinx/themes/basic/genindex-split.html +1 -9
- sphinx/themes/basic/genindex.html +1 -9
- sphinx/themes/basic/globaltoc.html +1 -9
- sphinx/themes/basic/layout.html +1 -9
- sphinx/themes/basic/localtoc.html +1 -9
- sphinx/themes/basic/page.html +1 -9
- sphinx/themes/basic/relations.html +1 -9
- sphinx/themes/basic/search.html +1 -9
- sphinx/themes/basic/searchbox.html +1 -9
- sphinx/themes/basic/searchfield.html +4 -10
- sphinx/themes/basic/sourcelink.html +1 -9
- sphinx/themes/basic/static/basic.css.jinja +2 -13
- sphinx/themes/basic/static/doctools.js +0 -7
- sphinx/themes/basic/static/language_data.js.jinja +0 -7
- sphinx/themes/basic/static/searchtools.js +25 -13
- sphinx/themes/bizstyle/layout.html +1 -9
- sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
- sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
- sphinx/themes/classic/layout.html +1 -9
- sphinx/themes/classic/static/classic.css.jinja +0 -7
- sphinx/themes/classic/static/sidebar.js.jinja +0 -6
- sphinx/themes/epub/epub-cover.html +1 -9
- sphinx/themes/epub/layout.html +1 -9
- sphinx/themes/epub/static/epub.css.jinja +0 -7
- sphinx/themes/haiku/layout.html +1 -9
- sphinx/themes/haiku/static/haiku.css.jinja +0 -6
- sphinx/themes/nature/static/nature.css.jinja +0 -7
- sphinx/themes/nonav/layout.html +1 -9
- sphinx/themes/nonav/static/nonav.css.jinja +0 -7
- sphinx/themes/pyramid/static/epub.css.jinja +0 -7
- sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
- sphinx/themes/scrolls/layout.html +1 -10
- sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
- sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
- sphinx/themes/traditional/static/traditional.css.jinja +0 -7
- sphinx/theming.py +18 -6
- sphinx/transforms/__init__.py +56 -35
- sphinx/transforms/compact_bullet_list.py +3 -2
- sphinx/transforms/i18n.py +132 -50
- sphinx/transforms/post_transforms/__init__.py +94 -43
- sphinx/transforms/post_transforms/code.py +7 -6
- sphinx/transforms/post_transforms/images.py +71 -54
- sphinx/transforms/references.py +1 -2
- sphinx/util/__init__.py +23 -194
- sphinx/util/_files.py +80 -0
- sphinx/util/_importer.py +27 -0
- sphinx/util/_io.py +1 -2
- sphinx/util/_lines.py +26 -0
- sphinx/util/_pathlib.py +5 -2
- sphinx/util/_serialise.py +53 -0
- sphinx/util/_timestamps.py +2 -1
- sphinx/util/_uri.py +16 -0
- sphinx/util/cfamily.py +48 -25
- sphinx/util/console.py +1 -0
- sphinx/util/display.py +1 -1
- sphinx/util/docfields.py +125 -45
- sphinx/util/docstrings.py +1 -1
- sphinx/util/docutils.py +118 -44
- sphinx/util/exceptions.py +11 -5
- sphinx/util/fileutil.py +53 -32
- sphinx/util/http_date.py +9 -7
- sphinx/util/i18n.py +49 -16
- sphinx/util/images.py +7 -6
- sphinx/util/inspect.py +29 -12
- sphinx/util/inventory.py +47 -29
- sphinx/util/logging.py +58 -85
- sphinx/util/matching.py +3 -3
- sphinx/util/math.py +1 -1
- sphinx/util/nodes.py +176 -108
- sphinx/util/osutil.py +13 -10
- sphinx/util/parallel.py +5 -4
- sphinx/util/parsing.py +5 -3
- sphinx/util/png.py +3 -3
- sphinx/util/requests.py +8 -4
- sphinx/util/rst.py +5 -3
- sphinx/util/tags.py +5 -2
- sphinx/util/template.py +26 -11
- sphinx/util/texescape.py +2 -2
- sphinx/util/typing.py +89 -38
- sphinx/versioning.py +3 -1
- sphinx/writers/html.py +22 -7
- sphinx/writers/html5.py +113 -64
- sphinx/writers/latex.py +408 -221
- sphinx/writers/manpage.py +25 -15
- sphinx/writers/texinfo.py +94 -82
- sphinx/writers/text.py +87 -53
- sphinx/writers/xml.py +5 -4
- sphinx-8.1.0.dist-info/LICENSE.rst +31 -0
- {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
- sphinx-8.1.0.dist-info/RECORD +598 -0
- sphinx-8.0.1.dist-info/LICENSE.rst +0 -67
- sphinx-8.0.1.dist-info/RECORD +0 -590
- {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/WHEEL +0 -0
- {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
sphinx/transforms/__init__.py
CHANGED
|
@@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Any, cast
|
|
|
9
9
|
from docutils import nodes
|
|
10
10
|
from docutils.transforms import Transform, Transformer
|
|
11
11
|
from docutils.transforms.parts import ContentsFilter
|
|
12
|
+
from docutils.transforms.references import Footnotes
|
|
12
13
|
from docutils.transforms.universal import SmartQuotes
|
|
13
14
|
from docutils.utils import normalize_language_tag
|
|
14
15
|
from docutils.utils.smartquotes import smartchars
|
|
@@ -119,7 +120,9 @@ class DefaultSubstitutions(SphinxTransform):
|
|
|
119
120
|
if (name := ref['refname']) in to_handle:
|
|
120
121
|
ref.replace_self(self._handle_default_substitution(name))
|
|
121
122
|
|
|
122
|
-
def _handle_default_substitution(
|
|
123
|
+
def _handle_default_substitution(
|
|
124
|
+
self, name: _DEFAULT_SUBSTITUTION_NAMES
|
|
125
|
+
) -> nodes.Text:
|
|
123
126
|
if name == 'translation progress':
|
|
124
127
|
# special handling: calculate translation progress
|
|
125
128
|
return nodes.Text(_calculate_translation_progress(self.document))
|
|
@@ -127,10 +130,8 @@ class DefaultSubstitutions(SphinxTransform):
|
|
|
127
130
|
if text := self.config.today:
|
|
128
131
|
return nodes.Text(text)
|
|
129
132
|
# special handling: can also specify a strftime format
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
language=self.config.language,
|
|
133
|
-
))
|
|
133
|
+
today_fmt = self.config.today_fmt or _('%b %d, %Y')
|
|
134
|
+
return nodes.Text(format_date(today_fmt, language=self.config.language))
|
|
134
135
|
# config.version and config.release
|
|
135
136
|
return nodes.Text(getattr(self.config, name))
|
|
136
137
|
|
|
@@ -184,8 +185,7 @@ class HandleCodeBlocks(SphinxTransform):
|
|
|
184
185
|
def apply(self, **kwargs: Any) -> None:
|
|
185
186
|
# move doctest blocks out of blockquotes
|
|
186
187
|
for node in self.document.findall(nodes.block_quote):
|
|
187
|
-
if all(isinstance(child, nodes.doctest_block) for child
|
|
188
|
-
in node.children):
|
|
188
|
+
if all(isinstance(child, nodes.doctest_block) for child in node.children):
|
|
189
189
|
node.replace_self(node.children)
|
|
190
190
|
# combine successive doctest blocks
|
|
191
191
|
# for node in self.document.findall(nodes.doctest_block):
|
|
@@ -207,12 +207,14 @@ class AutoNumbering(SphinxTransform):
|
|
|
207
207
|
default_priority = 210
|
|
208
208
|
|
|
209
209
|
def apply(self, **kwargs: Any) -> None:
|
|
210
|
-
domain: StandardDomain = self.env.domains
|
|
210
|
+
domain: StandardDomain = self.env.domains.standard_domain
|
|
211
211
|
|
|
212
212
|
for node in self.document.findall(nodes.Element):
|
|
213
|
-
if (
|
|
214
|
-
|
|
215
|
-
|
|
213
|
+
if (
|
|
214
|
+
domain.is_enumerable_node(node)
|
|
215
|
+
and domain.get_numfig_title(node) is not None
|
|
216
|
+
and node['ids'] == []
|
|
217
|
+
):
|
|
216
218
|
self.document.note_implicit_target(node)
|
|
217
219
|
|
|
218
220
|
|
|
@@ -246,7 +248,7 @@ class ApplySourceWorkaround(SphinxTransform):
|
|
|
246
248
|
default_priority = 10
|
|
247
249
|
|
|
248
250
|
def apply(self, **kwargs: Any) -> None:
|
|
249
|
-
for node in self.document.findall():
|
|
251
|
+
for node in self.document.findall():
|
|
250
252
|
if isinstance(node, nodes.TextElement | nodes.image | nodes.topic):
|
|
251
253
|
apply_source_workaround(node)
|
|
252
254
|
|
|
@@ -261,8 +263,13 @@ class AutoIndexUpgrader(SphinxTransform):
|
|
|
261
263
|
def apply(self, **kwargs: Any) -> None:
|
|
262
264
|
for node in self.document.findall(addnodes.index):
|
|
263
265
|
if 'entries' in node and any(len(entry) == 4 for entry in node['entries']):
|
|
264
|
-
msg =
|
|
265
|
-
|
|
266
|
+
msg = (
|
|
267
|
+
__(
|
|
268
|
+
'4 column based index found. '
|
|
269
|
+
'It might be a bug of extensions you use: %r'
|
|
270
|
+
)
|
|
271
|
+
% node['entries']
|
|
272
|
+
)
|
|
266
273
|
logger.warning(msg, location=node)
|
|
267
274
|
for i, entry in enumerate(node['entries']):
|
|
268
275
|
if len(entry) == 4:
|
|
@@ -294,23 +301,40 @@ class UnreferencedFootnotesDetector(SphinxTransform):
|
|
|
294
301
|
Detect unreferenced footnotes and emit warnings
|
|
295
302
|
"""
|
|
296
303
|
|
|
297
|
-
default_priority =
|
|
304
|
+
default_priority = Footnotes.default_priority + 2
|
|
298
305
|
|
|
299
306
|
def apply(self, **kwargs: Any) -> None:
|
|
300
307
|
for node in self.document.footnotes:
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
logger.warning(
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
308
|
+
# note we do not warn on duplicate footnotes here
|
|
309
|
+
# (i.e. where the name has been moved to dupnames)
|
|
310
|
+
# since this is already reported by docutils
|
|
311
|
+
if not node['backrefs'] and node['names']:
|
|
312
|
+
logger.warning(
|
|
313
|
+
__('Footnote [%s] is not referenced.'),
|
|
314
|
+
node['names'][0] if node['names'] else node['dupnames'][0],
|
|
315
|
+
type='ref',
|
|
316
|
+
subtype='footnote',
|
|
317
|
+
location=node,
|
|
318
|
+
)
|
|
319
|
+
for node in self.document.symbol_footnotes:
|
|
320
|
+
if not node['backrefs']:
|
|
321
|
+
logger.warning(
|
|
322
|
+
__('Footnote [*] is not referenced.'),
|
|
323
|
+
type='ref',
|
|
324
|
+
subtype='footnote',
|
|
325
|
+
location=node,
|
|
326
|
+
)
|
|
309
327
|
for node in self.document.autofootnotes:
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
328
|
+
# note we do not warn on duplicate footnotes here
|
|
329
|
+
# (i.e. where the name has been moved to dupnames)
|
|
330
|
+
# since this is already reported by docutils
|
|
331
|
+
if not node['backrefs'] and node['names']:
|
|
332
|
+
logger.warning(
|
|
333
|
+
__('Footnote [#] is not referenced.'),
|
|
334
|
+
type='ref',
|
|
335
|
+
subtype='footnote',
|
|
336
|
+
location=node,
|
|
337
|
+
)
|
|
314
338
|
|
|
315
339
|
|
|
316
340
|
class DoctestTransform(SphinxTransform):
|
|
@@ -385,10 +409,7 @@ class SphinxSmartQuotes(SmartQuotes, SphinxTransform):
|
|
|
385
409
|
|
|
386
410
|
# confirm selected language supports smart_quotes or not
|
|
387
411
|
language = self.env.settings['language_code']
|
|
388
|
-
return any(
|
|
389
|
-
tag in smartchars.quotes
|
|
390
|
-
for tag in normalize_language_tag(language)
|
|
391
|
-
)
|
|
412
|
+
return any(tag in smartchars.quotes for tag in normalize_language_tag(language))
|
|
392
413
|
|
|
393
414
|
def get_tokens(self, txtnodes: list[Text]) -> Iterator[tuple[str, str]]:
|
|
394
415
|
# A generator that yields ``(texttype, nodetext)`` tuples for a list
|
|
@@ -421,13 +442,13 @@ class GlossarySorter(SphinxTransform):
|
|
|
421
442
|
|
|
422
443
|
def apply(self, **kwargs: Any) -> None:
|
|
423
444
|
for glossary in self.document.findall(addnodes.glossary):
|
|
424
|
-
if glossary[
|
|
445
|
+
if glossary['sorted']:
|
|
425
446
|
definition_list = cast(nodes.definition_list, glossary[0])
|
|
426
447
|
definition_list[:] = sorted(
|
|
427
448
|
definition_list,
|
|
428
449
|
key=lambda item: unicodedata.normalize(
|
|
429
|
-
'NFD',
|
|
430
|
-
|
|
450
|
+
'NFD', cast(nodes.term, item)[0].astext().lower()
|
|
451
|
+
),
|
|
431
452
|
)
|
|
432
453
|
|
|
433
454
|
|
|
@@ -490,7 +511,7 @@ def _reorder_index_target_nodes(start_node: nodes.target) -> None:
|
|
|
490
511
|
first_idx = parent.index(nodes_to_reorder[0])
|
|
491
512
|
last_idx = parent.index(nodes_to_reorder[-1])
|
|
492
513
|
if first_idx + len(nodes_to_reorder) - 1 == last_idx:
|
|
493
|
-
parent[first_idx:last_idx + 1] = sorted(nodes_to_reorder, key=_sort_key)
|
|
514
|
+
parent[first_idx : last_idx + 1] = sorted(nodes_to_reorder, key=_sort_key)
|
|
494
515
|
|
|
495
516
|
|
|
496
517
|
def _sort_key(node: nodes.Node) -> int:
|
|
@@ -30,8 +30,9 @@ class RefOnlyListChecker(nodes.GenericNodeVisitor):
|
|
|
30
30
|
pass
|
|
31
31
|
|
|
32
32
|
def visit_list_item(self, node: nodes.list_item) -> None:
|
|
33
|
-
children: list[Node] = [
|
|
34
|
-
|
|
33
|
+
children: list[Node] = [
|
|
34
|
+
child for child in node.children if not isinstance(child, nodes.Invisible)
|
|
35
|
+
]
|
|
35
36
|
if len(children) != 1:
|
|
36
37
|
raise nodes.NodeFound
|
|
37
38
|
if not isinstance(children[0], nodes.paragraph):
|
sphinx/transforms/i18n.py
CHANGED
|
@@ -48,8 +48,14 @@ EXCLUDED_PENDING_XREF_ATTRIBUTES = ('refexplicit',)
|
|
|
48
48
|
N = TypeVar('N', bound=nodes.Node)
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
def publish_msgstr(
|
|
52
|
-
|
|
51
|
+
def publish_msgstr(
|
|
52
|
+
app: Sphinx,
|
|
53
|
+
source: str,
|
|
54
|
+
source_path: str,
|
|
55
|
+
source_line: int,
|
|
56
|
+
config: Config,
|
|
57
|
+
settings: Any,
|
|
58
|
+
) -> nodes.Element:
|
|
53
59
|
"""Publish msgstr (single line) into docutils document
|
|
54
60
|
|
|
55
61
|
:param sphinx.application.Sphinx app: sphinx application
|
|
@@ -67,13 +73,15 @@ def publish_msgstr(app: Sphinx, source: str, source_path: str, source_line: int,
|
|
|
67
73
|
config.rst_prolog = None
|
|
68
74
|
|
|
69
75
|
from sphinx.io import SphinxI18nReader
|
|
76
|
+
|
|
70
77
|
reader = SphinxI18nReader()
|
|
71
78
|
reader.setup(app)
|
|
72
79
|
filetype = get_filetype(config.source_suffix, source_path)
|
|
73
80
|
parser = app.registry.create_source_parser(app, filetype)
|
|
74
81
|
doc = reader.read(
|
|
75
|
-
source=StringInput(
|
|
76
|
-
|
|
82
|
+
source=StringInput(
|
|
83
|
+
source=source, source_path=f'{source_path}:{source_line}:<translated>'
|
|
84
|
+
),
|
|
77
85
|
parser=parser,
|
|
78
86
|
settings=settings,
|
|
79
87
|
)
|
|
@@ -85,7 +93,7 @@ def publish_msgstr(app: Sphinx, source: str, source_path: str, source_line: int,
|
|
|
85
93
|
|
|
86
94
|
|
|
87
95
|
def parse_noqa(source: str) -> tuple[str, bool]:
|
|
88
|
-
m = match(r
|
|
96
|
+
m = match(r'(.*)(?<!\\)#\s*noqa\s*$', source, DOTALL)
|
|
89
97
|
if m:
|
|
90
98
|
return m.group(1), True
|
|
91
99
|
else:
|
|
@@ -108,29 +116,43 @@ class _NodeUpdater:
|
|
|
108
116
|
"""Contains logic for updating one node with the translated content."""
|
|
109
117
|
|
|
110
118
|
def __init__(
|
|
111
|
-
self,
|
|
119
|
+
self,
|
|
120
|
+
node: nodes.Element,
|
|
121
|
+
patch: nodes.Element,
|
|
122
|
+
document: nodes.document,
|
|
123
|
+
noqa: bool,
|
|
112
124
|
) -> None:
|
|
113
125
|
self.node: nodes.Element = node
|
|
114
126
|
self.patch: nodes.Element = patch
|
|
115
127
|
self.document: nodes.document = document
|
|
116
128
|
self.noqa: bool = noqa
|
|
117
129
|
|
|
118
|
-
def compare_references(
|
|
119
|
-
|
|
120
|
-
|
|
130
|
+
def compare_references(
|
|
131
|
+
self,
|
|
132
|
+
old_refs: Sequence[nodes.Element],
|
|
133
|
+
new_refs: Sequence[nodes.Element],
|
|
134
|
+
warning_msg: str,
|
|
135
|
+
) -> None:
|
|
121
136
|
"""Warn about mismatches between references in original and translated content."""
|
|
122
137
|
# FIXME: could use a smarter strategy than len(old_refs) == len(new_refs)
|
|
123
138
|
if not self.noqa and len(old_refs) != len(new_refs):
|
|
124
139
|
old_ref_rawsources = [ref.rawsource for ref in old_refs]
|
|
125
140
|
new_ref_rawsources = [ref.rawsource for ref in new_refs]
|
|
126
|
-
logger.warning(
|
|
127
|
-
|
|
141
|
+
logger.warning(
|
|
142
|
+
warning_msg.format(old_ref_rawsources, new_ref_rawsources),
|
|
143
|
+
location=self.node,
|
|
144
|
+
type='i18n',
|
|
145
|
+
subtype='inconsistent_references',
|
|
146
|
+
)
|
|
128
147
|
|
|
129
148
|
def update_title_mapping(self) -> bool:
|
|
130
149
|
processed = False # skip flag
|
|
131
150
|
|
|
132
151
|
# update title(section) target name-id mapping
|
|
133
|
-
if
|
|
152
|
+
if (
|
|
153
|
+
isinstance(self.node, nodes.title)
|
|
154
|
+
and isinstance(self.node.parent, nodes.section)
|
|
155
|
+
): # fmt: skip
|
|
134
156
|
section_node = self.node.parent
|
|
135
157
|
new_name = nodes.fully_normalize_name(self.patch.astext())
|
|
136
158
|
old_name = nodes.fully_normalize_name(self.node.astext())
|
|
@@ -201,9 +223,14 @@ class _NodeUpdater:
|
|
|
201
223
|
is_autofootnote_ref = NodeMatcher(nodes.footnote_reference, auto=Any)
|
|
202
224
|
old_foot_refs = list(is_autofootnote_ref.findall(self.node))
|
|
203
225
|
new_foot_refs = list(is_autofootnote_ref.findall(self.patch))
|
|
204
|
-
self.compare_references(
|
|
205
|
-
|
|
206
|
-
|
|
226
|
+
self.compare_references(
|
|
227
|
+
old_foot_refs,
|
|
228
|
+
new_foot_refs,
|
|
229
|
+
__(
|
|
230
|
+
'inconsistent footnote references in translated message.'
|
|
231
|
+
' original: {0}, translated: {1}'
|
|
232
|
+
),
|
|
233
|
+
)
|
|
207
234
|
old_foot_namerefs: dict[str, list[nodes.footnote_reference]] = {}
|
|
208
235
|
for r in old_foot_refs:
|
|
209
236
|
old_foot_namerefs.setdefault(r.get('refname'), []).append(r)
|
|
@@ -241,9 +268,14 @@ class _NodeUpdater:
|
|
|
241
268
|
is_refnamed_ref = NodeMatcher(nodes.reference, refname=Any)
|
|
242
269
|
old_refs = list(is_refnamed_ref.findall(self.node))
|
|
243
270
|
new_refs = list(is_refnamed_ref.findall(self.patch))
|
|
244
|
-
self.compare_references(
|
|
245
|
-
|
|
246
|
-
|
|
271
|
+
self.compare_references(
|
|
272
|
+
old_refs,
|
|
273
|
+
new_refs,
|
|
274
|
+
__(
|
|
275
|
+
'inconsistent references in translated message.'
|
|
276
|
+
' original: {0}, translated: {1}'
|
|
277
|
+
),
|
|
278
|
+
)
|
|
247
279
|
old_ref_names = [r['refname'] for r in old_refs]
|
|
248
280
|
new_ref_names = [r['refname'] for r in new_refs]
|
|
249
281
|
orphans = [*({*old_ref_names} - {*new_ref_names})]
|
|
@@ -266,31 +298,41 @@ class _NodeUpdater:
|
|
|
266
298
|
old_foot_refs = list(is_refnamed_footnote_ref.findall(self.node))
|
|
267
299
|
new_foot_refs = list(is_refnamed_footnote_ref.findall(self.patch))
|
|
268
300
|
refname_ids_map: dict[str, list[str]] = {}
|
|
269
|
-
self.compare_references(
|
|
270
|
-
|
|
271
|
-
|
|
301
|
+
self.compare_references(
|
|
302
|
+
old_foot_refs,
|
|
303
|
+
new_foot_refs,
|
|
304
|
+
__(
|
|
305
|
+
'inconsistent footnote references in translated message.'
|
|
306
|
+
' original: {0}, translated: {1}'
|
|
307
|
+
),
|
|
308
|
+
)
|
|
272
309
|
for oldf in old_foot_refs:
|
|
273
|
-
refname_ids_map.setdefault(oldf[
|
|
310
|
+
refname_ids_map.setdefault(oldf['refname'], []).append(oldf['ids'])
|
|
274
311
|
for newf in new_foot_refs:
|
|
275
|
-
refname = newf[
|
|
312
|
+
refname = newf['refname']
|
|
276
313
|
if refname_ids_map.get(refname):
|
|
277
|
-
newf[
|
|
314
|
+
newf['ids'] = refname_ids_map[refname].pop(0)
|
|
278
315
|
|
|
279
316
|
def update_citation_references(self) -> None:
|
|
280
317
|
# citation should use original 'ids'.
|
|
281
318
|
is_citation_ref = NodeMatcher(nodes.citation_reference, refname=Any)
|
|
282
319
|
old_cite_refs = list(is_citation_ref.findall(self.node))
|
|
283
320
|
new_cite_refs = list(is_citation_ref.findall(self.patch))
|
|
284
|
-
self.compare_references(
|
|
285
|
-
|
|
286
|
-
|
|
321
|
+
self.compare_references(
|
|
322
|
+
old_cite_refs,
|
|
323
|
+
new_cite_refs,
|
|
324
|
+
__(
|
|
325
|
+
'inconsistent citation references in translated message.'
|
|
326
|
+
' original: {0}, translated: {1}'
|
|
327
|
+
),
|
|
328
|
+
)
|
|
287
329
|
refname_ids_map: dict[str, list[str]] = {}
|
|
288
330
|
for oldc in old_cite_refs:
|
|
289
|
-
refname_ids_map.setdefault(oldc[
|
|
331
|
+
refname_ids_map.setdefault(oldc['refname'], []).append(oldc['ids'])
|
|
290
332
|
for newc in new_cite_refs:
|
|
291
|
-
refname = newc[
|
|
333
|
+
refname = newc['refname']
|
|
292
334
|
if refname_ids_map.get(refname):
|
|
293
|
-
newc[
|
|
335
|
+
newc['ids'] = refname_ids_map[refname].pop()
|
|
294
336
|
|
|
295
337
|
def update_pending_xrefs(self) -> None:
|
|
296
338
|
# Original pending_xref['reftarget'] contain not-translated
|
|
@@ -298,20 +340,25 @@ class _NodeUpdater:
|
|
|
298
340
|
# This code restricts to change ref-targets in the translation.
|
|
299
341
|
old_xrefs = [*self.node.findall(addnodes.pending_xref)]
|
|
300
342
|
new_xrefs = [*self.patch.findall(addnodes.pending_xref)]
|
|
301
|
-
self.compare_references(
|
|
302
|
-
|
|
303
|
-
|
|
343
|
+
self.compare_references(
|
|
344
|
+
old_xrefs,
|
|
345
|
+
new_xrefs,
|
|
346
|
+
__(
|
|
347
|
+
'inconsistent term references in translated message.'
|
|
348
|
+
' original: {0}, translated: {1}'
|
|
349
|
+
),
|
|
350
|
+
)
|
|
304
351
|
|
|
305
352
|
xref_reftarget_map: dict[tuple[str, str, str] | None, dict[str, Any]] = {}
|
|
306
353
|
|
|
307
354
|
def get_ref_key(node: addnodes.pending_xref) -> tuple[str, str, str] | None:
|
|
308
|
-
case = node[
|
|
355
|
+
case = node['refdomain'], node['reftype']
|
|
309
356
|
if case == ('std', 'term'):
|
|
310
357
|
return None
|
|
311
358
|
else:
|
|
312
359
|
return (
|
|
313
|
-
node[
|
|
314
|
-
node[
|
|
360
|
+
node['refdomain'],
|
|
361
|
+
node['reftype'],
|
|
315
362
|
node['reftarget'],
|
|
316
363
|
)
|
|
317
364
|
|
|
@@ -347,8 +394,10 @@ class Locale(SphinxTransform):
|
|
|
347
394
|
textdomain = docname_to_domain(self.env.docname, self.config.gettext_compact)
|
|
348
395
|
|
|
349
396
|
# fetch translations
|
|
350
|
-
dirs = [
|
|
351
|
-
|
|
397
|
+
dirs = [
|
|
398
|
+
path.join(self.env.srcdir, directory)
|
|
399
|
+
for directory in self.config.locale_dirs
|
|
400
|
+
]
|
|
352
401
|
catalog, has_catalog = init_locale(dirs, self.config.language, textdomain)
|
|
353
402
|
if not has_catalog:
|
|
354
403
|
return
|
|
@@ -393,8 +442,14 @@ class Locale(SphinxTransform):
|
|
|
393
442
|
if isinstance(node, LITERAL_TYPE_NODES):
|
|
394
443
|
msgstr = '::\n\n' + indent(msgstr, ' ' * 3)
|
|
395
444
|
|
|
396
|
-
patch = publish_msgstr(
|
|
397
|
-
|
|
445
|
+
patch = publish_msgstr(
|
|
446
|
+
self.app,
|
|
447
|
+
msgstr,
|
|
448
|
+
source,
|
|
449
|
+
node.line, # type: ignore[arg-type]
|
|
450
|
+
self.config,
|
|
451
|
+
settings,
|
|
452
|
+
)
|
|
398
453
|
# FIXME: no warnings about inconsistent references in this part
|
|
399
454
|
# XXX doctest and other block markup
|
|
400
455
|
if not isinstance(patch, nodes.paragraph):
|
|
@@ -408,11 +463,21 @@ class Locale(SphinxTransform):
|
|
|
408
463
|
for _id in node['ids']:
|
|
409
464
|
term, first_classifier = split_term_classifiers(msgstr)
|
|
410
465
|
patch = publish_msgstr(
|
|
411
|
-
self.app,
|
|
466
|
+
self.app,
|
|
467
|
+
term or '',
|
|
468
|
+
source,
|
|
469
|
+
node.line, # type: ignore[arg-type]
|
|
470
|
+
self.config,
|
|
471
|
+
settings,
|
|
412
472
|
)
|
|
413
473
|
updater.patch = make_glossary_term(
|
|
414
|
-
self.env,
|
|
415
|
-
|
|
474
|
+
self.env,
|
|
475
|
+
patch,
|
|
476
|
+
first_classifier,
|
|
477
|
+
source,
|
|
478
|
+
node.line, # type: ignore[arg-type]
|
|
479
|
+
_id,
|
|
480
|
+
self.document,
|
|
416
481
|
)
|
|
417
482
|
processed = True
|
|
418
483
|
|
|
@@ -474,8 +539,14 @@ class Locale(SphinxTransform):
|
|
|
474
539
|
# This generates: <section ...><title>msgstr</title></section>
|
|
475
540
|
msgstr = msgstr + '\n' + '=' * len(msgstr) * 2
|
|
476
541
|
|
|
477
|
-
patch = publish_msgstr(
|
|
478
|
-
|
|
542
|
+
patch = publish_msgstr(
|
|
543
|
+
self.app,
|
|
544
|
+
msgstr,
|
|
545
|
+
source,
|
|
546
|
+
node.line, # type: ignore[arg-type]
|
|
547
|
+
self.config,
|
|
548
|
+
settings,
|
|
549
|
+
)
|
|
479
550
|
# Structural Subelements phase2
|
|
480
551
|
if isinstance(node, nodes.title):
|
|
481
552
|
# get <title> node that placed as a first child
|
|
@@ -483,8 +554,8 @@ class Locale(SphinxTransform):
|
|
|
483
554
|
|
|
484
555
|
# ignore unexpected markups in translation message
|
|
485
556
|
unexpected: tuple[type[nodes.Element], ...] = (
|
|
486
|
-
nodes.paragraph,
|
|
487
|
-
nodes.title,
|
|
557
|
+
nodes.paragraph, # expected form of translation
|
|
558
|
+
nodes.title, # generated by above "Subelements phase2"
|
|
488
559
|
)
|
|
489
560
|
|
|
490
561
|
# following types are expected if
|
|
@@ -527,7 +598,13 @@ class Locale(SphinxTransform):
|
|
|
527
598
|
msgstr = part
|
|
528
599
|
msgstr_parts.append(msgstr)
|
|
529
600
|
|
|
530
|
-
new_entry =
|
|
601
|
+
new_entry = (
|
|
602
|
+
entry_type,
|
|
603
|
+
';'.join(msgstr_parts),
|
|
604
|
+
target_id,
|
|
605
|
+
main,
|
|
606
|
+
None,
|
|
607
|
+
)
|
|
531
608
|
new_entries.append(new_entry)
|
|
532
609
|
|
|
533
610
|
node['raw_entries'] = entries
|
|
@@ -543,6 +620,7 @@ class TranslationProgressTotaliser(SphinxTransform):
|
|
|
543
620
|
|
|
544
621
|
def apply(self, **kwargs: Any) -> None:
|
|
545
622
|
from sphinx.builders.gettext import MessageCatalogBuilder
|
|
623
|
+
|
|
546
624
|
if isinstance(self.app.builder, MessageCatalogBuilder):
|
|
547
625
|
return
|
|
548
626
|
|
|
@@ -567,6 +645,7 @@ class AddTranslationClasses(SphinxTransform):
|
|
|
567
645
|
|
|
568
646
|
def apply(self, **kwargs: Any) -> None:
|
|
569
647
|
from sphinx.builders.gettext import MessageCatalogBuilder
|
|
648
|
+
|
|
570
649
|
if isinstance(self.app.builder, MessageCatalogBuilder):
|
|
571
650
|
return
|
|
572
651
|
|
|
@@ -582,8 +661,10 @@ class AddTranslationClasses(SphinxTransform):
|
|
|
582
661
|
add_translated = False
|
|
583
662
|
add_untranslated = True
|
|
584
663
|
else:
|
|
585
|
-
msg = (
|
|
586
|
-
|
|
664
|
+
msg = (
|
|
665
|
+
'translation_progress_classes must be '
|
|
666
|
+
'True, False, "translated" or "untranslated"'
|
|
667
|
+
)
|
|
587
668
|
raise ConfigError(msg)
|
|
588
669
|
|
|
589
670
|
for node in NodeMatcher(nodes.Element, translated=Any).findall(self.document):
|
|
@@ -604,6 +685,7 @@ class RemoveTranslatableInline(SphinxTransform):
|
|
|
604
685
|
|
|
605
686
|
def apply(self, **kwargs: Any) -> None:
|
|
606
687
|
from sphinx.builders.gettext import MessageCatalogBuilder
|
|
688
|
+
|
|
607
689
|
if isinstance(self.app.builder, MessageCatalogBuilder):
|
|
608
690
|
return
|
|
609
691
|
|