Sphinx 7.3.6__py3-none-any.whl → 7.4.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 +5 -6
- sphinx/_cli/__init__.py +296 -0
- sphinx/_cli/util/__init__.py +0 -0
- sphinx/_cli/util/colour.py +103 -0
- sphinx/_cli/util/errors.py +165 -0
- sphinx/application.py +78 -43
- sphinx/builders/__init__.py +59 -15
- sphinx/builders/_epub_base.py +11 -5
- sphinx/builders/changes.py +2 -2
- sphinx/builders/epub3.py +2 -2
- sphinx/builders/gettext.py +10 -10
- sphinx/builders/html/__init__.py +56 -54
- sphinx/builders/latex/__init__.py +5 -5
- sphinx/builders/latex/constants.py +5 -0
- sphinx/builders/linkcheck.py +73 -38
- sphinx/builders/texinfo.py +1 -1
- sphinx/cmd/build.py +1 -1
- sphinx/cmd/quickstart.py +11 -11
- sphinx/config.py +57 -38
- sphinx/directives/__init__.py +7 -9
- sphinx/directives/code.py +12 -15
- sphinx/directives/other.py +12 -15
- sphinx/directives/patches.py +26 -0
- sphinx/domains/__init__.py +1 -1
- sphinx/domains/c/__init__.py +5 -5
- sphinx/domains/c/_ast.py +436 -12
- sphinx/domains/c/_symbol.py +89 -134
- sphinx/domains/changeset.py +3 -4
- sphinx/domains/cpp/__init__.py +5 -6
- sphinx/domains/cpp/_ast.py +822 -25
- sphinx/domains/cpp/_symbol.py +3 -0
- sphinx/domains/javascript.py +3 -6
- sphinx/domains/math.py +3 -2
- sphinx/domains/python/__init__.py +45 -6
- sphinx/domains/python/_object.py +7 -5
- sphinx/domains/rst.py +2 -2
- sphinx/domains/std/__init__.py +95 -14
- sphinx/environment/__init__.py +35 -15
- sphinx/environment/adapters/indexentries.py +71 -24
- sphinx/environment/adapters/toctree.py +1 -1
- sphinx/environment/collectors/__init__.py +18 -4
- sphinx/environment/collectors/asset.py +4 -4
- sphinx/environment/collectors/toctree.py +27 -14
- sphinx/events.py +7 -6
- sphinx/ext/apidoc.py +377 -170
- sphinx/ext/autodoc/__init__.py +13 -13
- sphinx/ext/autodoc/directive.py +10 -13
- sphinx/ext/autodoc/mock.py +10 -7
- sphinx/ext/autodoc/preserve_defaults.py +1 -1
- sphinx/ext/autodoc/typehints.py +2 -2
- sphinx/ext/autosummary/__init__.py +15 -9
- sphinx/ext/autosummary/generate.py +270 -154
- sphinx/ext/coverage.py +108 -18
- sphinx/ext/duration.py +10 -3
- sphinx/ext/extlinks.py +3 -2
- sphinx/ext/graphviz.py +3 -3
- sphinx/ext/ifconfig.py +1 -2
- sphinx/ext/imgconverter.py +1 -0
- sphinx/ext/imgmath.py +7 -6
- sphinx/ext/inheritance_diagram.py +3 -3
- sphinx/ext/intersphinx/__init__.py +81 -0
- sphinx/ext/intersphinx/__main__.py +10 -0
- sphinx/ext/intersphinx/_cli.py +44 -0
- sphinx/ext/intersphinx/_load.py +253 -0
- sphinx/ext/{intersphinx.py → intersphinx/_resolve.py} +17 -368
- sphinx/ext/intersphinx/_shared.py +53 -0
- sphinx/ext/mathjax.py +1 -1
- sphinx/ext/todo.py +2 -2
- sphinx/io.py +2 -6
- sphinx/locale/__init__.py +1 -5
- sphinx/locale/ar/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ar/LC_MESSAGES/sphinx.po +678 -471
- sphinx/locale/bg/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bg/LC_MESSAGES/sphinx.po +684 -476
- sphinx/locale/bn/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bn/LC_MESSAGES/sphinx.po +679 -472
- sphinx/locale/ca/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ca/LC_MESSAGES/sphinx.po +681 -474
- sphinx/locale/cak/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cak/LC_MESSAGES/sphinx.po +678 -471
- sphinx/locale/cs/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cs/LC_MESSAGES/sphinx.po +679 -472
- sphinx/locale/cy/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cy/LC_MESSAGES/sphinx.po +679 -472
- sphinx/locale/da/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/da/LC_MESSAGES/sphinx.po +679 -472
- sphinx/locale/de/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de/LC_MESSAGES/sphinx.po +679 -472
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +678 -471
- sphinx/locale/el/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/el/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/eo/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eo/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/es/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/et/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/et/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/eu/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eu/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/fa/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fa/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/fi/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fi/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/fr/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr/LC_MESSAGES/sphinx.po +725 -518
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/gl/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/gl/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/he/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/he/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/hi/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/hr/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hr/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/hu/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hu/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/id/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/id/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/is/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/is/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/it/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/it/LC_MESSAGES/sphinx.po +708 -500
- sphinx/locale/ja/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ja/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/ka/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ka/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/ko/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ko/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/lt/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lt/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/lv/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lv/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/mk/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/mk/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/ne/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ne/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/nl/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nl/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/pl/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pl/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/pt/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +705 -498
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/ro/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ro/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/ru/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ru/LC_MESSAGES/sphinx.po +890 -680
- sphinx/locale/si/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/si/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/sk/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sk/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/sl/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sl/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/sphinx.pot +702 -494
- sphinx/locale/sq/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sq/LC_MESSAGES/sphinx.po +704 -497
- sphinx/locale/sr/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr/LC_MESSAGES/sphinx.po +700 -493
- 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 +1 -1
- sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/ta/LC_MESSAGES/sphinx.po +1016 -808
- sphinx/locale/te/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/te/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/tr/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/tr/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/ur/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ur/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/vi/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/vi/LC_MESSAGES/sphinx.po +701 -494
- sphinx/locale/yue/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/yue/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po +704 -496
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +700 -493
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +729 -522
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +1 -1
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +700 -493
- sphinx/roles.py +1 -1
- sphinx/search/__init__.py +17 -9
- sphinx/templates/quickstart/{root_doc.rst_t → root_doc.rst.jinja} +7 -10
- sphinx/testing/fixtures.py +22 -20
- sphinx/testing/path.py +6 -2
- sphinx/testing/util.py +8 -13
- sphinx/texinputs/sphinx.sty +449 -332
- sphinx/texinputs/sphinxlatexadmonitions.sty +209 -66
- sphinx/texinputs/sphinxlatexliterals.sty +9 -16
- sphinx/texinputs/sphinxlatexstyletext.sty +4 -38
- sphinx/texinputs/sphinxlatextables.sty +6 -14
- sphinx/texinputs/sphinxpackageboxes.sty +15 -42
- sphinx/texinputs/sphinxpackagefootnote.sty +4 -3
- sphinx/themes/agogo/layout.html +3 -3
- sphinx/themes/basic/genindex-single.html +2 -1
- sphinx/themes/basic/layout.html +3 -6
- sphinx/themes/basic/static/searchtools.js +4 -3
- sphinx/themes/haiku/layout.html +4 -4
- sphinx/themes/pyramid/layout.html +1 -1
- sphinx/themes/scrolls/layout.html +2 -2
- sphinx/theming.py +42 -7
- sphinx/transforms/__init__.py +34 -20
- sphinx/transforms/i18n.py +8 -7
- sphinx/transforms/post_transforms/__init__.py +1 -1
- sphinx/transforms/post_transforms/images.py +7 -10
- sphinx/util/_pathlib.py +2 -2
- sphinx/util/cfamily.py +52 -30
- sphinx/util/console.py +1 -1
- sphinx/util/display.py +16 -11
- sphinx/util/docutils.py +88 -40
- sphinx/util/fileutil.py +15 -3
- sphinx/util/images.py +1 -0
- sphinx/util/inspect.py +66 -22
- sphinx/util/inventory.py +15 -0
- sphinx/util/logging.py +14 -21
- sphinx/util/math.py +3 -1
- sphinx/util/nodes.py +9 -12
- sphinx/util/osutil.py +5 -5
- sphinx/util/parsing.py +93 -0
- sphinx/util/tags.py +71 -47
- sphinx/util/typing.py +261 -143
- sphinx/versioning.py +17 -17
- sphinx/writers/html5.py +26 -19
- sphinx/writers/latex.py +58 -28
- sphinx/writers/manpage.py +4 -3
- sphinx/writers/texinfo.py +19 -14
- {sphinx-7.3.6.dist-info → sphinx-7.4.0.dist-info}/METADATA +21 -20
- sphinx-7.4.0.dist-info/RECORD +591 -0
- sphinx-7.3.6.dist-info/RECORD +0 -581
- /sphinx/templates/apidoc/{module.rst_t → module.rst.jinja} +0 -0
- /sphinx/templates/apidoc/{package.rst_t → package.rst.jinja} +0 -0
- /sphinx/templates/apidoc/{toc.rst_t → toc.rst.jinja} +0 -0
- /sphinx/templates/epub3/{content.opf_t → content.opf.jinja} +0 -0
- /sphinx/templates/epub3/{nav.xhtml_t → nav.xhtml.jinja} +0 -0
- /sphinx/templates/epub3/{toc.ncx_t → toc.ncx.jinja} +0 -0
- /sphinx/templates/gettext/{message.pot_t → message.pot.jinja} +0 -0
- /sphinx/templates/imgmath/{preview.tex_t → preview.tex.jinja} +0 -0
- /sphinx/templates/imgmath/{template.tex_t → template.tex.jinja} +0 -0
- /sphinx/templates/latex/{latex.tex_t → latex.tex.jinja} +0 -0
- /sphinx/templates/latex/{longtable.tex_t → longtable.tex.jinja} +0 -0
- /sphinx/templates/latex/{sphinxmessages.sty_t → sphinxmessages.sty.jinja} +0 -0
- /sphinx/templates/latex/{tabular.tex_t → tabular.tex.jinja} +0 -0
- /sphinx/templates/latex/{tabulary.tex_t → tabulary.tex.jinja} +0 -0
- /sphinx/templates/quickstart/{Makefile_t → Makefile.jinja} +0 -0
- /sphinx/templates/quickstart/{Makefile.new_t → Makefile.new.jinja} +0 -0
- /sphinx/templates/quickstart/{conf.py_t → conf.py.jinja} +0 -0
- /sphinx/templates/quickstart/{make.bat_t → make.bat.jinja} +0 -0
- /sphinx/templates/quickstart/{make.bat.new_t → make.bat.new.jinja} +0 -0
- /sphinx/texinputs/{Makefile_t → Makefile.jinja} +0 -0
- /sphinx/texinputs/{latexmkjarc_t → latexmkjarc.jinja} +0 -0
- /sphinx/texinputs/{latexmkrc_t → latexmkrc.jinja} +0 -0
- /sphinx/texinputs/{make.bat_t → make.bat.jinja} +0 -0
- /sphinx/texinputs_win/{Makefile_t → Makefile.jinja} +0 -0
- /sphinx/themes/agogo/static/{agogo.css_t → agogo.css.jinja} +0 -0
- /sphinx/themes/basic/static/{basic.css_t → basic.css.jinja} +0 -0
- /sphinx/themes/basic/static/{documentation_options.js_t → documentation_options.js.jinja} +0 -0
- /sphinx/themes/basic/static/{language_data.js_t → language_data.js.jinja} +0 -0
- /sphinx/themes/bizstyle/static/{bizstyle.css_t → bizstyle.css.jinja} +0 -0
- /sphinx/themes/bizstyle/static/{bizstyle.js_t → bizstyle.js.jinja} +0 -0
- /sphinx/themes/classic/static/{classic.css_t → classic.css.jinja} +0 -0
- /sphinx/themes/classic/static/{sidebar.js_t → sidebar.js.jinja} +0 -0
- /sphinx/themes/epub/static/{epub.css_t → epub.css.jinja} +0 -0
- /sphinx/themes/haiku/static/{haiku.css_t → haiku.css.jinja} +0 -0
- /sphinx/themes/nature/static/{nature.css_t → nature.css.jinja} +0 -0
- /sphinx/themes/nonav/static/{nonav.css_t → nonav.css.jinja} +0 -0
- /sphinx/themes/pyramid/static/{epub.css_t → epub.css.jinja} +0 -0
- /sphinx/themes/pyramid/static/{pyramid.css_t → pyramid.css.jinja} +0 -0
- /sphinx/themes/scrolls/static/{scrolls.css_t → scrolls.css.jinja} +0 -0
- /sphinx/themes/sphinxdoc/static/{sphinxdoc.css_t → sphinxdoc.css.jinja} +0 -0
- /sphinx/themes/traditional/static/{traditional.css_t → traditional.css.jinja} +0 -0
- {sphinx-7.3.6.dist-info → sphinx-7.4.0.dist-info}/LICENSE.rst +0 -0
- {sphinx-7.3.6.dist-info → sphinx-7.4.0.dist-info}/WHEEL +0 -0
- {sphinx-7.3.6.dist-info → sphinx-7.4.0.dist-info}/entry_points.txt +0 -0
sphinx/util/nodes.py
CHANGED
|
@@ -13,13 +13,14 @@ from docutils.nodes import Node
|
|
|
13
13
|
from sphinx import addnodes
|
|
14
14
|
from sphinx.locale import __
|
|
15
15
|
from sphinx.util import logging
|
|
16
|
+
from sphinx.util.parsing import _fresh_title_style_context
|
|
16
17
|
|
|
17
18
|
if TYPE_CHECKING:
|
|
18
19
|
from collections.abc import Iterable, Iterator
|
|
19
20
|
|
|
20
21
|
from docutils.nodes import Element
|
|
21
22
|
from docutils.parsers.rst import Directive
|
|
22
|
-
from docutils.parsers.rst.states import Inliner
|
|
23
|
+
from docutils.parsers.rst.states import Inliner, RSTState
|
|
23
24
|
from docutils.statemachine import StringList
|
|
24
25
|
|
|
25
26
|
from sphinx.builders import Builder
|
|
@@ -324,24 +325,20 @@ def traverse_translatable_index(
|
|
|
324
325
|
yield node, entries
|
|
325
326
|
|
|
326
327
|
|
|
327
|
-
def nested_parse_with_titles(state:
|
|
328
|
+
def nested_parse_with_titles(state: RSTState, content: StringList, node: Node,
|
|
328
329
|
content_offset: int = 0) -> str:
|
|
329
330
|
"""Version of state.nested_parse() that allows titles and does not require
|
|
330
331
|
titles to have the same decoration as the calling document.
|
|
331
332
|
|
|
332
333
|
This is useful when the parsed content comes from a completely different
|
|
333
334
|
context, such as docstrings.
|
|
335
|
+
|
|
336
|
+
This function is retained for compatibility and will be deprecated in
|
|
337
|
+
Sphinx 8. Prefer ``nested_parse_to_nodes()``.
|
|
334
338
|
"""
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
state.memo.title_styles = []
|
|
339
|
-
state.memo.section_level = 0
|
|
340
|
-
try:
|
|
341
|
-
return state.nested_parse(content, content_offset, node, match_titles=1)
|
|
342
|
-
finally:
|
|
343
|
-
state.memo.title_styles = surrounding_title_styles
|
|
344
|
-
state.memo.section_level = surrounding_section_level
|
|
339
|
+
with _fresh_title_style_context(state):
|
|
340
|
+
ret = state.nested_parse(content, content_offset, node, match_titles=True)
|
|
341
|
+
return ret
|
|
345
342
|
|
|
346
343
|
|
|
347
344
|
def clean_astext(node: Element) -> str:
|
sphinx/util/osutil.py
CHANGED
|
@@ -17,6 +17,7 @@ from sphinx.deprecation import _deprecation_warning
|
|
|
17
17
|
|
|
18
18
|
if TYPE_CHECKING:
|
|
19
19
|
from collections.abc import Iterator
|
|
20
|
+
from pathlib import Path
|
|
20
21
|
from types import TracebackType
|
|
21
22
|
from typing import Any
|
|
22
23
|
|
|
@@ -107,16 +108,15 @@ def copyfile(source: str | os.PathLike[str], dest: str | os.PathLike[str]) -> No
|
|
|
107
108
|
copytimes(source, dest)
|
|
108
109
|
|
|
109
110
|
|
|
110
|
-
|
|
111
|
-
project_suffix_re = re.compile(' Documentation$')
|
|
111
|
+
_no_fn_re = re.compile(r'[^a-zA-Z0-9_-]')
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
def make_filename(string: str) -> str:
|
|
115
|
-
return
|
|
115
|
+
return _no_fn_re.sub('', string) or 'sphinx'
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
def make_filename_from_project(project: str) -> str:
|
|
119
|
-
return make_filename(
|
|
119
|
+
return make_filename(project.removesuffix(' Documentation')).lower()
|
|
120
120
|
|
|
121
121
|
|
|
122
122
|
def relpath(path: str | os.PathLike[str],
|
|
@@ -182,7 +182,7 @@ class FileAvoidWrite:
|
|
|
182
182
|
Objects can be used as context managers.
|
|
183
183
|
"""
|
|
184
184
|
|
|
185
|
-
def __init__(self, path: str) -> None:
|
|
185
|
+
def __init__(self, path: str | Path) -> None:
|
|
186
186
|
self._path = path
|
|
187
187
|
self._io: StringIO | None = None
|
|
188
188
|
|
sphinx/util/parsing.py
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""Docutils utility functions for parsing text."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import contextlib
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from docutils.nodes import Element, Node
|
|
9
|
+
from docutils.statemachine import StringList, string2lines
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from collections.abc import Iterator
|
|
13
|
+
|
|
14
|
+
from docutils.parsers.rst.states import RSTState
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def nested_parse_to_nodes(
|
|
18
|
+
state: RSTState,
|
|
19
|
+
text: str | StringList,
|
|
20
|
+
*,
|
|
21
|
+
source: str = '<generated text>',
|
|
22
|
+
offset: int = 0,
|
|
23
|
+
allow_section_headings: bool = True,
|
|
24
|
+
keep_title_context: bool = False,
|
|
25
|
+
) -> list[Node]: # Element | nodes.Text
|
|
26
|
+
"""Parse *text* into nodes.
|
|
27
|
+
|
|
28
|
+
:param state:
|
|
29
|
+
The state machine state. Must be a subclass of ``RSTState``.
|
|
30
|
+
:param text:
|
|
31
|
+
Text, in string form. ``StringList`` is also accepted.
|
|
32
|
+
:param source:
|
|
33
|
+
The text's source, used when creating a new ``StringList``.
|
|
34
|
+
:param offset:
|
|
35
|
+
The offset of the content.
|
|
36
|
+
:param allow_section_headings:
|
|
37
|
+
Are titles (sections) allowed in *text*?
|
|
38
|
+
Note that this option bypasses Docutils' usual checks on
|
|
39
|
+
doctree structure, and misuse of this option can lead to
|
|
40
|
+
an incoherent doctree. In Docutils, section nodes should
|
|
41
|
+
only be children of ``Structural`` nodes, which includes
|
|
42
|
+
``document``, ``section``, and ``sidebar`` nodes.
|
|
43
|
+
:param keep_title_context:
|
|
44
|
+
If this is False (the default), then *content* is parsed as if it were
|
|
45
|
+
an independent document, meaning that title decorations (e.g. underlines)
|
|
46
|
+
do not need to match the surrounding document.
|
|
47
|
+
This is useful when the parsed content comes from
|
|
48
|
+
a completely different context, such as docstrings.
|
|
49
|
+
If this is True, then title underlines must match those in
|
|
50
|
+
the surrounding document, otherwise the behaviour is undefined.
|
|
51
|
+
|
|
52
|
+
.. versionadded:: 7.4
|
|
53
|
+
"""
|
|
54
|
+
document = state.document
|
|
55
|
+
content = _text_to_string_list(
|
|
56
|
+
text, source=source, tab_width=document.settings.tab_width,
|
|
57
|
+
)
|
|
58
|
+
node = Element() # Anonymous container for parsing
|
|
59
|
+
node.document = document
|
|
60
|
+
|
|
61
|
+
if keep_title_context:
|
|
62
|
+
state.nested_parse(content, offset, node, match_titles=allow_section_headings)
|
|
63
|
+
else:
|
|
64
|
+
with _fresh_title_style_context(state):
|
|
65
|
+
state.nested_parse(content, offset, node, match_titles=allow_section_headings)
|
|
66
|
+
return node.children
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@contextlib.contextmanager
|
|
70
|
+
def _fresh_title_style_context(state: RSTState) -> Iterator[None]:
|
|
71
|
+
# hack around title style bookkeeping
|
|
72
|
+
memo = state.memo
|
|
73
|
+
surrounding_title_styles: list[str | tuple[str, str]] = memo.title_styles
|
|
74
|
+
surrounding_section_level: int = memo.section_level
|
|
75
|
+
# clear current title styles
|
|
76
|
+
memo.title_styles = []
|
|
77
|
+
memo.section_level = 0
|
|
78
|
+
try:
|
|
79
|
+
yield
|
|
80
|
+
finally:
|
|
81
|
+
# reset title styles
|
|
82
|
+
memo.title_styles = surrounding_title_styles
|
|
83
|
+
memo.section_level = surrounding_section_level
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _text_to_string_list(
|
|
87
|
+
text: str | StringList, /, *, source: str, tab_width: int,
|
|
88
|
+
) -> StringList:
|
|
89
|
+
# Doesn't really belong in this module, but avoids circular imports.
|
|
90
|
+
if isinstance(text, StringList):
|
|
91
|
+
return text
|
|
92
|
+
content = string2lines(text, tab_width, convert_whitespace=True)
|
|
93
|
+
return StringList(content, source=source)
|
sphinx/util/tags.py
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import warnings
|
|
3
4
|
from typing import TYPE_CHECKING
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import jinja2.environment
|
|
7
|
+
import jinja2.nodes
|
|
8
|
+
import jinja2.parser
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
from collections.abc import Iterator
|
|
11
|
-
|
|
12
|
-
from jinja2.nodes import Node
|
|
10
|
+
from sphinx.deprecation import RemovedInSphinx90Warning
|
|
13
11
|
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from collections.abc import Iterator, Sequence
|
|
14
|
+
from typing import Literal
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
_ENV = jinja2.environment.Environment()
|
|
16
17
|
|
|
17
18
|
|
|
18
|
-
class BooleanParser(Parser):
|
|
19
|
-
"""
|
|
20
|
-
Only allow condition exprs and/or/not operations.
|
|
21
|
-
"""
|
|
19
|
+
class BooleanParser(jinja2.parser.Parser):
|
|
20
|
+
"""Only allow conditional expressions and binary operators."""
|
|
22
21
|
|
|
23
|
-
def parse_compare(self) -> nodes.Expr:
|
|
24
|
-
node: nodes.Expr
|
|
22
|
+
def parse_compare(self) -> jinja2.nodes.Expr:
|
|
23
|
+
node: jinja2.nodes.Expr
|
|
25
24
|
token = self.stream.current
|
|
26
25
|
if token.type == 'name':
|
|
27
|
-
if token.value in
|
|
28
|
-
node = nodes.Const(token.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
if token.value in {'true', 'True'}:
|
|
27
|
+
node = jinja2.nodes.Const(True, lineno=token.lineno)
|
|
28
|
+
elif token.value in {'false', 'False'}:
|
|
29
|
+
node = jinja2.nodes.Const(False, lineno=token.lineno)
|
|
30
|
+
elif token.value in {'none', 'None'}:
|
|
31
|
+
node = jinja2.nodes.Const(None, lineno=token.lineno)
|
|
32
32
|
else:
|
|
33
|
-
node = nodes.Name(token.value, 'load', lineno=token.lineno)
|
|
33
|
+
node = jinja2.nodes.Name(token.value, 'load', lineno=token.lineno)
|
|
34
34
|
next(self.stream)
|
|
35
35
|
elif token.type == 'lparen':
|
|
36
36
|
next(self.stream)
|
|
@@ -42,47 +42,71 @@ class BooleanParser(Parser):
|
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class Tags:
|
|
45
|
-
def __init__(self, tags:
|
|
46
|
-
self.
|
|
45
|
+
def __init__(self, tags: Sequence[str] = ()) -> None:
|
|
46
|
+
self._tags = set(tags or ())
|
|
47
|
+
self._condition_cache: dict[str, bool] = {}
|
|
47
48
|
|
|
48
|
-
def
|
|
49
|
-
return
|
|
49
|
+
def __str__(self) -> str:
|
|
50
|
+
return f'{self.__class__.__name__}({", ".join(sorted(self._tags))})'
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
def __repr__(self) -> str:
|
|
53
|
+
return f'{self.__class__.__name__}({tuple(sorted(self._tags))})'
|
|
52
54
|
|
|
53
55
|
def __iter__(self) -> Iterator[str]:
|
|
54
|
-
return iter(self.
|
|
56
|
+
return iter(self._tags)
|
|
57
|
+
|
|
58
|
+
def __contains__(self, tag: str) -> bool:
|
|
59
|
+
return tag in self._tags
|
|
60
|
+
|
|
61
|
+
def has(self, tag: str) -> bool:
|
|
62
|
+
return tag in self._tags
|
|
55
63
|
|
|
56
64
|
def add(self, tag: str) -> None:
|
|
57
|
-
self.
|
|
65
|
+
self._tags.add(tag)
|
|
58
66
|
|
|
59
67
|
def remove(self, tag: str) -> None:
|
|
60
|
-
self.
|
|
68
|
+
self._tags.discard(tag)
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def tags(self) -> dict[str, Literal[True]]:
|
|
72
|
+
warnings.warn('Tags.tags is deprecated, use methods on Tags.',
|
|
73
|
+
RemovedInSphinx90Warning, stacklevel=2)
|
|
74
|
+
return dict.fromkeys(self._tags, True)
|
|
61
75
|
|
|
62
76
|
def eval_condition(self, condition: str) -> bool:
|
|
77
|
+
"""Evaluate a boolean condition.
|
|
78
|
+
|
|
79
|
+
Only conditional expressions and binary operators (and, or, not)
|
|
80
|
+
are permitted, and operate on tag names, where truthy values mean
|
|
81
|
+
the tag is present and vice versa.
|
|
82
|
+
"""
|
|
83
|
+
if condition in self._condition_cache:
|
|
84
|
+
return self._condition_cache[condition]
|
|
85
|
+
|
|
63
86
|
# exceptions are handled by the caller
|
|
64
|
-
parser = BooleanParser(
|
|
87
|
+
parser = BooleanParser(_ENV, condition, state='variable')
|
|
65
88
|
expr = parser.parse_expression()
|
|
66
89
|
if not parser.stream.eos:
|
|
67
90
|
msg = 'chunk after expression'
|
|
68
91
|
raise ValueError(msg)
|
|
69
92
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if eval_node(node.test):
|
|
73
|
-
return eval_node(node.expr1)
|
|
74
|
-
else:
|
|
75
|
-
return eval_node(node.expr2)
|
|
76
|
-
elif isinstance(node, nodes.And):
|
|
77
|
-
return eval_node(node.left) and eval_node(node.right)
|
|
78
|
-
elif isinstance(node, nodes.Or):
|
|
79
|
-
return eval_node(node.left) or eval_node(node.right)
|
|
80
|
-
elif isinstance(node, nodes.Not):
|
|
81
|
-
return not eval_node(node.node)
|
|
82
|
-
elif isinstance(node, nodes.Name):
|
|
83
|
-
return self.tags.get(node.name, False)
|
|
84
|
-
else:
|
|
85
|
-
msg = 'invalid node, check parsing'
|
|
86
|
-
raise ValueError(msg)
|
|
93
|
+
evaluated = self._condition_cache[condition] = self._eval_node(expr)
|
|
94
|
+
return evaluated
|
|
87
95
|
|
|
88
|
-
|
|
96
|
+
def _eval_node(self, node: jinja2.nodes.Node | None) -> bool:
|
|
97
|
+
if isinstance(node, jinja2.nodes.CondExpr):
|
|
98
|
+
if self._eval_node(node.test):
|
|
99
|
+
return self._eval_node(node.expr1)
|
|
100
|
+
else:
|
|
101
|
+
return self._eval_node(node.expr2)
|
|
102
|
+
elif isinstance(node, jinja2.nodes.And):
|
|
103
|
+
return self._eval_node(node.left) and self._eval_node(node.right)
|
|
104
|
+
elif isinstance(node, jinja2.nodes.Or):
|
|
105
|
+
return self._eval_node(node.left) or self._eval_node(node.right)
|
|
106
|
+
elif isinstance(node, jinja2.nodes.Not):
|
|
107
|
+
return not self._eval_node(node.node)
|
|
108
|
+
elif isinstance(node, jinja2.nodes.Name):
|
|
109
|
+
return node.name in self._tags
|
|
110
|
+
else:
|
|
111
|
+
msg = 'invalid node, check parsing'
|
|
112
|
+
raise ValueError(msg)
|