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

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

Potentially problematic release.


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

Files changed (424) hide show
  1. sphinx/__init__.py +6 -3
  2. sphinx/_cli/__init__.py +40 -20
  3. sphinx/_cli/util/colour.py +5 -4
  4. sphinx/_cli/util/errors.py +28 -11
  5. sphinx/application.py +361 -38
  6. sphinx/builders/__init__.py +229 -83
  7. sphinx/builders/_epub_base.py +118 -71
  8. sphinx/builders/changes.py +39 -21
  9. sphinx/builders/dirhtml.py +4 -4
  10. sphinx/builders/dummy.py +2 -5
  11. sphinx/builders/epub3.py +43 -22
  12. sphinx/builders/gettext.py +43 -25
  13. sphinx/builders/html/__init__.py +284 -218
  14. sphinx/builders/html/_assets.py +62 -26
  15. sphinx/builders/html/_build_info.py +76 -0
  16. sphinx/builders/html/transforms.py +11 -9
  17. sphinx/builders/latex/__init__.py +139 -81
  18. sphinx/builders/latex/constants.py +7 -7
  19. sphinx/builders/latex/nodes.py +3 -2
  20. sphinx/builders/latex/theming.py +7 -5
  21. sphinx/builders/latex/transforms.py +27 -19
  22. sphinx/builders/linkcheck.py +146 -72
  23. sphinx/builders/manpage.py +30 -13
  24. sphinx/builders/singlehtml.py +22 -14
  25. sphinx/builders/texinfo.py +67 -37
  26. sphinx/builders/text.py +5 -5
  27. sphinx/builders/xml.py +6 -9
  28. sphinx/cmd/build.py +282 -103
  29. sphinx/cmd/make_mode.py +106 -63
  30. sphinx/cmd/quickstart.py +341 -145
  31. sphinx/config.py +45 -12
  32. sphinx/deprecation.py +8 -2
  33. sphinx/directives/__init__.py +28 -19
  34. sphinx/directives/code.py +86 -56
  35. sphinx/directives/other.py +50 -36
  36. sphinx/directives/patches.py +29 -19
  37. sphinx/domains/__init__.py +20 -120
  38. sphinx/domains/_domains_container.py +281 -0
  39. sphinx/domains/_index.py +110 -0
  40. sphinx/domains/c/__init__.py +3 -3
  41. sphinx/domains/c/_parser.py +10 -6
  42. sphinx/domains/changeset.py +5 -3
  43. sphinx/domains/citation.py +5 -3
  44. sphinx/domains/cpp/__init__.py +9 -11
  45. sphinx/domains/cpp/_parser.py +8 -7
  46. sphinx/domains/index.py +3 -3
  47. sphinx/domains/javascript.py +12 -7
  48. sphinx/domains/math.py +2 -2
  49. sphinx/domains/python/__init__.py +10 -5
  50. sphinx/domains/python/_object.py +1 -1
  51. sphinx/domains/rst.py +5 -5
  52. sphinx/domains/std/__init__.py +16 -11
  53. sphinx/environment/__init__.py +206 -146
  54. sphinx/environment/adapters/asset.py +3 -2
  55. sphinx/environment/adapters/indexentries.py +74 -33
  56. sphinx/environment/adapters/toctree.py +100 -43
  57. sphinx/environment/collectors/__init__.py +19 -8
  58. sphinx/environment/collectors/asset.py +47 -15
  59. sphinx/environment/collectors/dependencies.py +8 -4
  60. sphinx/environment/collectors/metadata.py +7 -2
  61. sphinx/environment/collectors/title.py +7 -2
  62. sphinx/environment/collectors/toctree.py +54 -22
  63. sphinx/errors.py +4 -1
  64. sphinx/events.py +314 -7
  65. sphinx/ext/apidoc.py +42 -18
  66. sphinx/ext/autodoc/__init__.py +52 -24
  67. sphinx/ext/autodoc/importer.py +6 -9
  68. sphinx/ext/autosectionlabel.py +1 -2
  69. sphinx/ext/autosummary/__init__.py +3 -1
  70. sphinx/ext/autosummary/generate.py +28 -14
  71. sphinx/ext/coverage.py +7 -7
  72. sphinx/ext/doctest.py +4 -8
  73. sphinx/ext/duration.py +6 -5
  74. sphinx/ext/inheritance_diagram.py +1 -1
  75. sphinx/ext/intersphinx/_cli.py +6 -4
  76. sphinx/ext/intersphinx/_load.py +77 -32
  77. sphinx/ext/intersphinx/_resolve.py +173 -79
  78. sphinx/ext/intersphinx/_shared.py +7 -5
  79. sphinx/ext/linkcode.py +7 -1
  80. sphinx/ext/mathjax.py +1 -2
  81. sphinx/ext/napoleon/__init__.py +37 -24
  82. sphinx/ext/napoleon/docstring.py +202 -134
  83. sphinx/ext/todo.py +5 -3
  84. sphinx/highlighting.py +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 +133 -13
  288. sphinx/search/__init__.py +146 -87
  289. sphinx/search/da.py +2 -4
  290. sphinx/search/de.py +2 -4
  291. sphinx/search/en.py +4 -4
  292. sphinx/search/es.py +2 -4
  293. sphinx/search/fi.py +2 -4
  294. sphinx/search/fr.py +2 -4
  295. sphinx/search/hu.py +2 -4
  296. sphinx/search/it.py +2 -4
  297. sphinx/search/ja.py +55 -32
  298. sphinx/search/nl.py +2 -4
  299. sphinx/search/no.py +2 -4
  300. sphinx/search/pt.py +2 -4
  301. sphinx/search/ro.py +0 -2
  302. sphinx/search/ru.py +2 -4
  303. sphinx/search/sv.py +2 -4
  304. sphinx/search/tr.py +0 -2
  305. sphinx/search/zh.py +18 -13
  306. sphinx/templates/graphviz/graphviz.css +0 -7
  307. sphinx/testing/fixtures.py +6 -5
  308. sphinx/testing/path.py +7 -5
  309. sphinx/testing/util.py +63 -29
  310. sphinx/texinputs/sphinx.sty +107 -39
  311. sphinx/texinputs/sphinxlatexadmonitions.sty +51 -35
  312. sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
  313. sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
  314. sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
  315. sphinx/texinputs/sphinxlatexlists.sty +1 -1
  316. sphinx/texinputs/sphinxlatexliterals.sty +4 -1
  317. sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
  318. sphinx/texinputs/sphinxlatexobjects.sty +1 -1
  319. sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
  320. sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
  321. sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
  322. sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
  323. sphinx/texinputs/sphinxlatextables.sty +1 -1
  324. sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
  325. sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
  326. sphinx/themes/agogo/layout.html +1 -10
  327. sphinx/themes/agogo/static/agogo.css.jinja +0 -7
  328. sphinx/themes/basic/defindex.html +1 -8
  329. sphinx/themes/basic/domainindex.html +1 -9
  330. sphinx/themes/basic/genindex-single.html +1 -9
  331. sphinx/themes/basic/genindex-split.html +1 -9
  332. sphinx/themes/basic/genindex.html +1 -9
  333. sphinx/themes/basic/globaltoc.html +1 -9
  334. sphinx/themes/basic/layout.html +1 -9
  335. sphinx/themes/basic/localtoc.html +1 -9
  336. sphinx/themes/basic/page.html +1 -9
  337. sphinx/themes/basic/relations.html +1 -9
  338. sphinx/themes/basic/search.html +1 -9
  339. sphinx/themes/basic/searchbox.html +1 -9
  340. sphinx/themes/basic/searchfield.html +4 -10
  341. sphinx/themes/basic/sourcelink.html +1 -9
  342. sphinx/themes/basic/static/basic.css.jinja +2 -13
  343. sphinx/themes/basic/static/doctools.js +0 -7
  344. sphinx/themes/basic/static/language_data.js.jinja +0 -7
  345. sphinx/themes/basic/static/searchtools.js +25 -13
  346. sphinx/themes/bizstyle/layout.html +1 -9
  347. sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
  348. sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
  349. sphinx/themes/classic/layout.html +1 -9
  350. sphinx/themes/classic/static/classic.css.jinja +0 -7
  351. sphinx/themes/classic/static/sidebar.js.jinja +0 -6
  352. sphinx/themes/epub/epub-cover.html +1 -9
  353. sphinx/themes/epub/layout.html +1 -9
  354. sphinx/themes/epub/static/epub.css.jinja +0 -7
  355. sphinx/themes/haiku/layout.html +1 -9
  356. sphinx/themes/haiku/static/haiku.css.jinja +0 -6
  357. sphinx/themes/nature/static/nature.css.jinja +0 -7
  358. sphinx/themes/nonav/layout.html +1 -9
  359. sphinx/themes/nonav/static/nonav.css.jinja +0 -7
  360. sphinx/themes/pyramid/static/epub.css.jinja +0 -7
  361. sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
  362. sphinx/themes/scrolls/layout.html +1 -10
  363. sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
  364. sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
  365. sphinx/themes/traditional/static/traditional.css.jinja +0 -7
  366. sphinx/theming.py +18 -6
  367. sphinx/transforms/__init__.py +56 -35
  368. sphinx/transforms/compact_bullet_list.py +3 -2
  369. sphinx/transforms/i18n.py +132 -50
  370. sphinx/transforms/post_transforms/__init__.py +94 -43
  371. sphinx/transforms/post_transforms/code.py +7 -6
  372. sphinx/transforms/post_transforms/images.py +71 -54
  373. sphinx/transforms/references.py +1 -2
  374. sphinx/util/__init__.py +23 -194
  375. sphinx/util/_files.py +80 -0
  376. sphinx/util/_importer.py +27 -0
  377. sphinx/util/_io.py +1 -2
  378. sphinx/util/_lines.py +26 -0
  379. sphinx/util/_pathlib.py +5 -2
  380. sphinx/util/_serialise.py +53 -0
  381. sphinx/util/_timestamps.py +2 -1
  382. sphinx/util/_uri.py +16 -0
  383. sphinx/util/cfamily.py +48 -25
  384. sphinx/util/console.py +1 -0
  385. sphinx/util/display.py +1 -1
  386. sphinx/util/docfields.py +125 -45
  387. sphinx/util/docstrings.py +1 -1
  388. sphinx/util/docutils.py +118 -44
  389. sphinx/util/exceptions.py +11 -5
  390. sphinx/util/fileutil.py +53 -32
  391. sphinx/util/http_date.py +9 -7
  392. sphinx/util/i18n.py +49 -16
  393. sphinx/util/images.py +7 -6
  394. sphinx/util/inspect.py +29 -12
  395. sphinx/util/inventory.py +47 -29
  396. sphinx/util/logging.py +58 -85
  397. sphinx/util/matching.py +3 -3
  398. sphinx/util/math.py +1 -1
  399. sphinx/util/nodes.py +176 -108
  400. sphinx/util/osutil.py +13 -10
  401. sphinx/util/parallel.py +5 -4
  402. sphinx/util/parsing.py +5 -3
  403. sphinx/util/png.py +3 -3
  404. sphinx/util/requests.py +8 -4
  405. sphinx/util/rst.py +5 -3
  406. sphinx/util/tags.py +5 -2
  407. sphinx/util/template.py +26 -11
  408. sphinx/util/texescape.py +2 -2
  409. sphinx/util/typing.py +89 -38
  410. sphinx/versioning.py +3 -1
  411. sphinx/writers/html.py +22 -7
  412. sphinx/writers/html5.py +113 -64
  413. sphinx/writers/latex.py +408 -221
  414. sphinx/writers/manpage.py +25 -15
  415. sphinx/writers/texinfo.py +94 -82
  416. sphinx/writers/text.py +87 -53
  417. sphinx/writers/xml.py +5 -4
  418. sphinx-8.1.0.dist-info/LICENSE.rst +31 -0
  419. {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
  420. sphinx-8.1.0.dist-info/RECORD +598 -0
  421. sphinx-8.0.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.0.dist-info}/WHEEL +0 -0
  424. {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
@@ -40,10 +40,10 @@ if TYPE_CHECKING:
40
40
  tuple[
41
41
  _IndexEntryTargets,
42
42
  list[tuple[str, _IndexEntryTargets]],
43
- _IndexEntryCategoryKey
44
- ]
43
+ _IndexEntryCategoryKey,
44
+ ],
45
45
  ]
46
- ]
46
+ ],
47
47
  ]
48
48
  ]
49
49
 
@@ -65,7 +65,7 @@ class IndexEntries:
65
65
  new: _IndexEntryMap = {}
66
66
 
67
67
  rel_uri: str | Literal[False]
68
- index_domain = self.env.domains['index']
68
+ index_domain = self.env.domains.index_domain
69
69
  for docname, entries in index_domain.entries.items():
70
70
  try:
71
71
  rel_uri = builder.get_relative_uri('genindex', docname)
@@ -80,41 +80,77 @@ class IndexEntries:
80
80
  try:
81
81
  entry, sub_entry = _split_into(2, 'single', value)
82
82
  except ValueError:
83
- entry, = _split_into(1, 'single', value)
83
+ (entry,) = _split_into(1, 'single', value)
84
84
  sub_entry = ''
85
- _add_entry(entry, sub_entry, main,
86
- dic=new, link=uri, key=category_key)
85
+ _add_entry(
86
+ entry, sub_entry, main, dic=new, link=uri, key=category_key
87
+ )
87
88
  elif entry_type == 'pair':
88
89
  first, second = _split_into(2, 'pair', value)
89
- _add_entry(first, second, main,
90
- dic=new, link=uri, key=category_key)
91
- _add_entry(second, first, main,
92
- dic=new, link=uri, key=category_key)
90
+ _add_entry(
91
+ first, second, main, dic=new, link=uri, key=category_key
92
+ )
93
+ _add_entry(
94
+ second, first, main, dic=new, link=uri, key=category_key
95
+ )
93
96
  elif entry_type == 'triple':
