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
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, TypeVar, cast
7
7
  from docutils import nodes
8
8
 
9
9
  from sphinx import addnodes
10
+ from sphinx.domains.std import StandardDomain
10
11
  from sphinx.environment.adapters.toctree import note_toctree
11
12
  from sphinx.environment.collectors import EnvironmentCollector
12
13
  from sphinx.locale import __
@@ -42,8 +43,13 @@ class TocTreeCollector(EnvironmentCollector):
42
43
  if not fnset:
43
44
  del env.files_to_rebuild[subfn]
44
45
 
45
- def merge_other(self, app: Sphinx, env: BuildEnvironment, docnames: set[str],
46
- other: BuildEnvironment) -> None:
46
+ def merge_other(
47
+ self,
48
+ app: Sphinx,
49
+ env: BuildEnvironment,
50
+ docnames: set[str],
51
+ other: BuildEnvironment,
52
+ ) -> None:
47
53
  for docname in docnames:
48
54
  env.tocs[docname] = other.tocs[docname]
49
55
  env.toc_num_entries[docname] = other.toc_num_entries[docname]
@@ -83,8 +89,13 @@ class TocTreeCollector(EnvironmentCollector):
83
89
  # make these nodes:
84
90
  # list_item -> compact_paragraph -> reference
85
91
  reference = nodes.reference(
86
- '', '', internal=True, refuri=docname,
87
- anchorname=anchorname, *nodetext)
92
+ '',
93
+ '',
94
+ internal=True,
95
+ refuri=docname,
96
+ anchorname=anchorname,
97
+ *nodetext,
98
+ )
88
99
  para = addnodes.compact_paragraph('', '', reference)
89
100
  item: Element = nodes.list_item('', para)
90
101
  sub_item = build_toc(sectionnode, depth + 1)
@@ -135,15 +146,23 @@ class TocTreeCollector(EnvironmentCollector):
135
146
  anchorname = _make_anchor_name(ids, numentries)
136
147
 
137
148
  reference = nodes.reference(
138
- '', '', nodes.literal('', sig_node['_toc_name']),
139
- internal=True, refuri=docname, anchorname=anchorname)
140
- para = addnodes.compact_paragraph('', '', reference,
141
- skip_section_number=True)
149
+ '',
150
+ '',
151
+ nodes.literal('', sig_node['_toc_name']),
152
+ internal=True,
153
+ refuri=docname,
154
+ anchorname=anchorname,
155
+ )
156
+ para = addnodes.compact_paragraph(
157
+ '', '', reference, skip_section_number=True
158
+ )
142
159
  entry = nodes.list_item('', para)
143
160
 
144
161
  # Find parent node
145
162
  parent = sig_node.parent
146
- while parent not in memo_parents and parent != sectionnode:
163
+ while (
164
+ parent not in memo_parents and parent != sectionnode
165
+ ):
147
166
  parent = parent.parent
148
167
  # Note, it may both be the limit and in memo_parents,
149
168
  # prefer memo_parents, so we get the nesting.
@@ -230,14 +249,21 @@ class TocTreeCollector(EnvironmentCollector):
230
249
  def _walk_toctree(toctreenode: addnodes.toctree, depth: int) -> None:
231
250
  if depth == 0:
232
251
  return
233
- for (_title, ref) in toctreenode['entries']:
252
+ for _title, ref in toctreenode['entries']:
234
253
  if url_re.match(ref) or ref == 'self':
235
254
  # don't mess with those
236
255
  continue
237
256
  if ref in assigned:
238
- logger.warning(__('%s is already assigned section numbers '
239
- '(nested numbered toctree?)'), ref,
240
- location=toctreenode, type='toc', subtype='secnum')
257
+ logger.warning(
258
+ __(
259
+ '%s is already assigned section numbers '
260
+ '(nested numbered toctree?)'
261
+ ),
262
+ ref,
263
+ location=toctreenode,
264
+ type='toc',
265
+ subtype='secnum',
266
+ )
241
267
  elif ref in env.tocs:
242
268
  secnums: dict[str, tuple[int, ...]] = {}
243
269
  env.toc_secnumbers[ref] = secnums
@@ -260,7 +286,7 @@ class TocTreeCollector(EnvironmentCollector):
260
286
 
261
287
  def assign_figure_numbers(self, env: BuildEnvironment) -> list[str]:
262
288
  """Assign a figure number to each figure under a numbered toctree."""
263
- generated_docnames = frozenset(env.domains['std']._virtual_doc_names)
289
+ generated_docnames = frozenset(env.domains.standard_domain._virtual_doc_names)
264
290
 
265
291
  rewrite_needed = []
266
292
 
@@ -270,10 +296,11 @@ class TocTreeCollector(EnvironmentCollector):
270
296
  fignum_counter: dict[str, dict[tuple[int, ...], int]] = {}
271
297
 
272
298
  def get_figtype(node: Node) -> str | None:
273
- for domain in env.domains.values():
299
+ for domain in env.domains.sorted():
274
300
  figtype = domain.get_enumerable_node_type(node)
275
- if (domain.name == 'std'
276
- and not domain.get_numfig_title(node)): # type: ignore[attr-defined] # NoQA: E501
301
+ if isinstance(domain, StandardDomain) and not domain.get_numfig_title(
302
+ node
303
+ ):
277
304
  # Skip if uncaptioned node
278
305
  continue
279
306
 
@@ -292,22 +319,27 @@ class TocTreeCollector(EnvironmentCollector):
292
319
 
293
320
  return secnum or ()
294
321
 
295
- def get_next_fignumber(figtype: str, secnum: tuple[int, ...]) -> tuple[int, ...]:
322
+ def get_next_fignumber(
323
+ figtype: str, secnum: tuple[int, ...]
324
+ ) -> tuple[int, ...]:
296
325
  counter = fignum_counter.setdefault(figtype, {})
297
326
 
298
- secnum = secnum[:env.config.numfig_secnum_depth]
327
+ secnum = secnum[: env.config.numfig_secnum_depth]
299
328
  counter[secnum] = counter.get(secnum, 0) + 1
300
329
  return (*secnum, counter[secnum])
301
330
 
302
- def register_fignumber(docname: str, secnum: tuple[int, ...],
303
- figtype: str, fignode: Element) -> None:
331
+ def register_fignumber(
332
+ docname: str, secnum: tuple[int, ...], figtype: str, fignode: Element
333
+ ) -> None:
304
334
  env.toc_fignumbers.setdefault(docname, {})
305
335
  fignumbers = env.toc_fignumbers[docname].setdefault(figtype, {})
306
336
  figure_id = fignode['ids'][0]
307
337
 
308
338
  fignumbers[figure_id] = get_next_fignumber(figtype, secnum)
309
339
 
310
- def _walk_doctree(docname: str, doctree: Element, secnum: tuple[int, ...]) -> None:
340
+ def _walk_doctree(
341
+ docname: str, doctree: Element, secnum: tuple[int, ...]
342
+ ) -> None:
311
343
  nonlocal generated_docnames
312
344
  for subnode in doctree.children:
313
345
  if isinstance(subnode, nodes.section):
sphinx/errors.py CHANGED
@@ -45,7 +45,10 @@ class ExtensionError(SphinxError):
45
45
  """Extension error."""
46
46
 
47
47
  def __init__(
48
- self, message: str, orig_exc: Exception | None = None, modname: str | None = None
48
+ self,
49
+ message: str,
50
+ orig_exc: Exception | None = None,
51
+ modname: str | None = None,
49
52
  ) -> None:
50
53
  super().__init__(message)
51
54
  self.message = message
sphinx/events.py CHANGED
@@ -5,10 +5,9 @@ Gracefully adapted from the TextPress system by Armin.
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
- import contextlib
9
8
  from collections import defaultdict
10
9
  from operator import attrgetter
11
- from typing import TYPE_CHECKING, Any, NamedTuple
10
+ from typing import TYPE_CHECKING, NamedTuple, overload
12
11
 
