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
sphinx/writers/manpage.py CHANGED
@@ -98,8 +98,10 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
98
98
  if self.config.today:
99
99
  self._docinfo['date'] = self.config.today
100
100
  else:
101
- self._docinfo['date'] = format_date(self.config.today_fmt or _('%b %d, %Y'),
102
- language=self.config.language)
101
+ today_fmt = self.config.today_fmt or _('%b %d, %Y')
102
+ self._docinfo['date'] = format_date(
103
+ today_fmt, language=self.config.language
104
+ )
103
105
  self._docinfo['copyright'] = self.config.copyright
104
106
  self._docinfo['version'] = self.config.version
105
107
  self._docinfo['manual_group'] = self.config.project
@@ -110,11 +112,12 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
110
112
 
111
113
  # overwritten -- added quotes around all .TH arguments
112
114
  def header(self) -> str:
113
- tmpl = (".TH \"%(title_upper)s\" \"%(manual_section)s\""
114
- " \"%(date)s\" \"%(version)s\" \"%(manual_group)s\"\n")
115
+ tmpl = (
116
+ '.TH "%(title_upper)s" "%(manual_section)s"'
117
+ ' "%(date)s" "%(version)s" "%(manual_group)s"\n'
118
+ )
115
119
  if self._docinfo['subtitle']:
116
- tmpl += (".SH NAME\n"
117
- "%(title)s \\- %(subtitle)s\n")
120
+ tmpl += '.SH NAME\n' '%(title)s \\- %(subtitle)s\n'
118
121
  return tmpl % self._docinfo
119
122
 
120
123
  def visit_start_of_file(self, node: Element) -> None:
@@ -312,7 +315,7 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
312
315
  is_safe_to_click = uri.startswith(('mailto:', 'http:', 'https:', 'ftp:'))
313
316
  if is_safe_to_click:
314
317
  # OSC 8 link start (using groff's device control directive).
315
- self.body.append(fr"\X'tty: link {uri}'")
318
+ self.body.append(rf"\X'tty: link {uri}'")
316
319
 
317
320
  self.body.append(self.defs['reference'][0])
318
321
  # avoid repeating escaping code... fine since
@@ -323,12 +326,14 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
323
326
  if uri and not uri.startswith('#'):
324
327
  # if configured, put the URL after the link
325
328
  if self.config.man_show_urls and node.astext() != uri:
326
- if uri.startswith('mailto:'):
327
- uri = uri[7:]
329
+ uri = uri.removeprefix('mailto:')
328
330
  self.body.extend([
329
331
  ' <',
330
- self.defs['strong'][0], uri, self.defs['strong'][1],
331
- '>'])
332
+ self.defs['strong'][0],
333
+ uri,
334
+ self.defs['strong'][1],
335
+ '>',
336
+ ])
332
337
  if is_safe_to_click:
333
338
  # OSC 8 link end.
334
339
  self.body.append(r"\X'tty: link'")
@@ -421,13 +426,19 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
421
426
 
422
427
  # overwritten: handle section titles better than in 0.6 release
423
428
  def visit_caption(self, node: Element) -> None:
424
- if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
429
+ if (
430
+ isinstance(node.parent, nodes.container)
431
+ and node.parent.get('literal_block')
432
+ ): # fmt: skip
425
433
  self.body.append('.sp\n')
426
434
  else:
427
435
  super().visit_caption(node)
428
436
 
429
437
  def depart_caption(self, node: Element) -> None:
430
- if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
438
+ if (
439
+ isinstance(node.parent, nodes.container)
440
+ and node.parent.get('literal_block')
441
+ ): # fmt: skip
431
442
  self.body.append('\n')
432
443
  else:
433
444
  super().depart_caption(node)
@@ -442,8 +453,7 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator): # type: ignore[mi
442
453
  # skip the document title
443
454
  raise nodes.SkipNode
444
455
  elif self.section_level == 1:
445
- self.body.append('.SH %s\n' %
446
- self.deunicode(node.astext().upper()))
456
+ self.body.append(f'.SH {self.deunicode(node.astext().upper())}\n')
447
457
  raise nodes.SkipNode
448
458
  return super().visit_title(node)
449
459
 
sphinx/writers/texinfo.py CHANGED
@@ -6,12 +6,11 @@ import re
6
6
  import textwrap
7
7
  from collections.abc import Iterable, Iterator
8
8
  from os import path
9
- from typing import TYPE_CHECKING, Any, cast
9
+ from typing import TYPE_CHECKING, Any, ClassVar, cast
10
10
 
11
11
  from docutils import nodes, writers
12
12
 
13
13
  from sphinx import __display_version__, addnodes
14
- from sphinx.domains.index import IndexDomain
15
14
  from sphinx.errors import ExtensionError
16
15
  from sphinx.locale import _, __, admonitionlabels
17
16
  from sphinx.util import logging
@@ -39,13 +38,13 @@ Copyright @copyright{} %(copyright)s
39
38
  @end quotation
40
39
  """
41
40
 
42
- TEMPLATE = """\
41
+ TEMPLATE = f"""\
43
42
  \\input texinfo @c -*-texinfo-*-
44
43
  @c %%**start of header
45
44
  @setfilename %(filename)s
46
45
  @documentencoding UTF-8
47
46
  @ifinfo
48
- @*Generated by Sphinx """ + __display_version__ + """.@*
47
+ @*Generated by Sphinx {__display_version__}.@*
49
48
  @end ifinfo
50
49
  @settitle %(title)s
51
50
  @defindex ge
@@ -105,20 +104,23 @@ def smart_capwords(s: str, sep: str | None = None) -> str:
105
104
  return (sep or ' ').join(words)
106
105
 
107
106
 
108
- class TexinfoWriter(writers.Writer): # type: ignore[misc]
107
+ class TexinfoWriter(writers.Writer): # type: ignore[type-arg]
109
108
  """Texinfo writer for generating Texinfo documents."""
110
109
 
111
110
  supported = ('texinfo', 'texi')
112
111
 
113
- settings_spec: tuple[str, Any, tuple[tuple[str, list[str], dict[str, str]], ...]] = (
114
- 'Texinfo Specific Options', None, (
115
- ("Name of the Info file", ['--texinfo-filename'], {'default': ''}),
112
+ settings_spec = (
113
+ 'Texinfo Specific Options',
114
+ None,
115
+ (
116
+ ('Name of the Info file', ['--texinfo-filename'], {'default': ''}),
116
117
  ('Dir entry', ['--texinfo-dir-entry'], {'default': ''}),
117
118
  ('Description', ['--texinfo-dir-description'], {'default': ''}),
118
- ('Category', ['--texinfo-dir-category'], {'default':
119
- 'Miscellaneous'})))
119
+ ('Category', ['--texinfo-dir-category'], {'default': 'Miscellaneous'}),
120
+ ),
121
+ )
120
122
 
121
- settings_defaults: dict[str, Any] = {}
123
+ settings_defaults: ClassVar[dict[str, Any]] = {}
122
124
 
123
125
  output: str
124
126
 
@@ -129,6 +131,7 @@ class TexinfoWriter(writers.Writer): # type: ignore[misc]
129
131
  self.builder = builder
130
132
 
131
133
  def translate(self) -> None:
134
+ assert isinstance(self.document, nodes.document)
132
135
  visitor = self.builder.create_translator(self.document, self.builder)
133
136
  self.visitor = cast(TexinfoTranslator, visitor)
134
137
  self.document.walkabout(visitor)
@@ -138,7 +141,6 @@ class TexinfoWriter(writers.Writer): # type: ignore[misc]
138
141
 
139
142
 
140
143
  class TexinfoTranslator(SphinxTranslator):
141
-
142
144
  ignore_missing_images = False
143
145
  builder: TexinfoBuilder
144
146
 
@@ -161,14 +163,14 @@ class TexinfoTranslator(SphinxTranslator):
161
163
  super().__init__(document, builder)
162
164
  self.init_settings()
163
165
 
164
- self.written_ids: set[str] = set() # node names and anchors in output
166
+ self.written_ids: set[str] = set() # node names and anchors in output
165
167
  # node names and anchors that should be in output
166
168
  self.referenced_ids: set[str] = set()
167
- self.indices: list[tuple[str, str]] = [] # (node name, content)
168
- self.short_ids: dict[str, str] = {} # anchors --> short ids
169
- self.node_names: dict[str, str] = {} # node name --> node's name to display
169
+ self.indices: list[tuple[str, str]] = [] # (node name, content)
170
+ self.short_ids: dict[str, str] = {} # anchors --> short ids
171
+ self.node_names: dict[str, str] = {} # node name --> node's name to display
170
172
  self.node_menus: dict[str, list[str]] = {} # node name --> node's menu entries
171
- self.rellinks: dict[str, list[str]] = {} # node name --> (next, previous, up)
173
+ self.rellinks: dict[str, list[str]] = {} # node name --> (next, previous, up)
172
174
 
173
175
  self.collect_indices()
174
176
  self.collect_node_names()
@@ -213,6 +215,10 @@ class TexinfoTranslator(SphinxTranslator):
213
215
  # -- Helper routines
214
216
 
215
217
  def init_settings(self) -> None:
218
+ today_fmt = self.config.today_fmt or _('%b %d, %Y')
219
+ today = self.config.today or format_date(
220
+ today_fmt, language=self.config.language
221
+ )
216
222
  elements = self.elements = self.default_elements.copy()
217
223
  elements.update({
218
224
  # if empty, the title is set to the first section title
@@ -223,9 +229,7 @@ class TexinfoTranslator(SphinxTranslator):
223
229
  'release': self.escape(self.config.release),
224
230
  'project': self.escape(self.config.project),
225
231
  'copyright': self.escape(self.config.copyright),
226
- 'date': self.escape(self.config.today or
227
- format_date(self.config.today_fmt or _('%b %d, %Y'),
228
- language=self.config.language)),
232
+ 'date': self.escape(today),
229
233
  })
230
234
  # title
231
235
  title: str = self.settings.title
@@ -244,12 +248,11 @@ class TexinfoTranslator(SphinxTranslator):
244
248
  entry = self.format_menu_entry(
245
249
  self.escape_menu(self.settings.texinfo_dir_entry),
246
250
  '(%s)' % elements['filename'],
247
- self.escape_arg(self.settings.texinfo_dir_description))
248
- elements['direntry'] = ('@dircategory %s\n'
249
- '@direntry\n'
250
- '%s'
251
- '@end direntry\n') % (
252
- self.escape_id(self.settings.texinfo_dir_category), entry)
251
+ self.escape_arg(self.settings.texinfo_dir_description),
252
+ )
253
+ elements['direntry'] = (
254
+ '@dircategory %s\n' '@direntry\n' '%s' '@end direntry\n'
255
+ ) % (self.escape_id(self.settings.texinfo_dir_category), entry)
253
256
  elements['copying'] = COPYING % elements
254
257
  # allow the user to override them all
255
258
  elements.update(self.settings.texinfo_elements)
@@ -263,8 +266,10 @@ class TexinfoTranslator(SphinxTranslator):
263
266
  def add_node_name(name: str) -> str:
264
267
  node_id = self.escape_id(name)
265
268
  nth, suffix = 1, ''
266
- while node_id + suffix in self.written_ids or \
267
- node_id + suffix in self.node_names:
269
+ while (
270
+ node_id + suffix in self.written_ids
271
+ or node_id + suffix in self.node_names
272
+ ):
268
273
  nth += 1
269
274
  suffix = '<%s>' % nth
270
275
  node_id += suffix
@@ -277,8 +282,9 @@ class TexinfoTranslator(SphinxTranslator):
277
282
  add_node_name('Top')
278
283
  add_node_name('top')
279
284
  # each index is a node
280
- self.indices = [(add_node_name(name), content)
281
- for name, content in self.indices]
285
+ self.indices = [
286
+ (add_node_name(name), content) for name, content in self.indices
287
+ ]
282
288
  # each section is also a node
283
289
  for section in self.document.findall(nodes.section):
284
290
  title = cast(nodes.TextElement, section.next_node(nodes.Titular)) # type: ignore[type-var]
@@ -349,7 +355,7 @@ class TexinfoTranslator(SphinxTranslator):
349
355
  s = s.replace('{', '@{')
350
356
  s = s.replace('}', '@}')
351
357
  # prevent `` and '' quote conversion
352
- s = s.replace('``', "`@w{`}")
358
+ s = s.replace('``', '`@w{`}')
353
359
  s = s.replace("''", "'@w{'}")
354
360
  return s
355
361
 
@@ -393,8 +399,9 @@ class TexinfoTranslator(SphinxTranslator):
393
399
  else:
394
400
  s = f'* {name}: {node_name}. '
395
401
  offset = max((24, (len(name) + 4) % 78))
396
- wdesc = '\n'.join(' ' * offset + l for l in
397
- textwrap.wrap(desc, width=78 - offset))
402
+ wdesc = '\n'.join(
403
+ ' ' * offset + l for l in textwrap.wrap(desc, width=78 - offset)
404
+ )
398
405
  return s + wdesc.strip() + '\n'
399
406
 
400
407
  def add_menu_entries(
@@ -424,9 +431,11 @@ class TexinfoTranslator(SphinxTranslator):
424
431
  return
425
432
  self.body.append('\n@menu\n')
426
433
  self.add_menu_entries(entries)
427
- if (node_name != 'Top' or
428
- not self.node_menus[entries[0]] or
429
- self.config.texinfo_no_detailmenu):
434
+ if (
435
+ node_name != 'Top'
436
+ or not self.node_menus[entries[0]]
437
+ or self.config.texinfo_no_detailmenu
438
+ ):
430
439
  self.body.append('\n@end menu\n')
431
440
  return
432
441
 
@@ -439,12 +448,10 @@ class TexinfoTranslator(SphinxTranslator):
439
448
  for subentry in entries:
440
449
  _add_detailed_menu(subentry)
441
450
 
442
- self.body.append('\n@detailmenu\n'
443
- ' --- The Detailed Node Listing ---\n')
451
+ self.body.append('\n@detailmenu\n' ' --- The Detailed Node Listing ---\n')
444
452
  for entry in entries:
445
453
  _add_detailed_menu(entry)
446
- self.body.append('\n@end detailmenu\n'
447
- '@end menu\n')
454
+ self.body.append('\n@end detailmenu\n' '@end menu\n')
448
455
 
449
456
  def tex_image_length(self, width_str: str) -> str:
450
457
  match = re.match(r'(\d*\.?\d*)\s*(\S*)', width_str)
@@ -453,16 +460,18 @@ class TexinfoTranslator(SphinxTranslator):
453
460
  return width_str
454
461
  res = width_str
455
462
  amount, unit = match.groups()[:2]
456
- if not unit or unit == "px":
463
+ if not unit or unit == 'px':
457
464
  # pixels: let TeX alone
458
465
  return ''
459
- elif unit == "%":
466
+ elif unit == '%':
460
467
  # a4paper: textwidth=418.25368pt
461
- res = "%d.0pt" % (float(amount) * 4.1825368)
468
+ res = '%d.0pt' % (float(amount) * 4.1825368)
462
469
  return res
463
470
 
464
471
  def collect_indices(self) -> None:
465
- def generate(content: list[tuple[str, list[IndexEntry]]], collapsed: bool) -> str:
472
+ def generate(
473
+ content: list[tuple[str, list[IndexEntry]]], collapsed: bool
474
+ ) -> str:
466
475
  ret = ['\n@menu\n']
467
476
  for _letter, entries in content:
468
477
  for entry in entries:
@@ -482,21 +491,21 @@ class TexinfoTranslator(SphinxTranslator):
482
491
  indices_config = frozenset(indices_config)
483
492
  else:
484
493
  check_names = False
485
- for domain_name in sorted(self.builder.env.domains):
486
- domain = self.builder.env.domains[domain_name]
494
+ for domain in self.builder.env.domains.sorted():
487
495
  for index_cls in domain.indices:
488
496
  index_name = f'{domain.name}-{index_cls.name}'
489
497
  if check_names and index_name not in indices_config:
490
498
  continue
491
499
  content, collapsed = index_cls(domain).generate(
492
- self.builder.docnames)
500
+ self.builder.docnames
501
+ )
493
502
  if content:
494
503
  self.indices.append((
495
504
  index_cls.localname,
496
505
  generate(content, collapsed),
497
506
  ))
498
507
  # only add the main Index if it's not empty
499
- domain = cast(IndexDomain, self.builder.env.get_domain('index'))
508
+ domain = self.builder.env.domains.index_domain
500
509
  for docname in self.builder.docnames:
501
510
  if domain.entries[docname]:
502
511
  self.indices.append((_('Index'), '\n@printindex ge\n'))
@@ -506,7 +515,7 @@ class TexinfoTranslator(SphinxTranslator):
506
515
  # TODO: move this to sphinx.util
507
516
 
508
517
  def collect_footnotes(
509
- self, node: Element,
518
+ self, node: Element
510
519
  ) -> dict[str, list[collected_footnote | bool]]:
511
520
  def footnotes_under(n: Element) -> Iterator[nodes.footnote]:
512
521
  if isinstance(n, nodes.footnote):
@@ -517,6 +526,7 @@ class TexinfoTranslator(SphinxTranslator):
517
526
  continue
518
527
  elif isinstance(c, nodes.Element):
519
528
  yield from footnotes_under(c)
529
+
520
530
  fnotes: dict[str, list[collected_footnote | bool]] = {}
521
531
  for fn in footnotes_under(node):
522
532
  label = cast(nodes.label, fn[0])
@@ -628,9 +638,13 @@ class TexinfoTranslator(SphinxTranslator):
628
638
  if isinstance(parent, nodes.Admonition | nodes.sidebar | nodes.topic):
629
639
  raise nodes.SkipNode
630
640
  if not isinstance(parent, nodes.section):
631
- logger.warning(__('encountered title node not in section, topic, table, '
632
- 'admonition or sidebar'),
633
- location=node)
641
+ logger.warning(
642
+ __(
643
+ 'encountered title node not in section, topic, table, '
644
+ 'admonition or sidebar'
645
+ ),
646
+ location=node,
647
+ )
634
648
  self.visit_rubric(node)
635
649
  else:
636
650
  try:
@@ -904,9 +918,7 @@ class TexinfoTranslator(SphinxTranslator):
904
918
  def visit_enumerated_list(self, node: Element) -> None:
905
919
  # doesn't support Roman numerals
906
920
  enum = node.get('enumtype', 'arabic')
907
- starters = {'arabic': '',
908
- 'loweralpha': 'a',
909
- 'upperalpha': 'A'}
921
+ starters = {'arabic': '', 'loweralpha': 'a', 'upperalpha': 'A'}
910
922
  start = node.get('start', starters.get(enum, ''))
911
923
  self.body.append('\n\n@enumerate %s\n' % start)
912
924
 
@@ -1107,8 +1119,7 @@ class TexinfoTranslator(SphinxTranslator):
1107
1119
 
1108
1120
  def depart_admonition(self, node: Element) -> None:
1109
1121
  self.ensure_eol()
1110
- self.body.append('@end quotation\n'
1111
- '@end cartouche\n')
1122
+ self.body.append('@end quotation\n' '@end cartouche\n')
1112
1123
 
1113
1124
  visit_attention = _visit_named_admonition
1114
1125
  depart_attention = depart_admonition
@@ -1194,18 +1205,19 @@ class TexinfoTranslator(SphinxTranslator):
1194
1205
  self.body.append('\n@end float\n\n')
1195
1206
 
1196
1207
  def visit_caption(self, node: Element) -> None:
1197
- if (isinstance(node.parent, nodes.figure) or
1198
- (isinstance(node.parent, nodes.container) and
1199
- node.parent.get('literal_block'))):
1208
+ if isinstance(node.parent, nodes.figure) or (
1209
+ isinstance(node.parent, nodes.container)
1210
+ and node.parent.get('literal_block')
1211
+ ):
1200
1212
  self.body.append('\n@caption{')
1201
1213
  else:
1202
- logger.warning(__('caption not inside a figure.'),
1203
- location=node)
1214
+ logger.warning(__('caption not inside a figure.'), location=node)
1204
1215
 
1205
1216
  def depart_caption(self, node: Element) -> None:
1206
- if (isinstance(node.parent, nodes.figure) or
1207
- (isinstance(node.parent, nodes.container) and
1208
- node.parent.get('literal_block'))):
1217
+ if isinstance(node.parent, nodes.figure) or (
1218
+ isinstance(node.parent, nodes.container)
1219
+ and node.parent.get('literal_block')
1220
+ ):
1209
1221
  self.body.append('}\n')
1210
1222
 
1211
1223
  def visit_image(self, node: Element) -> None:
@@ -1225,8 +1237,7 @@ class TexinfoTranslator(SphinxTranslator):
1225
1237
  height = self.tex_image_length(node.get('height', ''))
1226
1238
  alt = self.escape_arg(node.get('alt', ''))
1227
1239
  filename = f"{self.elements['filename'][:-5]}-figures/{name}" # type: ignore[index]
1228
- self.body.append('\n@image{%s,%s,%s,%s,%s}\n' %
1229
- (filename, width, height, alt, ext[1:]))
1240
+ self.body.append(f'\n@image{{{filename},{width},{height},{alt},{ext[1:]}}}\n')
1230
1241
 
1231
1242
  def depart_image(self, node: Element) -> None:
1232
1243
  pass
@@ -1268,9 +1279,9 @@ class TexinfoTranslator(SphinxTranslator):
1268
1279
  raise nodes.SkipNode
1269
1280
 
1270
1281
  def visit_system_message(self, node: Element) -> None:
1271
- self.body.append('\n@verbatim\n'
1272
- '<SYSTEM MESSAGE: %s>\n'
1273
- '@end verbatim\n' % node.astext())
1282
+ self.body.append(
1283
+ '\n@verbatim\n' '<SYSTEM MESSAGE: %s>\n' '@end verbatim\n' % node.astext()
1284
+ )
1274
1285
  raise nodes.SkipNode
1275
1286
 
1276
1287
  def visit_comment(self, node: Element) -> None:
@@ -1286,8 +1297,7 @@ class TexinfoTranslator(SphinxTranslator):
1286
1297
  self.body.append('<<')
1287
1298
 
1288
1299
  def unimplemented_visit(self, node: Element) -> None:
1289
- logger.warning(__("unimplemented node type: %r"), node,
1290
- location=node)
1300
+ logger.warning(__('unimplemented node type: %r'), node, location=node)
1291
1301
 
1292
1302
  def unknown_departure(self, node: Node) -> None:
1293
1303
  pass
@@ -1336,7 +1346,7 @@ class TexinfoTranslator(SphinxTranslator):
1336
1346
  self.ensure_eol()
1337
1347
  else:
1338
1348
  self.body.append('\n')
1339
- for (_entry_type, value, _target_id, _main, _category_key) in node['entries']:
1349
+ for _entry_type, value, _target_id, _main, _category_key in node['entries']:
1340
1350
  text = self.escape_menu(value)
1341
1351
  self.body.append('@geindex %s\n' % text)
1342
1352
 
@@ -1362,8 +1372,7 @@ class TexinfoTranslator(SphinxTranslator):
1362
1372
  raise nodes.SkipNode
1363
1373
 
1364
1374
  def visit_seealso(self, node: Element) -> None:
1365
- self.body.append('\n\n@subsubheading %s\n\n' %
1366
- admonitionlabels['seealso'])
1375
+ self.body.append('\n\n@subsubheading %s\n\n' % admonitionlabels['seealso'])
1367
1376
 
1368
1377
  def depart_seealso(self, node: Element) -> None:
1369
1378
  self.body.append('\n')
@@ -1410,8 +1419,9 @@ class TexinfoTranslator(SphinxTranslator):
1410
1419
  # use the full name of the objtype for the category
1411
1420
  try:
1412
1421
  domain = self.builder.env.get_domain(node.parent['domain'])
1413
- name = domain.get_type_name(domain.object_types[objtype],
1414
- self.config.primary_domain == domain.name)
1422
+ name = domain.get_type_name(
1423
+ domain.object_types[objtype], self.config.primary_domain == domain.name
1424
+ )
1415
1425
  except (KeyError, ExtensionError):
1416
1426
  name = objtype
1417
1427
  # by convention, the deffn category should be capitalized like a title
@@ -1421,7 +1431,7 @@ class TexinfoTranslator(SphinxTranslator):
1421
1431
  self.desc_type_name: str | None = name
1422
1432
 
1423
1433
  def depart_desc_signature(self, node: Element) -> None:
1424
- self.body.append("\n")
1434
+ self.body.append('\n')
1425
1435
  self.escape_hyphens -= 1
1426
1436
  self.desc_type_name = None
1427
1437
 
@@ -1511,8 +1521,9 @@ class TexinfoTranslator(SphinxTranslator):
1511
1521
  # -- instead of --
1512
1522
  # @deffn {Class} class Foo
1513
1523
  txt = node.astext().strip()
1514
- if ((self.descs and txt == self.descs[-1]['objtype']) or
1515
- (self.desc_type_name and txt in self.desc_type_name.split())):
1524
+ if (self.descs and txt == self.descs[-1]['objtype']) or (
1525
+ self.desc_type_name and txt in self.desc_type_name.split()
1526
+ ):
1516
1527
  raise nodes.SkipNode
1517
1528
 
1518
1529
  def depart_desc_annotation(self, node: Element) -> None:
@@ -1575,6 +1586,7 @@ class TexinfoTranslator(SphinxTranslator):
1575
1586
  def visit_math_block(self, node: Element) -> None:
1576
1587
  if node.get('label'):
1577
1588
  self.add_anchor(node['label'], node)
1578
- self.body.append('\n\n@example\n%s\n@end example\n\n' %
1579
- self.escape_arg(node.astext()))
1589
+ self.body.append(
1590
+ f'\n\n@example\n{self.escape_arg(node.astext())}\n@end example\n\n'
1591
+ )
1580
1592
  raise nodes.SkipNode