Sphinx 8.0.2__py3-none-any.whl → 8.1.1__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.

Files changed (424) hide show
  1. sphinx/__init__.py +6 -3
  2. sphinx/_cli/__init__.py +40 -20
  3. sphinx/_cli/util/colour.py +5 -4
  4. sphinx/_cli/util/errors.py +28 -11
  5. sphinx/application.py +361 -38
  6. sphinx/builders/__init__.py +229 -83
  7. sphinx/builders/_epub_base.py +118 -71
  8. sphinx/builders/changes.py +39 -21
  9. sphinx/builders/dirhtml.py +4 -4
  10. sphinx/builders/dummy.py +2 -5
  11. sphinx/builders/epub3.py +43 -22
  12. sphinx/builders/gettext.py +43 -25
  13. sphinx/builders/html/__init__.py +284 -218
  14. sphinx/builders/html/_assets.py +62 -26
  15. sphinx/builders/html/_build_info.py +76 -0
  16. sphinx/builders/html/transforms.py +11 -9
  17. sphinx/builders/latex/__init__.py +139 -81
  18. sphinx/builders/latex/constants.py +7 -7
  19. sphinx/builders/latex/nodes.py +3 -2
  20. sphinx/builders/latex/theming.py +7 -5
  21. sphinx/builders/latex/transforms.py +27 -19
  22. sphinx/builders/linkcheck.py +146 -72
  23. sphinx/builders/manpage.py +30 -13
  24. sphinx/builders/singlehtml.py +22 -14
  25. sphinx/builders/texinfo.py +67 -37
  26. sphinx/builders/text.py +5 -5
  27. sphinx/builders/xml.py +6 -9
  28. sphinx/cmd/build.py +282 -103
  29. sphinx/cmd/make_mode.py +106 -63
  30. sphinx/cmd/quickstart.py +341 -145
  31. sphinx/config.py +45 -12
  32. sphinx/deprecation.py +8 -2
  33. sphinx/directives/__init__.py +28 -19
  34. sphinx/directives/code.py +86 -56
  35. sphinx/directives/other.py +50 -36
  36. sphinx/directives/patches.py +29 -19
  37. sphinx/domains/__init__.py +20 -120
  38. sphinx/domains/_domains_container.py +281 -0
  39. sphinx/domains/_index.py +110 -0
  40. sphinx/domains/c/__init__.py +3 -3
  41. sphinx/domains/c/_parser.py +10 -6
  42. sphinx/domains/changeset.py +5 -3
  43. sphinx/domains/citation.py +5 -3
  44. sphinx/domains/cpp/__init__.py +9 -11
  45. sphinx/domains/cpp/_parser.py +8 -7
  46. sphinx/domains/index.py +3 -3
  47. sphinx/domains/javascript.py +12 -7
  48. sphinx/domains/math.py +2 -2
  49. sphinx/domains/python/__init__.py +10 -5
  50. sphinx/domains/python/_object.py +1 -1
  51. sphinx/domains/rst.py +5 -5
  52. sphinx/domains/std/__init__.py +16 -11
  53. sphinx/environment/__init__.py +202 -146
  54. sphinx/environment/adapters/asset.py +3 -2
  55. sphinx/environment/adapters/indexentries.py +74 -33
  56. sphinx/environment/adapters/toctree.py +100 -43
  57. sphinx/environment/collectors/__init__.py +19 -8
  58. sphinx/environment/collectors/asset.py +47 -15
  59. sphinx/environment/collectors/dependencies.py +8 -4
  60. sphinx/environment/collectors/metadata.py +7 -2
  61. sphinx/environment/collectors/title.py +7 -2
  62. sphinx/environment/collectors/toctree.py +54 -22
  63. sphinx/errors.py +4 -1
  64. sphinx/events.py +314 -7
  65. sphinx/ext/apidoc.py +42 -18
  66. sphinx/ext/autodoc/__init__.py +52 -24
  67. sphinx/ext/autodoc/importer.py +6 -9
  68. sphinx/ext/autosectionlabel.py +1 -2
  69. sphinx/ext/autosummary/__init__.py +3 -1
  70. sphinx/ext/autosummary/generate.py +28 -14
  71. sphinx/ext/coverage.py +7 -7
  72. sphinx/ext/doctest.py +4 -8
  73. sphinx/ext/duration.py +6 -5
  74. sphinx/ext/inheritance_diagram.py +1 -1
  75. sphinx/ext/intersphinx/_cli.py +6 -4
  76. sphinx/ext/intersphinx/_load.py +77 -32
  77. sphinx/ext/intersphinx/_resolve.py +173 -79
  78. sphinx/ext/intersphinx/_shared.py +7 -5
  79. sphinx/ext/linkcode.py +7 -1
  80. sphinx/ext/mathjax.py +1 -2
  81. sphinx/ext/napoleon/__init__.py +37 -24
  82. sphinx/ext/napoleon/docstring.py +202 -134
  83. sphinx/ext/todo.py +5 -3
  84. sphinx/highlighting.py +9 -2
  85. sphinx/io.py +1 -1
  86. sphinx/jinja2glue.py +27 -6
  87. sphinx/locale/__init__.py +6 -2
  88. sphinx/locale/ar/LC_MESSAGES/sphinx.js +8 -1
  89. sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
  90. sphinx/locale/ar/LC_MESSAGES/sphinx.po +2246 -2288
  91. sphinx/locale/bg/LC_MESSAGES/sphinx.js +4 -1
  92. sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
  93. sphinx/locale/bg/LC_MESSAGES/sphinx.po +2113 -2159
  94. sphinx/locale/bn/LC_MESSAGES/sphinx.js +4 -1
  95. sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
  96. sphinx/locale/bn/LC_MESSAGES/sphinx.po +2349 -2395
  97. sphinx/locale/ca/LC_MESSAGES/sphinx.js +4 -1
  98. sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
  99. sphinx/locale/ca/LC_MESSAGES/sphinx.po +2846 -2892
  100. sphinx/locale/cak/LC_MESSAGES/sphinx.js +4 -1
  101. sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
  102. sphinx/locale/cak/LC_MESSAGES/sphinx.po +2213 -2259
  103. sphinx/locale/cs/LC_MESSAGES/sphinx.js +6 -1
  104. sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
  105. sphinx/locale/cs/LC_MESSAGES/sphinx.po +2225 -2269
  106. sphinx/locale/cy/LC_MESSAGES/sphinx.js +6 -1
  107. sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
  108. sphinx/locale/cy/LC_MESSAGES/sphinx.po +2403 -2447
  109. sphinx/locale/da/LC_MESSAGES/sphinx.js +4 -1
  110. sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
  111. sphinx/locale/da/LC_MESSAGES/sphinx.po +2214 -2260
  112. sphinx/locale/de/LC_MESSAGES/sphinx.js +4 -1
  113. sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
  114. sphinx/locale/de/LC_MESSAGES/sphinx.po +2230 -2276
  115. sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +4 -1
  116. sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
  117. sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2113 -2159
  118. sphinx/locale/el/LC_MESSAGES/sphinx.js +4 -1
  119. sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
  120. sphinx/locale/el/LC_MESSAGES/sphinx.po +2619 -2665
  121. sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +4 -1
  122. sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
  123. sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2113 -2159
  124. sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +4 -1
  125. sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
  126. sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2113 -2159
  127. sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +4 -1
  128. sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
  129. sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2519 -2565
  130. sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +4 -1
  131. sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
  132. sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2113 -2159
  133. sphinx/locale/eo/LC_MESSAGES/sphinx.js +4 -1
  134. sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
  135. sphinx/locale/eo/LC_MESSAGES/sphinx.po +2232 -2278
  136. sphinx/locale/es/LC_MESSAGES/sphinx.js +5 -1
  137. sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
  138. sphinx/locale/es/LC_MESSAGES/sphinx.po +2516 -2561
  139. sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +5 -1
  140. sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
  141. sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2114 -2159
  142. sphinx/locale/et/LC_MESSAGES/sphinx.js +4 -1
  143. sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
  144. sphinx/locale/et/LC_MESSAGES/sphinx.po +2317 -2363
  145. sphinx/locale/eu/LC_MESSAGES/sphinx.js +4 -1
  146. sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
  147. sphinx/locale/eu/LC_MESSAGES/sphinx.po +2218 -2264
  148. sphinx/locale/fa/LC_MESSAGES/sphinx.js +4 -1
  149. sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
  150. sphinx/locale/fa/LC_MESSAGES/sphinx.po +2505 -2551
  151. sphinx/locale/fi/LC_MESSAGES/sphinx.js +4 -1
  152. sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
  153. sphinx/locale/fi/LC_MESSAGES/sphinx.po +2303 -2349
  154. sphinx/locale/fr/LC_MESSAGES/sphinx.js +6 -2
  155. sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
  156. sphinx/locale/fr/LC_MESSAGES/sphinx.po +2863 -2908
  157. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +5 -1
  158. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
  159. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +2114 -2159
  160. sphinx/locale/gl/LC_MESSAGES/sphinx.js +4 -1
  161. sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
  162. sphinx/locale/gl/LC_MESSAGES/sphinx.po +2571 -2617
  163. sphinx/locale/he/LC_MESSAGES/sphinx.js +5 -1
  164. sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
  165. sphinx/locale/he/LC_MESSAGES/sphinx.po +2307 -2352
  166. sphinx/locale/hi/LC_MESSAGES/sphinx.js +4 -1
  167. sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
  168. sphinx/locale/hi/LC_MESSAGES/sphinx.po +2580 -2626
  169. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +4 -1
  170. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
  171. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +2113 -2159
  172. sphinx/locale/hr/LC_MESSAGES/sphinx.js +5 -1
  173. sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
  174. sphinx/locale/hr/LC_MESSAGES/sphinx.po +2238 -2283
  175. sphinx/locale/hu/LC_MESSAGES/sphinx.js +4 -1
  176. sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
  177. sphinx/locale/hu/LC_MESSAGES/sphinx.po +2228 -2274
  178. sphinx/locale/id/LC_MESSAGES/sphinx.js +3 -1
  179. sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
  180. sphinx/locale/id/LC_MESSAGES/sphinx.po +2787 -2834
  181. sphinx/locale/is/LC_MESSAGES/sphinx.js +4 -1
  182. sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
  183. sphinx/locale/is/LC_MESSAGES/sphinx.po +2224 -2270
  184. sphinx/locale/it/LC_MESSAGES/sphinx.js +5 -1
  185. sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
  186. sphinx/locale/it/LC_MESSAGES/sphinx.po +2231 -2276
  187. sphinx/locale/ja/LC_MESSAGES/sphinx.js +3 -1
  188. sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
  189. sphinx/locale/ja/LC_MESSAGES/sphinx.po +2507 -2554
  190. sphinx/locale/ka/LC_MESSAGES/sphinx.js +4 -1
  191. sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
  192. sphinx/locale/ka/LC_MESSAGES/sphinx.po +2428 -2474
  193. sphinx/locale/ko/LC_MESSAGES/sphinx.js +3 -1
  194. sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
  195. sphinx/locale/ko/LC_MESSAGES/sphinx.po +2516 -2563
  196. sphinx/locale/lt/LC_MESSAGES/sphinx.js +6 -1
  197. sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
  198. sphinx/locale/lt/LC_MESSAGES/sphinx.po +2425 -2469
  199. sphinx/locale/lv/LC_MESSAGES/sphinx.js +5 -1
  200. sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
  201. sphinx/locale/lv/LC_MESSAGES/sphinx.po +2362 -2407
  202. sphinx/locale/mk/LC_MESSAGES/sphinx.js +4 -1
  203. sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
  204. sphinx/locale/mk/LC_MESSAGES/sphinx.po +2121 -2167
  205. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +4 -1
  206. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
  207. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2220 -2266
  208. sphinx/locale/ne/LC_MESSAGES/sphinx.js +4 -1
  209. sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
  210. sphinx/locale/ne/LC_MESSAGES/sphinx.po +2221 -2267
  211. sphinx/locale/nl/LC_MESSAGES/sphinx.js +4 -1
  212. sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
  213. sphinx/locale/nl/LC_MESSAGES/sphinx.po +2240 -2286
  214. sphinx/locale/pl/LC_MESSAGES/sphinx.js +6 -1
  215. sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
  216. sphinx/locale/pl/LC_MESSAGES/sphinx.po +2319 -2363
  217. sphinx/locale/pt/LC_MESSAGES/sphinx.js +5 -1
  218. sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
  219. sphinx/locale/pt/LC_MESSAGES/sphinx.po +2114 -2159
  220. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +5 -1
  221. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
  222. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2854 -2899
  223. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +5 -1
  224. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
  225. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2224 -2269
  226. sphinx/locale/ro/LC_MESSAGES/sphinx.js +5 -1
  227. sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
  228. sphinx/locale/ro/LC_MESSAGES/sphinx.po +2226 -2271
  229. sphinx/locale/ru/LC_MESSAGES/sphinx.js +8 -3
  230. sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
  231. sphinx/locale/ru/LC_MESSAGES/sphinx.po +2841 -2885
  232. sphinx/locale/si/LC_MESSAGES/sphinx.js +4 -1
  233. sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
  234. sphinx/locale/si/LC_MESSAGES/sphinx.po +2294 -2340
  235. sphinx/locale/sk/LC_MESSAGES/sphinx.js +6 -1
  236. sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
  237. sphinx/locale/sk/LC_MESSAGES/sphinx.po +2497 -2541
  238. sphinx/locale/sl/LC_MESSAGES/sphinx.js +6 -1
  239. sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
  240. sphinx/locale/sl/LC_MESSAGES/sphinx.po +2331 -2375
  241. sphinx/locale/sphinx.pot +2121 -2167
  242. sphinx/locale/sq/LC_MESSAGES/sphinx.js +4 -1
  243. sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
  244. sphinx/locale/sq/LC_MESSAGES/sphinx.po +2855 -2901
  245. sphinx/locale/sr/LC_MESSAGES/sphinx.js +5 -1
  246. sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
  247. sphinx/locale/sr/LC_MESSAGES/sphinx.po +2203 -2248
  248. sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
  249. sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
  250. sphinx/locale/sv/LC_MESSAGES/sphinx.js +4 -1
  251. sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
  252. sphinx/locale/sv/LC_MESSAGES/sphinx.po +2423 -2469
  253. sphinx/locale/te/LC_MESSAGES/sphinx.js +4 -1
  254. sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
  255. sphinx/locale/te/LC_MESSAGES/sphinx.po +2113 -2159
  256. sphinx/locale/tr/LC_MESSAGES/sphinx.js +4 -1
  257. sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
  258. sphinx/locale/tr/LC_MESSAGES/sphinx.po +2443 -2489
  259. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +6 -1
  260. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
  261. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2329 -2373
  262. sphinx/locale/ur/LC_MESSAGES/sphinx.js +4 -1
  263. sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
  264. sphinx/locale/ur/LC_MESSAGES/sphinx.po +2113 -2159
  265. sphinx/locale/vi/LC_MESSAGES/sphinx.js +3 -1
  266. sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
  267. sphinx/locale/vi/LC_MESSAGES/sphinx.po +2199 -2246
  268. sphinx/locale/yue/LC_MESSAGES/sphinx.js +3 -1
  269. sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
  270. sphinx/locale/yue/LC_MESSAGES/sphinx.po +2112 -2159
  271. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +3 -1
  272. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
  273. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2112 -2159
  274. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +3 -1
  275. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
  276. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2845 -2892
  277. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +3 -1
  278. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
  279. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2112 -2159
  280. sphinx/parsers.py +3 -1
  281. sphinx/project.py +6 -2
  282. sphinx/pycode/__init__.py +11 -4
  283. sphinx/pycode/ast.py +58 -58
  284. sphinx/pycode/parser.py +49 -28
  285. sphinx/pygments_styles.py +49 -49
  286. sphinx/registry.py +8 -3
  287. sphinx/roles.py +136 -13
  288. sphinx/search/__init__.py +146 -87
  289. sphinx/search/da.py +2 -4
  290. sphinx/search/de.py +2 -4
  291. sphinx/search/en.py +4 -4
  292. sphinx/search/es.py +2 -4
  293. sphinx/search/fi.py +2 -4
  294. sphinx/search/fr.py +2 -4
  295. sphinx/search/hu.py +2 -4
  296. sphinx/search/it.py +2 -4
  297. sphinx/search/ja.py +55 -32
  298. sphinx/search/nl.py +2 -4
  299. sphinx/search/no.py +2 -4
  300. sphinx/search/pt.py +2 -4
  301. sphinx/search/ro.py +0 -2
  302. sphinx/search/ru.py +2 -4
  303. sphinx/search/sv.py +2 -4
  304. sphinx/search/tr.py +0 -2
  305. sphinx/search/zh.py +18 -13
  306. sphinx/templates/graphviz/graphviz.css +0 -7
  307. sphinx/testing/fixtures.py +6 -5
  308. sphinx/testing/path.py +7 -5
  309. sphinx/testing/util.py +63 -29
  310. sphinx/texinputs/sphinx.sty +115 -50
  311. sphinx/texinputs/sphinxlatexadmonitions.sty +56 -38
  312. sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
  313. sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
  314. sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
  315. sphinx/texinputs/sphinxlatexlists.sty +1 -1
  316. sphinx/texinputs/sphinxlatexliterals.sty +4 -1
  317. sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
  318. sphinx/texinputs/sphinxlatexobjects.sty +1 -1
  319. sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
  320. sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
  321. sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
  322. sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
  323. sphinx/texinputs/sphinxlatextables.sty +1 -1
  324. sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
  325. sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
  326. sphinx/themes/agogo/layout.html +1 -10
  327. sphinx/themes/agogo/static/agogo.css.jinja +0 -7
  328. sphinx/themes/basic/defindex.html +1 -8
  329. sphinx/themes/basic/domainindex.html +1 -9
  330. sphinx/themes/basic/genindex-single.html +1 -9
  331. sphinx/themes/basic/genindex-split.html +1 -9
  332. sphinx/themes/basic/genindex.html +1 -9
  333. sphinx/themes/basic/globaltoc.html +1 -9
  334. sphinx/themes/basic/layout.html +1 -9
  335. sphinx/themes/basic/localtoc.html +1 -9
  336. sphinx/themes/basic/page.html +1 -9
  337. sphinx/themes/basic/relations.html +1 -9
  338. sphinx/themes/basic/search.html +1 -9
  339. sphinx/themes/basic/searchbox.html +1 -9
  340. sphinx/themes/basic/searchfield.html +4 -10
  341. sphinx/themes/basic/sourcelink.html +1 -9
  342. sphinx/themes/basic/static/basic.css.jinja +2 -13
  343. sphinx/themes/basic/static/doctools.js +0 -7
  344. sphinx/themes/basic/static/language_data.js.jinja +0 -7
  345. sphinx/themes/basic/static/searchtools.js +25 -13
  346. sphinx/themes/bizstyle/layout.html +1 -9
  347. sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
  348. sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
  349. sphinx/themes/classic/layout.html +1 -9
  350. sphinx/themes/classic/static/classic.css.jinja +0 -7
  351. sphinx/themes/classic/static/sidebar.js.jinja +0 -6
  352. sphinx/themes/epub/epub-cover.html +1 -9
  353. sphinx/themes/epub/layout.html +1 -9
  354. sphinx/themes/epub/static/epub.css.jinja +0 -7
  355. sphinx/themes/haiku/layout.html +1 -9
  356. sphinx/themes/haiku/static/haiku.css.jinja +0 -6
  357. sphinx/themes/nature/static/nature.css.jinja +0 -7
  358. sphinx/themes/nonav/layout.html +1 -9
  359. sphinx/themes/nonav/static/nonav.css.jinja +0 -7
  360. sphinx/themes/pyramid/static/epub.css.jinja +0 -7
  361. sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
  362. sphinx/themes/scrolls/layout.html +1 -10
  363. sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
  364. sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
  365. sphinx/themes/traditional/static/traditional.css.jinja +0 -7
  366. sphinx/theming.py +18 -6
  367. sphinx/transforms/__init__.py +56 -35
  368. sphinx/transforms/compact_bullet_list.py +3 -2
  369. sphinx/transforms/i18n.py +132 -50
  370. sphinx/transforms/post_transforms/__init__.py +94 -43
  371. sphinx/transforms/post_transforms/code.py +7 -6
  372. sphinx/transforms/post_transforms/images.py +71 -54
  373. sphinx/transforms/references.py +1 -2
  374. sphinx/util/__init__.py +23 -194
  375. sphinx/util/_files.py +80 -0
  376. sphinx/util/_importer.py +27 -0
  377. sphinx/util/_io.py +1 -2
  378. sphinx/util/_lines.py +26 -0
  379. sphinx/util/_pathlib.py +5 -2
  380. sphinx/util/_serialise.py +53 -0
  381. sphinx/util/_timestamps.py +2 -1
  382. sphinx/util/_uri.py +16 -0
  383. sphinx/util/cfamily.py +48 -25
  384. sphinx/util/console.py +1 -0
  385. sphinx/util/display.py +1 -1
  386. sphinx/util/docfields.py +125 -45
  387. sphinx/util/docstrings.py +1 -1
  388. sphinx/util/docutils.py +118 -44
  389. sphinx/util/exceptions.py +11 -5
  390. sphinx/util/fileutil.py +53 -32
  391. sphinx/util/http_date.py +9 -7
  392. sphinx/util/i18n.py +49 -16
  393. sphinx/util/images.py +7 -6
  394. sphinx/util/inspect.py +29 -12
  395. sphinx/util/inventory.py +47 -29
  396. sphinx/util/logging.py +58 -85
  397. sphinx/util/matching.py +3 -3
  398. sphinx/util/math.py +1 -1
  399. sphinx/util/nodes.py +176 -108
  400. sphinx/util/osutil.py +13 -10
  401. sphinx/util/parallel.py +5 -4
  402. sphinx/util/parsing.py +5 -3
  403. sphinx/util/png.py +3 -3
  404. sphinx/util/requests.py +8 -4
  405. sphinx/util/rst.py +5 -3
  406. sphinx/util/tags.py +5 -2
  407. sphinx/util/template.py +26 -11
  408. sphinx/util/texescape.py +2 -2
  409. sphinx/util/typing.py +89 -38
  410. sphinx/versioning.py +3 -1
  411. sphinx/writers/html.py +22 -7
  412. sphinx/writers/html5.py +113 -64
  413. sphinx/writers/latex.py +408 -221
  414. sphinx/writers/manpage.py +25 -15
  415. sphinx/writers/texinfo.py +94 -82
  416. sphinx/writers/text.py +87 -53
  417. sphinx/writers/xml.py +5 -4
  418. sphinx-8.1.1.dist-info/LICENSE.rst +31 -0
  419. {sphinx-8.0.2.dist-info → sphinx-8.1.1.dist-info}/METADATA +13 -11
  420. sphinx-8.1.1.dist-info/RECORD +598 -0
  421. sphinx-8.0.2.dist-info/LICENSE.rst +0 -67
  422. sphinx-8.0.2.dist-info/RECORD +0 -590
  423. {sphinx-8.0.2.dist-info → sphinx-8.1.1.dist-info}/WHEEL +0 -0
  424. {sphinx-8.0.2.dist-info → sphinx-8.1.1.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
- if TYPE_CHECKING and sys.platform == "win32": # always false, for type checking
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("bind ^I rl_complete")
21
+ readline.parse_and_bind('bind ^I rl_complete')
21
22
  USE_LIBEDIT = True
22
23
  else:
23
- readline.parse_and_bind("tab: complete")
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(__("Please enter a valid path name."))
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(__("Please enter some text."))
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, default: str | None = None, validator: Callable[[str], Any] = nonempty,
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(bold(__('Welcome to the Sphinx %s quickstart utility.')) % __display_version__)
212
+ print(
213
+ bold(__('Welcome to the Sphinx %s quickstart utility.')) % __display_version__
214
+ )
209
215
  print()
210
- print(__('Please enter values for the following settings (just press Enter to\n'
211
- 'accept a default value, if one is given in brackets).'))
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
- path.isfile(path.join(d['path'], 'source', 'conf.py')):
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(bold(__('Error: an existing conf.py has been found in the '
225
- 'selected root path.')))
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(__('Please enter a new root path (or just Enter to exit)'),
229
- '', is_path_or_empty)
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(__('You have two options for placing the build directory for Sphinx output.\n'
236
- 'Either, you use a directory "_build" within the root path, or you separate\n'
237
- '"source" and "build" directories within the root path.'))
238
- d['sep'] = do_prompt(__('Separate source and build directories (y/n)'), 'n', boolean)
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(__('Inside the root directory, two more directories will be created; "_templates"\n' # NoQA: E501
243
- 'for custom HTML templates and "_static" for custom stylesheets and other static\n' # NoQA: E501
244
- 'files. You can enter another prefix (such as ".") to replace the underscore.')) # NoQA: E501
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(__('The project name will occur in several places in the built documentation.'))
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(__('Sphinx has the notion of a "version" and a "release" for the\n'
257
- 'software. Each version can have multiple releases. For example, for\n'
258
- 'Python the version is something like 2.5 or 3.0, while the release is\n'
259
- "something like 2.5.1 or 3.0a1. If you don't need this dual structure,\n"
260
- 'just set both to the same value.'))
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
- 'If the documents are to be written in a language other than English,\n'
269
- 'you can select a language here by its language code. Sphinx will then\n'
270
- 'translate text that it generates into that language.\n'
271
- '\n'
272
- 'For a list of supported codes, see\n'
273
- 'https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language.',
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(__('The file name suffix for source files. Commonly, this is either ".txt"\n'
282
- 'or ".rst". Only files with this suffix are considered documents.'))
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(__('One document is special in that it is considered the top node of the\n'
288
- '"contents tree", that is, it is the root of the hierarchical structure\n'
289
- 'of the documents. Normally, this is "index", but if your "index"\n'
290
- 'document is a custom template, you can also set this to another filename.'))
291
- d['master'] = do_prompt(__('Name of your master document (without suffix)'), 'index')
292
-
293
- while path.isfile(path.join(d['path'], d['master'] + d['suffix'])) or \
294
- path.isfile(path.join(d['path'], 'source', d['master'] + d['suffix'])):
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(bold(__('Error: the master file %s has already been found in the '
297
- 'selected root path.') % (d['master'] + d['suffix'])))
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(__('Please enter a new file name, or rename the '
301
- 'existing file and press Enter'), d['master'])
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(__('Indicate which of the following Sphinx extensions should be enabled:'))
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(__('Note: imgmath and mathjax cannot be enabled at the same time. '
313
- 'imgmath has been deselected.'))
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(__('A Makefile and a Windows command file can be generated for you so that you\n'
319
- "only have to run e.g. `make html' instead of invoking sphinx-build\n"
320
- 'directly.'))
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(__('Create Windows command file? (y/n)'), 'y', boolean)
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["path"] = os.path.abspath(d['path'])
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(repr, [
360
- d['dot'] + 'build',
361
- 'Thumbs.db', '.DS_Store',
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(package_dir, 'templates', 'quickstart', 'conf.py.jinja')
381
- with open(conf_path, encoding="utf-8") as f:
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(path.join(d['path'], 'Makefile'),
403
- template.render(makefile_template, d), '\n')
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(path.join(d['path'], 'make.bat'),
409
- template.render(batchfile_template, d), '\r\n')
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(__('You should now populate your master file %s and create other documentation\n'
417
- 'source files. ') % masterfile, end='')
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(__('Use the sphinx-build command to build the docs, like so:\n'
423
- ' sphinx-build -b builder %s %s') % (srcdir, builddir))
424
- print(__('where "builder" is one of the supported builders, '
425
- 'e.g. html, latex or linkcheck.'))
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
- "\n"
458
- "Generate required files for a Sphinx project.\n"
459
- "\n"
460
- "sphinx-quickstart is an interactive tool that asks some questions about your\n"
461
- "project and then generates a complete documentation directory and sample\n"
462
- "Makefile to be used with sphinx-build.\n",
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=__("For more information, visit <https://www.sphinx-doc.org/>."),
467
- description=description)
565
+ epilog=__('For more information, visit <https://www.sphinx-doc.org/>.'),
566
+ description=description,
567
+ )
468
568
 
469
- parser.add_argument('-q', '--quiet', action='store_true', dest='quiet',
470
- default=None,
471
- help=__('quiet mode'))
472
- parser.add_argument('--version', action='version', dest='show_version',
473
- version='%%(prog)s %s' % __display_version__)
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('path', metavar='PROJECT_DIR', default='.', nargs='?',
476
- help=__('project root'))
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('--sep', action='store_true', dest='sep', default=None,
480
- help=__('if specified, separate source and build dirs'))
481
- group.add_argument('--no-sep', action='store_false', dest='sep',
482
- help=__('if specified, create build dir under source dir'))
483
- group.add_argument('--dot', metavar='DOT', default='_',
484
- help=__('replacement for dot in _templates etc.'))
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('-p', '--project', metavar='PROJECT', dest='project',
488
- help=__('project name'))
489
- group.add_argument('-a', '--author', metavar='AUTHOR', dest='author',
490
- help=__('author names'))
491
- group.add_argument('-v', metavar='VERSION', dest='version', default='',
492
- help=__('version of project'))
493
- group.add_argument('-r', '--release', metavar='RELEASE', dest='release',
494
- help=__('release of project'))
495
- group.add_argument('-l', '--language', metavar='LANGUAGE', dest='language',
496
- help=__('document language'))
497
- group.add_argument('--suffix', metavar='SUFFIX', default='.rst',
498
- help=__('source file suffix'))
499
- group.add_argument('--master', metavar='MASTER', default='index',
500
- help=__('master document name'))
501
- group.add_argument('--epub', action='store_true', default=False,
502
- help=__('use epub'))
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('--ext-%s' % ext, action='append_const',
507
- const='sphinx.ext.%s' % ext, dest='extensions',
508
- help=__('enable %s extension') % ext)
509
- group.add_argument('--extensions', metavar='EXTENSIONS', dest='extensions',
510
- action='append', help=__('enable arbitrary extensions'))
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('--makefile', action='store_true', dest='makefile', default=True,
514
- help=__('create makefile'))
515
- group.add_argument('--no-makefile', action='store_false', dest='makefile',
516
- help=__('do not create makefile'))
517
- group.add_argument('--batchfile', action='store_true', dest='batchfile', default=True,
518
- help=__('create batchfile'))
519
- group.add_argument('--no-batchfile', action='store_false',
520
- dest='batchfile',
521
- help=__('do not create batchfile'))
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('-m', '--use-make-mode', action='store_true',
524
- dest='make_mode', default=True,
525
- help=__('use make-mode for Makefile/make.bat'))
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('-t', '--templatedir', metavar='TEMPLATEDIR',
529
- dest='templatedir',
530
- help=__('template directory for template files'))
531
- group.add_argument('-d', metavar='NAME=VALUE', action='append',
532
- dest='variables',
533
- help=__('define a template variable'))
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(__('"quiet" is specified, but any of "project" or '
567
- '"author" is not specified.'))
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(bold(__('Error: specified path is not a directory, or sphinx'
581
- ' files already exist.')))
582
- print(__('sphinx-quickstart only generate into a empty directory.'
583
- ' Please specify a new root path.'))
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)