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
@@ -0,0 +1,281 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, overload
4
+
5
+ if TYPE_CHECKING:
6
+ from collections.abc import Iterable, Iterator, Mapping, Set
7
+ from typing import Any, Final, Literal, NoReturn
8
+
9
+ from docutils import nodes
10
+ from typing_extensions import Self
11
+
12
+ from sphinx.domains import Domain
13
+ from sphinx.domains.c import CDomain
14
+ from sphinx.domains.changeset import ChangeSetDomain
15
+ from sphinx.domains.citation import CitationDomain
16
+ from sphinx.domains.cpp import CPPDomain
17
+ from sphinx.domains.index import IndexDomain
18
+ from sphinx.domains.javascript import JavaScriptDomain
19
+ from sphinx.domains.math import MathDomain
20
+ from sphinx.domains.python import PythonDomain
21
+ from sphinx.domains.rst import ReSTDomain
22
+ from sphinx.domains.std import StandardDomain
23
+ from sphinx.environment import BuildEnvironment
24
+ from sphinx.ext.duration import DurationDomain
25
+ from sphinx.ext.todo import TodoDomain
26
+
27
+
28
+ class _DomainsContainer:
29
+ """Container for domain instances.
30
+
31
+ This class is private, including its name, constructor, and all methods.
32
+ Any or all of these will change without notice or warning in any release.
33
+
34
+ The public interface is restricted to:
35
+
36
+ * the``domains.['<domain-name>']`` mapping interface
37
+ * the ``domains.<core-domain-name>`` attributes for core domains.
38
+ * the `.get()``, ``.keys()``, ``.items()``, and ``.values()`` methods.
39
+
40
+ Additionally, this class supports ``iter`` and ``len``,
41
+ and provides membership testing via the ``in`` operator.
42
+ """
43
+
44
+ __slots__ = (
45
+ '_domain_instances',
46
+ 'c_domain',
47
+ 'changeset_domain',
48
+ 'citation_domain',
49
+ 'cpp_domain',
50
+ 'index_domain',
51
+ 'javascript_domain',
52
+ 'math_domain',
53
+ 'python_domain',
54
+ 'restructuredtext_domain',
55
+ 'standard_domain',
56
+ )
57
+
58
+ #: First-party domains in :mod:`sphinx.domains`
59
+ _core_domains: Final = frozenset({
60
+ 'std',
61
+ # Language-specific domains
62
+ 'c',
63
+ 'cpp',
64
+ 'js',
65
+ 'py',
66
+ 'rst',
67
+ # Other core domains
68
+ 'changeset',
69
+ 'citation',
70
+ 'index',
71
+ 'math',
72
+ })
73
+
74
+ @classmethod
75
+ def _from_environment(cls, env: BuildEnvironment, /) -> Self:
76
+ create_domains = env.app.registry.create_domains
77
+ # Initialise domains
78
+ if domains := {domain.name: domain for domain in create_domains(env)}:
79
+ return cls(**domains) # type: ignore[arg-type]
80
+
81
+ return cls._from_environment_default(env=env)
82
+
83
+ @classmethod
84
+ def _from_environment_default(cls, *, env: BuildEnvironment) -> Self:
85
+ """Return a default instance with every domain we require."""
86
+ from sphinx.domains.c import CDomain
87
+ from sphinx.domains.changeset import ChangeSetDomain
88
+ from sphinx.domains.citation import CitationDomain
89
+ from sphinx.domains.cpp import CPPDomain
90
+ from sphinx.domains.index import IndexDomain
91
+ from sphinx.domains.javascript import JavaScriptDomain
92
+ from sphinx.domains.math import MathDomain
93
+ from sphinx.domains.python import PythonDomain
94
+ from sphinx.domains.rst import ReSTDomain
95
+ from sphinx.domains.std import StandardDomain
96
+
97
+ return cls(
98
+ c=CDomain(env),
99
+ changeset=ChangeSetDomain(env),
100
+ citation=CitationDomain(env),
101
+ cpp=CPPDomain(env),
102
+ index=IndexDomain(env),
103
+ js=JavaScriptDomain(env),
104
+ math=MathDomain(env),
105
+ py=PythonDomain(env),
106
+ rst=ReSTDomain(env),
107
+ std=StandardDomain(env),
108
+ )
109
+
110
+ def __init__(
111
+ self,
112
+ *,
113
+ c: CDomain,
114
+ cpp: CPPDomain,
115
+ js: JavaScriptDomain,
116
+ py: PythonDomain,
117
+ rst: ReSTDomain,
118
+ std: StandardDomain,
119
+ changeset: ChangeSetDomain,
120
+ citation: CitationDomain,
121
+ index: IndexDomain,
122
+ math: MathDomain,
123
+ **domains: Domain,
124
+ ) -> None:
125
+ # All domains, including core.
126
+ # Implemented as a dict for backwards compatibility.
127
+ self._domain_instances: Mapping[str, Domain] = {
128
+ 'c': c,
129
+ 'changeset': changeset,
130
+ 'citation': citation,
131
+ 'cpp': cpp,
132
+ 'index': index,
133
+ 'js': js,
134
+ 'math': math,
135
+ 'py': py,
136
+ 'rst': rst,
137
+ 'std': std,
138
+ **domains,
139
+ }
140
+
141
+ # Provide typed attributes for the core domains
142
+ self.standard_domain: StandardDomain = std
143
+ self.c_domain: CDomain = c
144
+ self.cpp_domain: CPPDomain = cpp
145
+ self.javascript_domain: JavaScriptDomain = js
146
+ self.python_domain: PythonDomain = py
147
+ self.restructuredtext_domain: ReSTDomain = rst
148
+ self.changeset_domain: ChangeSetDomain = changeset
149
+ self.citation_domain: CitationDomain = citation
150
+ self.index_domain: IndexDomain = index
151
+ self.math_domain: MathDomain = math
152
+
153
+ for domain_name, domain in self._domain_instances.items():
154
+ # invariant from ``_DomainsContainer._from_environment``
155
+ if domain_name != domain.name:
156
+ msg = f'Domain name mismatch in {domain!r}: {domain_name!r} != {domain.name!r}'
157
+ raise ValueError(msg)
158
+
159
+ def _setup(self) -> None:
160
+ for domain in self._domain_instances.values():
161
+ domain.setup()
162
+
163
+ def _process_doc(
164
+ self, env: BuildEnvironment, docname: str, document: nodes.document
165
+ ) -> None:
166
+ for domain in self._domain_instances.values():
167
+ domain.process_doc(env, docname, document)
168
+
169
+ def _clear_doc(self, docname: str) -> None:
170
+ for domain in self._domain_instances.values():
171
+ domain.clear_doc(docname)
172
+
173
+ def _merge_domain_data(
174
+ self, docnames: Set[str], domain_data: dict[str, Any]
175
+ ) -> None:
176
+ for domain_name, domain in self._domain_instances.items():
177
+ domain.merge_domaindata(docnames, domain_data[domain_name])
178
+
179
+ def _check_consistency(self) -> None:
180
+ for domain in self._domain_instances.values():
181
+ domain.check_consistency()
182
+
183
+ def __contains__(self, key: str) -> bool:
184
+ return key in self._domain_instances
185
+
186
+ def __eq__(self, other: object) -> bool:
187
+ if not isinstance(other, _DomainsContainer):
188
+ return NotImplemented
189
+ return self._domain_instances == other._domain_instances
190
+
191
+ def __setattr__(self, key: str, value: object) -> None:
192
+ if key in self._core_domains:
193
+ msg = f'{self.__class__.__name__!r} object does not support assignment to {key!r}'
194
+ raise TypeError(msg)
195
+ super().__setattr__(key, value)
196
+
197
+ def __delattr__(self, key: str) -> None:
198
+ if key in self._core_domains:
199
+ msg = f'{self.__class__.__name__!r} object does not support deletion of {key!r}'
200
+ raise TypeError(msg)
201
+ super().__delattr__(key)
202
+
203
+ # Mapping interface: builtin domains
204
+
205
+ @overload
206
+ def __getitem__(self, key: Literal['c']) -> CDomain: ... # NoQA: E704
207
+
208
+ @overload
209
+ def __getitem__(self, key: Literal['cpp']) -> CPPDomain: ... # NoQA: E704
210
+
211
+ @overload
212
+ def __getitem__(self, key: Literal['changeset']) -> ChangeSetDomain: ... # NoQA: E704
213
+
214
+ @overload
215
+ def __getitem__(self, key: Literal['citation']) -> CitationDomain: ... # NoQA: E704
216
+
217
+ @overload
218
+ def __getitem__(self, key: Literal['index']) -> IndexDomain: ... # NoQA: E704
219
+
220
+ @overload
221
+ def __getitem__(self, key: Literal['js']) -> JavaScriptDomain: ... # NoQA: E704
222
+
223
+ @overload
224
+ def __getitem__(self, key: Literal['math']) -> MathDomain: ... # NoQA: E704
225
+
226
+ @overload
227
+ def __getitem__(self, key: Literal['py']) -> PythonDomain: ... # NoQA: E704
228
+
229
+ @overload
230
+ def __getitem__(self, key: Literal['rst']) -> ReSTDomain: ... # NoQA: E704
231
+
232
+ @overload
233
+ def __getitem__(self, key: Literal['std']) -> StandardDomain: ... # NoQA: E704
234
+
235
+ # Mapping interface: first-party domains
236
+
237
+ @overload
238
+ def __getitem__(self, key: Literal['duration']) -> DurationDomain: ... # NoQA: E704
239
+
240
+ @overload
241
+ def __getitem__(self, key: Literal['todo']) -> TodoDomain: ... # NoQA: E704
242
+
243
+ # Mapping interface: third-party domains
244
+
245
+ @overload
246
+ def __getitem__(self, key: str) -> Domain: ... # NoQA: E704
247
+
248
+ def __getitem__(self, key: str) -> Domain:
249
+ if domain := getattr(self, key, None):
250
+ return domain
251
+ return self._domain_instances[key]
252
+
253
+ def __setitem__(self, key: str, value: Domain) -> NoReturn:
254
+ msg = f'{self.__class__.__name__!r} object does not support item assignment'
255
+ raise TypeError(msg)
256
+
257
+ def __delitem__(self, key: str) -> NoReturn:
258
+ msg = f'{self.__class__.__name__!r} object does not support item deletion'
259
+ raise TypeError(msg)
260
+
261
+ def __iter__(self) -> Iterator[str]:
262
+ return iter(self._domain_instances.keys())
263
+
264
+ def __len__(self) -> int:
265
+ return len(self._domain_instances)
266
+
267
+ def get(self, key: str, default: Domain | None = None) -> Domain | None:
268
+ return self._domain_instances.get(key, default)
269
+
270
+ def keys(self) -> Iterable[str]:
271
+ return self._domain_instances.keys()
272
+
273
+ def items(self) -> Iterable[tuple[str, Domain]]:
274
+ return self._domain_instances.items()
275
+
276
+ def values(self) -> Iterable[Domain]:
277
+ return self._domain_instances.values()
278
+
279
+ def sorted(self) -> Iterable[Domain]:
280
+ for _domain_name, domain in sorted(self._domain_instances.items()):
281
+ yield domain
@@ -0,0 +1,110 @@
1
+ """Domain indices."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from abc import ABC, abstractmethod
6
+ from typing import TYPE_CHECKING, NamedTuple
7
+
8
+ from sphinx.errors import SphinxError
9
+
10
+ if TYPE_CHECKING:
11
+ from collections.abc import Iterable
12
+
13
+ from sphinx.domains import Domain
14
+
15
+
16
+ class IndexEntry(NamedTuple):
17
+ """
18
+ An index entry.
19
+
20
+ .. note::
21
+
22
+ The *qualifier* and *description* are not rendered for some output formats,
23
+ such as LaTeX.
24
+ """
25
+
26
+ #: The name of the index entry to be displayed.
27
+ name: str
28
+
29
+ #: The sub-entry related type. One of:
30
+ #:
31
+ #: ``0``
32
+ #: A normal entry.
33
+ #: ``1``
34
+ #: An entry with sub-entries.
35
+ #: ``2``
36
+ #: A sub-entry.
37
+ subtype: int
38
+
39
+ #: *docname* where the entry is located.
40
+ docname: str
41
+
42
+ #: Anchor for the entry within `docname`
43
+ anchor: str
44
+
45
+ #: Extra info for the entry.
46
+ extra: str
47
+
48
+ #: Qualifier for the description.
49
+ qualifier: str
50
+
51
+ #: Description for the entry.
52
+ descr: str
53
+
54
+
55
+ class Index(ABC):
56
+ """
57
+ An Index is the description for a domain-specific index. To add an index to
58
+ a domain, subclass Index, overriding the three name attributes:
59
+
60
+ * `name` is an identifier used for generating file names.
61
+ It is also used for a hyperlink target for the index. Therefore, users can
62
+ refer the index page using ``ref`` role and a string which is combined
63
+ domain name and ``name`` attribute (ex. ``:ref:`py-modindex```).
64
+ * `localname` is the section title for the index.
65
+ * `shortname` is a short name for the index, for use in the relation bar in
66
+ HTML output. Can be empty to disable entries in the relation bar.
67
+
68
+ and providing a :meth:`generate()` method. Then, add the index class to
69
+ your domain's `indices` list. Extensions can add indices to existing
70
+ domains using :meth:`~sphinx.application.Sphinx.add_index_to_domain()`.
71
+
72
+ .. versionchanged:: 3.0
73
+
74
+ Index pages can be referred by domain name and index name via
75
+ :rst:role:`ref` role.
76
+ """
77
+
78
+ name: str
79
+ localname: str
80
+ shortname: str | None = None
81
+
82
+ def __init__(self, domain: Domain) -> None:
83
+ if not self.name or self.localname is None:
84
+ msg = f'Index subclass {self.__class__.__name__} has no valid name or localname'
85
+ raise SphinxError(msg)
86
+ self.domain = domain
87
+
88
+ @abstractmethod
89
+ def generate(
90
+ self,
91
+ docnames: Iterable[str] | None = None,
92
+ ) -> tuple[list[tuple[str, list[IndexEntry]]], bool]:
93
+ """Get entries for the index.
94
+
95
+ If ``docnames`` is given, restrict to entries referring to these
96
+ docnames.
97
+
98
+ The return value is a tuple of ``(content, collapse)``:
99
+
100
+ ``collapse``
101
+ A boolean that determines if sub-entries should start collapsed (for
102
+ output formats that support collapsing sub-entries).
103
+
104
+ ``content``:
105
+ A sequence of ``(letter, entries)`` tuples, where ``letter`` is the
106
+ "heading" for the given ``entries``, usually the starting letter, and
107
+ ``entries`` is a sequence of single entries.
108
+ Each entry is an :py:class:`IndexEntry`.
109
+ """
110
+ raise NotImplementedError
@@ -33,7 +33,7 @@ from sphinx.util.docutils import SphinxDirective, SphinxRole
33
33
  from sphinx.util.nodes import make_refnode
34
34
 
35
35
  if TYPE_CHECKING:
36
- from collections.abc import Iterator
36
+ from collections.abc import Iterator, Set
37
37
 
38
38
  from docutils.nodes import Element, Node, TextElement, system_message
39
39
 
@@ -526,7 +526,7 @@ class AliasTransform(SphinxTransform):
526
526
  node.replace_self(signode)
527
527
  continue
528
528
 
529
- rootSymbol: Symbol = self.env.domains['c'].data['root_symbol']
529
+ rootSymbol: Symbol = self.env.domains.c_domain.data['root_symbol']
530
530
  parentSymbol: Symbol | None = rootSymbol.direct_lookup(parentKey)
531
531
  if not parentSymbol:
532
532
  logger.debug("Target: %s", sig)
@@ -745,7 +745,7 @@ class CDomain(Domain):
745
745
  def process_field_xref(self, pnode: pending_xref) -> None:
746
746
  pnode.attributes.update(self.env.ref_context)
747
747
 
748
- def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
748
+ def merge_domaindata(self, docnames: Set[str], otherdata: dict[str, Any]) -> None:
749
749
  if Symbol.debug_show_tree:
750
750
  logger.debug("merge_domaindata:")
751
751
  logger.debug("\tself:")
@@ -495,9 +495,11 @@ class DefinitionParser(BaseParser):
495
495
  self.fail("Expected identifier in nested name, "
496
496
  "got keyword: %s" % identifier)
497
497
  if self.matched_text in self.config.c_extra_keywords:
498
- msg = "Expected identifier, got user-defined keyword: %s." \
499
- + " Remove it from c_extra_keywords to allow it as identifier.\n" \
500
- + "Currently c_extra_keywords is %s."
498
+ msg = (
499
+ 'Expected identifier, got user-defined keyword: %s.'
500
+ ' Remove it from c_extra_keywords to allow it as identifier.\n'
501
+ 'Currently c_extra_keywords is %s.'
502
+ )
501
503
  self.fail(msg % (self.matched_text,
502
504
  str(self.config.c_extra_keywords)))
503
505
  ident = ASTIdentifier(identifier)
@@ -670,9 +672,11 @@ class DefinitionParser(BaseParser):
670
672
  self.fail("Expected identifier, "
671
673
  "got keyword: %s" % self.matched_text)
672
674
  if self.matched_text in self.config.c_extra_keywords:
673
- msg = "Expected identifier, got user-defined keyword: %s." \
674
- + " Remove it from c_extra_keywords to allow it as identifier.\n" \
675
- + "Currently c_extra_keywords is %s."
675
+ msg = (
676
+ 'Expected identifier, got user-defined keyword: %s. '
677
+ 'Remove it from c_extra_keywords to allow it as identifier.\n'
678
+ 'Currently c_extra_keywords is %s.'
679
+ )
676
680
  self.fail(msg % (self.matched_text,
677
681
  str(self.config.c_extra_keywords)))
678
682
  identifier = ASTIdentifier(self.matched_text)
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple, cast
5
+ from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple
6
6
 
7
7
  from docutils import nodes
8
8
 
@@ -12,6 +12,8 @@ from sphinx.locale import _
12
12
  from sphinx.util.docutils import SphinxDirective
13
13
 
14
14
  if TYPE_CHECKING:
15
+ from collections.abc import Set
16
+
15
17
  from docutils.nodes import Node
16
18
 
17
19
  from sphinx.application import Sphinx
@@ -96,7 +98,7 @@ class VersionChange(SphinxDirective):
96
98
  translatable=False)
97
99
  node.append(para)
98
100
 
99
- domain = cast(ChangeSetDomain, self.env.get_domain('changeset'))
101
+ domain = self.env.domains.changeset_domain
100
102
  domain.note_changeset(node)
101
103
 
102
104
  ret: list[Node] = [node]
@@ -132,7 +134,7 @@ class ChangeSetDomain(Domain):
132
134
  if changeset.docname == docname:
133
135
  changes.remove(changeset)
134
136
 
135
- def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
137
+ def merge_domaindata(self, docnames: Set[str], otherdata: dict[str, Any]) -> None:
136
138
  # XXX duplicates?
137
139
  for version, otherchanges in otherdata['changes'].items():
138
140
  changes = self.changesets.setdefault(version, [])
@@ -14,6 +14,8 @@ from sphinx.util import logging
14
14
  from sphinx.util.nodes import copy_source_info, make_refnode
15
15
 
16
16
  if TYPE_CHECKING:
17
+ from collections.abc import Set
18
+
17
19
  from docutils.nodes import Element
18
20
 
19
21
  from sphinx.application import Sphinx
@@ -53,7 +55,7 @@ class CitationDomain(Domain):
53
55
  elif docname in docnames:
54
56
  docnames.remove(docname)
55
57
 
56
- def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
58
+ def merge_domaindata(self, docnames: Set[str], otherdata: dict[str, Any]) -> None:
57
59
  # XXX duplicates?
58
60
  for key, data in otherdata['citations'].items():
59
61
  if data[0] in docnames:
@@ -108,7 +110,7 @@ class CitationDefinitionTransform(SphinxTransform):
108
110
  default_priority = 619
109
111
 
110
112
  def apply(self, **kwargs: Any) -> None:
111
- domain = cast(CitationDomain, self.env.get_domain('citation'))
113
+ domain = self.env.domains.citation_domain
112
114
  for node in self.document.findall(nodes.citation):
113
115
  # register citation node to domain
114
116
  node['docname'] = self.env.docname
@@ -128,7 +130,7 @@ class CitationReferenceTransform(SphinxTransform):
128
130
  default_priority = 619
129
131
 
130
132
  def apply(self, **kwargs: Any) -> None:
131
- domain = cast(CitationDomain, self.env.get_domain('citation'))
133
+ domain = self.env.domains.citation_domain
132
134
  for node in self.document.findall(nodes.citation_reference):
133
135
  target = node.astext()
134
136
  ref = pending_xref(target, refdomain='citation', reftype='ref',
@@ -37,7 +37,7 @@ from sphinx.util.docutils import SphinxDirective, SphinxRole
37
37
  from sphinx.util.nodes import make_refnode
38
38
 
39
39
  if TYPE_CHECKING:
40
- from collections.abc import Iterator
40
+ from collections.abc import Iterator, Set
41
41
 
42
42
  from docutils.nodes import Element, Node, TextElement, system_message
43
43
 
@@ -661,7 +661,7 @@ class AliasTransform(SphinxTransform):
661
661
  node.replace_self(signode)
662
662
  continue
663
663
 
664
- rootSymbol: Symbol = self.env.domains['cpp'].data['root_symbol']
664
+ rootSymbol: Symbol = self.env.domains.cpp_domain.data['root_symbol']
665
665
  parentSymbol: Symbol = rootSymbol.direct_lookup(parentKey)
666
666
  if not parentSymbol:
667
667
  logger.debug("Target: %s", sig)
@@ -784,10 +784,9 @@ class CPPXRefRole(XRefRole):
784
784
  if refnode['reftype'] == 'any':
785
785
  # Assume the removal part of fix_parens for :any: refs.
786
786
  # The addition part is done with the reference is resolved.
787
- if not has_explicit_title and title.endswith('()'):
788
- title = title[:-2]
789
- if target.endswith('()'):
790
- target = target[:-2]
787
+ if not has_explicit_title:
788
+ title = title.removesuffix('()')
789
+ target = target.removesuffix('()')
791
790
  # TODO: should this really be here?
792
791
  if not has_explicit_title:
793
792
  target = target.lstrip('~') # only has a meaning for the title
@@ -934,7 +933,7 @@ class CPPDomain(Domain):
934
933
  def process_field_xref(self, pnode: pending_xref) -> None:
935
934
  pnode.attributes.update(self.env.ref_context)
936
935
 
937
- def merge_domaindata(self, docnames: list[str], otherdata: dict[str, Any]) -> None:
936
+ def merge_domaindata(self, docnames: Set[str], otherdata: dict[str, Any]) -> None:
938
937
  if Symbol.debug_show_tree:
939
938
  logger.debug("merge_domaindata:")
940
939
  logger.debug("\tself:")
@@ -1036,8 +1035,7 @@ class CPPDomain(Domain):
1036
1035
  raise NoUri(txtName, typ)
1037
1036
  return None, None
1038
1037
 
1039
- if typ.startswith('cpp:'):
1040
- typ = typ[4:]
1038
+ typ = typ.removeprefix('cpp:')
1041
1039
  declTyp = s.declaration.objectType
1042
1040
 
1043
1041
  def checkType() -> bool:
@@ -1093,8 +1091,8 @@ class CPPDomain(Domain):
1093
1091
  if typ == 'any' and displayName.endswith('()'):
1094
1092
  addParen += 1
1095
1093
  elif typ == 'func':
1096
- if title.endswith('()') and not displayName.endswith('()'):
1097
- title = title[:-2]
1094
+ if not displayName.endswith('()'):
1095
+ title = title.removesuffix('()')
1098
1096
  else:
1099
1097
  if displayName.endswith('()'):
1100
1098
  addParen += 1
@@ -1263,7 +1263,7 @@ class DefinitionParser(BaseParser):
1263
1263
  if self.skip_string('('):
1264
1264
  expr = self._parse_constant_expression(inTemplate=False)
1265
1265
  if not expr:
1266
- self.fail("Expected constant expression after '('" +
1266
+ self.fail("Expected constant expression after '('"
1267
1267
  " in explicit specifier.")
1268
1268
  self.skip_ws()
1269
1269
  if not self.skip_string(')'):
@@ -1972,13 +1972,14 @@ class DefinitionParser(BaseParser):
1972
1972
  if numArgs > numParams:
1973
1973
  numExtra = numArgs - numParams
1974
1974
  if not fullSpecShorthand and not isMemberInstantiation:
1975
- msg = "Too many template argument lists compared to parameter" \
1976
- " lists. Argument lists: %d, Parameter lists: %d," \
1977
- " Extra empty parameters lists prepended: %d." \
1978
- % (numArgs, numParams, numExtra)
1979
- msg += " Declaration:\n\t"
1975
+ msg = (
1976
+ f'Too many template argument lists compared to parameter lists. '
1977
+ f'Argument lists: {numArgs:d}, Parameter lists: {numParams:d}, '
1978
+ f'Extra empty parameters lists prepended: {numExtra:d}. '
1979
+ 'Declaration:\n\t'
1980
+ )
1980
1981
  if templatePrefix:
1981
- msg += "%s\n\t" % templatePrefix
1982
+ msg += f"{templatePrefix}\n\t"
1982
1983
  msg += str(nestedName)
1983
1984
  self.warn(msg)
1984
1985
 
sphinx/domains/index.py CHANGED
@@ -15,7 +15,7 @@ from sphinx.util.index_entries import split_index_msg
15
15
  from sphinx.util.nodes import process_index_entry
16
16
 
17
17
  if TYPE_CHECKING:
18
- from collections.abc import Iterable
18
+ from collections.abc import Set
19
19
 
20
20
  from docutils.nodes import Node, system_message
21
21
 
@@ -28,7 +28,7 @@ logger = logging.getLogger(__name__)
28
28
 
29
29
 
30
30
  class IndexDomain(Domain):
31
- """Mathematics domain."""
31
+ """Index domain."""
32
32
 
33
33
  name = 'index'
34
34
  label = 'index'
@@ -40,7 +40,7 @@ class IndexDomain(Domain):
40
40
  def clear_doc(self, docname: str) -> None:
41
41
  self.entries.pop(docname, None)
42
42
 
43
- def merge_domaindata(self, docnames: Iterable[str], otherdata: dict[str, Any]) -> None:
43
+ def merge_domaindata(self, docnames: Set[str], otherdata: dict[str, Any]) -> None:
44
44
  for docname in docnames:
45
45
  self.entries[docname] = otherdata['entries'][docname]
46
46