13
12
  from sphinx.errors import ExtensionError, SphinxError
14
13
  from sphinx.locale import __
@@ -16,9 +15,20 @@ from sphinx.util import logging
16
15
  from sphinx.util.inspect import safe_getattr
17
16
 
18
17
  if TYPE_CHECKING:
19
- from collections.abc import Callable
18
+ from collections.abc import Callable, Iterable, Sequence, Set
19
+ from pathlib import Path
20
+ from typing import Any, Literal
20
21
 
22
+ from docutils import nodes
23
+
24
+ from sphinx import addnodes
21
25
  from sphinx.application import Sphinx
26
+ from sphinx.builders import Builder
27
+ from sphinx.config import Config
28
+ from sphinx.domains import Domain
29
+ from sphinx.environment import BuildEnvironment
30
+ from sphinx.ext.autodoc import _AutodocProcessDocstringListener
31
+ from sphinx.ext.todo import todo_node
22
32
 
23
33
 
24
34
  logger = logging.getLogger(__name__)
@@ -67,6 +77,293 @@ class EventManager:
67
77
  raise ExtensionError(__('Event %r already present') % name)
68
78
  self.events[name] = ''
69
79
 
80
+ # ---- Core events -------------------------------------------------------
81
+
82
+ @overload
83
+ def connect(
84
+ self,
85
+ name: Literal['config-inited'],
86
+ callback: Callable[[Sphinx, Config], None],
87
+ priority: int,
88
+ ) -> int: ...
89
+
90
+ @overload
91
+ def connect(
92
+ self,
93
+ name: Literal['builder-inited'],
94
+ callback: Callable[[Sphinx], None],
95
+ priority: int,
96
+ ) -> int: ...
97
+
98
+ @overload
99
+ def connect(
100
+ self,
101
+ name: Literal['env-get-outdated'],
102
+ callback: Callable[
103
+ [Sphinx, BuildEnvironment, Set[str], Set[str], Set[str]], Sequence[str]
104
+ ],
105
+ priority: int,
106
+ ) -> int: ...
107
+
108
+ @overload
109
+ def connect(
110
+ self,
111
+ name: Literal['env-before-read-docs'],
112
+ callback: Callable[[Sphinx, BuildEnvironment, list[str]], None],
113
+ priority: int,
114
+ ) -> int: ...
115
+
116
+ @overload
117
+ def connect(
118
+ self,
119
+ name: Literal['env-purge-doc'],
120
+ callback: Callable[[Sphinx, BuildEnvironment, str], None],
121
+ priority: int,
122
+ ) -> int: ...
123
+
124
+ @overload
125
+ def connect(
126
+ self,
127
+ name: Literal['source-read'],
128
+ callback: Callable[[Sphinx, str, list[str]], None],
129
+ priority: int,
130
+ ) -> int: ...
131
+
132
+ @overload
133
+ def connect(
134
+ self,
135
+ name: Literal['include-read'],
136
+ callback: Callable[[Sphinx, Path, str, list[str]], None],
137
+ priority: int,
138
+ ) -> int: ...
139
+
140
+ @overload
141
+ def connect(
142
+ self,
143
+ name: Literal['doctree-read'],
144
+ callback: Callable[[Sphinx, nodes.document], None],
145
+ priority: int,
146
+ ) -> int: ...
147
+
148
+ @overload
149
+ def connect(
150
+ self,
151
+ name: Literal['env-merge-info'],
152
+ callback: Callable[
153
+ [Sphinx, BuildEnvironment, list[str], BuildEnvironment], None
154
+ ],
155
+ priority: int,
156
+ ) -> int: ...
157
+
158
+ @overload
159
+ def connect(
160
+ self,
161
+ name: Literal['env-updated'],
162
+ callback: Callable[[Sphinx, BuildEnvironment], str],
163
+ priority: int,
164
+ ) -> int: ...
165
+
166
+ @overload
167
+ def connect(
168
+ self,
169
+ name: Literal['env-get-updated'],
170
+ callback: Callable[[Sphinx, BuildEnvironment], Iterable[str]],
171
+ priority: int,
172
+ ) -> int: ...
173
+
174
+ @overload
175
+ def connect(
176
+ self,
177
+ name: Literal['env-check-consistency'],
178
+ callback: Callable[[Sphinx, BuildEnvironment], None],
179
+ priority: int,
180
+ ) -> int: ...
181
+
182
+ @overload
183
+ def connect(
184
+ self,
185
+ name: Literal['write-started'],
186
+ callback: Callable[[Sphinx, Builder], None],
187
+ priority: int,
188
+ ) -> int: ...
189
+
190
+ @overload
191
+ def connect(
192
+ self,
193
+ name: Literal['doctree-resolved'],
194
+ callback: Callable[[Sphinx, nodes.document, str], None],
195
+ priority: int,
196
+ ) -> int: ...
197
+
198
+ @overload
199
+ def connect(
200
+ self,
201
+ name: Literal['missing-reference'],
202
+ callback: Callable[
203
+ [Sphinx, BuildEnvironment, addnodes.pending_xref, nodes.TextElement],
204
+ nodes.reference | None,
205
+ ],
206
+ priority: int,
207
+ ) -> int: ...
208
+
209
+ @overload
210
+ def connect(
211
+ self,
212
+ name: Literal['warn-missing-reference'],
213
+ callback: Callable[[Sphinx, Domain, addnodes.pending_xref], bool | None],
214
+ priority: int,
215
+ ) -> int: ...
216
+
217
+ @overload
218
+ def connect(
219
+ self,
220
+ name: Literal['build-finished'],
221
+ callback: Callable[[Sphinx, Exception | None], None],
222
+ priority: int,
223
+ ) -> int: ...
224
+
225
+ # ---- Events from builtin builders --------------------------------------
226
+
227
+ @overload
228
+ def connect(
229
+ self,
230
+ name: Literal['html-collect-pages'],
231
+ callback: Callable[[Sphinx], Iterable[tuple[str, dict[str, Any], str]]],
232
+ priority: int,
233
+ ) -> int: ...
234
+
235
+ @overload
236
+ def connect(
237
+ self,
238
+ name: Literal['html-page-context'],
239
+ callback: Callable[
240
+ [Sphinx, str, str, dict[str, Any], nodes.document], str | None
241
+ ],
242
+ priority: int,
243
+ ) -> int: ...
244
+
245
+ @overload
246
+ def connect(
247
+ self,
248
+ name: Literal['linkcheck-process-uri'],
249
+ callback: Callable[[Sphinx, str], str | None],
250
+ priority: int,
251
+ ) -> int: ...
252
+
253
+ # ---- Events from builtin extensions-- ----------------------------------
254
+
255
+ @overload
256
+ def connect(
257
+ self,
258
+ name: Literal['object-description-transform'],
259
+ callback: Callable[[Sphinx, str, str, addnodes.desc_content], None],
260
+ priority: int,
261
+ ) -> int: ...
262
+
263
+ # ---- Events from first-party extensions --------------------------------
264
+
265
+ @overload
266
+ def connect(
267
+ self,
268
+ name: Literal['autodoc-process-docstring'],
269
+ callback: _AutodocProcessDocstringListener,
270
+ priority: int,
271
+ ) -> int: ...
272
+
273
+ @overload
274
+ def connect(
275
+ self,
276
+ name: Literal['autodoc-before-process-signature'],
277
+ callback: Callable[[Sphinx, Any, bool], None],
278
+ priority: int,
279
+ ) -> int: ...
280
+
281
+ @overload
282
+ def connect(
283
+ self,
284
+ name: Literal['autodoc-process-signature'],
285
+ callback: Callable[
286
+ [
287
+ Sphinx,
288
+ Literal[
289
+ 'module', 'class', 'exception', 'function', 'method', 'attribute'
290
+ ],
291
+ str,
292
+ Any,
293
+ dict[str, bool],
294
+ str | None,
295
+ str | None,
296
+ ],
297
+ tuple[str | None, str | None] | None,
298
+ ],
299
+ priority: int,
300
+ ) -> int: ...
301
+
302
+ @overload
303
+ def connect(
304
+ self,
305
+ name: Literal['autodoc-process-bases'],
306
+ callback: Callable[[Sphinx, str, Any, dict[str, bool], list[str]], None],
307
+ priority: int,
308
+ ) -> int: ...
309
+
310
+ @overload
311
+ def connect(
312
+ self,
313
+ name: Literal['autodoc-skip-member'],
314
+ callback: Callable[
315
+ [
316
+ Sphinx,
317
+ Literal[
318
+ 'module', 'class', 'exception', 'function', 'method', 'attribute'
319
+ ],
320
+ str,
321
+ Any,
322
+ bool,
323
+ dict[str, bool],
324
+ ],
325
+ bool,
326
+ ],
327
+ priority: int,
328
+ ) -> int: ...
329
+
330
+ @overload
331
+ def connect(
332
+ self,
333
+ name: Literal['todo-defined'],
334
+ callback: Callable[[Sphinx, todo_node], None],
335
+ priority: int,
336
+ ) -> int: ...
337
+
338
+ @overload
339
+ def connect(
340
+ self,
341
+ name: Literal['viewcode-find-source'],
342
+ callback: Callable[
343
+ [Sphinx, str],
344
+ tuple[str, dict[str, tuple[Literal['class', 'def', 'other'], int, int]]],
345
+ ],
346
+ priority: int,
347
+ ) -> int: ...
348
+
349
+ @overload
350
+ def connect(
351
+ self,
352
+ name: Literal['viewcode-follow-imported'],
353
+ callback: Callable[[Sphinx, str, str], str | None],
354
+ priority: int,
355
+ ) -> int: ...
356
+
357
+ # ---- Catch-all ---------------------------------------------------------
358
+
359
+ @overload
360
+ def connect(
361
+ self,
362
+ name: str,
363
+ callback: Callable[..., Any],
364
+ priority: int,
365
+ ) -> int: ...
366
+
70
367
  def connect(self, name: str, callback: Callable, priority: int) -> int:
71
368
  """Connect a handler to specific event."""
72
369
  if name not in self.events:
@@ -85,13 +382,20 @@ class EventManager:
85
382
  listeners.remove(listener)
86
383
 
87
384
  def emit(
88
- self, name: str, *args: Any, allowed_exceptions: tuple[type[Exception], ...] = ()
385
+ self,
386
+ name: str,
387
+ *args: Any,
388
+ allowed_exceptions: tuple[type[Exception], ...] = (),
89
389
  ) -> list:
90
390
  """Emit a Sphinx event."""
91
391
  # not every object likes to be repr()'d (think
92
392
  # random stuff coming via autodoc)
93
- with contextlib.suppress(Exception):
94
- logger.debug('[app] emitting event: %r%s', name, repr(args)[:100])
393
+ try:
394
+ repr_args = repr(args)
395
+ except Exception:
396
+ pass
397
+ else:
398
+ logger.debug('[app] emitting event: %r%s', name, repr_args)
95
399
 
96
400
  results = []
97
401
  listeners = sorted(self.listeners[name], key=attrgetter('priority'))
@@ -117,7 +421,10 @@ class EventManager:
117
421
  return results
118
422
 
119
423
  def emit_firstresult(
120
- self, name: str, *args: Any, allowed_exceptions: tuple[type[Exception], ...] = ()
424
+ self,
425
+ name: str,
426
+ *args: Any,
427
+ allowed_exceptions: tuple[type[Exception], ...] = (),
121
428
  ) -> Any:
122
429
  """Emit a Sphinx event and returns first result.
123
430
 
sphinx/ext/apidoc.py CHANGED
@@ -69,7 +69,7 @@ def module_join(*modnames: str | None) -> str:
69
69
 
70
70
  def is_packagedir(dirname: str | None = None, files: list[str] | None = None) -> bool:
71
71
  """Check given *files* contains __init__ file."""
72
- if files is dirname is None:
72
+ if files is None and dirname is None:
73
73
  return False
74
74
 
75
75
  if files is None:
@@ -96,7 +96,10 @@ def write_file(name: str, text: str, opts: CliOptions) -> Path:
96
96
 
97
97
 
98
98
  def create_module_file(
99
- package: str | None, basename: str, opts: CliOptions, user_template_dir: str | None = None
99
+ package: str | None,
100
+ basename: str,
101
+ opts: CliOptions,
102
+ user_template_dir: str | None = None,
100
103
  ) -> Path:
101
104
  """Build the text of the file and write the file."""
102
105
  options = copy(OPTIONS)
@@ -148,7 +151,9 @@ def create_package_file(
148
151
  if not is_skipped_module(Path(root, sub), opts, excludes) and not is_initpy(sub)
149
152
  ]
150
153
  submodules = sorted(set(submodules))
151
- submodules = [module_join(master_package, subroot, modname) for modname in submodules]
154
+ submodules = [
155
+ module_join(master_package, subroot, modname) for modname in submodules
156
+ ]
152
157
  options = copy(OPTIONS)
153
158
  if opts.includeprivate and 'private-members' not in options:
154
159
  options.append('private-members')
@@ -316,7 +321,9 @@ def recurse_tree(
316
321
  if is_pkg or is_namespace:
317
322
  # we are in a package with something to document
318
323
  if subs or len(files) > 1 or not is_skipped_package(root, opts):
319
- subpackage = root[len(rootpath) :].lstrip(path.sep).replace(path.sep, '.')
324
+ subpackage = (
325
+ root[len(rootpath) :].lstrip(path.sep).replace(path.sep, '.')
326
+ )
320
327
  # if this is not a namespace or
321
328
  # a namespace and there is something there to document
322
329
  if not is_namespace or has_child_module(root, excludes, opts):
@@ -342,7 +349,9 @@ def recurse_tree(
342
349
  if not is_skipped_module(Path(rootpath, py_file), opts, excludes):
343
350
  module = py_file.split('.')[0]
344
351
  written_files.append(
345
- create_module_file(root_package, module, opts, user_template_dir)
352
+ create_module_file(
353
+ root_package, module, opts, user_template_dir
354
+ )
346
355
  )
347
356
  toplevels.append(module)
348
357
 
@@ -361,7 +370,7 @@ def is_excluded(root: str | Path, excludes: Sequence[re.Pattern[str]]) -> bool:
361
370
 
362
371
  def get_parser() -> argparse.ArgumentParser:
363
372
  parser = argparse.ArgumentParser(
364
- usage='%(prog)s [OPTIONS] -o <OUTPUT_PATH> <MODULE_PATH> ' '[EXCLUDE_PATTERN, ...]',
373
+ usage='%(prog)s [OPTIONS] -o <OUTPUT_PATH> <MODULE_PATH> [EXCLUDE_PATTERN, ...]',
365
374
  epilog=__('For more information, visit <https://www.sphinx-doc.org/>.'),
366
375
  description=__("""