94
97
  first, second, third = _split_into(3, 'triple', value)
95
- _add_entry(first, second + ' ' + third, main,
96
- dic=new, link=uri, key=category_key)
97
- _add_entry(second, third + ', ' + first, main,
98
- dic=new, link=uri, key=category_key)
99
- _add_entry(third, first + ' ' + second, main,
100
- dic=new, link=uri, key=category_key)
98
+ _add_entry(
99
+ first,
100
+ second + ' ' + third,
101
+ main,
102
+ dic=new,
103
+ link=uri,
104
+ key=category_key,
105
+ )
106
+ _add_entry(
107
+ second,
108
+ third + ', ' + first,
109
+ main,
110
+ dic=new,
111
+ link=uri,
112
+ key=category_key,
113
+ )
114
+ _add_entry(
115
+ third,
116
+ first + ' ' + second,
117
+ main,
118
+ dic=new,
119
+ link=uri,
120
+ key=category_key,
121
+ )
101
122
  elif entry_type == 'see':
102
123
  first, second = _split_into(2, 'see', value)
103
- _add_entry(first, _('see %s') % second, None,
104
- dic=new, link=False, key=category_key)
124
+ _add_entry(
125
+ first,
126
+ _('see %s') % second,
127
+ None,
128
+ dic=new,
129
+ link=False,
130
+ key=category_key,
131
+ )
105
132
  elif entry_type == 'seealso':
