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/parsers.py CHANGED
@@ -72,7 +72,9 @@ class RSTParser(docutils.parsers.rst.Parser, Parser):
72
72
  # preprocess inputstring
73
73
  if isinstance(inputstring, str):
74
74
  lines = docutils.statemachine.string2lines(
75
- inputstring, tab_width=document.settings.tab_width, convert_whitespace=True
75
+ inputstring,
76
+ tab_width=document.settings.tab_width,
77
+ convert_whitespace=True,
76
78
  )
77
79
 
78
80
  inputlines = StringList(lines, document.current_source)
sphinx/project.py CHANGED
@@ -23,7 +23,9 @@ EXCLUDE_PATHS = ['**/_sources', '.#*', '**/.#*', '*.lproj/**']
23
23
  class Project:
24
24
  """A project is the source code set of the Sphinx document(s)."""
25
25
 
26
- def __init__(self, srcdir: str | os.PathLike[str], source_suffix: Iterable[str]) -> None:
26
+ def __init__(
27
+ self, srcdir: str | os.PathLike[str], source_suffix: Iterable[str]
28
+ ) -> None:
27
29
  #: Source directory.
28
30
  self.srcdir = _StrPath(srcdir)
29
31
 
@@ -82,7 +84,9 @@ class Project:
82
84
  self._docname_to_path[docname] = path
83
85
  else:
84
86
  logger.warning(
85
- __('Ignored unreadable document %r.'), filename, location=docname
87
+ __('Ignored unreadable document %r.'),
88
+ filename,
89
+ location=docname,
86
90
  )
87
91
 
88
92
  return self.docnames
sphinx/pycode/__init__.py CHANGED
@@ -52,7 +52,9 @@ class ModuleAnalyzer:
52
52
  try:
53
53
  filename = loader.get_filename(modname)
54
54
  except ImportError as err:
55
- raise PycodeError('error getting filename for %r' % modname, err) from err
55
+ raise PycodeError(
56
+ 'error getting filename for %r' % modname, err
57
+ ) from err
56
58
  if filename is None:
57
59
  # all methods for getting filename failed, so raise...
58
60
  raise PycodeError('no source found for module %r' % modname)
@@ -70,12 +72,17 @@ class ModuleAnalyzer:
70
72
 
71
73
  @classmethod
72
74
  def for_string(
73
- cls: type[ModuleAnalyzer], string: str, modname: str, srcname: str = '<string>',
75
+ cls: type[ModuleAnalyzer],
76
+ string: str,
77
+ modname: str,
78
+ srcname: str = '<string>',
74
79
  ) -> ModuleAnalyzer:
75
80
  return cls(string, modname, srcname)
76
81
 
77
82
  @classmethod
78
- def for_file(cls: type[ModuleAnalyzer], filename: str, modname: str) -> ModuleAnalyzer:
83
+ def for_file(
84
+ cls: type[ModuleAnalyzer], filename: str, modname: str
85
+ ) -> ModuleAnalyzer:
79
86
  if ('file', filename) in cls.cache:
80
87
  return cls.cache['file', filename]
81
88
  try:
@@ -126,7 +133,7 @@ class ModuleAnalyzer:
126
133
  parser.parse()
127
134
 
128
135
  self.attr_docs = {}
129
- for (scope, comment) in parser.comments.items():
136
+ for scope, comment in parser.comments.items():
130
137
  if comment:
131
138
  self.attr_docs[scope] = [*comment.splitlines(), '']
132
139
  else:
sphinx/pycode/ast.py CHANGED
@@ -6,36 +6,34 @@ import ast
6
6
  from typing import NoReturn, overload
7
7
 