367
376
  Look recursively in <MODULE_PATH> for Python modules and packages and create
@@ -384,7 +393,9 @@ Note: By default this script will not overwrite already created files."""),
384
393
  parser.add_argument(
385
394
  'exclude_pattern',
386
395
  nargs='*',
387
- help=__('fnmatch-style file and/or directory patterns ' 'to exclude from generation'),
396
+ help=__(
397
+ 'fnmatch-style file and/or directory patterns to exclude from generation'
398
+ ),
388
399
  )
389
400
 
390
401
  parser.add_argument(
@@ -408,10 +419,14 @@ Note: By default this script will not overwrite already created files."""),
408
419
  dest='maxdepth',
409
420
  type=int,
410
421
  default=4,
411
- help=__('maximum depth of submodules to show in the TOC ' '(default: 4)'),
422
+ help=__('maximum depth of submodules to show in the TOC (default: 4)'),
412
423
  )
413
424
  parser.add_argument(
414
- '-f', '--force', action='store_true', dest='force', help=__('overwrite existing files')
425
+ '-f',
426
+ '--force',
427
+ action='store_true',
428
+ dest='force',
429
+ help=__('overwrite existing files'),
415
430
  )
416
431
  parser.add_argument(
417
432
  '-l',
@@ -420,7 +435,7 @@ Note: By default this script will not overwrite already created files."""),
420
435
  dest='followlinks',
421
436
  default=False,
422
437
  help=__(
423
- 'follow symbolic links. Powerful when combined ' 'with collective.recipe.omelette.'
438
+ 'follow symbolic links. Powerful when combined with collective.recipe.omelette.'
424
439
  ),
425
440
  )
426
441
  parser.add_argument(
@@ -474,14 +489,14 @@ Note: By default this script will not overwrite already created files."""),
474
489
  '--module-first',
