Sphinx 8.0.1__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 +10 -3
  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.1.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.1.dist-info/LICENSE.rst +0 -67
  422. sphinx-8.0.1.dist-info/RECORD +0 -590
  423. {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/WHEEL +0 -0
  424. {sphinx-8.0.1.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
@@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Any, cast
9
9
  from docutils import nodes
10
10
  from docutils.transforms import Transform, Transformer
11
11
  from docutils.transforms.parts import ContentsFilter
12
+ from docutils.transforms.references import Footnotes
12
13
  from docutils.transforms.universal import SmartQuotes
13
14
  from docutils.utils import normalize_language_tag
14
15
  from docutils.utils.smartquotes import smartchars
@@ -119,7 +120,9 @@ class DefaultSubstitutions(SphinxTransform):
119
120
  if (name := ref['refname']) in to_handle:
120
121
  ref.replace_self(self._handle_default_substitution(name))
121
122
 
122
- def _handle_default_substitution(self, name: _DEFAULT_SUBSTITUTION_NAMES) -> nodes.Text:
123
+ def _handle_default_substitution(
124
+ self, name: _DEFAULT_SUBSTITUTION_NAMES
125
+ ) -> nodes.Text:
123
126
  if name == 'translation progress':
124
127
  # special handling: calculate translation progress
125
128
  return nodes.Text(_calculate_translation_progress(self.document))
@@ -127,10 +130,8 @@ class DefaultSubstitutions(SphinxTransform):
127
130
  if text := self.config.today:
128
131
  return nodes.Text(text)
129
132
  # special handling: can also specify a strftime format
130
- return nodes.Text(format_date(
131
- self.config.today_fmt or _('%b %d, %Y'),
132
- language=self.config.language,
133
- ))
133
+ today_fmt = self.config.today_fmt or _('%b %d, %Y')
134
+ return nodes.Text(format_date(today_fmt, language=self.config.language))
134
135
  # config.version and config.release
135
136
  return nodes.Text(getattr(self.config, name))
136
137
 
@@ -184,8 +185,7 @@ class HandleCodeBlocks(SphinxTransform):
184
185
  def apply(self, **kwargs: Any) -> None:
185
186
  # move doctest blocks out of blockquotes
186
187
  for node in self.document.findall(nodes.block_quote):
187
- if all(isinstance(child, nodes.doctest_block) for child
188
- in node.children):
188
+ if all(isinstance(child, nodes.doctest_block) for child in node.children):
189
189
  node.replace_self(node.children)
190
190
  # combine successive doctest blocks
191
191
  # for node in self.document.findall(nodes.doctest_block):
@@ -207,12 +207,14 @@ class AutoNumbering(SphinxTransform):
207
207
  default_priority = 210
208
208
 
209
209
  def apply(self, **kwargs: Any) -> None:
210
- domain: StandardDomain = self.env.domains['std']
210
+ domain: StandardDomain = self.env.domains.standard_domain
211
211
 
212
212
  for node in self.document.findall(nodes.Element):
213
- if (domain.is_enumerable_node(node) and
214
- domain.get_numfig_title(node) is not None and
215
- node['ids'] == []):
213
+ if (
214
+ domain.is_enumerable_node(node)
215
+ and domain.get_numfig_title(node) is not None
216
+ and node['ids'] == []
217
+ ):
216
218
  self.document.note_implicit_target(node)
217
219
 
218
220
 
@@ -246,7 +248,7 @@ class ApplySourceWorkaround(SphinxTransform):
246
248
  default_priority = 10
247
249
 
248
250
  def apply(self, **kwargs: Any) -> None:
249
- for node in self.document.findall(): # type: Node
251
+ for node in self.document.findall():
250
252
  if isinstance(node, nodes.TextElement | nodes.image | nodes.topic):
251
253
  apply_source_workaround(node)
252
254
 
@@ -261,8 +263,13 @@ class AutoIndexUpgrader(SphinxTransform):
261
263
  def apply(self, **kwargs: Any) -> None:
262
264
  for node in self.document.findall(addnodes.index):
263
265
  if 'entries' in node and any(len(entry) == 4 for entry in node['entries']):
264
- msg = __('4 column based index found. '
265
- 'It might be a bug of extensions you use: %r') % node['entries']
266
+ msg = (
267
+ __(
268
+ '4 column based index found. '
269
+ 'It might be a bug of extensions you use: %r'
270
+ )
271
+ % node['entries']
272
+ )
266
273
  logger.warning(msg, location=node)
267
274
  for i, entry in enumerate(node['entries']):
268
275
  if len(entry) == 4:
@@ -294,23 +301,40 @@ class UnreferencedFootnotesDetector(SphinxTransform):
294
301
  Detect unreferenced footnotes and emit warnings
295
302
  """
296
303
 
297
- default_priority = 200
304
+ default_priority = Footnotes.default_priority + 2
298
305
 
299
306
  def apply(self, **kwargs: Any) -> None:
300
307
  for node in self.document.footnotes:
301
- if node['names'] == []:
302
- # footnote having duplicated number. It is already warned at parser.
303
- pass
304
- elif node['names'][0] not in self.document.footnote_refs:
305
- logger.warning(__('Footnote [%s] is not referenced.'), node['names'][0],
306
- type='ref', subtype='footnote',
307
- location=node)
308
-
308
+ # note we do not warn on duplicate footnotes here
309
+ # (i.e. where the name has been moved to dupnames)
310
+ # since this is already reported by docutils
311
+ if not node['backrefs'] and node['names']:
312
+ logger.warning(
313
+ __('Footnote [%s] is not referenced.'),
314
+ node['names'][0] if node['names'] else node['dupnames'][0],
315
+ type='ref',
316
+ subtype='footnote',
317
+ location=node,
318
+ )
319
+ for node in self.document.symbol_footnotes:
320
+ if not node['backrefs']:
321
+ logger.warning(
322
+ __('Footnote [*] is not referenced.'),
323
+ type='ref',
324
+ subtype='footnote',
325
+ location=node,
326
+ )
309
327
  for node in self.document.autofootnotes:
310
- if not any(ref['auto'] == node['auto'] for ref in self.document.autofootnote_refs):
311
- logger.warning(__('Footnote [#] is not referenced.'),
312
- type='ref', subtype='footnote',
313
- location=node)
328
+ # note we do not warn on duplicate footnotes here
329
+ # (i.e. where the name has been moved to dupnames)
330
+ # since this is already reported by docutils
331
+ if not node['backrefs'] and node['names']:
332
+ logger.warning(
333
+ __('Footnote [#] is not referenced.'),
334
+ type='ref',
335
+ subtype='footnote',
336
+ location=node,
337
+ )
314
338
 
315
339
 
316
340
  class DoctestTransform(SphinxTransform):
@@ -385,10 +409,7 @@ class SphinxSmartQuotes(SmartQuotes, SphinxTransform):
385
409
 
386
410
  # confirm selected language supports smart_quotes or not
387
411
  language = self.env.settings['language_code']
388
- return any(
389
- tag in smartchars.quotes
390
- for tag in normalize_language_tag(language)
391
- )
412
+ return any(tag in smartchars.quotes for tag in normalize_language_tag(language))
392
413
 
393
414
  def get_tokens(self, txtnodes: list[Text]) -> Iterator[tuple[str, str]]:
394
415
  # A generator that yields ``(texttype, nodetext)`` tuples for a list
@@ -421,13 +442,13 @@ class GlossarySorter(SphinxTransform):
421
442
 
422
443
  def apply(self, **kwargs: Any) -> None:
423
444
  for glossary in self.document.findall(addnodes.glossary):
424
- if glossary["sorted"]:
445
+ if glossary['sorted']:
425
446
  definition_list = cast(nodes.definition_list, glossary[0])
426
447
  definition_list[:] = sorted(
427
448
  definition_list,
428
449
  key=lambda item: unicodedata.normalize(
429
- 'NFD',
430
- cast(nodes.term, item)[0].astext().lower()),
450
+ 'NFD', cast(nodes.term, item)[0].astext().lower()
451
+ ),
431
452
  )
432
453
 
433
454
 
@@ -490,7 +511,7 @@ def _reorder_index_target_nodes(start_node: nodes.target) -> None:
490
511
  first_idx = parent.index(nodes_to_reorder[0])
491
512
  last_idx = parent.index(nodes_to_reorder[-1])
492
513
  if first_idx + len(nodes_to_reorder) - 1 == last_idx:
493
- parent[first_idx:last_idx + 1] = sorted(nodes_to_reorder, key=_sort_key)
514
+ parent[first_idx : last_idx + 1] = sorted(nodes_to_reorder, key=_sort_key)
494
515
 
495
516
 
496
517
  def _sort_key(node: nodes.Node) -> int:
@@ -30,8 +30,9 @@ class RefOnlyListChecker(nodes.GenericNodeVisitor):
30
30
  pass
31
31
 
32
32
  def visit_list_item(self, node: nodes.list_item) -> None:
33
- children: list[Node] = [child for child in node.children
34
- if not isinstance(child, nodes.Invisible)]
33
+ children: list[Node] = [
34
+ child for child in node.children if not isinstance(child, nodes.Invisible)
35
+ ]
35
36
  if len(children) != 1:
36
37
  raise nodes.NodeFound
37
38
  if not isinstance(children[0], nodes.paragraph):
sphinx/transforms/i18n.py CHANGED
@@ -48,8 +48,14 @@ EXCLUDED_PENDING_XREF_ATTRIBUTES = ('refexplicit',)
48
48
  N = TypeVar('N', bound=nodes.Node)
49
49
 
50
50
 
51
- def publish_msgstr(app: Sphinx, source: str, source_path: str, source_line: int,
52
- config: Config, settings: Any) -> nodes.Element:
51
+ def publish_msgstr(
52
+ app: Sphinx,
53
+ source: str,
54
+ source_path: str,
55
+ source_line: int,
56
+ config: Config,
57
+ settings: Any,
58
+ ) -> nodes.Element:
53
59
  """Publish msgstr (single line) into docutils document
54
60
 
55
61
  :param sphinx.application.Sphinx app: sphinx application
@@ -67,13 +73,15 @@ def publish_msgstr(app: Sphinx, source: str, source_path: str, source_line: int,
67
73
  config.rst_prolog = None
68
74
 
69
75
  from sphinx.io import SphinxI18nReader
76
+
70
77
  reader = SphinxI18nReader()
71
78
  reader.setup(app)
72
79
  filetype = get_filetype(config.source_suffix, source_path)
73
80
  parser = app.registry.create_source_parser(app, filetype)
74
81
  doc = reader.read(
75
- source=StringInput(source=source,
76
- source_path=f"{source_path}:{source_line}:<translated>"),
82
+ source=StringInput(
83
+ source=source, source_path=f'{source_path}:{source_line}:<translated>'
84
+ ),
77
85
  parser=parser,
78
86
  settings=settings,
79
87
  )
@@ -85,7 +93,7 @@ def publish_msgstr(app: Sphinx, source: str, source_path: str, source_line: int,
85
93
 
86
94
 
87
95
  def parse_noqa(source: str) -> tuple[str, bool]:
88
- m = match(r"(.*)(?<!\\)#\s*noqa\s*$", source, DOTALL)
96
+ m = match(r'(.*)(?<!\\)#\s*noqa\s*$', source, DOTALL)
89
97
  if m:
90
98
  return m.group(1), True
91
99
  else:
@@ -108,29 +116,43 @@ class _NodeUpdater:
108
116
  """Contains logic for updating one node with the translated content."""
109
117
 
110
118
  def __init__(
111
- self, node: nodes.Element, patch: nodes.Element, document: nodes.document, noqa: bool,
119
+ self,
120
+ node: nodes.Element,
121
+ patch: nodes.Element,
122
+ document: nodes.document,
123
+ noqa: bool,
112
124
  ) -> None:
113
125
  self.node: nodes.Element = node
114
126
  self.patch: nodes.Element = patch
115
127
  self.document: nodes.document = document
116
128
  self.noqa: bool = noqa
117
129
 
118
- def compare_references(self, old_refs: Sequence[nodes.Element],
119
- new_refs: Sequence[nodes.Element],
120
- warning_msg: str) -> None:
130
+ def compare_references(
131
+ self,
132
+ old_refs: Sequence[nodes.Element],
133
+ new_refs: Sequence[nodes.Element],
134
+ warning_msg: str,
135
+ ) -> None:
121
136
  """Warn about mismatches between references in original and translated content."""
122
137
  # FIXME: could use a smarter strategy than len(old_refs) == len(new_refs)
123
138
  if not self.noqa and len(old_refs) != len(new_refs):
124
139
  old_ref_rawsources = [ref.rawsource for ref in old_refs]
125
140
  new_ref_rawsources = [ref.rawsource for ref in new_refs]
126
- logger.warning(warning_msg.format(old_ref_rawsources, new_ref_rawsources),
127
- location=self.node, type='i18n', subtype='inconsistent_references')
141
+ logger.warning(
142
+ warning_msg.format(old_ref_rawsources, new_ref_rawsources),
143
+ location=self.node,
144
+ type='i18n',
145
+ subtype='inconsistent_references',
146
+ )
128
147
 
129
148
  def update_title_mapping(self) -> bool:
130
149
  processed = False # skip flag
131
150
 
132
151
  # update title(section) target name-id mapping
133
- if isinstance(self.node, nodes.title) and isinstance(self.node.parent, nodes.section):
152
+ if (
153
+ isinstance(self.node, nodes.title)
154
+ and isinstance(self.node.parent, nodes.section)
155
+ ): # fmt: skip
134
156
  section_node = self.node.parent
135
157
  new_name = nodes.fully_normalize_name(self.patch.astext())
136
158
  old_name = nodes.fully_normalize_name(self.node.astext())
@@ -201,9 +223,14 @@ class _NodeUpdater:
201
223
  is_autofootnote_ref = NodeMatcher(nodes.footnote_reference, auto=Any)
202
224
  old_foot_refs = list(is_autofootnote_ref.findall(self.node))
203
225
  new_foot_refs = list(is_autofootnote_ref.findall(self.patch))
204
- self.compare_references(old_foot_refs, new_foot_refs,
205
- __('inconsistent footnote references in translated message.' +
206
- ' original: {0}, translated: {1}'))
226
+ self.compare_references(
227
+ old_foot_refs,
228
+ new_foot_refs,
229
+ __(
230
+ 'inconsistent footnote references in translated message.'
231
+ ' original: {0}, translated: {1}'
232
+ ),
233
+ )
207
234
  old_foot_namerefs: dict[str, list[nodes.footnote_reference]] = {}
208
235
  for r in old_foot_refs:
209
236
  old_foot_namerefs.setdefault(r.get('refname'), []).append(r)
@@ -241,9 +268,14 @@ class _NodeUpdater:
241
268
  is_refnamed_ref = NodeMatcher(nodes.reference, refname=Any)
242
269
  old_refs = list(is_refnamed_ref.findall(self.node))
243
270
  new_refs = list(is_refnamed_ref.findall(self.patch))
244
- self.compare_references(old_refs, new_refs,
245
- __('inconsistent references in translated message.' +
246
- ' original: {0}, translated: {1}'))
271
+ self.compare_references(
272
+ old_refs,
273
+ new_refs,
274
+ __(
275
+ 'inconsistent references in translated message.'
276
+ ' original: {0}, translated: {1}'
277
+ ),
278
+ )
247
279
  old_ref_names = [r['refname'] for r in old_refs]
248
280
  new_ref_names = [r['refname'] for r in new_refs]
249
281
  orphans = [*({*old_ref_names} - {*new_ref_names})]
@@ -266,31 +298,41 @@ class _NodeUpdater:
266
298
  old_foot_refs = list(is_refnamed_footnote_ref.findall(self.node))
267
299
  new_foot_refs = list(is_refnamed_footnote_ref.findall(self.patch))
268
300
  refname_ids_map: dict[str, list[str]] = {}
269
- self.compare_references(old_foot_refs, new_foot_refs,
270
- __('inconsistent footnote references in translated message.' +
271
- ' original: {0}, translated: {1}'))
301
+ self.compare_references(
302
+ old_foot_refs,
303
+ new_foot_refs,
304
+ __(
305
+ 'inconsistent footnote references in translated message.'
306
+ ' original: {0}, translated: {1}'
307
+ ),
308
+ )
272
309
  for oldf in old_foot_refs:
273
- refname_ids_map.setdefault(oldf["refname"], []).append(oldf["ids"])
310
+ refname_ids_map.setdefault(oldf['refname'], []).append(oldf['ids'])
274
311
  for newf in new_foot_refs:
275
- refname = newf["refname"]
312
+ refname = newf['refname']
276
313
  if refname_ids_map.get(refname):
277
- newf["ids"] = refname_ids_map[refname].pop(0)
314
+ newf['ids'] = refname_ids_map[refname].pop(0)
278
315
 
279
316
  def update_citation_references(self) -> None:
280
317
  # citation should use original 'ids'.
281
318
  is_citation_ref = NodeMatcher(nodes.citation_reference, refname=Any)
282
319
  old_cite_refs = list(is_citation_ref.findall(self.node))
283
320
  new_cite_refs = list(is_citation_ref.findall(self.patch))
284
- self.compare_references(old_cite_refs, new_cite_refs,
285
- __('inconsistent citation references in translated message.' +
286
- ' original: {0}, translated: {1}'))
321
+ self.compare_references(
322
+ old_cite_refs,
323
+ new_cite_refs,
324
+ __(
325
+ 'inconsistent citation references in translated message.'
326
+ ' original: {0}, translated: {1}'
327
+ ),
328
+ )
287
329
  refname_ids_map: dict[str, list[str]] = {}
288
330
  for oldc in old_cite_refs:
289
- refname_ids_map.setdefault(oldc["refname"], []).append(oldc["ids"])
331
+ refname_ids_map.setdefault(oldc['refname'], []).append(oldc['ids'])
290
332
  for newc in new_cite_refs:
291
- refname = newc["refname"]
333
+ refname = newc['refname']
292
334
  if refname_ids_map.get(refname):
293
- newc["ids"] = refname_ids_map[refname].pop()
335
+ newc['ids'] = refname_ids_map[refname].pop()
294
336
 
295
337
  def update_pending_xrefs(self) -> None:
296
338
  # Original pending_xref['reftarget'] contain not-translated
@@ -298,20 +340,25 @@ class _NodeUpdater:
298
340
  # This code restricts to change ref-targets in the translation.
299
341
  old_xrefs = [*self.node.findall(addnodes.pending_xref)]
300
342
  new_xrefs = [*self.patch.findall(addnodes.pending_xref)]
301
- self.compare_references(old_xrefs, new_xrefs,
302
- __('inconsistent term references in translated message.' +
303
- ' original: {0}, translated: {1}'))
343
+ self.compare_references(
344
+ old_xrefs,
345
+ new_xrefs,
346
+ __(
347
+ 'inconsistent term references in translated message.'
348
+ ' original: {0}, translated: {1}'
349
+ ),
350
+ )
304
351
 
305
352
  xref_reftarget_map: dict[tuple[str, str, str] | None, dict[str, Any]] = {}
306
353
 
307
354
  def get_ref_key(node: addnodes.pending_xref) -> tuple[str, str, str] | None:
308
- case = node["refdomain"], node["reftype"]
355
+ case = node['refdomain'], node['reftype']
309
356
  if case == ('std', 'term'):
310
357
  return None
311
358
  else:
312
359
  return (
313
- node["refdomain"],
314
- node["reftype"],
360
+ node['refdomain'],
361
+ node['reftype'],
315
362
  node['reftarget'],
316
363
  )
317
364
 
@@ -347,8 +394,10 @@ class Locale(SphinxTransform):
347
394
  textdomain = docname_to_domain(self.env.docname, self.config.gettext_compact)
348
395
 
349
396
  # fetch translations
350
- dirs = [path.join(self.env.srcdir, directory)
351
- for directory in self.config.locale_dirs]
397
+ dirs = [
398
+ path.join(self.env.srcdir, directory)
399
+ for directory in self.config.locale_dirs
400
+ ]
352
401
  catalog, has_catalog = init_locale(dirs, self.config.language, textdomain)
353
402
  if not has_catalog:
354
403
  return
@@ -393,8 +442,14 @@ class Locale(SphinxTransform):
393
442
  if isinstance(node, LITERAL_TYPE_NODES):
394
443
  msgstr = '::\n\n' + indent(msgstr, ' ' * 3)
395
444
 
396
- patch = publish_msgstr(self.app, msgstr, source,
397
- node.line, self.config, settings) # type: ignore[arg-type]
445
+ patch = publish_msgstr(
446
+ self.app,
447
+ msgstr,
448
+ source,
449
+ node.line, # type: ignore[arg-type]
450
+ self.config,
451
+ settings,
452
+ )
398
453
  # FIXME: no warnings about inconsistent references in this part
399
454
  # XXX doctest and other block markup
400
455
  if not isinstance(patch, nodes.paragraph):
@@ -408,11 +463,21 @@ class Locale(SphinxTransform):
408
463
  for _id in node['ids']:
409
464
  term, first_classifier = split_term_classifiers(msgstr)
410
465
  patch = publish_msgstr(
411
- self.app, term or '', source, node.line, self.config, settings, # type: ignore[arg-type]
466
+ self.app,
467
+ term or '',
468
+ source,
469
+ node.line, # type: ignore[arg-type]
470
+ self.config,
471
+ settings,
412
472
  )
413
473
  updater.patch = make_glossary_term(
414
- self.env, patch, first_classifier,
415
- source, node.line, _id, self.document, # type: ignore[arg-type]
474
+ self.env,
475
+ patch,
476
+ first_classifier,
477
+ source,
478
+ node.line, # type: ignore[arg-type]
479
+ _id,
480
+ self.document,
416
481
  )
417
482
  processed = True
418
483
 
@@ -474,8 +539,14 @@ class Locale(SphinxTransform):
474
539
  # This generates: <section ...><title>msgstr</title></section>
475
540
  msgstr = msgstr + '\n' + '=' * len(msgstr) * 2
476
541
 
477
- patch = publish_msgstr(self.app, msgstr, source,
478
- node.line, self.config, settings) # type: ignore[arg-type]
542
+ patch = publish_msgstr(
543
+ self.app,
544
+ msgstr,
545
+ source,
546
+ node.line, # type: ignore[arg-type]
547
+ self.config,
548
+ settings,
549
+ )
479
550
  # Structural Subelements phase2
480
551
  if isinstance(node, nodes.title):
481
552
  # get <title> node that placed as a first child
@@ -483,8 +554,8 @@ class Locale(SphinxTransform):
483
554
 
484
555
  # ignore unexpected markups in translation message
485
556
  unexpected: tuple[type[nodes.Element], ...] = (
486
- nodes.paragraph, # expected form of translation
487
- nodes.title, # generated by above "Subelements phase2"
557
+ nodes.paragraph, # expected form of translation
558
+ nodes.title, # generated by above "Subelements phase2"
488
559
  )
489
560
 
490
561
  # following types are expected if
@@ -527,7 +598,13 @@ class Locale(SphinxTransform):
527
598
  msgstr = part
528
599
  msgstr_parts.append(msgstr)
529
600
 
530
- new_entry = entry_type, ';'.join(msgstr_parts), target_id, main, None
601
+ new_entry = (
602
+ entry_type,
603
+ ';'.join(msgstr_parts),
604
+ target_id,
605
+ main,
606
+ None,
607
+ )
531
608
  new_entries.append(new_entry)
532
609
 
533
610
  node['raw_entries'] = entries
@@ -543,6 +620,7 @@ class TranslationProgressTotaliser(SphinxTransform):
543
620
 
544
621
  def apply(self, **kwargs: Any) -> None:
545
622
  from sphinx.builders.gettext import MessageCatalogBuilder
623
+
546
624
  if isinstance(self.app.builder, MessageCatalogBuilder):
547
625
  return
548
626
 
@@ -567,6 +645,7 @@ class AddTranslationClasses(SphinxTransform):
567
645
 
568
646
  def apply(self, **kwargs: Any) -> None:
569
647
  from sphinx.builders.gettext import MessageCatalogBuilder
648
+
570
649
  if isinstance(self.app.builder, MessageCatalogBuilder):
571
650
  return
572
651
 
@@ -582,8 +661,10 @@ class AddTranslationClasses(SphinxTransform):
582
661
  add_translated = False
583
662
  add_untranslated = True
584
663
  else:
585
- msg = ('translation_progress_classes must be '
586
- 'True, False, "translated" or "untranslated"')
664
+ msg = (
665
+ 'translation_progress_classes must be '
666
+ 'True, False, "translated" or "untranslated"'
667
+ )
587
668
  raise ConfigError(msg)
588
669
 
589
670
  for node in NodeMatcher(nodes.Element, translated=Any).findall(self.document):
@@ -604,6 +685,7 @@ class RemoveTranslatableInline(SphinxTransform):
604
685
 
605
686
  def apply(self, **kwargs: Any) -> None:
606
687
  from sphinx.builders.gettext import MessageCatalogBuilder
688
+
607
689
  if isinstance(self.app.builder, MessageCatalogBuilder):
608
690
  return
609
691