8
8
  OPERATORS: dict[type[ast.AST], str] = {
9
- ast.Add: "+",
10
- ast.And: "and",
11
- ast.BitAnd: "&",
12
- ast.BitOr: "|",
13
- ast.BitXor: "^",
14
- ast.Div: "/",
15
- ast.FloorDiv: "//",
16
- ast.Invert: "~",
17
- ast.LShift: "<<",
18
- ast.MatMult: "@",
19
- ast.Mult: "*",
20
- ast.Mod: "%",
21
- ast.Not: "not",
22
- ast.Pow: "**",
23
- ast.Or: "or",
24
- ast.RShift: ">>",
25
- ast.Sub: "-",
26
- ast.UAdd: "+",
27
- ast.USub: "-",
9
+ ast.Add: '+',
10
+ ast.And: 'and',
11
+ ast.BitAnd: '&',
12
+ ast.BitOr: '|',
13
+ ast.BitXor: '^',
14
+ ast.Div: '/',
15
+ ast.FloorDiv: '//',
16
+ ast.Invert: '~',
17
+ ast.LShift: '<<',
18
+ ast.MatMult: '@',
19
+ ast.Mult: '*',
20
+ ast.Mod: '%',
21
+ ast.Not: 'not',
22
+ ast.Pow: '**',
23
+ ast.Or: 'or',
24
+ ast.RShift: '>>',
25
+ ast.Sub: '-',
26
+ ast.UAdd: '+',
27
+ ast.USub: '-',
28
28
  }
29
29
 
30
30
 
31
31
  @overload
32
- def unparse(node: None, code: str = '') -> None:
33
- ...
32
+ def unparse(node: None, code: str = '') -> None: ... # NoQA: E704
34
33
 
35
34
 
36
35
  @overload
37
- def unparse(node: ast.AST, code: str = '') -> str:
38
- ...
36
+ def unparse(node: ast.AST, code: str = '') -> str: ... # NoQA: E704
39
37
 
40
38
 
41
39
  def unparse(node: ast.AST | None, code: str = '') -> str | None:
@@ -54,12 +52,13 @@ class _UnparseVisitor(ast.NodeVisitor):
54
52
 
55
53
  def _visit_op(self, node: ast.AST) -> str:
56
54
  return OPERATORS[node.__class__]
55
+
57
56
  for _op in OPERATORS:
58
57
  locals()[f'visit_{_op.__name__}'] = _visit_op
59
58
 
60
59
  def visit_arg(self, node: ast.arg) -> str:
61
60
  if node.annotation:
62
- return f"{node.arg}: {self.visit(node.annotation)}"
61
+ return f'{node.arg}: {self.visit(node.annotation)}'
63
62
  else:
64
63
  return node.arg
65
64
 
@@ -68,9 +67,9 @@ class _UnparseVisitor(ast.NodeVisitor):
68
67
  name = self.visit(arg)
69
68
  if default:
70
69
  if arg.annotation:
71
- name += " = %s" % self.visit(default)
70
+ name += ' = %s' % self.visit(default)
72
71
  else:
73
- name += "=%s" % self.visit(default)
72
+ name += '=%s' % self.visit(default)
74
73
  return name
75
74
 
76
75
  def visit_arguments(self, node: ast.arguments) -> str:
@@ -85,8 +84,10 @@ class _UnparseVisitor(ast.NodeVisitor):
85
84
  for _ in range(len(kw_defaults), len(node.kwonlyargs)):
86
85
  kw_defaults.insert(0, None)
87
86
 
88
- args: list[str] = [self._visit_arg_with_default(arg, defaults[i])
89
- for i, arg in enumerate(node.posonlyargs)]
87
+ args: list[str] = [
88
+ self._visit_arg_with_default(arg, defaults[i])
89
+ for i, arg in enumerate(node.posonlyargs)
90
+ ]
90
91
 
91
92
  if node.posonlyargs:
92
93
  args.append('/')
@@ -95,7 +96,7 @@ class _UnparseVisitor(ast.NodeVisitor):
95
96
  args.append(self._visit_arg_with_default(arg, defaults[i + posonlyargs]))
96
97
 
97
98
  if node.vararg:
98
- args.append("*" + self.visit(node.vararg))
99
+ args.append('*' + self.visit(node.vararg))
99
100
 
100
101
  if node.kwonlyargs and not node.vararg:
101
102
  args.append('*')
@@ -103,33 +104,33 @@ class _UnparseVisitor(ast.NodeVisitor):
103
104
  args.append(self._visit_arg_with_default(arg, kw_defaults[i]))
104
105
 
105
106
  if node.kwarg:
106
- args.append("**" + self.visit(node.kwarg))
107
+ args.append('**' + self.visit(node.kwarg))
107
108
 
108
- return ", ".join(args)
109
+ return ', '.join(args)
109
110
 
110
111
  def visit_Attribute(self, node: ast.Attribute) -> str:
111
- return f"{self.visit(node.value)}.{node.attr}"
112
+ return f'{self.visit(node.value)}.{node.attr}'
112
113
 
113
114
  def visit_BinOp(self, node: ast.BinOp) -> str:
114
115
  # Special case ``**`` to not have surrounding spaces.
115
116
  if isinstance(node.op, ast.Pow):
116
- return "".join(map(self.visit, (node.left, node.op, node.right)))
117
- return " ".join(map(self.visit, (node.left, node.op, node.right)))
117
+ return ''.join(map(self.visit, (node.left, node.op, node.right)))
118
+ return ' '.join(map(self.visit, (node.left, node.op, node.right)))
118
119
 
119
120
  def visit_BoolOp(self, node: ast.BoolOp) -> str:
120
- op = " %s " % self.visit(node.op)
121
+ op = ' %s ' % self.visit(node.op)
121
122
  return op.join(self.visit(e) for e in node.values)
122
123
 
123
124
  def visit_Call(self, node: ast.Call) -> str:
124
125
  args = ', '.join(
125
126
  [self.visit(e) for e in node.args]
126
- + [f"{k.arg}={self.visit(k.value)}" for k in node.keywords],
127
+ + [f'{k.arg}={self.visit(k.value)}' for k in node.keywords],
127
128
  )
128
- return f"{self.visit(node.func)}({args})"
129
+ return f'{self.visit(node.func)}({args})'
129
130
 
130
131
  def visit_Constant(self, node: ast.Constant) -> str:
131
132
  if node.value is Ellipsis:
132
- return "..."
133
+ return '...'
133
134
  elif isinstance(node.value, int | float | complex):
134
135
  if self.code:
135
136
  return ast.get_source_segment(self.code, node) or repr(node.value)
@@ -141,34 +142,34 @@ class _UnparseVisitor(ast.NodeVisitor):
141
142
  def visit_Dict(self, node: ast.Dict) -> str:
142
143
  keys = (self.visit(k) for k in node.keys if k is not None)
143
144
  values = (self.visit(v) for v in node.values)
144
- items = (k + ": " + v for k, v in zip(keys, values, strict=True))
145
- return "{" + ", ".join(items) + "}"
145
+ items = (k + ': ' + v for k, v in zip(keys, values, strict=True))
146
+ return '{' + ', '.join(items) + '}'
146
147
 
147
148
  def visit_Lambda(self, node: ast.Lambda) -> str:
148
- return "lambda %s: ..." % self.visit(node.args)
149
+ return 'lambda %s: ...' % self.visit(node.args)
149
150
 
150
151
  def visit_List(self, node: ast.List) -> str:
151
- return "[" + ", ".join(self.visit(e) for e in node.elts) + "]"
152
+ return '[' + ', '.join(self.visit(e) for e in node.elts) + ']'
152
153
 
153
154
  def visit_Name(self, node: ast.Name) -> str:
154
155
  return node.id
155
156
 
156
157
  def visit_Set(self, node: ast.Set) -> str:
157
- return "{" + ", ".join(self.visit(e) for e in node.elts) + "}"
158
+ return '{' + ', '.join(self.visit(e) for e in node.elts) + '}'
158
159
 
159
160
  def visit_Slice(self, node: ast.Slice) -> str:
160
161
  if not node.lower and not node.upper and not node.step:
161
162
  # Empty slice with default values -> [:]
162
- return ":"
163
+ return ':'
163
164
 
164
- start = self.visit(node.lower) if node.lower else ""
165
- stop = self.visit(node.upper) if node.upper else ""
165
+ start = self.visit(node.lower) if node.lower else ''
166
+ stop = self.visit(node.upper) if node.upper else ''
166
167
  if not node.step:
167
168
  # Default step size -> [start:stop]
168
- return f"{start}:{stop}"
169
+ return f'{start}:{stop}'
169
170
 
170
- step = self.visit(node.step) if node.step else ""
171
- return f"{start}:{stop}:{step}"
171
+ step = self.visit(node.step) if node.step else ''
172
+ return f'{start}:{stop}:{step}'
172
173
 
173
174
  def visit_Subscript(self, node: ast.Subscript) -> str:
174
175
  def is_simple_tuple(value: ast.expr) -> bool:
@@ -179,25 +180,24 @@ class _UnparseVisitor(ast.NodeVisitor):
179
180
  )
180
181
 
181
182
  if is_simple_tuple(node.slice):
182
- elts = ", ".join(self.visit(e)
183
- for e in node.slice.elts) # type: ignore[attr-defined]
184
- return f"{self.visit(node.value)}[{elts}]"
185
- return f"{self.visit(node.value)}[{self.visit(node.slice)}]"
183
+ elts = ', '.join(self.visit(e) for e in node.slice.elts) # type: ignore[attr-defined]
184
+ return f'{self.visit(node.value)}[{elts}]'
185
+ return f'{self.visit(node.value)}[{self.visit(node.slice)}]'
186
186
 
187
187
  def visit_UnaryOp(self, node: ast.UnaryOp) -> str:
188
188
  # UnaryOp is one of {UAdd, USub, Invert, Not}, which refer to ``+x``,
189
189
  # ``-x``, ``~x``, and ``not x``. Only Not needs a space.
190
190
  if isinstance(node.op, ast.Not):
191
- return f"{self.visit(node.op)} {self.visit(node.operand)}"
192
- return f"{self.visit(node.op)}{self.visit(node.operand)}"
191
+ return f'{self.visit(node.op)} {self.visit(node.operand)}'
192
+ return f'{self.visit(node.op)}{self.visit(node.operand)}'
193
193
 
194
194
  def visit_Tuple(self, node: ast.Tuple) -> str:
195
195
  if len(node.elts) == 0:
196
- return "()"
196
+ return '()'
197
197
  elif len(node.elts) == 1:
198
- return "(%s,)" % self.visit(node.elts[0])
198
+ return '(%s,)' % self.visit(node.elts[0])
199
199
  else:
200
- return "(" + ", ".join(self.visit(e) for e in node.elts) + ")"
200
+ return '(' + ', '.join(self.visit(e) for e in node.elts) + ')'
201
201
 
202
202
  def generic_visit(self, node: ast.AST) -> NoReturn:
203
203
  raise NotImplementedError('Unable to parse %s object' % type(node).__name__)
sphinx/pycode/parser.py CHANGED
@@ -63,11 +63,12 @@ def get_lvar_names(node: ast.AST, self: ast.arg | None = None) -> list[str]:
63
63
  return members
64
64
  elif node_name == 'Attribute':
65
65
  if (
66
- node.value.__class__.__name__ == 'Name' and # type: ignore[attr-defined]
67
- self and node.value.id == self_id # type: ignore[attr-defined]
66
+ node.value.__class__.__name__ == 'Name' # type: ignore[attr-defined]
67
+ and self
68
+ and node.value.id == self_id # type: ignore[attr-defined]
68
69
  ):
69
70
  # instance variable
70
- return ["%s" % get_lvar_names(node.attr, self)[0]] # type: ignore[attr-defined]
71
+ return ['%s' % get_lvar_names(node.attr, self)[0]] # type: ignore[attr-defined]
71
72
  else:
72
73
  raise TypeError('The assignment %r is not instance variable' % node)
73
74
  elif node_name == 'str':
@@ -80,6 +81,7 @@ def get_lvar_names(node: ast.AST, self: ast.arg | None = None) -> list[str]:
80
81
 
81
82
  def dedent_docstring(s: str) -> str:
82
83
  """Remove common leading indentation from docstring."""
84
+
83
85
  def dummy() -> None:
84
86
  # dummy function to mock `inspect.getdoc`.
85
87
  pass
@@ -87,16 +89,22 @@ def dedent_docstring(s: str) -> str:
87
89
  dummy.__doc__ = s
88
90
  docstring = inspect.getdoc(dummy)
89
91
  if docstring:
90
- return docstring.lstrip("\r\n").rstrip("\r\n")
92
+ return docstring.lstrip('\r\n').rstrip('\r\n')
91
93
  else:
92
- return ""
94
+ return ''
93
95
 
94
96
 
95
97
  class Token:
96
98
  """Better token wrapper for tokenize module."""
97
99
 
98
- def __init__(self, kind: int, value: Any, start: tuple[int, int], end: tuple[int, int],
99
- source: str) -> None:
100
+ def __init__(
101
+ self,
102
+ kind: int,
103
+ value: Any,
104
+ start: tuple[int, int],
105
+ end: tuple[int, int],
106
+ source: str,
107
+ ) -> None:
100
108
  self.kind = kind
101
109
  self.value = value
102
110
  self.start = start
@@ -201,7 +209,9 @@ class AfterCommentParser(TokenProcessor):
201
209
  def parse(self) -> None:
202
210
  """Parse the code and obtain comment after assignment."""
203
211
  # skip lvalue (or whole of AnnAssign)
204
- while (tok := self.fetch_token()) and not tok.match([OP, '='], NEWLINE, COMMENT):
212
+ while (tok := self.fetch_token()) and not tok.match(
213
+ [OP, '='], NEWLINE, COMMENT
214
+ ):
205
215
  assert tok
206
216
  assert tok is not None
207
217
 
@@ -239,7 +249,7 @@ class VariableCommentPicker(ast.NodeVisitor):
239
249
  def get_qualname_for(self, name: str) -> list[str] | None:
240
250
  """Get qualified name for given object as a list of string(s)."""
241
251
  if self.current_function:
242
- if self.current_classes and self.context[-1] == "__init__":
252
+ if self.current_classes and self.context[-1] == '__init__':
243
253
  # store variable comments inside __init__ method of classes
244
254
  return self.context[:-1] + [name]
245
255
  else:
@@ -250,31 +260,32 @@ class VariableCommentPicker(ast.NodeVisitor):
250
260
  def add_entry(self, name: str) -> None:
251
261
  qualname = self.get_qualname_for(name)
252
262
  if qualname:
253
- self.deforders[".".join(qualname)] = next(self.counter)
263
+ self.deforders['.'.join(qualname)] = next(self.counter)
254
264
 
255
265
  def add_final_entry(self, name: str) -> None:
256
266
  qualname = self.get_qualname_for(name)
257
267
  if qualname:
258
- self.finals.append(".".join(qualname))
268
+ self.finals.append('.'.join(qualname))
259
269
 
260
270
  def add_overload_entry(self, func: ast.FunctionDef) -> None:
261
271
  # avoid circular import problem
262
272
  from sphinx.util.inspect import signature_from_ast
273
+
263
274
  qualname = self.get_qualname_for(func.name)
264
275
  if qualname:
265
- overloads = self.overloads.setdefault(".".join(qualname), [])
276
+ overloads = self.overloads.setdefault('.'.join(qualname), [])
266
277
  overloads.append(signature_from_ast(func))
267
278
 
268
279
  def add_variable_comment(self, name: str, comment: str) -> None:
269
280
  qualname = self.get_qualname_for(name)
270
281
  if qualname:
271
- basename = ".".join(qualname[:-1])
282
+ basename = '.'.join(qualname[:-1])
272
283
  self.comments[(basename, name)] = comment
273
284
 
274
285
  def add_variable_annotation(self, name: str, annotation: ast.AST) -> None:
275
286
  qualname = self.get_qualname_for(name)
276
287
  if qualname:
277
- basename = ".".join(qualname[:-1])
288
+ basename = '.'.join(qualname[:-1])
278
289
  self.annotations[(basename, name)] = ast_unparse(annotation)
279
290
 
280
291
  def is_final(self, decorators: list[ast.expr]) -> bool:
@@ -353,7 +364,10 @@ class VariableCommentPicker(ast.NodeVisitor):
353
364
  try:
354
365
  targets = get_assign_targets(node)
355
366
  varnames: list[str] = functools.reduce(
356
- operator.iadd, [get_lvar_names(t, self=self.get_self()) for t in targets], [])
367
+ operator.iadd,
368
+ [get_lvar_names(t, self=self.get_self()) for t in targets],
369
+ [],
370
+ )
357
371
  current_line = self.get_line(node.lineno)
358
372
  except TypeError:
359
373
  return # this assignment is not new definition!
@@ -364,21 +378,23 @@ class VariableCommentPicker(ast.NodeVisitor):
364
378
  self.add_variable_annotation(varname, node.annotation)
365
379
  elif hasattr(node, 'type_comment') and node.type_comment:
366
380
  for varname in varnames:
367
- self.add_variable_annotation(
368
- varname, node.type_comment) # type: ignore[arg-type]
381
+ self.add_variable_annotation(varname, node.type_comment) # type: ignore[arg-type]
369
382
 
370
383
  # check comments after assignment
371
- parser = AfterCommentParser([current_line[node.col_offset:]] +
372
- self.buffers[node.lineno:])
384
+ parser = AfterCommentParser(
385
+ [current_line[node.col_offset :]] + self.buffers[node.lineno :]
386
+ )
373
387
  parser.parse()
374
388
  if parser.comment and comment_re.match(parser.comment):
375
389
  for varname in varnames:
376
- self.add_variable_comment(varname, comment_re.sub('\\1', parser.comment))
390
+ self.add_variable_comment(
391
+ varname, comment_re.sub('\\1', parser.comment)
392
+ )
377
393
  self.add_entry(varname)
378
394
  return
379
395
 
380
396
  # check comments before assignment
381
- if indent_re.match(current_line[:node.col_offset]):
397
+ if indent_re.match(current_line[: node.col_offset]):
382
398
  comment_lines = []
383
399
  for i in range(node.lineno - 1):
384
400
  before_line = self.get_line(node.lineno - 1 - i)
@@ -404,8 +420,11 @@ class VariableCommentPicker(ast.NodeVisitor):
404
420
 
405
421
  def visit_Expr(self, node: ast.Expr) -> None:
406
422
  """Handles Expr node and pick up a comment if string."""
407
- if (isinstance(self.previous, ast.Assign | ast.AnnAssign) and
408
- isinstance(node.value, ast.Constant) and isinstance(node.value.value, str)):
423
+ if (
424
+ isinstance(self.previous, ast.Assign | ast.AnnAssign)
425
+ and isinstance(node.value, ast.Constant)
426
+ and isinstance(node.value.value, str)
427
+ ):
409
428
  try:
410
429
  targets = get_assign_targets(self.previous)
411
430
  varnames = get_lvar_names(targets[0], self.get_self())
@@ -446,7 +465,8 @@ class VariableCommentPicker(ast.NodeVisitor):
446
465
  def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
447
466
  """Handles FunctionDef node and set context."""
448
467
  if self.current_function is None:
449
- self.add_entry(node.name) # should be called before setting self.current_function
468
+ # should be called before setting self.current_function
469
+ self.add_entry(node.name)
450
470
  if self.is_final(node.decorator_list):
451
471
  self.add_final_entry(node.name)
452
472
  if self.is_overload(node.decorator_list):
@@ -491,8 +511,10 @@ class DefinitionFinder(TokenProcessor):
491
511
  break
492
512
  if token == COMMENT:
493
513
  pass
494
- elif token == [OP, '@'] and (self.previous is None or
495
- self.previous.match(NEWLINE, NL, INDENT, DEDENT)):
514
+ elif token == [OP, '@'] and (
515
+ self.previous is None
516
+ or self.previous.match(NEWLINE, NL, INDENT, DEDENT)
517
+ ):
496
518
  if self.decorator is None:
497
519
  self.decorator = token
498
520
  elif token.match([NAME, 'class']):
@@ -522,8 +544,7 @@ class DefinitionFinder(TokenProcessor):
522
544
  self.indents.append((typ, funcname, start_pos))
523
545
  else:
524
546
  # one-liner
525
- self.add_definition(funcname,
526
- (typ, start_pos, name.end[0])) # type: ignore[union-attr]
547
+ self.add_definition(funcname, (typ, start_pos, name.end[0])) # type: ignore[union-attr]
527
548
  self.context.pop()
528
549
 
529
550
  def finalize_block(self) -> None:
sphinx/pygments_styles.py CHANGED
@@ -43,54 +43,54 @@ class PyramidStyle(Style):
43
43
 
44
44
  # work in progress...
45
45
 
46
- background_color = "#f8f8f8"
47
- default_style = ""
46
+ background_color = '#f8f8f8'
47
+ default_style = ''
48
48
 
49
49
  styles = {
50
- Whitespace: "#bbbbbb",
51
- Comment: "italic #60a0b0",
52
- Comment.Preproc: "noitalic #007020",
53
- Comment.Special: "noitalic bg:#fff0f0",
54
-
55
- Keyword: "bold #007020",
56
- Keyword.Pseudo: "nobold",
57
- Keyword.Type: "nobold #902000",
58
-
59
- Operator: "#666666",
60
- Operator.Word: "bold #007020",
61
-
62
- Name.Builtin: "#007020",
63
- Name.Function: "#06287e",
64
- Name.Class: "bold #0e84b5",
65
- Name.Namespace: "bold #0e84b5",
66
- Name.Exception: "#007020",
67
- Name.Variable: "#bb60d5",
68
- Name.Constant: "#60add5",
69
- Name.Label: "bold #002070",
70
- Name.Entity: "bold #d55537",
71
- Name.Attribute: "#0e84b5",
72
- Name.Tag: "bold #062873",
73
- Name.Decorator: "bold #555555",
74
-
75
- String: "#4070a0",
76
- String.Doc: "italic",
77
- String.Interpol: "italic #70a0d0",
78
- String.Escape: "bold #4070a0",
79
- String.Regex: "#235388",
80
- String.Symbol: "#517918",
81
- String.Other: "#c65d09",
82
- Number: "#40a070",
83
-
84
- Generic.Heading: "bold #000080",
85
- Generic.Subheading: "bold #800080",
86
- Generic.Deleted: "#A00000",
87
- Generic.Inserted: "#00A000",
88
- Generic.Error: "#FF0000",
89
- Generic.Emph: "italic",
90
- Generic.Strong: "bold",
91
- Generic.Prompt: "bold #c65d09",
92
- Generic.Output: "#888",
93
- Generic.Traceback: "#04D",
94
-
95
- Error: "#a40000 bg:#fbe3e4",
96
- }
50
+ Whitespace: '#bbbbbb',
51
+ Comment: 'italic #60a0b0',
52
+ Comment.Preproc: 'noitalic #007020',
53
+ Comment.Special: 'noitalic bg:#fff0f0',
54
+
55
+ Keyword: 'bold #007020',
56
+ Keyword.Pseudo: 'nobold',
57
+ Keyword.Type: 'nobold #902000',
58
+
59
+ Operator: '#666666',
60
+ Operator.Word: 'bold #007020',
61
+
62
+ Name.Builtin: '#007020',
63
+ Name.Function: '#06287e',
64
+ Name.Class: 'bold #0e84b5',
65
+ Name.Namespace: 'bold #0e84b5',
66
+ Name.Exception: '#007020',
67
+ Name.Variable: '#bb60d5',
68
+ Name.Constant: '#60add5',
69
+ Name.Label: 'bold #002070',
70
+ Name.Entity: 'bold #d55537',
71
+ Name.Attribute: '#0e84b5',
72
+ Name.Tag: 'bold #062873',
73
+ Name.Decorator: 'bold #555555',
74
+
75
+ String: '#4070a0',
76
+ String.Doc: 'italic',
77
+ String.Interpol: 'italic #70a0d0',
78
+ String.Escape: 'bold #4070a0',
79
+ String.Regex: '#235388',
80
+ String.Symbol: '#517918',
81
+ String.Other: '#c65d09',
82
+ Number: '#40a070',
83
+
84
+ Generic.Heading: 'bold #000080',
85
+ Generic.Subheading: 'bold #800080',
86
+ Generic.Deleted: '#A00000',
87
+ Generic.Inserted: '#00A000',
88
+ Generic.Error: '#FF0000',
89
+ Generic.Emph: 'italic',
90
+ Generic.Strong: 'bold',
91
+ Generic.Prompt: 'bold #c65d09',
92
+ Generic.Output: '#888',
93
+ Generic.Traceback: '#04D',
94
+
95
+ Error: '#a40000 bg:#fbe3e4',
96
+ } # fmt: skip
sphinx/registry.py CHANGED
@@ -47,6 +47,7 @@ logger = logging.getLogger(__name__)
47
47
  # Values are Sphinx version that merge the extension.
48
48
  EXTENSION_BLACKLIST = {
49
49
  "sphinxjp.themecore": "1.2",
50
+ 'sphinxcontrib-napoleon': '1.3',
50
51
  "sphinxprettysearchresults": "2.0.0",
51
52
  }
52
53
 
@@ -54,7 +55,7 @@ EXTENSION_BLACKLIST = {
54
55
  class SphinxComponentRegistry:
55
56
  def __init__(self) -> None:
56
57
  #: special attrgetter for autodoc; class object -> attrgetter
57
- self.autodoc_attrgettrs: dict[type, Callable[[Any, str, Any], Any]] = {}
58
+ self.autodoc_attrgetters: dict[type, Callable[[Any, str, Any], Any]] = {}
58
59
 
59
60
  #: builders; a dict of builder name -> builder class
60
61
  self.builders: dict[str, type[Builder]] = {}
@@ -112,7 +113,7 @@ class SphinxComponentRegistry:
112
113
  #: post transforms; list of transforms
113
114
  self.post_transforms: list[type[Transform]] = []
114
115
 
115
- #: source paresrs; file type -> parser class
116
+ #: source parsers; file type -> parser class
116
117
  self.source_parsers: dict[str, type[Parser]] = {}
117
118
 
118
119
  #: source suffix: suffix -> file type
@@ -131,6 +132,10 @@ class SphinxComponentRegistry:
131
132
  # private cache of Docutils Publishers (file type -> publisher object)
132
133
  self.publishers: dict[str, Publisher] = {}
133
134
 
135
+ @property
136
+ def autodoc_attrgettrs(self) -> dict[type, Callable[[Any, str, Any], Any]]:
137
+ return self.autodoc_attrgetters
138
+
134
139
  def add_builder(self, builder: type[Builder], override: bool = False) -> None:
135
140
  logger.debug('[app] adding builder: %r', builder)
136
141
  if not hasattr(builder, 'name'):
@@ -376,7 +381,7 @@ class SphinxComponentRegistry:
376
381
 
377
382
  def add_autodoc_attrgetter(self, typ: type,
378
383
  attrgetter: Callable[[Any, str, Any], Any]) -> None:
379
- self.autodoc_attrgettrs[typ] = attrgetter
384
+ self.autodoc_attrgetters[typ] = attrgetter
380
385
 
381
386
  def add_css_files(self, filename: str, **attributes: Any) -> None:
382
387
  self.css_files.append((filename, attributes))