Sphinx 8.0.1__py3-none-any.whl → 8.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Sphinx might be problematic. Click here for more details.

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 +206 -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 +10 -3
  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 +133 -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 +107 -39
  311. sphinx/texinputs/sphinxlatexadmonitions.sty +51 -35
  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.0.dist-info/LICENSE.rst +31 -0
  419. {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
  420. sphinx-8.1.0.dist-info/RECORD +598 -0
  421. sphinx-8.0.1.dist-info/LICENSE.rst +0 -67
  422. sphinx-8.0.1.dist-info/RECORD +0 -590
  423. {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/WHEEL +0 -0
  424. {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
sphinx/util/cfamily.py CHANGED
@@ -25,19 +25,23 @@ logger = logging.getLogger(__name__)
25
25
 
26
26
  _whitespace_re = re.compile(r'\s+')
27
27
  anon_identifier_re = re.compile(r'(@[a-zA-Z0-9_])[a-zA-Z0-9_]*\b')
28
- identifier_re = re.compile(r'''
28
+ identifier_re = re.compile(
29
+ r"""
29
30
  ( # This 'extends' _anon_identifier_re with the ordinary identifiers,
30
31
  # make sure they are in sync.
31
32
  (~?\b[a-zA-Z_]) # ordinary identifiers
32
33
  | (@[a-zA-Z0-9_]) # our extension for names of anonymous entities
33
34
  )
34
35
  [a-zA-Z0-9_]*\b
35
- ''', flags=re.VERBOSE)
36
+ """,
37
+ flags=re.VERBOSE,
38
+ )
36
39
  integer_literal_re = re.compile(r'[1-9][0-9]*(\'[0-9]+)*')
37
40
  octal_literal_re = re.compile(r'0[0-7]*(\'[0-7]+)*')
38
41
  hex_literal_re = re.compile(r'0[xX][0-9a-fA-F]+(\'[0-9a-fA-F]+)*')
39
42
  binary_literal_re = re.compile(r'0[bB][01]+(\'[01]+)*')
40
- integers_literal_suffix_re = re.compile(r'''
43
+ integers_literal_suffix_re = re.compile(
44
+ r"""
41
45
  # unsigned and/or (long) long, in any order, but at least one of them
42
46
  (
43
47
  ([uU] ([lL] | (ll) | (LL))?)
@@ -46,8 +50,11 @@ integers_literal_suffix_re = re.compile(r'''
46
50
  )\b
47
51
  # the ending word boundary is important for distinguishing
48
52
  # between suffixes and UDLs in C++
49
- ''', flags=re.VERBOSE)
50
- float_literal_re = re.compile(r'''
53
+ """,
54
+ flags=re.VERBOSE,
55
+ )
56
+ float_literal_re = re.compile(
57
+ r"""
51
58
  [+-]?(
52
59
  # decimal
53
60
  ([0-9]+(\'[0-9]+)*[eE][+-]?[0-9]+(\'[0-9]+)*)
@@ -59,10 +66,13 @@ float_literal_re = re.compile(r'''
59
66
  [0-9a-fA-F]+(\'[0-9a-fA-F]+)*([pP][+-]?[0-9a-fA-F]+(\'[0-9a-fA-F]+)*)?)
60
67
  | (0[xX][0-9a-fA-F]+(\'[0-9a-fA-F]+)*\.([pP][+-]?[0-9a-fA-F]+(\'[0-9a-fA-F]+)*)?)
61
68
  )
62
- ''', flags=re.VERBOSE)
69
+ """,
70
+ flags=re.VERBOSE,
71
+ )
63
72
  float_literal_suffix_re = re.compile(r'[fFlL]\b')
64
73
  # the ending word boundary is important for distinguishing between suffixes and UDLs in C++
65
- char_literal_re = re.compile(r'''
74
+ char_literal_re = re.compile(
75
+ r"""
66
76
  ((?:u8)|u|U|L)?
67
77
  '(
68
78
  (?:[^\\'])
@@ -74,7 +84,9 @@ char_literal_re = re.compile(r'''
74
84
  | (?:U[0-9a-fA-F]{8})
75
85
  ))
76
86
  )'
77
- ''', flags=re.VERBOSE)
87
+ """,
88
+ flags=re.VERBOSE,
89
+ )
78
90
 
79
91
 
80
92
  def verify_description_mode(mode: str) -> None:
@@ -116,6 +128,7 @@ class ASTBaseBase:
116
128
  # Attributes
117
129
  ################################################################################
118
130
 
131
+
119
132
  class ASTAttribute(ASTBaseBase):
120
133
  def describe_signature(self, signode: TextElement) -> None:
121
134
  raise NotImplementedError(repr(self))
@@ -134,7 +147,7 @@ class ASTCPPAttribute(ASTAttribute):
134
147
  return hash(self.arg)
135
148
 
136
149
  def _stringify(self, transform: StringifyTransform) -> str:
137
- return f"[[{self.arg}]]"
150
+ return f'[[{self.arg}]]'
138
151
 
139
152
  def describe_signature(self, signode: TextElement) -> None:
140
153
  signode.append(addnodes.desc_sig_punctuation('[[', '[['))
@@ -258,12 +271,14 @@ class ASTAttributeList(ASTBaseBase):
258
271
 
259
272
  ################################################################################
260
273
 
274
+
261
275
  class ASTBaseParenExprList(ASTBaseBase):
262
276
  pass
263
277
 
264
278
 
265
279
  ################################################################################
266
280
 
281
+
267
282
  class UnsupportedMultiCharacterCharLiteral(Exception):
268
283
  pass
269
284
 
@@ -273,9 +288,13 @@ class DefinitionError(Exception):
273
288
 
274
289
 
275
290
  class BaseParser:
276
- def __init__(self, definition: str, *,
277
- location: nodes.Node | tuple[str, int] | str,
278
- config: Config) -> None:
291
+ def __init__(
292
+ self,
293
+ definition: str,
294
+ *,
295
+ location: nodes.Node | tuple[str, int] | str,
296
+ config: Config,
297
+ ) -> None:
279
298
  self.definition = definition.strip()
280
299
  self.location = location # for warnings
281
300
  self.config = config
@@ -315,16 +334,19 @@ class BaseParser:
315
334
  def status(self, msg: str) -> None:
316
335
  # for debugging
317
336
  indicator = '-' * self.pos + '^'
318
- logger.debug(f"{msg}\n{self.definition}\n{indicator}") # NoQA: G004
337
+ logger.debug(f'{msg}\n{self.definition}\n{indicator}') # NoQA: G004
319
338
 
320
339
  def fail(self, msg: str) -> None:
321
340
  errors = []
322
341
  indicator = '-' * self.pos + '^'
323
- exMain = DefinitionError(
324
- 'Invalid %s declaration: %s [error at %d]\n %s\n %s' %
325
- (self.language, msg, self.pos, self.definition, indicator))
326
- errors.append((exMain, "Main error"))
327
- errors.extend((err, "Potential other error") for err in self.otherErrors)
342
+ msg = (
343
+ f'Invalid {self.language} declaration: {msg} [error at {self.pos}]\n'
344
+ f' {self.definition}\n'
345
+ f' {indicator}'
346
+ )
347
+ exc_main = DefinitionError(msg)
348
+ errors.append((exc_main, 'Main error'))
349
+ errors.extend((err, 'Potential other error') for err in self.otherErrors)
328
350
  self.otherErrors = []
329
351
  raise self._make_multi_error(errors, '')
330
352
 
@@ -342,7 +364,7 @@ class BaseParser:
342
364
 
343
365
  def skip_string(self, string: str) -> bool:
344
366
  strlen = len(string)
345
- if self.definition[self.pos:self.pos + strlen] == string:
367
+ if self.definition[self.pos : self.pos + strlen] == string:
346
368
  self.pos += strlen
347
369
  return True
348
370
  return False
@@ -383,14 +405,14 @@ class BaseParser:
383
405
  return ''
384
406
 
385
407
  def read_rest(self) -> str:
386
- rv = self.definition[self.pos:]
408
+ rv = self.definition[self.pos :]
387
409
  self.pos = self.end
388
410
  return rv
389
411
 
390
412
  def assert_end(self, *, allowSemicolon: bool = False) -> None:
391
413
  self.skip_ws()
392
414
  if allowSemicolon:
393
- if not self.eof and self.definition[self.pos:] != ';':
415
+ if not self.eof and self.definition[self.pos :] != ';':
394
416
  self.fail('Expected end of definition or ;.')
395
417
  else:
396
418
  if not self.eof:
@@ -418,13 +440,14 @@ class BaseParser:
418
440
  symbols.append(brackets[self.current_char])
419
441
  elif len(symbols) > 0 and self.current_char == symbols[-1]:
420
442
  symbols.pop()
421
- elif self.current_char in ")]}":
443
+ elif self.current_char in ')]}':
422
444
  self.fail("Unexpected '%s' in balanced-token-seq." % self.current_char)
423
445
  self.pos += 1
424
446
  if self.eof:
425
- self.fail("Could not find end of balanced-token-seq starting at %d."
426
- % startPos)
427
- return self.definition[startPos:self.pos]
447
+ self.fail(
448
+ f'Could not find end of balanced-token-seq starting at {startPos}.'
449
+ )
450
+ return self.definition[startPos : self.pos]
428
451
 
429
452
  def _parse_attribute(self) -> ASTAttribute | None:
430
453
  self.skip_ws()
sphinx/util/console.py CHANGED
@@ -41,6 +41,7 @@ if TYPE_CHECKING:
41
41
  try:
42
42
  # check if colorama is installed to support color on Windows
43
43
  import colorama
44
+
44
45
  COLORAMA_AVAILABLE = True
45
46
  except ImportError:
46
47
  COLORAMA_AVAILABLE = False
sphinx/util/display.py CHANGED
@@ -78,7 +78,7 @@ class progress_message:
78
78
  val: BaseException | None,
79
79
  tb: TracebackType | None,
80
80
  ) -> bool:
81
- prefix = "" if self.nonl else bold(self.message + ': ')
81
+ prefix = '' if self.nonl else bold(self.message + ': ')
82
82
  if isinstance(val, SkipProgressMessage):
83
83
  logger.info(prefix + __('skipped'))
84
84
  if val.args:
sphinx/util/docfields.py CHANGED
@@ -3,6 +3,7 @@
3
3
  "Doc fields" are reST field lists in object descriptions that will
4
4
  be domain-specifically transformed to a more appealing presentation.
5
5
  """
6
+
6
7
  from __future__ import annotations
7
8
 
8
9
  import contextlib
@@ -31,7 +32,7 @@ def _is_single_paragraph(node: nodes.field_body) -> bool:
31
32
  if len(node) == 0:
32
33
  return False
33
34
  elif len(node) > 1:
34
- for subnode in node[1:]: # type: Node
35
+ for subnode in node[1:]:
35
36
  if not isinstance(subnode, nodes.system_message):
36
37
  return False
37
38
  return isinstance(node[0], nodes.paragraph)
@@ -70,10 +71,17 @@ class Field:
70
71
  self.rolename = rolename
71
72
  self.bodyrolename = bodyrolename
72
73
 
73
- def make_xref(self, rolename: str, domain: str, target: str,
74
- innernode: type[TextlikeNode] = addnodes.literal_emphasis,
75
- contnode: Node | None = None, env: BuildEnvironment | None = None,
76
- inliner: Inliner | None = None, location: Element | None = None) -> Node:
74
+ def make_xref(
75
+ self,
76
+ rolename: str,
77
+ domain: str,
78
+ target: str,
79
+ innernode: type[TextlikeNode] = addnodes.literal_emphasis,
80
+ contnode: Node | None = None,
81
+ env: BuildEnvironment | None = None,
82
+ inliner: Inliner | None = None,
83
+ location: Element | None = None,
84
+ ) -> Node:
77
85
  # note: for backwards compatibility env is last, but not optional
78
86
  assert env is not None
79
87
  assert (inliner is None) == (location is None), (inliner, location)
@@ -84,11 +92,18 @@ class Field:
84
92
  role = env.get_domain(domain).role(rolename)
85
93
  if role is None or inliner is None:
86
94
  if role is None and inliner is not None:
87
- msg = __("Problem in %s domain: field is supposed "
88
- "to use role '%s', but that role is not in the domain.")
95
+ msg = __(
96
+ 'Problem in %s domain: field is supposed '
97
+ "to use role '%s', but that role is not in the domain."
98
+ )
89
99
  logger.warning(__(msg), domain, rolename, location=location)
90
- refnode = addnodes.pending_xref('', refdomain=domain, refexplicit=False,
91
- reftype=rolename, reftarget=target)
100
+ refnode = addnodes.pending_xref(
101
+ '',
102
+ refdomain=domain,
103
+ refexplicit=False,
104
+ reftype=rolename,
105
+ reftarget=target,
106
+ )
92
107
  refnode += contnode or innernode(target, target) # type: ignore[call-arg]
93
108
  env.get_domain(domain).process_field_xref(refnode)
94
109
  return refnode
@@ -99,13 +114,22 @@ class Field:
99
114
  ns, messages = role(rolename, target, target, lineno, inliner, {}, [])
100
115
  return nodes.inline(target, '', *ns)
101
116
 
102
- def make_xrefs(self, rolename: str, domain: str, target: str,
103
- innernode: type[TextlikeNode] = addnodes.literal_emphasis,
104
- contnode: Node | None = None, env: BuildEnvironment | None = None,
105
- inliner: Inliner | None = None, location: Element | None = None,
106
- ) -> list[Node]:
107
- return [self.make_xref(rolename, domain, target, innernode, contnode,
108
- env, inliner, location)]
117
+ def make_xrefs(
118
+ self,
119
+ rolename: str,
120
+ domain: str,
121
+ target: str,
122
+ innernode: type[TextlikeNode] = addnodes.literal_emphasis,
123
+ contnode: Node | None = None,
124
+ env: BuildEnvironment | None = None,
125
+ inliner: Inliner | None = None,
126
+ location: Element | None = None,
127
+ ) -> list[Node]:
128
+ return [
129
+ self.make_xref(
130
+ rolename, domain, target, innernode, contnode, env, inliner, location
131
+ )
132
+ ]
109
133
 
110
134
  def make_entry(self, fieldarg: str, content: list[Node]) -> tuple[str, list[Node]]:
111
135
  return (fieldarg, content)
@@ -123,17 +147,35 @@ class Field:
123
147
  fieldname = nodes.field_name('', self.label)
124
148
  if fieldarg:
125
149
  fieldname += nodes.Text(' ')
126
- fieldname.extend(self.make_xrefs(self.rolename, domain,
127
- fieldarg, nodes.Text,
128
- env=env, inliner=inliner, location=location))
150
+ fieldname.extend(
151
+ self.make_xrefs(
152
+ self.rolename,
153
+ domain,
154
+ fieldarg,
155
+ nodes.Text,
156
+ env=env,
157
+ inliner=inliner,
158
+ location=location,
159
+ )
160
+ )
129
161
 
130
162
  if len(content) == 1 and (
131
- isinstance(content[0], nodes.Text) or
132
- (isinstance(content[0], nodes.inline) and len(content[0]) == 1 and
133
- isinstance(content[0][0], nodes.Text))):
134
- content = self.make_xrefs(self.bodyrolename, domain,
135
- content[0].astext(), contnode=content[0],
136
- env=env, inliner=inliner, location=location)
163
+ isinstance(content[0], nodes.Text)
164
+ or (
165
+ isinstance(content[0], nodes.inline)
166
+ and len(content[0]) == 1
167
+ and isinstance(content[0][0], nodes.Text)
168
+ )
169
+ ):
170
+ content = self.make_xrefs(
171
+ self.bodyrolename,
172
+ domain,
173
+ content[0].astext(),
174
+ contnode=content[0],
175
+ env=env,
176
+ inliner=inliner,
177
+ location=location,
178
+ )
137
179
  fieldbody = nodes.field_body('', nodes.paragraph('', '', *content))
138
180
  return nodes.field('', fieldname, fieldbody)
139
181
 
@@ -155,8 +197,14 @@ class GroupedField(Field):
155
197
  is_grouped = True
156
198
  list_type = nodes.bullet_list
157
199
 
158
- def __init__(self, name: str, names: tuple[str, ...] = (), label: str = '',
159
- rolename: str = '', can_collapse: bool = False) -> None:
200
+ def __init__(
201
+ self,
202
+ name: str,
203
+ names: tuple[str, ...] = (),
204
+ label: str = '',
205
+ rolename: str = '',
206
+ can_collapse: bool = False,
207
+ ) -> None:
160
208
  super().__init__(name, names, label, True, rolename)
161
209
  self.can_collapse = can_collapse
162
210
 
@@ -173,9 +221,17 @@ class GroupedField(Field):
173
221
  listnode = self.list_type()
174
222
  for fieldarg, content in items:
175
223
  par = nodes.paragraph()
176
- par.extend(self.make_xrefs(self.rolename, domain, fieldarg,
177
- addnodes.literal_strong,
178
- env=env, inliner=inliner, location=location))
224
+ par.extend(
225
+ self.make_xrefs(
226
+ self.rolename,
227
+ domain,
228
+ fieldarg,
229
+ addnodes.literal_strong,
230
+ env=env,
231
+ inliner=inliner,
232
+ location=location,
233
+ )
234
+ )
179
235
  par += nodes.Text(' -- ')
180
236
  par += content
181
237
  listnode += nodes.list_item('', par)
@@ -236,8 +292,11 @@ class TypedField(GroupedField):
236
292
  ) -> nodes.field:
237
293
  def handle_item(fieldarg: str, content: list[Node]) -> nodes.paragraph:
238
294
  par = nodes.paragraph()
239
- par.extend(self.make_xrefs(self.rolename, domain, fieldarg,
240
- addnodes.literal_strong, env=env))
295
+ par.extend(
296
+ self.make_xrefs(
297
+ self.rolename, domain, fieldarg, addnodes.literal_strong, env=env
298
+ )
299
+ )
241
300
  if fieldarg in types:
242
301
  par += nodes.Text(' (')
243
302
  # NOTE: using .pop() here to prevent a single type node to be
@@ -246,9 +305,17 @@ class TypedField(GroupedField):
246
305
  fieldtype = types.pop(fieldarg)
247
306
  if len(fieldtype) == 1 and isinstance(fieldtype[0], nodes.Text):
248
307
  typename = fieldtype[0].astext()
249
- par.extend(self.make_xrefs(self.typerolename, domain, typename,
250
- addnodes.literal_emphasis, env=env,
251
- inliner=inliner, location=location))
308
+ par.extend(
309
+ self.make_xrefs(
310
+ self.typerolename,
311
+ domain,
312
+ typename,
313
+ addnodes.literal_emphasis,
314
+ env=env,
315
+ inliner=inliner,
316
+ location=location,
317
+ )
318
+ )
252
319
  else:
253
320
  par += fieldtype
254
321
  par += nodes.Text(')')
@@ -329,8 +396,13 @@ class DocFieldTransformer:
329
396
  entries.append(field)
330
397
 
331
398
  # but if this has a type then we can at least link it
332
- if (typedesc and is_typefield and content and
333
- len(content) == 1 and isinstance(content[0], nodes.Text)):
399
+ if (
400
+ typedesc
401
+ and is_typefield
402
+ and content
403
+ and len(content) == 1
404
+ and isinstance(content[0], nodes.Text)
405
+ ):
334
406
  typed_field = cast(TypedField, typedesc)
335
407
  target = content[0].astext()
336
408
  xrefs = typed_field.make_xrefs(
@@ -356,7 +428,9 @@ class DocFieldTransformer:
356
428
  if is_typefield:
357
429
  # filter out only inline nodes; others will result in invalid
358
430
  # markup being written out
359
- content = [n for n in content if isinstance(n, nodes.Inline | nodes.Text)]
431
+ content = [
432
+ n for n in content if isinstance(n, nodes.Inline | nodes.Text)
433
+ ]
360
434
  if content:
361
435
  types.setdefault(typename, {})[fieldarg] = content
362
436
  continue
@@ -368,12 +442,10 @@ class DocFieldTransformer:
368
442
  except ValueError:
369
443
  pass
370
444
  else:
371
- types.setdefault(typename, {})[argname] = \
372
- [nodes.Text(argtype)]
445
+ types.setdefault(typename, {})[argname] = [nodes.Text(argtype)]
373
446
  fieldarg = argname
374
447
 
375
- translatable_content = nodes.inline(field_body.rawsource,
376
- translatable=True)
448
+ translatable_content = nodes.inline(field_body.rawsource, translatable=True)
377
449
  translatable_content.document = field_body.parent.document
378
450
  translatable_content.source = field_body.parent.source
379
451
  translatable_content.line = field_body.parent.line
@@ -383,7 +455,9 @@ class DocFieldTransformer:
383
455
  # get one entry per field
384
456
  if typedesc.is_grouped:
385
457
  if typename in groupindices:
386
- group = cast(tuple[Field, list, Node], entries[groupindices[typename]])
458
+ group = cast(
459
+ tuple[Field, list, Node], entries[groupindices[typename]]
460
+ )
387
461
  else:
388
462
  groupindices[typename] = len(entries)
389
463
  group = (typedesc, [], field)
@@ -406,7 +480,13 @@ class DocFieldTransformer:
406
480
  env = self.directive.state.document.settings.env
407
481
  inliner = self.directive.state.inliner
408
482
  domain = self.directive.domain or ''
409
- new_list += fieldtype.make_field(fieldtypes, domain, items,
410
- env=env, inliner=inliner, location=location)
483
+ new_list += fieldtype.make_field(
484
+ fieldtypes,
485
+ domain,
486
+ items,
487
+ env=env,
488
+ inliner=inliner,
489
+ location=location,
490
+ )
411
491
 
412
492
  node.replace_self(new_list)
sphinx/util/docstrings.py CHANGED
@@ -29,7 +29,7 @@ def separate_metadata(s: str | None) -> tuple[str | None, dict[str, str]]:
29
29
  field_name = matched.group()[1:].split(':', 1)[0]
30
30
  if field_name.startswith('meta '):
31
31
  name = field_name[5:].strip()
32
- metadata[name] = line[matched.end():].strip()
32
+ metadata[name] = line[matched.end() :].strip()
33
33
  else:
34
34
  lines.append(line)
35
35
  else: