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/util/tags.py CHANGED
@@ -69,8 +69,11 @@ class Tags:
69
69
 
70
70
  @property
71
71
  def tags(self) -> dict[str, Literal[True]]:
72
- warnings.warn('Tags.tags is deprecated, use methods on Tags.',
73
- RemovedInSphinx90Warning, stacklevel=2)
72
+ warnings.warn(
73
+ 'Tags.tags is deprecated, use methods on Tags.',
74
+ RemovedInSphinx90Warning,
75
+ stacklevel=2,
76
+ )
74
77
  return dict.fromkeys(self._tags, True)
75
78
 
76
79
  def eval_condition(self, condition: str) -> bool:
sphinx/util/template.py CHANGED
@@ -49,7 +49,7 @@ class FileRenderer(BaseRenderer):
49
49
 
50
50
  @classmethod
51
51
  def render_from_file(
52
- cls: type[FileRenderer], filename: str, context: dict[str, Any],
52
+ cls: type[FileRenderer], filename: str, context: dict[str, Any]
53
53
  ) -> str:
54
54
  dirname = os.path.dirname(filename)
55
55
  basename = os.path.basename(filename)
@@ -57,21 +57,26 @@ class FileRenderer(BaseRenderer):
57
57
 
58
58
 
59
59
  class SphinxRenderer(FileRenderer):
60
- def __init__(self, template_path: Sequence[str | os.PathLike[str]] | None = None) -> None:
60
+ def __init__(
61
+ self, template_path: Sequence[str | os.PathLike[str]] | None = None
62
+ ) -> None:
61
63
  if template_path is None:
62
64
  template_path = os.path.join(package_dir, 'templates')
63
65
  super().__init__(template_path)
64
66
 
65
67
  @classmethod
66
68
  def render_from_file(
67
- cls: type[FileRenderer], filename: str, context: dict[str, Any],
69
+ cls: type[FileRenderer], filename: str, context: dict[str, Any]
68
70
  ) -> str:
69
71
  return FileRenderer.render_from_file(filename, context)
70
72
 
71
73
 
72
74
  class LaTeXRenderer(SphinxRenderer):
73
- def __init__(self, template_path: Sequence[str | os.PathLike[str]] | None = None,
74
- latex_engine: str | None = None) -> None:
75
+ def __init__(
76
+ self,
77
+ template_path: Sequence[str | os.PathLike[str]] | None = None,
78
+ latex_engine: str | None = None,
79
+ ) -> None:
75
80
  if template_path is None:
76
81
  template_path = [os.path.join(package_dir, 'templates', 'latex')]
77
82
  super().__init__(template_path)
@@ -93,8 +98,11 @@ class LaTeXRenderer(SphinxRenderer):
93
98
 
94
99
 
95
100
  class ReSTRenderer(SphinxRenderer):
96
- def __init__(self, template_path: Sequence[str | os.PathLike[str]] | None = None,
97
- language: str | None = None) -> None:
101
+ def __init__(
102
+ self,
103
+ template_path: Sequence[str | os.PathLike[str]] | None = None,
104
+ language: str | None = None,
105
+ ) -> None:
98
106
  super().__init__(template_path)
99
107
 
100
108
  # add language to environment
@@ -109,9 +117,12 @@ class ReSTRenderer(SphinxRenderer):
109
117
  class SphinxTemplateLoader(BaseLoader):
110
118
  """A loader supporting template inheritance"""
111
119
 
112
- def __init__(self, confdir: str | os.PathLike[str],
113
- templates_paths: Sequence[str | os.PathLike[str]],
114
- system_templates_paths: Sequence[str | os.PathLike[str]]) -> None:
120
+ def __init__(
121
+ self,
122
+ confdir: str | os.PathLike[str],
123
+ templates_paths: Sequence[str | os.PathLike[str]],
124
+ system_templates_paths: Sequence[str | os.PathLike[str]],
125
+ ) -> None:
115
126
  self.loaders = []
116
127
  self.sysloaders = []
117
128
 
@@ -124,7 +135,11 @@ class SphinxTemplateLoader(BaseLoader):
124
135
  self.loaders.append(loader)
125
136
  self.sysloaders.append(loader)
126
137
 
127
- def get_source(self, environment: Environment, template: str) -> tuple[str, str, Callable]:
138
+ def get_source(
139
+ self,
140
+ environment: Environment,
141
+ template: str,
142
+ ) -> tuple[str, str, Callable[[], bool]]:
128
143
  if template.startswith('!'):
129
144
  # search a template from ``system_templates_paths``
130
145
  loaders = self.sysloaders
sphinx/util/texescape.py CHANGED
@@ -47,8 +47,8 @@ ascii_tex_replacements = [
47
47
  # complications (whether by {}, or a macro) and is not done
48
48
  # the next two require textcomp package
49
49
  ("'", r'\textquotesingle{}'), # else ' renders curly, and '' is a ligature
50
- ('`', r'\textasciigrave{}'), # else \` and \`\` render curly
51
- ('<', r'\textless{}'), # < is inv. exclam in OT1, << is a T1-ligature
50
+ ('`', r'\textasciigrave{}'), # else \` and \`\` render curly
51
+ ('<', r'\textless{}'), # < is inv. exclam in OT1, << is a T1-ligature
52
52
  ('>', r'\textgreater{}'), # > is inv. quest. mark in 0T1, >> a T1-ligature
53
53
  ]
54
54
 
sphinx/util/typing.py CHANGED
@@ -23,6 +23,8 @@ from typing import (
23
23
  from docutils import nodes
24
24
  from docutils.parsers.rst.states import Inliner
25
25
 
26
+ from sphinx.util import logging
27
+
26
28
  if TYPE_CHECKING:
27
29
  from collections.abc import Mapping
28
30
  from typing import Final, Literal, Protocol, TypeAlias
@@ -41,6 +43,8 @@ if TYPE_CHECKING:
41
43
  'smart',
42
44
  ]
43
45
 
46
+ logger = logging.getLogger(__name__)
47
+
44
48
 
45
49
  # classes that have an incorrect .__module__ attribute