106
133
  first, second = _split_into(2, 'see', value)
107
- _add_entry(first, _('see also %s') % second, None,
108
- dic=new, link=False, key=category_key)
134
+ _add_entry(
135
+ first,
136
+ _('see also %s') % second,
137
+ None,
138
+ dic=new,
139
+ link=False,
140
+ key=category_key,
141
+ )
109
142
  else:
110
- logger.warning(__('unknown index entry type %r'), entry_type,
111
- location=docname)
143
+ logger.warning(
144
+ __('unknown index entry type %r'),
145
+ entry_type,
146
+ location=docname,
147
+ )
112
148
  except ValueError as err:
113
149
  logger.warning(str(err), location=docname)
114
150
 
115
- for (targets, sub_items, _category_key) in new.values():
151
+ for targets, sub_items, _category_key in new.values():
116
152
  targets.sort(key=_key_func_0)
117
- for (sub_targets, _sub_category_key) in sub_items.values():
153
+ for sub_targets, _sub_category_key in sub_items.values():
118
154
  sub_targets.sort(key=_key_func_0)
119
155
 
120
156
  new_list: list[tuple[str, _IndexEntry]] = sorted(new.items(), key=_key_func_1)
@@ -139,8 +175,8 @@ class IndexEntries:
139
175
  if old_key == m.group(1):
140
176
  # prefixes match: add entry as subitem of the
141
177
  # previous entry
142
- old_sub_items.setdefault(
143
- m.group(2), ([], category_key))[0].extend(targets)
178
+ prev = old_sub_items.setdefault(m[2], ([], category_key))
179
+ prev[0].extend(targets)
144
180
  del new_list[i]
145
181
  continue
146
182
  old_key = m.group(1)
@@ -150,14 +186,13 @@ class IndexEntries:
150
186
  i += 1
151
187
 
152
188
  grouped = []
153
- for (group_key, group) in groupby(new_list, _group_by_func):
189
+ for group_key, group in groupby(new_list, _group_by_func):
154
190
  group_list = []
155
191
  for group_entry in group:
156
192
  entry_key, (targets, sub_items, category_key) = group_entry
157
193
  pairs = [
158
194
  (sub_key, sub_targets)
159
- for (sub_key, (sub_targets, _sub_category_key))
160
- in sub_items.items()
195
+ for (sub_key, (sub_targets, _sub_category_key)) in sub_items.items()
161
196
  ]
162
197
  pairs.sort(key=_key_func_2)
163
198
  group_list.append((entry_key, (targets, pairs, category_key)))
@@ -165,9 +200,15 @@ class IndexEntries:
165
200
  return grouped
166
201
 
167
202
 
168
- def _add_entry(word: str, subword: str, main: str | None, *,
169
- dic: _IndexEntryMap,
170
- link: str | Literal[False], key: _IndexEntryCategoryKey) -> None:
203
+ def _add_entry(
204
+ word: str,
205
+ subword: str,
206
+ main: str | None,
207
+ *,
208
+ dic: _IndexEntryMap,
209
+ link: str | Literal[False],
210
+ key: _IndexEntryCategoryKey,
211
+ ) -> None:
171
212
  entry = dic.setdefault(word, ([], {}, key))
172
213
  if subword:
173
214
  targets = entry[1].setdefault(subword, ([], key))[0]
@@ -24,7 +24,9 @@ if TYPE_CHECKING:
24
24
  logger = logging.getLogger(__name__)
25
25
 
26
26
 
27
- def note_toctree(env: BuildEnvironment, docname: str, toctreenode: addnodes.toctree) -> None:
27
+ def note_toctree(
28
+ env: BuildEnvironment, docname: str, toctreenode: addnodes.toctree
29
+ ) -> None:
28
30
  """Note a TOC tree directive in a document and gather information about
29
31
  file relations from it.
30
32
  """
@@ -87,9 +89,7 @@ def global_toctree_for_doc(
87
89
  )
88
90
  for toctree_node in env.master_doctree.findall(addnodes.toctree)
89
91
  )
90
- toctrees = [
91
- toctree for toctree in resolved if toctree is not None
92
- ]
92
+ toctrees = [toctree for toctree in resolved if toctree is not None]
93
93
 
