Sphinx 8.0.2__py3-none-any.whl → 8.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of Sphinx might be problematic. Click here for more details.
- sphinx/__init__.py +6 -3
- sphinx/_cli/__init__.py +40 -20
- sphinx/_cli/util/colour.py +5 -4
- sphinx/_cli/util/errors.py +28 -11
- sphinx/application.py +361 -38
- sphinx/builders/__init__.py +229 -83
- sphinx/builders/_epub_base.py +118 -71
- sphinx/builders/changes.py +39 -21
- sphinx/builders/dirhtml.py +4 -4
- sphinx/builders/dummy.py +2 -5
- sphinx/builders/epub3.py +43 -22
- sphinx/builders/gettext.py +43 -25
- sphinx/builders/html/__init__.py +284 -218
- sphinx/builders/html/_assets.py +62 -26
- sphinx/builders/html/_build_info.py +76 -0
- sphinx/builders/html/transforms.py +11 -9
- sphinx/builders/latex/__init__.py +139 -81
- sphinx/builders/latex/constants.py +7 -7
- sphinx/builders/latex/nodes.py +3 -2
- sphinx/builders/latex/theming.py +7 -5
- sphinx/builders/latex/transforms.py +27 -19
- sphinx/builders/linkcheck.py +146 -72
- sphinx/builders/manpage.py +30 -13
- sphinx/builders/singlehtml.py +22 -14
- sphinx/builders/texinfo.py +67 -37
- sphinx/builders/text.py +5 -5
- sphinx/builders/xml.py +6 -9
- sphinx/cmd/build.py +282 -103
- sphinx/cmd/make_mode.py +106 -63
- sphinx/cmd/quickstart.py +341 -145
- sphinx/config.py +45 -12
- sphinx/deprecation.py +8 -2
- sphinx/directives/__init__.py +28 -19
- sphinx/directives/code.py +86 -56
- sphinx/directives/other.py +50 -36
- sphinx/directives/patches.py +29 -19
- sphinx/domains/__init__.py +20 -120
- sphinx/domains/_domains_container.py +281 -0
- sphinx/domains/_index.py +110 -0
- sphinx/domains/c/__init__.py +3 -3
- sphinx/domains/c/_parser.py +10 -6
- sphinx/domains/changeset.py +5 -3
- sphinx/domains/citation.py +5 -3
- sphinx/domains/cpp/__init__.py +9 -11
- sphinx/domains/cpp/_parser.py +8 -7
- sphinx/domains/index.py +3 -3
- sphinx/domains/javascript.py +12 -7
- sphinx/domains/math.py +2 -2
- sphinx/domains/python/__init__.py +10 -5
- sphinx/domains/python/_object.py +1 -1
- sphinx/domains/rst.py +5 -5
- sphinx/domains/std/__init__.py +16 -11
- sphinx/environment/__init__.py +206 -146
- sphinx/environment/adapters/asset.py +3 -2
- sphinx/environment/adapters/indexentries.py +74 -33
- sphinx/environment/adapters/toctree.py +100 -43
- sphinx/environment/collectors/__init__.py +19 -8
- sphinx/environment/collectors/asset.py +47 -15
- sphinx/environment/collectors/dependencies.py +8 -4
- sphinx/environment/collectors/metadata.py +7 -2
- sphinx/environment/collectors/title.py +7 -2
- sphinx/environment/collectors/toctree.py +54 -22
- sphinx/errors.py +4 -1
- sphinx/events.py +314 -7
- sphinx/ext/apidoc.py +42 -18
- sphinx/ext/autodoc/__init__.py +52 -24
- sphinx/ext/autodoc/importer.py +6 -9
- sphinx/ext/autosectionlabel.py +1 -2
- sphinx/ext/autosummary/__init__.py +3 -1
- sphinx/ext/autosummary/generate.py +28 -14
- sphinx/ext/coverage.py +7 -7
- sphinx/ext/doctest.py +4 -8
- sphinx/ext/duration.py +6 -5
- sphinx/ext/inheritance_diagram.py +1 -1
- sphinx/ext/intersphinx/_cli.py +6 -4
- sphinx/ext/intersphinx/_load.py +77 -32
- sphinx/ext/intersphinx/_resolve.py +173 -79
- sphinx/ext/intersphinx/_shared.py +7 -5
- sphinx/ext/linkcode.py +7 -1
- sphinx/ext/mathjax.py +1 -2
- sphinx/ext/napoleon/__init__.py +37 -24
- sphinx/ext/napoleon/docstring.py +202 -134
- sphinx/ext/todo.py +5 -3
- sphinx/highlighting.py +9 -2
- sphinx/io.py +1 -1
- sphinx/jinja2glue.py +27 -6
- sphinx/locale/__init__.py +6 -2
- sphinx/locale/ar/LC_MESSAGES/sphinx.js +8 -1
- sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ar/LC_MESSAGES/sphinx.po +2246 -2288
- sphinx/locale/bg/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bg/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/bn/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/bn/LC_MESSAGES/sphinx.po +2349 -2395
- sphinx/locale/ca/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ca/LC_MESSAGES/sphinx.po +2846 -2892
- sphinx/locale/cak/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cak/LC_MESSAGES/sphinx.po +2213 -2259
- sphinx/locale/cs/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cs/LC_MESSAGES/sphinx.po +2225 -2269
- sphinx/locale/cy/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/cy/LC_MESSAGES/sphinx.po +2403 -2447
- sphinx/locale/da/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/da/LC_MESSAGES/sphinx.po +2214 -2260
- sphinx/locale/de/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de/LC_MESSAGES/sphinx.po +2230 -2276
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/el/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/el/LC_MESSAGES/sphinx.po +2619 -2665
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2519 -2565
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/eo/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eo/LC_MESSAGES/sphinx.po +2232 -2278
- sphinx/locale/es/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es/LC_MESSAGES/sphinx.po +2516 -2561
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/et/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/et/LC_MESSAGES/sphinx.po +2317 -2363
- sphinx/locale/eu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/eu/LC_MESSAGES/sphinx.po +2218 -2264
- sphinx/locale/fa/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fa/LC_MESSAGES/sphinx.po +2505 -2551
- sphinx/locale/fi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fi/LC_MESSAGES/sphinx.po +2303 -2349
- sphinx/locale/fr/LC_MESSAGES/sphinx.js +6 -2
- sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr/LC_MESSAGES/sphinx.po +2863 -2908
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/gl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/gl/LC_MESSAGES/sphinx.po +2571 -2617
- sphinx/locale/he/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/he/LC_MESSAGES/sphinx.po +2307 -2352
- sphinx/locale/hi/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi/LC_MESSAGES/sphinx.po +2580 -2626
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/hr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hr/LC_MESSAGES/sphinx.po +2238 -2283
- sphinx/locale/hu/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/hu/LC_MESSAGES/sphinx.po +2228 -2274
- sphinx/locale/id/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/id/LC_MESSAGES/sphinx.po +2787 -2834
- sphinx/locale/is/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/is/LC_MESSAGES/sphinx.po +2224 -2270
- sphinx/locale/it/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/it/LC_MESSAGES/sphinx.po +2231 -2276
- sphinx/locale/ja/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ja/LC_MESSAGES/sphinx.po +2507 -2554
- sphinx/locale/ka/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ka/LC_MESSAGES/sphinx.po +2428 -2474
- sphinx/locale/ko/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ko/LC_MESSAGES/sphinx.po +2516 -2563
- sphinx/locale/lt/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lt/LC_MESSAGES/sphinx.po +2425 -2469
- sphinx/locale/lv/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/lv/LC_MESSAGES/sphinx.po +2362 -2407
- sphinx/locale/mk/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/mk/LC_MESSAGES/sphinx.po +2121 -2167
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2220 -2266
- sphinx/locale/ne/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ne/LC_MESSAGES/sphinx.po +2221 -2267
- sphinx/locale/nl/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/nl/LC_MESSAGES/sphinx.po +2240 -2286
- sphinx/locale/pl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pl/LC_MESSAGES/sphinx.po +2319 -2363
- sphinx/locale/pt/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt/LC_MESSAGES/sphinx.po +2114 -2159
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2854 -2899
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2224 -2269
- sphinx/locale/ro/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ro/LC_MESSAGES/sphinx.po +2226 -2271
- sphinx/locale/ru/LC_MESSAGES/sphinx.js +8 -3
- sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ru/LC_MESSAGES/sphinx.po +2841 -2885
- sphinx/locale/si/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/si/LC_MESSAGES/sphinx.po +2294 -2340
- sphinx/locale/sk/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sk/LC_MESSAGES/sphinx.po +2497 -2541
- sphinx/locale/sl/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sl/LC_MESSAGES/sphinx.po +2331 -2375
- sphinx/locale/sphinx.pot +2121 -2167
- sphinx/locale/sq/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sq/LC_MESSAGES/sphinx.po +2855 -2901
- sphinx/locale/sr/LC_MESSAGES/sphinx.js +5 -1
- sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr/LC_MESSAGES/sphinx.po +2203 -2248
- sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/sv/LC_MESSAGES/sphinx.po +2423 -2469
- sphinx/locale/te/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/te/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/tr/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/tr/LC_MESSAGES/sphinx.po +2443 -2489
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +6 -1
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2329 -2373
- sphinx/locale/ur/LC_MESSAGES/sphinx.js +4 -1
- sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/ur/LC_MESSAGES/sphinx.po +2113 -2159
- sphinx/locale/vi/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/vi/LC_MESSAGES/sphinx.po +2199 -2246
- sphinx/locale/yue/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/yue/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2845 -2892
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +3 -1
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
- sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2112 -2159
- sphinx/parsers.py +3 -1
- sphinx/project.py +6 -2
- sphinx/pycode/__init__.py +11 -4
- sphinx/pycode/ast.py +58 -58
- sphinx/pycode/parser.py +49 -28
- sphinx/pygments_styles.py +49 -49
- sphinx/registry.py +8 -3
- sphinx/roles.py +133 -13
- sphinx/search/__init__.py +146 -87
- sphinx/search/da.py +2 -4
- sphinx/search/de.py +2 -4
- sphinx/search/en.py +4 -4
- sphinx/search/es.py +2 -4
- sphinx/search/fi.py +2 -4
- sphinx/search/fr.py +2 -4
- sphinx/search/hu.py +2 -4
- sphinx/search/it.py +2 -4
- sphinx/search/ja.py +55 -32
- sphinx/search/nl.py +2 -4
- sphinx/search/no.py +2 -4
- sphinx/search/pt.py +2 -4
- sphinx/search/ro.py +0 -2
- sphinx/search/ru.py +2 -4
- sphinx/search/sv.py +2 -4
- sphinx/search/tr.py +0 -2
- sphinx/search/zh.py +18 -13
- sphinx/templates/graphviz/graphviz.css +0 -7
- sphinx/testing/fixtures.py +6 -5
- sphinx/testing/path.py +7 -5
- sphinx/testing/util.py +63 -29
- sphinx/texinputs/sphinx.sty +107 -39
- sphinx/texinputs/sphinxlatexadmonitions.sty +51 -35
- sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
- sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
- sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
- sphinx/texinputs/sphinxlatexlists.sty +1 -1
- sphinx/texinputs/sphinxlatexliterals.sty +4 -1
- sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
- sphinx/texinputs/sphinxlatexobjects.sty +1 -1
- sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
- sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
- sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
- sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
- sphinx/texinputs/sphinxlatextables.sty +1 -1
- sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
- sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
- sphinx/themes/agogo/layout.html +1 -10
- sphinx/themes/agogo/static/agogo.css.jinja +0 -7
- sphinx/themes/basic/defindex.html +1 -8
- sphinx/themes/basic/domainindex.html +1 -9
- sphinx/themes/basic/genindex-single.html +1 -9
- sphinx/themes/basic/genindex-split.html +1 -9
- sphinx/themes/basic/genindex.html +1 -9
- sphinx/themes/basic/globaltoc.html +1 -9
- sphinx/themes/basic/layout.html +1 -9
- sphinx/themes/basic/localtoc.html +1 -9
- sphinx/themes/basic/page.html +1 -9
- sphinx/themes/basic/relations.html +1 -9
- sphinx/themes/basic/search.html +1 -9
- sphinx/themes/basic/searchbox.html +1 -9
- sphinx/themes/basic/searchfield.html +4 -10
- sphinx/themes/basic/sourcelink.html +1 -9
- sphinx/themes/basic/static/basic.css.jinja +2 -13
- sphinx/themes/basic/static/doctools.js +0 -7
- sphinx/themes/basic/static/language_data.js.jinja +0 -7
- sphinx/themes/basic/static/searchtools.js +25 -13
- sphinx/themes/bizstyle/layout.html +1 -9
- sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
- sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
- sphinx/themes/classic/layout.html +1 -9
- sphinx/themes/classic/static/classic.css.jinja +0 -7
- sphinx/themes/classic/static/sidebar.js.jinja +0 -6
- sphinx/themes/epub/epub-cover.html +1 -9
- sphinx/themes/epub/layout.html +1 -9
- sphinx/themes/epub/static/epub.css.jinja +0 -7
- sphinx/themes/haiku/layout.html +1 -9
- sphinx/themes/haiku/static/haiku.css.jinja +0 -6
- sphinx/themes/nature/static/nature.css.jinja +0 -7
- sphinx/themes/nonav/layout.html +1 -9
- sphinx/themes/nonav/static/nonav.css.jinja +0 -7
- sphinx/themes/pyramid/static/epub.css.jinja +0 -7
- sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
- sphinx/themes/scrolls/layout.html +1 -10
- sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
- sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
- sphinx/themes/traditional/static/traditional.css.jinja +0 -7
- sphinx/theming.py +18 -6
- sphinx/transforms/__init__.py +56 -35
- sphinx/transforms/compact_bullet_list.py +3 -2
- sphinx/transforms/i18n.py +132 -50
- sphinx/transforms/post_transforms/__init__.py +94 -43
- sphinx/transforms/post_transforms/code.py +7 -6
- sphinx/transforms/post_transforms/images.py +71 -54
- sphinx/transforms/references.py +1 -2
- sphinx/util/__init__.py +23 -194
- sphinx/util/_files.py +80 -0
- sphinx/util/_importer.py +27 -0
- sphinx/util/_io.py +1 -2
- sphinx/util/_lines.py +26 -0
- sphinx/util/_pathlib.py +5 -2
- sphinx/util/_serialise.py +53 -0
- sphinx/util/_timestamps.py +2 -1
- sphinx/util/_uri.py +16 -0
- sphinx/util/cfamily.py +48 -25
- sphinx/util/console.py +1 -0
- sphinx/util/display.py +1 -1
- sphinx/util/docfields.py +125 -45
- sphinx/util/docstrings.py +1 -1
- sphinx/util/docutils.py +118 -44
- sphinx/util/exceptions.py +11 -5
- sphinx/util/fileutil.py +53 -32
- sphinx/util/http_date.py +9 -7
- sphinx/util/i18n.py +49 -16
- sphinx/util/images.py +7 -6
- sphinx/util/inspect.py +29 -12
- sphinx/util/inventory.py +47 -29
- sphinx/util/logging.py +58 -85
- sphinx/util/matching.py +3 -3
- sphinx/util/math.py +1 -1
- sphinx/util/nodes.py +176 -108
- sphinx/util/osutil.py +13 -10
- sphinx/util/parallel.py +5 -4
- sphinx/util/parsing.py +5 -3
- sphinx/util/png.py +3 -3
- sphinx/util/requests.py +8 -4
- sphinx/util/rst.py +5 -3
- sphinx/util/tags.py +5 -2
- sphinx/util/template.py +26 -11
- sphinx/util/texescape.py +2 -2
- sphinx/util/typing.py +89 -38
- sphinx/versioning.py +3 -1
- sphinx/writers/html.py +22 -7
- sphinx/writers/html5.py +113 -64
- sphinx/writers/latex.py +408 -221
- sphinx/writers/manpage.py +25 -15
- sphinx/writers/texinfo.py +94 -82
- sphinx/writers/text.py +87 -53
- sphinx/writers/xml.py +5 -4
- sphinx-8.1.0.dist-info/LICENSE.rst +31 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
- sphinx-8.1.0.dist-info/RECORD +598 -0
- sphinx-8.0.2.dist-info/LICENSE.rst +0 -67
- sphinx-8.0.2.dist-info/RECORD +0 -590
- {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/WHEEL +0 -0
- {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
sphinx/cmd/quickstart.py
CHANGED
|
@@ -13,14 +13,15 @@ from typing import TYPE_CHECKING, Any
|
|
|
13
13
|
# try to import readline, unix specific enhancement
|
|
14
14
|
try:
|
|
15
15
|
import readline
|
|
16
|
-
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING and sys.platform == 'win32': # always false, for type checking
|
|
17
18
|
raise ImportError
|
|
18
19
|
READLINE_AVAILABLE = True
|
|
19
20
|
if readline.__doc__ and 'libedit' in readline.__doc__:
|
|
20
|
-
readline.parse_and_bind(
|
|
21
|
+
readline.parse_and_bind('bind ^I rl_complete')
|
|
21
22
|
USE_LIBEDIT = True
|
|
22
23
|
else:
|
|
23
|
-
readline.parse_and_bind(
|
|
24
|
+
readline.parse_and_bind('tab: complete')
|
|
24
25
|
USE_LIBEDIT = False
|
|
25
26
|
except ImportError:
|
|
26
27
|
READLINE_AVAILABLE = False
|
|
@@ -90,7 +91,7 @@ class ValidationError(Exception):
|
|
|
90
91
|
def is_path(x: str) -> str:
|
|
91
92
|
x = path.expanduser(x)
|
|
92
93
|
if not path.isdir(x):
|
|
93
|
-
raise ValidationError(__(
|
|
94
|
+
raise ValidationError(__('Please enter a valid path name.'))
|
|
94
95
|
return x
|
|
95
96
|
|
|
96
97
|
|
|
@@ -106,7 +107,7 @@ def allow_empty(x: str) -> str:
|
|
|
106
107
|
|
|
107
108
|
def nonempty(x: str) -> str:
|
|
108
109
|
if not x:
|
|
109
|
-
raise ValidationError(__(
|
|
110
|
+
raise ValidationError(__('Please enter some text.'))
|
|
110
111
|
return x
|
|
111
112
|
|
|
112
113
|
|
|
@@ -115,6 +116,7 @@ def choice(*l: str) -> Callable[[str], str]:
|
|
|
115
116
|
if x not in l:
|
|
116
117
|
raise ValidationError(__('Please enter one of %s.') % ', '.join(l))
|
|
117
118
|
return x
|
|
119
|
+
|
|
118
120
|
return val
|
|
119
121
|
|
|
120
122
|
|
|
@@ -135,7 +137,9 @@ def ok(x: str) -> str:
|
|
|
135
137
|
|
|
136
138
|
|
|
137
139
|
def do_prompt(
|
|
138
|
-
text: str,
|
|
140
|
+
text: str,
|
|
141
|
+
default: str | None = None,
|
|
142
|
+
validator: Callable[[str], Any] = nonempty,
|
|
139
143
|
) -> str | bool:
|
|
140
144
|
while True:
|
|
141
145
|
if default is not None:
|
|
@@ -205,10 +209,16 @@ def ask_user(d: dict[str, Any]) -> None:
|
|
|
205
209
|
* makefile: make Makefile
|
|
206
210
|
* batchfile: make command file
|
|
207
211
|
"""
|
|
208
|
-
print(
|
|
212
|
+
print(
|
|
213
|
+
bold(__('Welcome to the Sphinx %s quickstart utility.')) % __display_version__
|
|
214
|
+
)
|
|
209
215
|
print()
|
|
210
|
-
print(
|
|
211
|
-
|
|
216
|
+
print(
|
|
217
|
+
__(
|
|
218
|
+
'Please enter values for the following settings (just press Enter to\n'
|
|
219
|
+
'accept a default value, if one is given in brackets).'
|
|
220
|
+
)
|
|
221
|
+
)
|
|
212
222
|
|
|
213
223
|
if 'path' in d:
|
|
214
224
|
print()
|
|
@@ -218,90 +228,146 @@ def ask_user(d: dict[str, Any]) -> None:
|
|
|
218
228
|
print(__('Enter the root path for documentation.'))
|
|
219
229
|
d['path'] = do_prompt(__('Root path for the documentation'), '.', is_path)
|
|
220
230
|
|
|
221
|
-
while path.isfile(path.join(d['path'], 'conf.py')) or
|
|
222
|
-
|
|
231
|
+
while path.isfile(path.join(d['path'], 'conf.py')) or path.isfile(
|
|
232
|
+
path.join(d['path'], 'source', 'conf.py')
|
|
233
|
+
):
|
|
223
234
|
print()
|
|
224
|
-
print(
|
|
225
|
-
|
|
235
|
+
print(
|
|
236
|
+
bold(
|
|
237
|
+
__(
|
|
238
|
+
'Error: an existing conf.py has been found in the '
|
|
239
|
+
'selected root path.'
|
|
240
|
+
)
|
|
241
|
+
)
|
|
242
|
+
)
|
|
226
243
|
print(__('sphinx-quickstart will not overwrite existing Sphinx projects.'))
|
|
227
244
|
print()
|
|
228
|
-
d['path'] = do_prompt(
|
|
229
|
-
|
|
245
|
+
d['path'] = do_prompt(
|
|
246
|
+
__('Please enter a new root path (or just Enter to exit)'),
|
|
247
|
+
'',
|
|
248
|
+
is_path_or_empty,
|
|
249
|
+
)
|
|
230
250
|
if not d['path']:
|
|
231
251
|
raise SystemExit(1)
|
|
232
252
|
|
|
233
253
|
if 'sep' not in d:
|
|
234
254
|
print()
|
|
235
|
-
print(
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
255
|
+
print(
|
|
256
|
+
__(
|
|
257
|
+
'You have two options for placing the build directory for Sphinx output.\n'
|
|
258
|
+
'Either, you use a directory "_build" within the root path, or you separate\n'
|
|
259
|
+
'"source" and "build" directories within the root path.'
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
d['sep'] = do_prompt(
|
|
263
|
+
__('Separate source and build directories (y/n)'), 'n', boolean
|
|
264
|
+
)
|
|
239
265
|
|
|
240
266
|
if 'dot' not in d:
|
|
241
267
|
print()
|
|
242
|
-
print(
|
|
243
|
-
|
|
244
|
-
|
|
268
|
+
print(
|
|
269
|
+
__(
|
|
270
|
+
'Inside the root directory, two more directories will be created; "_templates"\n' # NoQA: E501
|
|
271
|
+
'for custom HTML templates and "_static" for custom stylesheets and other static\n' # NoQA: E501
|
|
272
|
+
'files. You can enter another prefix (such as ".") to replace the underscore.'
|
|
273
|
+
)
|
|
274
|
+
) # NoQA: E501
|
|
245
275
|
d['dot'] = do_prompt(__('Name prefix for templates and static dir'), '_', ok)
|
|
246
276
|
|
|
247
277
|
if 'project' not in d:
|
|
248
278
|
print()
|
|
249
|
-
print(
|
|
279
|
+
print(
|
|
280
|
+
__(
|
|
281
|
+
'The project name will occur in several places in the built documentation.'
|
|
282
|
+
)
|
|
283
|
+
)
|
|
250
284
|
d['project'] = do_prompt(__('Project name'))
|
|
251
285
|
if 'author' not in d:
|
|
252
286
|
d['author'] = do_prompt(__('Author name(s)'))
|
|
253
287
|
|
|
254
288
|
if 'version' not in d:
|
|
255
289
|
print()
|
|
256
|
-
print(
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
290
|
+
print(
|
|
291
|
+
__(
|
|
292
|
+
'Sphinx has the notion of a "version" and a "release" for the\n'
|
|
293
|
+
'software. Each version can have multiple releases. For example, for\n'
|
|
294
|
+
'Python the version is something like 2.5 or 3.0, while the release is\n'
|
|
295
|
+
"something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
|
|
296
|
+
'just set both to the same value.'
|
|
297
|
+
)
|
|
298
|
+
)
|
|
261
299
|
d['version'] = do_prompt(__('Project version'), '', allow_empty)
|
|
262
300
|
if 'release' not in d:
|
|
263
301
|
d['release'] = do_prompt(__('Project release'), d['version'], allow_empty)
|
|
264
302
|
|
|
265
303
|
if 'language' not in d:
|
|
266
304
|
print()
|
|
267
|
-
print(
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
305
|
+
print(
|
|
306
|
+
__(
|
|
307
|
+
'If the documents are to be written in a language other than English,\n'
|
|
308
|
+
'you can select a language here by its language code. Sphinx will then\n'
|
|
309
|
+
'translate text that it generates into that language.\n'
|
|
310
|
+
'\n'
|
|
311
|
+
'For a list of supported codes, see\n'
|
|
312
|
+
'https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language.',
|
|
313
|
+
)
|
|
314
|
+
)
|
|
275
315
|
d['language'] = do_prompt(__('Project language'), 'en')
|
|
276
316
|
if d['language'] == 'en':
|
|
277
317
|
d['language'] = None
|
|
278
318
|
|
|
279
319
|
if 'suffix' not in d:
|
|
280
320
|
print()
|
|
281
|
-
print(
|
|
282
|
-
|
|
321
|
+
print(
|
|
322
|
+
__(
|
|
323
|
+
'The file name suffix for source files. Commonly, this is either ".txt"\n'
|
|
324
|
+
'or ".rst". Only files with this suffix are considered documents.'
|
|
325
|
+
)
|
|
326
|
+
)
|
|
283
327
|
d['suffix'] = do_prompt(__('Source file suffix'), '.rst', suffix)
|
|
284
328
|
|
|
285
329
|
if 'master' not in d:
|
|
286
330
|
print()
|
|
287
|
-
print(
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
331
|
+
print(
|
|
332
|
+
__(
|
|
333
|
+
'One document is special in that it is considered the top node of the\n'
|
|
334
|
+
'"contents tree", that is, it is the root of the hierarchical structure\n'
|
|
335
|
+
'of the documents. Normally, this is "index", but if your "index"\n'
|
|
336
|
+
'document is a custom template, you can also set this to another filename.'
|
|
337
|
+
)
|
|
338
|
+
)
|
|
339
|
+
d['master'] = do_prompt(
|
|
340
|
+
__('Name of your master document (without suffix)'), 'index'
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
while (
|
|
344
|
+
path.isfile(path.join(d['path'], d['master'] + d['suffix']))
|
|
345
|
+
or path.isfile(path.join(d['path'], 'source', d['master'] + d['suffix']))
|
|
346
|
+
): # fmt: skip
|
|
295
347
|
print()
|
|
296
|
-
print(
|
|
297
|
-
|
|
348
|
+
print(
|
|
349
|
+
bold(
|
|
350
|
+
__(
|
|
351
|
+
'Error: the master file %s has already been found in the '
|
|
352
|
+
'selected root path.'
|
|
353
|
+
)
|
|
354
|
+
% (d['master'] + d['suffix'])
|
|
355
|
+
)
|
|
356
|
+
)
|
|
298
357
|
print(__('sphinx-quickstart will not overwrite the existing file.'))
|
|
299
358
|
print()
|
|
300
|
-
d['master'] = do_prompt(
|
|
301
|
-
|
|
359
|
+
d['master'] = do_prompt(
|
|
360
|
+
__(
|
|
361
|
+
'Please enter a new file name, or rename the '
|
|
362
|
+
'existing file and press Enter'
|
|
363
|
+
),
|
|
364
|
+
d['master'],
|
|
365
|
+
)
|
|
302
366
|
|
|
303
367
|
if 'extensions' not in d:
|
|
304
|
-
print(
|
|
368
|
+
print(
|
|
369
|
+
__('Indicate which of the following Sphinx extensions should be enabled:')
|
|
370
|
+
)
|
|
305
371
|
d['extensions'] = []
|
|
306
372
|
for name, description in EXTENSIONS.items():
|
|
307
373
|
if do_prompt(f'{name}: {description} (y/n)', 'n', boolean):
|
|
@@ -309,19 +375,29 @@ def ask_user(d: dict[str, Any]) -> None:
|
|
|
309
375
|
|
|
310
376
|
# Handle conflicting options
|
|
311
377
|
if {'sphinx.ext.imgmath', 'sphinx.ext.mathjax'}.issubset(d['extensions']):
|
|
312
|
-
print(
|
|
313
|
-
|
|
378
|
+
print(
|
|
379
|
+
__(
|
|
380
|
+
'Note: imgmath and mathjax cannot be enabled at the same time. '
|
|
381
|
+
'imgmath has been deselected.'
|
|
382
|
+
)
|
|
383
|
+
)
|
|
314
384
|
d['extensions'].remove('sphinx.ext.imgmath')
|
|
315
385
|
|
|
316
386
|
if 'makefile' not in d:
|
|
317
387
|
print()
|
|
318
|
-
print(
|
|
319
|
-
|
|
320
|
-
|
|
388
|
+
print(
|
|
389
|
+
__(
|
|
390
|
+
'A Makefile and a Windows command file can be generated for you so that you\n'
|
|
391
|
+
"only have to run e.g. `make html' instead of invoking sphinx-build\n"
|
|
392
|
+
'directly.'
|
|
393
|
+
)
|
|
394
|
+
)
|
|
321
395
|
d['makefile'] = do_prompt(__('Create Makefile? (y/n)'), 'y', boolean)
|
|
322
396
|
|
|
323
397
|
if 'batchfile' not in d:
|
|
324
|
-
d['batchfile'] = do_prompt(
|
|
398
|
+
d['batchfile'] = do_prompt(
|
|
399
|
+
__('Create Windows command file? (y/n)'), 'y', boolean
|
|
400
|
+
)
|
|
325
401
|
print()
|
|
326
402
|
|
|
327
403
|
|
|
@@ -345,7 +421,7 @@ def generate(
|
|
|
345
421
|
d.setdefault('extensions', [])
|
|
346
422
|
d['copyright'] = time.strftime('%Y') + ', ' + d['author']
|
|
347
423
|
|
|
348
|
-
d[
|
|
424
|
+
d['path'] = os.path.abspath(d['path'])
|
|
349
425
|
ensuredir(d['path'])
|
|
350
426
|
|
|
351
427
|
srcdir = path.join(d['path'], 'source') if d['sep'] else d['path']
|
|
@@ -356,10 +432,14 @@ def generate(
|
|
|
356
432
|
d['exclude_patterns'] = ''
|
|
357
433
|
else:
|
|
358
434
|
builddir = path.join(srcdir, d['dot'] + 'build')
|
|
359
|
-
exclude_patterns = map(
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
435
|
+
exclude_patterns = map(
|
|
436
|
+
repr,
|
|
437
|
+
[
|
|
438
|
+
d['dot'] + 'build',
|
|
439
|
+
'Thumbs.db',
|
|
440
|
+
'.DS_Store',
|
|
441
|
+
],
|
|
442
|
+
)
|
|
363
443
|
d['exclude_patterns'] = ', '.join(exclude_patterns)
|
|
364
444
|
ensuredir(builddir)
|
|
365
445
|
ensuredir(path.join(srcdir, d['dot'] + 'templates'))
|
|
@@ -377,17 +457,16 @@ def generate(
|
|
|
377
457
|
|
|
378
458
|
conf_path = os.path.join(templatedir, 'conf.py.jinja') if templatedir else None
|
|
379
459
|
if not conf_path or not path.isfile(conf_path):
|
|
380
|
-
conf_path = os.path.join(
|
|
381
|
-
|
|
460
|
+
conf_path = os.path.join(
|
|
461
|
+
package_dir, 'templates', 'quickstart', 'conf.py.jinja'
|
|
462
|
+
)
|
|
463
|
+
with open(conf_path, encoding='utf-8') as f:
|
|
382
464
|
conf_text = f.read()
|
|
383
465
|
|
|
384
466
|
write_file(path.join(srcdir, 'conf.py'), template.render_string(conf_text, d))
|
|
385
467
|
|
|
386
468
|
masterfile = path.join(srcdir, d['master'] + d['suffix'])
|
|
387
469
|
if template._has_custom_template('quickstart/master_doc.rst.jinja'):
|
|
388
|
-
msg = ('A custom template `master_doc.rst.jinja` found. It has been renamed to '
|
|
389
|
-
'`root_doc.rst.jinja`. Please rename it on your project too.')
|
|
390
|
-
print(colorize('red', msg))
|
|
391
470
|
write_file(masterfile, template.render('quickstart/master_doc.rst.jinja', d))
|
|
392
471
|
else:
|
|
393
472
|
write_file(masterfile, template.render('quickstart/root_doc.rst.jinja', d))
|
|
@@ -399,30 +478,50 @@ def generate(
|
|
|
399
478
|
d['rsrcdir'] = 'source' if d['sep'] else '.'
|
|
400
479
|
d['rbuilddir'] = 'build' if d['sep'] else d['dot'] + 'build'
|
|
401
480
|
# use binary mode, to avoid writing \r\n on Windows
|
|
402
|
-
write_file(
|
|
403
|
-
|
|
481
|
+
write_file(
|
|
482
|
+
path.join(d['path'], 'Makefile'),
|
|
483
|
+
template.render(makefile_template, d),
|
|
484
|
+
'\n',
|
|
485
|
+
)
|
|
404
486
|
|
|
405
487
|
if d['batchfile'] is True:
|
|
406
488
|
d['rsrcdir'] = 'source' if d['sep'] else '.'
|
|
407
489
|
d['rbuilddir'] = 'build' if d['sep'] else d['dot'] + 'build'
|
|
408
|
-
write_file(
|
|
409
|
-
|
|
490
|
+
write_file(
|
|
491
|
+
path.join(d['path'], 'make.bat'),
|
|
492
|
+
template.render(batchfile_template, d),
|
|
493
|
+
'\r\n',
|
|
494
|
+
)
|
|
410
495
|
|
|
411
496
|
if silent:
|
|
412
497
|
return
|
|
413
498
|
print()
|
|
414
499
|
print(bold(__('Finished: An initial directory structure has been created.')))
|
|
415
500
|
print()
|
|
416
|
-
print(
|
|
417
|
-
|
|
501
|
+
print(
|
|
502
|
+
__(
|
|
503
|
+
'You should now populate your master file %s and create other documentation\n'
|
|
504
|
+
'source files. '
|
|
505
|
+
)
|
|
506
|
+
% masterfile,
|
|
507
|
+
end='',
|
|
508
|
+
)
|
|
418
509
|
if d['makefile'] or d['batchfile']:
|
|
419
|
-
print(__('Use the Makefile to build the docs, like so:\n'
|
|
420
|
-
' make builder'))
|
|
510
|
+
print(__('Use the Makefile to build the docs, like so:\n' ' make builder'))
|
|
421
511
|
else:
|
|
422
|
-
print(
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
512
|
+
print(
|
|
513
|
+
__(
|
|
514
|
+
'Use the sphinx-build command to build the docs, like so:\n'
|
|
515
|
+
' sphinx-build -b builder %s %s'
|
|
516
|
+
)
|
|
517
|
+
% (srcdir, builddir)
|
|
518
|
+
)
|
|
519
|
+
print(
|
|
520
|
+
__(
|
|
521
|
+
'where "builder" is one of the supported builders, '
|
|
522
|
+
'e.g. html, latex or linkcheck.'
|
|
523
|
+
)
|
|
524
|
+
)
|
|
426
525
|
print()
|
|
427
526
|
|
|
428
527
|
|
|
@@ -454,83 +553,166 @@ def valid_dir(d: dict[str, Any]) -> bool:
|
|
|
454
553
|
|
|
455
554
|
def get_parser() -> argparse.ArgumentParser:
|
|
456
555
|
description = __(
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
556
|
+
'\n'
|
|
557
|
+
'Generate required files for a Sphinx project.\n'
|
|
558
|
+
'\n'
|
|
559
|
+
'sphinx-quickstart is an interactive tool that asks some questions about your\n'
|
|
560
|
+
'project and then generates a complete documentation directory and sample\n'
|
|
561
|
+
'Makefile to be used with sphinx-build.\n',
|
|
463
562
|
)
|
|
464
563
|
parser = argparse.ArgumentParser(
|
|
465
564
|
usage='%(prog)s [OPTIONS] <PROJECT_DIR>',
|
|
466
|
-
epilog=__(
|
|
467
|
-
description=description
|
|
565
|
+
epilog=__('For more information, visit <https://www.sphinx-doc.org/>.'),
|
|
566
|
+
description=description,
|
|
567
|
+
)
|
|
468
568
|
|
|
469
|
-
parser.add_argument(
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
569
|
+
parser.add_argument(
|
|
570
|
+
'-q',
|
|
571
|
+
'--quiet',
|
|
572
|
+
action='store_true',
|
|
573
|
+
dest='quiet',
|
|
574
|
+
default=None,
|
|
575
|
+
help=__('quiet mode'),
|
|
576
|
+
)
|
|
577
|
+
parser.add_argument(
|
|
578
|
+
'--version',
|
|
579
|
+
action='version',
|
|
580
|
+
dest='show_version',
|
|
581
|
+
version='%%(prog)s %s' % __display_version__,
|
|
582
|
+
)
|
|
474
583
|
|
|
475
|
-
parser.add_argument(
|
|
476
|
-
|
|
584
|
+
parser.add_argument(
|
|
585
|
+
'path', metavar='PROJECT_DIR', default='.', nargs='?', help=__('project root')
|
|
586
|
+
)
|
|
477
587
|
|
|
478
588
|
group = parser.add_argument_group(__('Structure options'))
|
|
479
|
-
group.add_argument(
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
589
|
+
group.add_argument(
|
|
590
|
+
'--sep',
|
|
591
|
+
action='store_true',
|
|
592
|
+
dest='sep',
|
|
593
|
+
default=None,
|
|
594
|
+
help=__('if specified, separate source and build dirs'),
|
|
595
|
+
)
|
|
596
|
+
group.add_argument(
|
|
597
|
+
'--no-sep',
|
|
598
|
+
action='store_false',
|
|
599
|
+
dest='sep',
|
|
600
|
+
help=__('if specified, create build dir under source dir'),
|
|
601
|
+
)
|
|
602
|
+
group.add_argument(
|
|
603
|
+
'--dot',
|
|
604
|
+
metavar='DOT',
|
|
605
|
+
default='_',
|
|
606
|
+
help=__('replacement for dot in _templates etc.'),
|
|
607
|
+
)
|
|
485
608
|
|
|
486
609
|
group = parser.add_argument_group(__('Project basic options'))
|
|
487
|
-
group.add_argument(
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
group.add_argument(
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
610
|
+
group.add_argument(
|
|
611
|
+
'-p', '--project', metavar='PROJECT', dest='project', help=__('project name')
|
|
612
|
+
)
|
|
613
|
+
group.add_argument(
|
|
614
|
+
'-a', '--author', metavar='AUTHOR', dest='author', help=__('author names')
|
|
615
|
+
)
|
|
616
|
+
group.add_argument(
|
|
617
|
+
'-v',
|
|
618
|
+
metavar='VERSION',
|
|
619
|
+
dest='version',
|
|
620
|
+
default='',
|
|
621
|
+
help=__('version of project'),
|
|
622
|
+
)
|
|
623
|
+
group.add_argument(
|
|
624
|
+
'-r',
|
|
625
|
+
'--release',
|
|
626
|
+
metavar='RELEASE',
|
|
627
|
+
dest='release',
|
|
628
|
+
help=__('release of project'),
|
|
629
|
+
)
|
|
630
|
+
group.add_argument(
|
|
631
|
+
'-l',
|
|
632
|
+
'--language',
|
|
633
|
+
metavar='LANGUAGE',
|
|
634
|
+
dest='language',
|
|
635
|
+
help=__('document language'),
|
|
636
|
+
)
|
|
637
|
+
group.add_argument(
|
|
638
|
+
'--suffix', metavar='SUFFIX', default='.rst', help=__('source file suffix')
|
|
639
|
+
)
|
|
640
|
+
group.add_argument(
|
|
641
|
+
'--master', metavar='MASTER', default='index', help=__('master document name')
|
|
642
|
+
)
|
|
643
|
+
group.add_argument(
|
|
644
|
+
'--epub', action='store_true', default=False, help=__('use epub')
|
|
645
|
+
)
|
|
503
646
|
|
|
504
647
|
group = parser.add_argument_group(__('Extension options'))
|
|
505
648
|
for ext in EXTENSIONS:
|
|
506
|
-
group.add_argument(
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
649
|
+
group.add_argument(
|
|
650
|
+
'--ext-%s' % ext,
|
|
651
|
+
action='append_const',
|
|
652
|
+
const='sphinx.ext.%s' % ext,
|
|
653
|
+
dest='extensions',
|
|
654
|
+
help=__('enable %s extension') % ext,
|
|
655
|
+
)
|
|
656
|
+
group.add_argument(
|
|
657
|
+
'--extensions',
|
|
658
|
+
metavar='EXTENSIONS',
|
|
659
|
+
dest='extensions',
|
|
660
|
+
action='append',
|
|
661
|
+
help=__('enable arbitrary extensions'),
|
|
662
|
+
)
|
|
511
663
|
|
|
512
664
|
group = parser.add_argument_group(__('Makefile and Batchfile creation'))
|
|
513
|
-
group.add_argument(
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
665
|
+
group.add_argument(
|
|
666
|
+
'--makefile',
|
|
667
|
+
action='store_true',
|
|
668
|
+
dest='makefile',
|
|
669
|
+
default=True,
|
|
670
|
+
help=__('create makefile'),
|
|
671
|
+
)
|
|
672
|
+
group.add_argument(
|
|
673
|
+
'--no-makefile',
|
|
674
|
+
action='store_false',
|
|
675
|
+
dest='makefile',
|
|
676
|
+
help=__('do not create makefile'),
|
|
677
|
+
)
|
|
678
|
+
group.add_argument(
|
|
679
|
+
'--batchfile',
|
|
680
|
+
action='store_true',
|
|
681
|
+
dest='batchfile',
|
|
682
|
+
default=True,
|
|
683
|
+
help=__('create batchfile'),
|
|
684
|
+
)
|
|
685
|
+
group.add_argument(
|
|
686
|
+
'--no-batchfile',
|
|
687
|
+
action='store_false',
|
|
688
|
+
dest='batchfile',
|
|
689
|
+
help=__('do not create batchfile'),
|
|
690
|
+
)
|
|
522
691
|
# --use-make-mode is a no-op from Sphinx 8.
|
|
523
|
-
group.add_argument(
|
|
524
|
-
|
|
525
|
-
|
|
692
|
+
group.add_argument(
|
|
693
|
+
'-m',
|
|
694
|
+
'--use-make-mode',
|
|
695
|
+
action='store_true',
|
|
696
|
+
dest='make_mode',
|
|
697
|
+
default=True,
|
|
698
|
+
help=__('use make-mode for Makefile/make.bat'),
|
|
699
|
+
)
|
|
526
700
|
|
|
527
701
|
group = parser.add_argument_group(__('Project templating'))
|
|
528
|
-
group.add_argument(
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
702
|
+
group.add_argument(
|
|
703
|
+
'-t',
|
|
704
|
+
'--templatedir',
|
|
705
|
+
metavar='TEMPLATEDIR',
|
|
706
|
+
dest='templatedir',
|
|
707
|
+
help=__('template directory for template files'),
|
|
708
|
+
)
|
|
709
|
+
group.add_argument(
|
|
710
|
+
'-d',
|
|
711
|
+
metavar='NAME=VALUE',
|
|
712
|
+
action='append',
|
|
713
|
+
dest='variables',
|
|
714
|
+
help=__('define a template variable'),
|
|
715
|
+
)
|
|
534
716
|
|
|
535
717
|
return parser
|
|
536
718
|
|
|
@@ -563,8 +745,12 @@ def main(argv: Sequence[str] = (), /) -> int:
|
|
|
563
745
|
try:
|
|
564
746
|
if 'quiet' in d:
|
|
565
747
|
if not {'project', 'author'}.issubset(d):
|
|
566
|
-
print(
|
|
567
|
-
|
|
748
|
+
print(
|
|
749
|
+
__(
|
|
750
|
+
'"quiet" is specified, but any of "project" or '
|
|
751
|
+
'"author" is not specified.'
|
|
752
|
+
)
|
|
753
|
+
)
|
|
568
754
|
return 1
|
|
569
755
|
|
|
570
756
|
if {'quiet', 'project', 'author'}.issubset(d):
|
|
@@ -577,10 +763,20 @@ def main(argv: Sequence[str] = (), /) -> int:
|
|
|
577
763
|
|
|
578
764
|
if not valid_dir(d):
|
|
579
765
|
print()
|
|
580
|
-
print(
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
766
|
+
print(
|
|
767
|
+
bold(
|
|
768
|
+
__(
|
|
769
|
+
'Error: specified path is not a directory, or sphinx'
|
|
770
|
+
' files already exist.'
|
|
771
|
+
)
|
|
772
|
+
)
|
|
773
|
+
)
|
|
774
|
+
print(
|
|
775
|
+
__(
|
|
776
|
+
'sphinx-quickstart only generate into a empty directory.'
|
|
777
|
+
' Please specify a new root path.'
|
|
778
|
+
)
|
|
779
|
+
)
|
|
584
780
|
return 1
|
|
585
781
|
else:
|
|
586
782
|
ask_user(d)
|