46
50
  _INVALID_BUILTIN_CLASSES: Final[Mapping[object, str]] = {
@@ -88,8 +92,9 @@ PathMatcher: TypeAlias = Callable[[str], bool]
88
92
 
89
93
  # common role functions
90
94
  if TYPE_CHECKING:
95
+
91
96
  class RoleFunction(Protocol):
92
- def __call__(
97
+ def __call__( # NoQA: E704
93
98
  self,
94
99
  name: str,
95
100
  rawtext: str,
@@ -99,8 +104,8 @@ if TYPE_CHECKING:
99
104
  /,
100
105
  options: dict[str, Any] | None = None,
101
106
  content: Sequence[str] = (),
102
- ) -> tuple[list[nodes.Node], list[nodes.system_message]]:
103
- ...
107
+ ) -> tuple[list[nodes.Node], list[nodes.system_message]]: ...
108
+
104
109
  else:
105
110
  RoleFunction: TypeAlias = Callable[
106
111
  [str, str, str, int, Inliner, dict[str, Any], Sequence[str]],
@@ -113,6 +118,27 @@ OptionSpec: TypeAlias = dict[str, Callable[[str], Any]]
113
118
  # title getter functions for enumerable nodes (see sphinx.domains.std)
114
119
  TitleGetter: TypeAlias = Callable[[nodes.Node], str]
115
120
 
121
+ # Readable file stream for inventory loading
122
+ if TYPE_CHECKING:
123
+ from types import TracebackType
124
+
125
+ from typing_extensions import Self
126
+
127
+ _T_co = TypeVar('_T_co', str, bytes, covariant=True)
128
+
129
+ class _ReadableStream(Protocol[_T_co]):
130
+ def read(self, size: int = ...) -> _T_co: ... # NoQA: E704
131
+
132
+ def __enter__(self) -> Self: ... # NoQA: E704
133
+
134
+ def __exit__( # NoQA: E704
135
+ self,
136
+ exc_type: type[BaseException] | None,
137
+ exc_val: BaseException | None,
138
+ exc_tb: TracebackType | None,
139
+ ) -> None: ...
140
+
141
+
116
142
  # inventory data on memory
117
143
  InventoryItem: TypeAlias = tuple[
118
144
  str, # project name
@@ -162,7 +188,9 @@ def get_type_hints(
162
188
  from sphinx.util.inspect import safe_getattr # lazy loading
163
189
 
164
190
  try:
165
- return typing.get_type_hints(obj, globalns, localns, include_extras=include_extras)
191
+ return typing.get_type_hints(
192
+ obj, globalns, localns, include_extras=include_extras
193
+ )
166
194
  except NameError:
167
195
  # Failed to evaluate ForwardRef (maybe TYPE_CHECKING)
168
196
  return safe_getattr(obj, '__annotations__', {})
@@ -185,7 +213,10 @@ def is_system_TypeVar(typ: Any) -> bool:
185
213
 
186
214
  def _is_annotated_form(obj: Any) -> TypeIs[Annotated[Any, ...]]:
187
215
  """Check if *obj* is an annotated type."""
188
- return typing.get_origin(obj) is Annotated or str(obj).startswith('typing.Annotated')
216
+ return (
217
+ typing.get_origin(obj) is Annotated
218
+ or str(obj).startswith('typing.Annotated')
219
+ ) # fmt: skip
189
220
 
190
221
 
191
222
  def _is_unpack_form(obj: Any) -> bool:
@@ -259,18 +290,21 @@ def restify(cls: Any, mode: _RestifyMode = 'fully-qualified-except-typing') -> s
259
290
  elif dataclasses.is_dataclass(m):
260
291
  # use restify for the repr of field values rather than repr
261
292
  d_fields = ', '.join([
262
- fr"{f.name}=\ {restify(getattr(m, f.name), mode)}"
263
- for f in dataclasses.fields(m) if f.repr
293
+ rf'{f.name}=\ {restify(getattr(m, f.name), mode)}'
294
+ for f in dataclasses.fields(m)
295
+ if f.repr
264
296
  ])
265
- meta_args.append(fr'{restify(type(m), mode)}\ ({d_fields})')
297
+ meta_args.append(rf'{restify(type(m), mode)}\ ({d_fields})')
266
298
  else:
267
299
  meta_args.append(repr(m))
268
300
  meta = ', '.join(meta_args)
269
301
  if sys.version_info[:2] <= (3, 11):
270
302
  # Hardcoded to fix errors on Python 3.11 and earlier.
271
- return fr':py:class:`~typing.Annotated`\ [{args}, {meta}]'
272
- return (f':py:class:`{module_prefix}{cls.__module__}.{cls.__name__}`'
273
- fr'\ [{args}, {meta}]')
303
+ return rf':py:class:`~typing.Annotated`\ [{args}, {meta}]'
304
+ return (
305
+ f':py:class:`{module_prefix}{cls.__module__}.{cls.__name__}`'
306
+ rf'\ [{args}, {meta}]'
307
+ )
274
308
  elif isinstance(cls, NewType):
275
309
  return f':py:class:`{module_prefix}{cls.__module__}.{cls.__name__}`' # type: ignore[attr-defined]
276
310
  elif isinstance(cls, types.UnionType):
@@ -280,14 +314,14 @@ def restify(cls: Any, mode: _RestifyMode = 'fully-qualified-except-typing') -> s
280
314
  elif cls.__module__ in ('__builtin__', 'builtins'):
281
315
  if hasattr(cls, '__args__'):
282
316
  if not cls.__args__: # Empty tuple, list, ...
283
- return fr':py:class:`{cls.__name__}`\ [{cls.__args__!r}]'
317
+ return rf':py:class:`{cls.__name__}`\ [{cls.__args__!r}]'
284
318
 
285
- concatenated_args = ', '.join(restify(arg, mode) for arg in cls.__args__)
286
- return fr':py:class:`{cls.__name__}`\ [{concatenated_args}]'
319
+ concatenated_args = ', '.join(
320
+ restify(arg, mode) for arg in cls.__args__
321
+ )
322
+ return rf':py:class:`{cls.__name__}`\ [{concatenated_args}]'
287
323
  return f':py:class:`{cls.__name__}`'
288
- elif (isgenericalias(cls)
289
- and cls_module_is_typing
290
- and cls.__origin__ is Union):
324
+ elif isgenericalias(cls) and cls_module_is_typing and cls.__origin__ is Union:
291
325
  # *cls* is defined in ``typing``, and thus ``__args__`` must exist
292
326
  return ' | '.join(restify(a, mode) for a in cls.__args__)
293
327
  elif isgenericalias(cls):
@@ -311,19 +345,20 @@ def restify(cls: Any, mode: _RestifyMode = 'fully-qualified-except-typing') -> s
311
345
  if (
312
346
  (cls_module_is_typing and cls.__name__ == 'Callable')
313
347
  or (cls.__module__ == 'collections.abc' and cls.__name__ == 'Callable')
314
- ):
348
+ ): # fmt: skip
315
349
  args = ', '.join(restify(a, mode) for a in __args__[:-1])
316
350
  returns = restify(__args__[-1], mode)
317
- return fr'{text}\ [[{args}], {returns}]'
351
+ return rf'{text}\ [[{args}], {returns}]'
318
352
 
319
353
  if cls_module_is_typing and cls.__origin__.__name__ == 'Literal':
320
- args = ', '.join(_format_literal_arg_restify(a, mode=mode)
321
- for a in cls.__args__)
322
- return fr'{text}\ [{args}]'
354
+ args = ', '.join(
355
+ _format_literal_arg_restify(a, mode=mode) for a in cls.__args__
356
+ )
357
+ return rf'{text}\ [{args}]'
323
358
 
324
359
  # generic representation of the parameters
325
360
  args = ', '.join(restify(a, mode) for a in __args__)
326
- return fr'{text}\ [{args}]'
361
+ return rf'{text}\ [{args}]'
327
362
  elif isinstance(cls, typing._SpecialForm):
328
363
  return f':py:obj:`~{cls.__module__}.{cls.__name__}`' # type: ignore[attr-defined]
329
364
  elif sys.version_info[:2] >= (3, 11) and cls is typing.Any:
@@ -336,7 +371,8 @@ def restify(cls: Any, mode: _RestifyMode = 'fully-qualified-except-typing') -> s
336
371
  else:
337
372
  # not a class (ex. TypeVar) but should have a __name__
338
373
  return f':py:obj:`{module_prefix}{cls.__module__}.{cls.__name__}`'
339
- except (AttributeError, TypeError):
374
+ except (AttributeError, TypeError) as exc:
375
+ logger.debug('restify on %r in mode %r failed: %r', cls, mode, exc)
340
376
  return object_description(cls)
341
377
 
342
378
 
@@ -347,7 +383,9 @@ def _format_literal_arg_restify(arg: Any, /, *, mode: str) -> str:
347
383
  enum_cls = arg.__class__
348
384
  if mode == 'smart' or enum_cls.__module__ == 'typing':
349
385
  # MyEnum.member
350
- return f':py:attr:`~{enum_cls.__module__}.{enum_cls.__qualname__}.{arg.name}`'
386
+ return (
387
+ f':py:attr:`~{enum_cls.__module__}.{enum_cls.__qualname__}.{arg.name}`'
388
+ )
351
389
  # module.MyEnum.member
352
390
  return f':py:attr:`{enum_cls.__module__}.{enum_cls.__qualname__}.{arg.name}`'
353
391
  return repr(arg)
@@ -403,7 +441,10 @@ def stringify_annotation(
403
441
  # Extract the annotation's base type by considering formattable cases
404
442
  if isinstance(annotation, TypeVar) and not _is_unpack_form(annotation):
405
443
  # typing_extensions.Unpack is incorrectly determined as a TypeVar
406
- if annotation_module_is_typing and mode in {'fully-qualified-except-typing', 'smart'}:
444
+ if annotation_module_is_typing and mode in {
445
+ 'fully-qualified-except-typing',
446
+ 'smart',
447
+ }:
407
448
  return annotation_name
408
449
  return module_prefix + f'{annotation_module}.{annotation_name}'
409
450
  elif isinstance(annotation, NewType):
@@ -433,7 +474,9 @@ def stringify_annotation(
433
474
 
434
475
  module_prefix = f'{annotation_module}.'
435
476
  annotation_forward_arg: str | None = getattr(annotation, '__forward_arg__', None)
436
- if annotation_qualname or (annotation_module_is_typing and not annotation_forward_arg):
477
+ if annotation_qualname or (
478
+ annotation_module_is_typing and not annotation_forward_arg
479
+ ):
437
480
  if mode == 'smart':
438
481
  module_prefix = f'~{module_prefix}'
439
482
  if annotation_module_is_typing and mode == 'fully-qualified-except-typing':
@@ -456,7 +499,8 @@ def stringify_annotation(
456
499
  # in this case, we know that the annotation is a member
457
500
  # of ``typing`` and all of them define ``__origin__``
458
501
  qualname = stringify_annotation(
459
- annotation.__origin__, 'fully-qualified-except-typing',
502
+ annotation.__origin__,
503
+ 'fully-qualified-except-typing',
460
504
  ).replace('typing.', '') # ex. Union
461
505
  elif annotation_qualname:
462
506
  qualname = annotation_qualname
@@ -477,21 +521,25 @@ def stringify_annotation(
477
521
  if (
478
522
  qualname in {'Union', 'types.UnionType'}
479
523
  and all(getattr(a, '__origin__', ...) is typing.Literal for a in annotation_args)
480
- ):
524
+ ): # fmt: skip
481
525
  # special case to flatten a Union of Literals into a literal
482
526
  flattened_args = typing.Literal[annotation_args].__args__ # type: ignore[attr-defined]
483
- args = ', '.join(_format_literal_arg_stringify(a, mode=mode)
484
- for a in flattened_args)
527
+ args = ', '.join(
528
+ _format_literal_arg_stringify(a, mode=mode) for a in flattened_args
529
+ )
485
530
  return f'{module_prefix}Literal[{args}]'
486
531
  if qualname in {'Optional', 'Union', 'types.UnionType'}:
487
532
  return ' | '.join(stringify_annotation(a, mode) for a in annotation_args)
488
533
  elif qualname == 'Callable':
489
- args = ', '.join(stringify_annotation(a, mode) for a in annotation_args[:-1])
534
+ args = ', '.join(
535
+ stringify_annotation(a, mode) for a in annotation_args[:-1]
536
+ )
490
537
  returns = stringify_annotation(annotation_args[-1], mode)
491
538
  return f'{module_prefix}Callable[[{args}], {returns}]'
492
539
  elif qualname == 'Literal':
493
- args = ', '.join(_format_literal_arg_stringify(a, mode=mode)
494
- for a in annotation_args)
540
+ args = ', '.join(
541
+ _format_literal_arg_stringify(a, mode=mode) for a in annotation_args
542
+ )
495
543
  return f'{module_prefix}Literal[{args}]'
496
544
  elif _is_annotated_form(annotation): # for py310+
497
545
  args = stringify_annotation(annotation_args[0], mode)
@@ -502,10 +550,13 @@ def stringify_annotation(
502
550
  elif dataclasses.is_dataclass(m):
503
551
  # use stringify_annotation for the repr of field values rather than repr
504
552
  d_fields = ', '.join([
505
- f"{f.name}={stringify_annotation(getattr(m, f.name), mode)}"
506
- for f in dataclasses.fields(m) if f.repr
553
+ f'{f.name}={stringify_annotation(getattr(m, f.name), mode)}'
554
+ for f in dataclasses.fields(m)
555
+ if f.repr
507
556
  ])
508
- meta_args.append(f'{stringify_annotation(type(m), mode)}({d_fields})')
557
+ meta_args.append(
558
+ f'{stringify_annotation(type(m), mode)}({d_fields})'
559
+ )
509
560
  else:
510
561
  meta_args.append(repr(m))
511
562
  meta = ', '.join(meta_args)
@@ -540,7 +591,7 @@ def _format_literal_arg_stringify(arg: Any, /, *, mode: str) -> str:
540
591
 
541
592
  # deprecated name -> (object to return, canonical path or empty string, removal version)
542
593
  _DEPRECATED_OBJECTS: dict[str, tuple[Any, str, tuple[int, int]]] = {
543
- }
594
+ } # fmt: skip
544
595
 
545
596
 
546
597
  def __getattr__(name: str) -> Any:
sphinx/versioning.py CHANGED
@@ -45,7 +45,9 @@ def add_uids(doctree: Node, condition: Callable[[Node], bool]) -> Iterator[Node]
45
45
  yield node
46
46
 
47
47
 
48
- def merge_doctrees(old: Node, new: Node, condition: Callable[[Node], bool]) -> Iterator[Node]:
48
+ def merge_doctrees(
49
+ old: Node, new: Node, condition: Callable[[Node], bool]
50
+ ) -> Iterator[Node]:
49
51
  """Merge the `old` doctree with the `new` one while looking at nodes
50
52
  matching the `condition`.
51
53
 
sphinx/writers/html.py CHANGED
@@ -21,9 +21,8 @@ HTMLTranslator = HTML5Translator
21
21
 
22
22
 
23
23
  class HTMLWriter(Writer): # type: ignore[misc]
24
-
25
24
  # override embed-stylesheet default value to False.
26
- settings_default_overrides = {"embed_stylesheet": False}
25
+ settings_default_overrides = {'embed_stylesheet': False}
27
26
 
28
27
  def __init__(self, builder: StandaloneHTMLBuilder) -> None:
29
28
  super().__init__()
@@ -35,10 +34,26 @@ class HTMLWriter(Writer): # type: ignore[misc]
35
34
  self.visitor = cast(HTML5Translator, visitor)
36
35
  self.document.walkabout(visitor)
37
36
  self.output = self.visitor.astext()
38
- for attr in ('head_prefix', 'stylesheet', 'head', 'body_prefix',
39
- 'body_pre_docinfo', 'docinfo', 'body', 'fragment',
40
- 'body_suffix', 'meta', 'title', 'subtitle', 'header',
41
- 'footer', 'html_prolog', 'html_head', 'html_title',
42
- 'html_subtitle', 'html_body'):
37
+ for attr in (
38
+ 'head_prefix',
39
+ 'stylesheet',
40
+ 'head',
41
+ 'body_prefix',
42
+ 'body_pre_docinfo',
43
+ 'docinfo',
44
+ 'body',
45
+ 'fragment',
46
+ 'body_suffix',
47
+ 'meta',
48
+ 'title',
49
+ 'subtitle',
50
+ 'header',
51
+ 'footer',
52
+ 'html_prolog',
53
+ 'html_head',
54
+ 'html_title',
55
+ 'html_subtitle',
56
+ 'html_body',
57
+ ):
43
58
  setattr(self, attr, getattr(visitor, attr, None))
44
59
  self.clean_meta = ''.join(self.visitor.meta[2:])