94
94
  if not toctrees:
95
95
  return None
@@ -100,9 +100,16 @@ def global_toctree_for_doc(
100
100
 
101
101
 
102
102
  def _resolve_toctree(
103
- env: BuildEnvironment, docname: str, builder: Builder, toctree: addnodes.toctree, *,
104
- prune: bool = True, maxdepth: int = 0, titles_only: bool = False,
105
- collapse: bool = False, includehidden: bool = False,
103
+ env: BuildEnvironment,
104
+ docname: str,
105
+ builder: Builder,
106
+ toctree: addnodes.toctree,
107
+ *,
108
+ prune: bool = True,
109
+ maxdepth: int = 0,
110
+ titles_only: bool = False,
111
+ collapse: bool = False,
112
+ includehidden: bool = False,
106
113
  ) -> Element | None:
107
114
  """Resolve a *toctree* node into individual bullet lists with titles
108
115
  as items, returning None (if no containing titles are found) or
@@ -178,9 +185,13 @@ def _resolve_toctree(
178
185
 
179
186
  # prune the tree to maxdepth, also set toc depth and current classes
180
187
  _toctree_add_classes(newnode, 1, docname)
181
- newnode = _toctree_copy(newnode, 1, maxdepth if prune else 0, collapse, builder.tags)
188
+ newnode = _toctree_copy(
189
+ newnode, 1, maxdepth if prune else 0, collapse, builder.tags
190
+ )
182
191
 
183
- if isinstance(newnode[-1], nodes.Element) and len(newnode[-1]) == 0: # No titles found
192
+ if (
193
+ isinstance(newnode[-1], nodes.Element) and len(newnode[-1]) == 0
194
+ ): # No titles found
184
195
  return None
185
196
 
186
197
  # set the target paths in the toctrees (they are not known at TOC
@@ -208,11 +219,20 @@ def _entries_from_toctree(
208
219
  ) -> list[Element]:
209
220
  """Return TOC entries for a toctree node."""
210
221
  entries: list[Element] = []
211
- for (title, ref) in toctreenode['entries']:
222
+ for title, ref in toctreenode['entries']:
212
223
  try:
213
224
  toc, refdoc = _toctree_entry(
214
- title, ref, env, prune, collapse, tags, toctree_ancestors,
215
- included, excluded, toctreenode, parents,
225
+ title,
226
+ ref,
227
+ env,
228
+ prune,
229
+ collapse,
230
+ tags,
231
+ toctree_ancestors,
232
+ included,
233
+ excluded,
234
+ toctreenode,
235
+ parents,
216
236
  )
217
237
  except LookupError:
218
238
  continue
@@ -294,10 +314,14 @@ def _toctree_entry(
294
314
  toc = _toctree_generated_entry(title, ref)
295
315
  else:
296
316
  if ref in parents:
297
- logger.warning(__('circular toctree references '
298
- 'detected, ignoring: %s <- %s'),
299
- ref, ' <- '.join(parents),
300
- location=ref, type='toc', subtype='circular')
317
+ logger.warning(
318
+ __('circular toctree references ' 'detected, ignoring: %s <- %s'),
319
+ ref,
320
+ ' <- '.join(parents),
321
+ location=ref,
322
+ type='toc',
323
+ subtype='circular',
324
+ )
301
325
  msg = 'circular reference'
302
326
  raise LookupError(msg)
303
327
 
@@ -314,9 +338,16 @@ def _toctree_entry(
314
338
 
315
339
  if not toc.children:
316
340
  # empty toc means: no titles will show up in the toctree
317
- logger.warning(__('toctree contains reference to document %r that '
318
- "doesn't have a title: no link will be generated"),
319
- ref, location=toctreenode, type='toc', subtype='no_title')
341
+ logger.warning(
342
+ __(
343
+ 'toctree contains reference to document %r that '
344
+ "doesn't have a title: no link will be generated"
345
+ ),
346
+ ref,
347
+ location=toctreenode,
348
+ type='toc',
349
+ subtype='no_title',
350
+ )
320
351
  except KeyError:
321
352
  # this is raised if the included file does not exist
322
353
  ref_path = str(env.doc2path(ref, False))
@@ -335,9 +366,9 @@ def _toctree_entry(
335
366
  def _toctree_url_entry(title: str, ref: str) -> nodes.bullet_list:
336
367
  if title is None:
337
368
  title = ref
338
- reference = nodes.reference('', '', internal=False,
339
- refuri=ref, anchorname='',
340
- *[nodes.Text(title)])
369
+ reference = nodes.reference(
370
+ '', '', internal=False, refuri=ref, anchorname='', *[nodes.Text(title)]
371
+ )
341
372
  para = addnodes.compact_paragraph('', '', reference)
342
373
  item = nodes.list_item('', para)
343
374
  toc = nodes.bullet_list('', item)
@@ -345,16 +376,17 @@ def _toctree_url_entry(title: str, ref: str) -> nodes.bullet_list:
345
376
 
346
377
 
347
378
  def _toctree_self_entry(
348
- title: str, ref: str, titles: dict[str, nodes.title],
379
+ title: str,
380
+ ref: str,
381
+ titles: dict[str, nodes.title],
349
382
  ) -> nodes.bullet_list:
350
383
  # 'self' refers to the document from which this
351
384
  # toctree originates
352
385
  if not title:
353
386
  title = clean_astext(titles[ref])
354
- reference = nodes.reference('', '', internal=True,
355
- refuri=ref,
356
- anchorname='',
357
- *[nodes.Text(title)])
387
+ reference = nodes.reference(
388
+ '', '', internal=True, refuri=ref, anchorname='', *[nodes.Text(title)]
389
+ )
358
390
  para = addnodes.compact_paragraph('', '', reference)
359
391
  item = nodes.list_item('', para)
360
392
  # don't show subitems
@@ -368,8 +400,7 @@ def _toctree_generated_entry(title: str, ref: str) -> nodes.bullet_list:
368
400
  docname, sectionname = StandardDomain._virtual_doc_names[ref]
369
401
  if not title:
370
402
  title = sectionname
371
- reference = nodes.reference('', title, internal=True,
372
- refuri=docname, anchorname='')
403
+ reference = nodes.reference('', title, internal=True, refuri=docname, anchorname='')
373
404
  para = addnodes.compact_paragraph('', '', reference)
374
405
  item = nodes.list_item('', para)
375
406
  # don't show subitems
@@ -434,11 +465,13 @@ def _toctree_add_classes(node: Element, depth: int, docname: str) -> None:
434
465
  ET = TypeVar('ET', bound=Element)
435
466
 
436
467
 
437
- def _toctree_copy(node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tags) -> ET:
468
+ def _toctree_copy(
469
+ node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tags
470
+ ) -> ET:
438
471
  """Utility: Cut and deep-copy a TOC at a specified depth."""
439
- keep_bullet_list_sub_nodes = (depth <= 1
440
- or ((depth <= maxdepth or maxdepth <= 0)
441
- and (not collapse or 'iscurrent' in node)))
472
+ keep_bullet_list_sub_nodes = depth <= 1 or (
473
+ (depth <= maxdepth or maxdepth <= 0) and (not collapse or 'iscurrent' in node)
474
+ )
442
475
 
443
476
  copy = node.copy()
444
477
  for subnode in node.children:
@@ -459,9 +492,15 @@ def _toctree_copy(node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tag
459
492
  # only keep children if the only node matches the tags
460
493
  if _only_node_keep_children(subnode, tags):
461
494
  for child in subnode.children:
462
- copy.append(_toctree_copy(
463
- child, depth, maxdepth, collapse, tags, # type: ignore[type-var]
464
- ))
495
+ copy.append(
496
+ _toctree_copy(
497
+ child,
498
+ depth,
499
+ maxdepth,
500
+ collapse,
501
+ tags, # type: ignore[type-var]
502
+ )
503
+ )
465
504
  elif isinstance(subnode, nodes.reference | nodes.title):
466
505
  # deep copy references and captions
467
506
  sub_node_copy = subnode.copy()
@@ -476,7 +515,8 @@ def _toctree_copy(node: ET, depth: int, maxdepth: int, collapse: bool, tags: Tag
476
515
 
477
516
 
478
517
  def _get_toctree_ancestors(
479
- toctree_includes: dict[str, list[str]], docname: str,
518
+ toctree_includes: dict[str, list[str]],
519
+ docname: str,
480
520
  ) -> Set[str]:
481
521
  parent: dict[str, str] = {}
482
522
  for p, children in toctree_includes.items():
@@ -497,11 +537,22 @@ class TocTree:
497
537
  def note(self, docname: str, toctreenode: addnodes.toctree) -> None:
498
538
  note_toctree(self.env, docname, toctreenode)
499
539
 
500
- def resolve(self, docname: str, builder: Builder, toctree: addnodes.toctree,
501
- prune: bool = True, maxdepth: int = 0, titles_only: bool = False,
502
- collapse: bool = False, includehidden: bool = False) -> Element | None:
540
+ def resolve(
541
+ self,
542
+ docname: str,
543
+ builder: Builder,
544
+ toctree: addnodes.toctree,
545
+ prune: bool = True,
546
+ maxdepth: int = 0,
547
+ titles_only: bool = False,
548
+ collapse: bool = False,
549
+ includehidden: bool = False,
550
+ ) -> Element | None:
503
551
  return _resolve_toctree(
504
- self.env, docname, builder, toctree,
552
+ self.env,
553
+ docname,
554
+ builder,
555
+ toctree,
505
556
  prune=prune,
506
557
  maxdepth=maxdepth,
507
558
  titles_only=titles_only,
@@ -516,6 +567,12 @@ class TocTree:
516
567
  return document_toc(self.env, docname, self.env.app.builder.tags)
517
568
 
518
569
  def get_toctree_for(
519
- self, docname: str, builder: Builder, collapse: bool, **kwargs: Any,
570
+ self,
571
+ docname: str,
572
+ builder: Builder,
573
+ collapse: bool,
574
+ **kwargs: Any,
520
575
  ) -> Element | None:
521
- return global_toctree_for_doc(self.env, docname, builder, collapse=collapse, **kwargs)
576
+ return global_toctree_for_doc(
577
+ self.env, docname, builder, collapse=collapse, **kwargs
578
+ )
@@ -29,10 +29,10 @@ class EnvironmentCollector:
29
29
  def enable(self, app: Sphinx) -> None:
30
30
  assert self.listener_ids is None
31
31
  self.listener_ids = {
32
- 'doctree-read': app.connect('doctree-read', self.process_doc),
33
- 'env-merge-info': app.connect('env-merge-info', self.merge_other),
34
- 'env-purge-doc': app.connect('env-purge-doc', self.clear_doc),
35
- 'env-get-updated': app.connect('env-get-updated', self.get_updated_docs),
32
+ 'doctree-read': app.connect('doctree-read', self.process_doc),
33
+ 'env-merge-info': app.connect('env-merge-info', self.merge_other),
34
+ 'env-purge-doc': app.connect('env-purge-doc', self.clear_doc),
35
+ 'env-get-updated': app.connect('env-get-updated', self.get_updated_docs),
36
36
  'env-get-outdated': app.connect('env-get-outdated', self.get_outdated_docs),
37
37
  }
38
38
 
@@ -51,8 +51,13 @@ class EnvironmentCollector:
51
51
  """
52
52
  raise NotImplementedError
53
53
 
54
- def merge_other(self, app: Sphinx, env: BuildEnvironment,
55
- docnames: set[str], other: BuildEnvironment) -> None:
54
+ def merge_other(
55
+ self,
56
+ app: Sphinx,
57
+ env: BuildEnvironment,
58
+ docnames: set[str],
59
+ other: BuildEnvironment,
60
+ ) -> None:
56
61
  """Merge in specified data regarding docnames from a different `BuildEnvironment`
57
62
  object which coming from a subprocess in parallel builds.
58
63
 
@@ -78,8 +83,14 @@ class EnvironmentCollector:
78
83
  """
79
84
  return []
80
85
 
81
- def get_outdated_docs(self, app: Sphinx, env: BuildEnvironment,
82
- added: set[str], changed: set[str], removed: set[str]) -> list[str]:
86
+ def get_outdated_docs(
87
+ self,
88
+ app: Sphinx,
89
+ env: BuildEnvironment,
90
+ added: set[str],
91
+ changed: set[str],
92
+ removed: set[str],
93
+ ) -> list[str]:
83
94
  """Return a list of docnames to re-read.
84
95
 
85
96
  This method is called before reading the documents.
@@ -33,8 +33,13 @@ class ImageCollector(EnvironmentCollector):
33
33
  def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
34
34
  env.images.purge_doc(docname)
35
35
 
36
- def merge_other(self, app: Sphinx, env: BuildEnvironment,
37
- docnames: set[str], other: BuildEnvironment) -> None:
36
+ def merge_other(
37
+ self,
38
+ app: Sphinx,
39
+ env: BuildEnvironment,
40
+ docnames: set[str],
41
+ other: BuildEnvironment,
42
+ ) -> None:
38
43
  env.images.merge_other(docnames, other.images)
39
44
 
40
45
  def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
@@ -86,17 +91,26 @@ class ImageCollector(EnvironmentCollector):
86
91
  for imgpath in candidates.values():
87
92
  app.env.dependencies[docname].add(imgpath)
88
93
  if not os.access(path.join(app.srcdir, imgpath), os.R_OK):
89
- logger.warning(__('image file not readable: %s'), imgpath,
90
- location=node, type='image', subtype='not_readable')
94
+ logger.warning(
95
+ __('image file not readable: %s'),
96
+ imgpath,
97
+ location=node,
98
+ type='image',
99
+ subtype='not_readable',
100
+ )
91
101
  continue
92
102
  app.env.images.add_file(docname, imgpath)
93
103
 
94
- def collect_candidates(self, env: BuildEnvironment, imgpath: str,
95
- candidates: dict[str, str], node: Node) -> None:
104
+ def collect_candidates(
105
+ self,
106
+ env: BuildEnvironment,
107
+ imgpath: str,
108
+ candidates: dict[str, str],
109
+ node: Node,
110
+ ) -> None:
96
111
  globbed: dict[str, list[str]] = {}
97
112
  for filename in glob(imgpath):
98
- new_imgpath = relative_path(path.join(env.srcdir, 'dummy'),
99
- filename)
113
+ new_imgpath = relative_path(path.join(env.srcdir, 'dummy'), filename)
100
114
  try:
101
115
  mimetype = guess_mimetype(filename)
102
116
  if mimetype is None:
@@ -105,8 +119,14 @@ class ImageCollector(EnvironmentCollector):
105
119
  if mimetype not in candidates:
106
120
  globbed.setdefault(mimetype, []).append(new_imgpath)
107
121
  except OSError as err:
108
- logger.warning(__('image file %s not readable: %s'), filename, err,
109
- location=node, type='image', subtype='not_readable')
122
+ logger.warning(
123
+ __('image file %s not readable: %s'),
124
+ filename,
125
+ err,
126
+ location=node,
127
+ type='image',
128
+ subtype='not_readable',
129
+ )
110
130
  for key, files in globbed.items():
111
131
  candidates[key] = min(files, key=len) # select by similarity
112
132
 
@@ -117,8 +137,13 @@ class DownloadFileCollector(EnvironmentCollector):
117
137
  def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
118
138
  env.dlfiles.purge_doc(docname)
119
139
 
120
- def merge_other(self, app: Sphinx, env: BuildEnvironment,
121
- docnames: set[str], other: BuildEnvironment) -> None:
140
+ def merge_other(
141
+ self,
142
+ app: Sphinx,
143
+ env: BuildEnvironment,
144
+ docnames: set[str],
145
+ other: BuildEnvironment,
146
+ ) -> None:
122
147
  env.dlfiles.merge_other(docnames, other.dlfiles)
123
148
 
124
149
  def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
@@ -131,10 +156,17 @@ class DownloadFileCollector(EnvironmentCollector):
131
156
  rel_filename, filename = app.env.relfn2path(targetname, app.env.docname)
132
157
  app.env.dependencies[app.env.docname].add(rel_filename)
133
158
  if not os.access(filename, os.R_OK):
134
- logger.warning(__('download file not readable: %s'), filename,
135
- location=node, type='download', subtype='not_readable')
159
+ logger.warning(
160
+ __('download file not readable: %s'),
161
+ filename,
162
+ location=node,
163
+ type='download',
164
+ subtype='not_readable',
165
+ )
136
166
  continue
137
- node['filename'] = app.env.dlfiles.add_file(app.env.docname, rel_filename)
167
+ node['filename'] = app.env.dlfiles.add_file(
168
+ app.env.docname, rel_filename
169
+ )
138
170
 
139
171
 
140
172
  def setup(app: Sphinx) -> ExtensionMetadata:
@@ -25,8 +25,13 @@ class DependenciesCollector(EnvironmentCollector):
25
25
  def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
26
26
  env.dependencies.pop(docname, None)
27
27
 
28
- def merge_other(self, app: Sphinx, env: BuildEnvironment,
29
- docnames: set[str], other: BuildEnvironment) -> None:
28
+ def merge_other(
29
+ self,
30
+ app: Sphinx,
31
+ env: BuildEnvironment,
32
+ docnames: set[str],
33
+ other: BuildEnvironment,
34
+ ) -> None:
30
35
  for docname in docnames:
31
36
  if docname in other.dependencies:
32
37
  env.dependencies[docname] = other.dependencies[docname]
@@ -43,8 +48,7 @@ class DependenciesCollector(EnvironmentCollector):
43
48
  # one relative to the srcdir
44
49
  if isinstance(dep, bytes):
45
50
  dep = dep.decode(fs_encoding)
46
- relpath = relative_path(frompath,
47
- path.normpath(path.join(cwd, dep)))
51
+ relpath = relative_path(frompath, path.normpath(path.join(cwd, dep)))
48
52
  app.env.dependencies[app.env.docname].add(relpath)
49
53
 
50
54
 
@@ -20,8 +20,13 @@ class MetadataCollector(EnvironmentCollector):
20
20
  def clear_doc(self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
21
21
  env.metadata.pop(docname, None)
22
22
 
23
- def merge_other(self, app: Sphinx, env: BuildEnvironment,
24
- docnames: set[str], other: BuildEnvironment) -> None:
23
+ def merge_other(
24
+ self,
25
+ app: Sphinx,
26
+ env: BuildEnvironment,
27
+ docnames: set[str],
28
+ other: BuildEnvironment,
29
+ ) -> None:
25
30
  for docname in docnames:
26
31
  env.metadata[docname] = other.metadata[docname]
27
32
 
@@ -22,8 +22,13 @@ class TitleCollector(EnvironmentCollector):
22
22
  env.titles.pop(docname, None)
23
23
  env.longtitles.pop(docname, None)
24
24
 
25
- def merge_other(self, app: Sphinx, env: BuildEnvironment,
26
- docnames: set[str], other: BuildEnvironment) -> None:
25
+ def merge_other(
26
+ self,
27
+ app: Sphinx,
28
+ env: BuildEnvironment,
29
+ docnames: set[str],
30
+ other: BuildEnvironment,
31
+ ) -> None:
27
32
  for docname in docnames:
28
33
  env.titles[docname] = other.titles[docname]
29
34
  env.longtitles[docname] = other.longtitles[docname]