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/html5.py CHANGED
@@ -40,7 +40,7 @@ def multiply_length(length: str, scale: int) -> str:
40
40
  return length
41
41
  amount, unit = matched.groups()
42
42
  result = float(amount) * scale / 100
43
- return f"{int(result)}{unit}"
43
+ return f'{int(result)}{unit}'
44
44
 
45
45
 
46
46
  class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
@@ -168,7 +168,9 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
168
168
  self.param_group_index = 0
169
169
  # Counts as what we call a parameter group either a required parameter, or a
170
170
  # set of contiguous optional ones.
171
- self.list_is_required_param = [isinstance(c, parameter_group) for c in node.children]
171
+ self.list_is_required_param = [
172
+ isinstance(c, parameter_group) for c in node.children
173
+ ]
172
174
  # How many required parameters are left.
173
175
  self.required_params_left = sum(self.list_is_required_param)
174
176
  self.param_separator = node.child_text_separator
@@ -205,7 +207,9 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
205
207
  #
206
208
  def visit_desc_parameter(self, node: Element) -> None:
207
209
  on_separate_line = self.multi_line_parameter_list
208
- if on_separate_line and not (self.is_first_param and self.optional_param_level > 0):
210
+ if on_separate_line and not (
211
+ self.is_first_param and self.optional_param_level > 0
212
+ ):
209
213
  self.body.append(self.starttag(node, 'dd', ''))
210
214
  if self.is_first_param:
211
215
  self.is_first_param = False
@@ -223,13 +227,18 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
223
227
  self.body.append('</em>')
224
228
  is_required = self.list_is_required_param[self.param_group_index]
225
229
  if self.multi_line_parameter_list:
226
- is_last_group = self.param_group_index + 1 == len(self.list_is_required_param)
230
+ len_lirp = len(self.list_is_required_param)
231
+ is_last_group = self.param_group_index + 1 == len_lirp
227
232
  next_is_required = (
228
233
  not is_last_group
229
234
  and self.list_is_required_param[self.param_group_index + 1]
230
- )
235
+ ) # fmt: skip
231
236
  opt_param_left_at_level = self.params_left_at_level > 0
232
- if opt_param_left_at_level or is_required and (is_last_group or next_is_required):
237
+ if (
238
+ opt_param_left_at_level
239
+ or is_required
240
+ and (is_last_group or next_is_required)
241
+ ):
233
242
  self.body.append(self.param_separator)
234
243
  self.body.append('</dd>\n')
235
244
 
@@ -246,8 +255,9 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
246
255
  self.depart_desc_parameter(node)
247
256
 
248
257
  def visit_desc_optional(self, node: Element) -> None:
249
- self.params_left_at_level = sum(isinstance(c, addnodes.desc_parameter)
250
- for c in node.children)
258
+ self.params_left_at_level = sum(
259
+ isinstance(c, addnodes.desc_parameter) for c in node.children
260
+ )
251
261
  self.optional_param_level += 1
252
262
  self.max_optional_param_level = self.optional_param_level
253
263
  if self.multi_line_parameter_list:
@@ -310,12 +320,16 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
310
320
  atts['class'] += ' external'
311
321
  if 'refuri' in node:
312
322
  atts['href'] = node['refuri'] or '#'
313
- if self.settings.cloak_email_addresses and atts['href'].startswith('mailto:'):
323
+ if (
324
+ self.settings.cloak_email_addresses
325
+ and atts['href'].startswith('mailto:')
326
+ ): # fmt: skip
314
327
  atts['href'] = self.cloak_mailto(atts['href'])
315
328
  self.in_mailto = True
316
329
  else:
317
- assert 'refid' in node, \
318
- 'References must have "refuri" or "refid" attribute.'
330
+ assert (
331
+ 'refid' in node
332
+ ), 'References must have "refuri" or "refid" attribute.'
319
333
  atts['href'] = '#' + node['refid']
320
334
  if not isinstance(node.parent, nodes.TextElement):
321
335
  assert len(node) == 1 and isinstance(node[0], nodes.image) # NoQA: PT018
@@ -329,8 +343,9 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
329
343
  self.body.append(self.starttag(node, 'a', '', **atts))
330
344
 
331
345
  if node.get('secnumber'):
332
- self.body.append(('%s' + self.secnumber_suffix) %
333
- '.'.join(map(str, node['secnumber'])))
346
+ self.body.append(
347
+ ('%s' + self.secnumber_suffix) % '.'.join(map(str, node['secnumber']))
348
+ )
334
349
 
335
350
  def visit_number_reference(self, node: Element) -> None:
336
351
  self.visit_reference(node)
@@ -344,8 +359,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
344
359
 
345
360
  # overwritten
346
361
  def visit_admonition(self, node: Element, name: str = '') -> None:
347
- self.body.append(self.starttag(
348
- node, 'div', CLASS=('admonition ' + name)))
362
+ self.body.append(self.starttag(node, 'div', CLASS=('admonition ' + name)))
349
363
  if name:
350
364
  node.insert(0, nodes.title(name, admonitionlabels[name]))
351
365
 
@@ -365,9 +379,10 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
365
379
  if isinstance(node.parent, nodes.section):
366
380
  if self.builder.name == 'singlehtml':
367
381
  docname = self.docnames[-1]
368
- anchorname = "{}/#{}".format(docname, node.parent['ids'][0])
382
+ anchorname = f"{docname}/#{node.parent['ids'][0]}"
369
383
  if anchorname not in self.builder.secnumbers:
370
- anchorname = "%s/" % docname # try first heading which has no anchor
384
+ # try first heading which has no anchor
385
+ anchorname = f'{docname}/'
371
386
  else:
372
387
  anchorname = '#' + node.parent['ids'][0]
373
388
  if anchorname not in self.builder.secnumbers:
@@ -381,13 +396,15 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
381
396
  def add_secnumber(self, node: Element) -> None:
382
397
  secnumber = self.get_secnumber(node)
383
398
  if secnumber:
384
- self.body.append('<span class="section-number">%s</span>' %
385
- ('.'.join(map(str, secnumber)) + self.secnumber_suffix))
399
+ self.body.append(
400
+ '<span class="section-number">%s</span>'
401
+ % ('.'.join(map(str, secnumber)) + self.secnumber_suffix)
402
+ )
386
403
 
387
404
  def add_fignumber(self, node: Element) -> None:
388
405
  def append_fignumber(figtype: str, figure_id: str) -> None:
389
406
  if self.builder.name == 'singlehtml':
390
- key = f"{self.docnames[-1]}/{figtype}"
407
+ key = f'{self.docnames[-1]}/{figtype}'
391
408
  else:
392
409
  key = figtype
393
410
 
@@ -402,7 +419,9 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
402
419
  self.body.append(prefix % '.'.join(map(str, numbers)) + ' ')
403
420
  self.body.append('</span>')
404
421
 
405
- figtype = self.builder.env.domains['std'].get_enumerable_node_type(node)
422
+ figtype = self.builder.env.domains.standard_domain.get_enumerable_node_type(
423
+ node
424
+ )
406
425
  if figtype:
407
426
  if len(node['ids']) == 0:
408
427
  msg = __('Any IDs not assigned for %s node') % node.tagname
@@ -466,8 +485,13 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
466
485
 
467
486
  # overwritten
468
487
  def visit_title(self, node: Element) -> None:
469
- if isinstance(node.parent, addnodes.compact_paragraph) and node.parent.get('toctree'):
470
- self.body.append(self.starttag(node, 'p', '', CLASS='caption', ROLE='heading'))
488
+ if (
489
+ isinstance(node.parent, addnodes.compact_paragraph)
490
+ and node.parent.get('toctree')
491
+ ): # fmt: skip
492
+ self.body.append(
493
+ self.starttag(node, 'p', '', CLASS='caption', ROLE='heading')
494
+ )
471
495
  self.body.append('<span class="caption-text">')
472
496
  self.context.append('</span></p>\n')
473
497
  else:
@@ -478,11 +502,11 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
478
502
  self.body.append('<span class="caption-text">')
479
503
  # Partially revert https://sourceforge.net/p/docutils/code/9562/
480
504
  if (
481
- isinstance(node.parent, nodes.topic)
482
- and self.settings.toc_backlinks
483
- and 'contents' in node.parent['classes']
484
- and self.body[-1].startswith('<a ')
485
- # TODO: only remove for EPUB
505
+ isinstance(node.parent, nodes.topic)
506
+ and self.settings.toc_backlinks
507
+ and 'contents' in node.parent['classes']
508
+ and self.body[-1].startswith('<a ')
509
+ # TODO: only remove for EPUB
486
510
  ):
487
511
  # remove <a class="reference internal" href="#top">
488
512
  self.body.pop()
@@ -490,17 +514,22 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
490
514
 
491
515
  def depart_title(self, node: Element) -> None:
492
516
  close_tag = self.context[-1]
493
- if (self.config.html_permalinks and self.builder.add_permalinks and
494
- node.parent.hasattr('ids') and node.parent['ids']):
517
+ if (
518
+ self.config.html_permalinks
519
+ and self.builder.add_permalinks
520
+ and node.parent.hasattr('ids')
521
+ and node.parent['ids']
522
+ ):
495
523
  # add permalink anchor
496
524
  if close_tag.startswith('</h'):
497
525
  self.add_permalink_ref(node.parent, _('Link to this heading'))
498
526
  elif close_tag.startswith('</a></h'):
499
- self.body.append('</a><a class="headerlink" href="#%s" ' %
500
- node.parent['ids'][0] +
501
- 'title="{}">{}'.format(
502
- _('Link to this heading'),
503
- self.config.html_permalinks_icon))
527
+ self.body.append(
528
+ '</a><a class="headerlink" href="#%s" ' % node.parent['ids'][0]
529
+ + 'title="{}">{}'.format(
530
+ _('Link to this heading'), self.config.html_permalinks_icon
531
+ )
532
+ )
504
533
  elif isinstance(node.parent, nodes.table):
505
534
  self.body.append('</span>')
506
535
  self.add_permalink_ref(node.parent, _('Link to this table'))
@@ -520,7 +549,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
520
549
  __('unsupported rubric heading level: %s'),
521
550
  level,
522
551
  type='html',
523
- location=node
552
+ location=node,
524
553
  )
525
554
  super().visit_rubric(node)
526
555
  else:
@@ -549,16 +578,24 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
549
578
  linenos = self.config.html_codeblock_linenos_style
550
579
 
551
580
  highlighted = self.highlighter.highlight_block(
552
- node.rawsource, lang, opts=opts, linenos=linenos,
553
- location=node, **highlight_args,
581
+ node.rawsource,
582
+ lang,
583
+ opts=opts,
584
+ linenos=linenos,
585
+ location=node,
586
+ **highlight_args,
587
+ )
588
+ starttag = self.starttag(
589
+ node, 'div', suffix='', CLASS='highlight-%s notranslate' % lang
554
590
  )
555
- starttag = self.starttag(node, 'div', suffix='',
556
- CLASS='highlight-%s notranslate' % lang)
557
591
  self.body.append(starttag + highlighted + '</div>\n')
558
592
  raise nodes.SkipNode
559
593
 
560
594
  def visit_caption(self, node: Element) -> None:
561
- if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
595
+ if (
596
+ isinstance(node.parent, nodes.container)
597
+ and node.parent.get('literal_block')
598
+ ): # fmt: skip
562
599
  self.body.append('<div class="code-block-caption">')
563
600
  else:
564
601
  super().visit_caption(node)
@@ -569,14 +606,20 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
569
606
  self.body.append('</span>')
570
607
 
571
608
  # append permalink if available
572
- if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
609
+ if (
610
+ isinstance(node.parent, nodes.container)
611
+ and node.parent.get('literal_block')
612
+ ): # fmt: skip
573
613
  self.add_permalink_ref(node.parent, _('Link to this code'))
574
614
  elif isinstance(node.parent, nodes.figure):
575
615
  self.add_permalink_ref(node.parent, _('Link to this image'))
576
616
  elif node.parent.get('toctree'):
577
617
  self.add_permalink_ref(node.parent.parent, _('Link to this toctree'))
578
618
 
579
- if isinstance(node.parent, nodes.container) and node.parent.get('literal_block'):
619
+ if (
620
+ isinstance(node.parent, nodes.container)
621
+ and node.parent.get('literal_block')
622
+ ): # fmt: skip
580
623
  self.body.append('</div>\n')
581
624
  else:
582
625
  super().depart_caption(node)
@@ -594,26 +637,29 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
594
637
  # overwritten
595
638
  def visit_literal(self, node: Element) -> None:
596
639
  if 'kbd' in node['classes']:
597
- self.body.append(self.starttag(node, 'kbd', '',
598
- CLASS='docutils literal notranslate'))
640
+ self.body.append(
641
+ self.starttag(node, 'kbd', '', CLASS='docutils literal notranslate')
642
+ )
599
643
  return
600
- lang = node.get("language", None)
644
+ lang = node.get('language', None)
601
645
  if 'code' not in node['classes'] or not lang:
602
- self.body.append(self.starttag(node, 'code', '',
603
- CLASS='docutils literal notranslate'))
646
+ self.body.append(
647
+ self.starttag(node, 'code', '', CLASS='docutils literal notranslate')
648
+ )
604
649
  self.protect_literal_text += 1
605
650
  return
606
651
 
607
652
  opts = self.config.highlight_options.get(lang, {})
608
653
  highlighted = self.highlighter.highlight_block(
609
- node.astext(), lang, opts=opts, location=node, nowrap=True)
654
+ node.astext(), lang, opts=opts, location=node, nowrap=True
655
+ )
610
656
  starttag = self.starttag(
611
657
  node,
612
- "code",
613
- suffix="",
614
- CLASS="docutils literal highlight highlight-%s" % lang,
658
+ 'code',
659
+ suffix='',
660
+ CLASS='docutils literal highlight highlight-%s' % lang,
615
661
  )
616
- self.body.append(starttag + highlighted.strip() + "</code>")
662
+ self.body.append(starttag + highlighted.strip() + '</code>')
617
663
  raise nodes.SkipNode
618
664
 
619
665
  def depart_literal(self, node: Element) -> None:
@@ -651,8 +697,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
651
697
  pass
652
698
 
653
699
  def visit_centered(self, node: Element) -> None:
654
- self.body.append(self.starttag(node, 'p', CLASS="centered") +
655
- '<strong>')
700
+ self.body.append(self.starttag(node, 'p', CLASS='centered') + '<strong>')
656
701
 
657
702
  def depart_centered(self, node: Element) -> None:
658
703
  self.body.append('</strong></p>')
@@ -664,8 +709,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
664
709
  pass
665
710
 
666
711
  def visit_download_reference(self, node: Element) -> None:
667
- atts = {'class': 'reference download',
668
- 'download': ''}
712
+ atts = {'class': 'reference download', 'download': ''}
669
713
 
670
714
  if not self.builder.download_support:
671
715
  self.context.append('')
@@ -676,8 +720,9 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
676
720
  self.context.append('</a>')
677
721
  elif 'filename' in node:
678
722
  atts['class'] += ' internal'
679
- atts['href'] = posixpath.join(self.builder.dlpath,
680
- urllib.parse.quote(node['filename']))
723
+ atts['href'] = posixpath.join(
724
+ self.builder.dlpath, urllib.parse.quote(node['filename'])
725
+ )
681
726
  self.body.append(self.starttag(node, 'a', '', **atts))
682
727
  self.context.append('</a>')
683
728
  else:
@@ -698,8 +743,9 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
698
743
  olduri = node['uri']
699
744
  # rewrite the URI if the environment knows about it
700
745
  if olduri in self.builder.images:
701
- node['uri'] = posixpath.join(self.builder.imgpath,
702
- urllib.parse.quote(self.builder.images[olduri]))
746
+ node['uri'] = posixpath.join(
747
+ self.builder.imgpath, urllib.parse.quote(self.builder.images[olduri])
748
+ )
703
749
 
704
750
  if 'scale' in node:
705
751
  # Try to figure out image height and width. Docutils does that too,
@@ -873,7 +919,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
873
919
 
874
920
  atts = {}
875
921
  classes = [cls.strip(' \t\n') for cls in self.settings.table_style.split(',')]
876
- classes.insert(0, "docutils") # compat
922
+ classes.insert(0, 'docutils') # compat
877
923
 
878
924
  # set align-default if align not specified to give a default style
879
925
  classes.append('align-%s' % node.get('align', 'default'))
@@ -942,6 +988,9 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
942
988
  def visit_footnote_reference(self, node: Element) -> None:
943
989
  href = '#' + node['refid']
944
990
  classes = ['footnote-reference', self.settings.footnote_references]
945
- self.body.append(self.starttag(node, 'a', suffix='', classes=classes,
946
- role='doc-noteref', href=href))
991
+ self.body.append(
992
+ self.starttag(
993
+ node, 'a', suffix='', classes=classes, role='doc-noteref', href=href
994
+ )
995
+ )
947
996
  self.body.append('<span class="fn-bracket">[</span>')