475
490
  action='store_true',
476
491
  dest='modulefirst',
477
- help=__('put module documentation before submodule ' 'documentation'),
492
+ help=__('put module documentation before submodule documentation'),
478
493
  )
479
494
  parser.add_argument(
480
495
  '--implicit-namespaces',
481
496
  action='store_true',
482
497
  dest='implicit_namespaces',
483
498
  help=__(
484
- 'interpret module paths according to PEP-0420 ' 'implicit namespaces specification'
499
+ 'interpret module paths according to PEP-0420 implicit namespaces specification'
485
500
  ),
486
501
  )
487
502
  parser.add_argument(
@@ -497,7 +512,9 @@ Note: By default this script will not overwrite already created files."""),
497
512
  '--remove-old',
498
513
  action='store_true',
499
514
  dest='remove_old',
500
- help=__('Remove existing files in the output directory that were not generated'),
515
+ help=__(
516
+ 'Remove existing files in the output directory that were not generated'
517
+ ),
501
518
  )
502
519
  exclusive_group.add_argument(
503
520
  '-F',
@@ -539,7 +556,9 @@ Note: By default this script will not overwrite already created files."""),
539
556
  '--doc-release',
540
557
  action='store',
541
558
  dest='release',
542
- help=__('project release, used when --full is given, ' 'defaults to --doc-version'),
559
+ help=__(
560
+ 'project release, used when --full is given, defaults to --doc-version'
561
+ ),
543
562
  )
544
563
 
545
564
  group = parser.add_argument_group(__('extension options'))
@@ -614,8 +633,7 @@ def main(argv: Sequence[str] = (), /) -> int:
614
633
 
615
634
  if args.header is None:
616
635
  args.header = rootpath.split(path.sep)[-1]
617
- if args.suffix.startswith('.'):
618
- args.suffix = args.suffix[1:]
636
+ args.suffix = args.suffix.removeprefix('.')
619
637
  if not Path(rootpath).is_dir():
620
638
  logger.error(__('%s is not a directory.'), rootpath)
621
639
  raise SystemExit(1)
@@ -649,7 +667,11 @@ def main(argv: Sequence[str] = (), /) -> int:
649
667
  'suffix': '.' + args.suffix,
650
668
  'master': 'index',
651
669
  'epub': True,
652
- 'extensions': ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.todo'],
670
+ 'extensions': [
671
+ 'sphinx.ext.autodoc',
672
+ 'sphinx.ext.viewcode',
673
+ 'sphinx.ext.todo',
674
+ ],
653
675
  'makefile': True,
654
676
  'batchfile': True,
655
677
  'make_mode': True,
@@ -670,7 +692,9 @@ def main(argv: Sequence[str] = (), /) -> int:
670
692
  d['extensions'].extend(ext.split(','))
671
693
 
672
694
  if not args.dryrun:
673
- qs.generate(d, silent=True, overwrite=args.force, templatedir=args.templatedir)
695
+ qs.generate(
696
+ d, silent=True, overwrite=args.force, templatedir=args.templatedir
697
+ )
674
698
  elif args.tocfile:
675
699
  written_files.append(
676
700
  create_modules_toc_file(modules, args, args.tocfile, args.templatedir)