Sphinx 7.3.7__py3-none-any.whl → 7.4.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 (357) hide show
  1. sphinx/__init__.py +5 -6
  2. sphinx/_cli/__init__.py +296 -0
  3. sphinx/_cli/util/__init__.py +0 -0
  4. sphinx/_cli/util/colour.py +103 -0
  5. sphinx/_cli/util/errors.py +165 -0
  6. sphinx/application.py +78 -43
  7. sphinx/builders/__init__.py +59 -15
  8. sphinx/builders/_epub_base.py +11 -5
  9. sphinx/builders/changes.py +2 -2
  10. sphinx/builders/epub3.py +2 -2
  11. sphinx/builders/gettext.py +10 -10
  12. sphinx/builders/html/__init__.py +56 -54
  13. sphinx/builders/latex/__init__.py +5 -5
  14. sphinx/builders/latex/constants.py +5 -0
  15. sphinx/builders/linkcheck.py +73 -38
  16. sphinx/builders/texinfo.py +1 -1
  17. sphinx/cmd/build.py +1 -1
  18. sphinx/cmd/quickstart.py +11 -11
  19. sphinx/config.py +57 -38
  20. sphinx/directives/__init__.py +7 -9
  21. sphinx/directives/code.py +12 -15
  22. sphinx/directives/other.py +12 -15
  23. sphinx/directives/patches.py +26 -0
  24. sphinx/domains/__init__.py +1 -1
  25. sphinx/domains/c/__init__.py +5 -5
  26. sphinx/domains/c/_ast.py +436 -12
  27. sphinx/domains/c/_symbol.py +89 -134
  28. sphinx/domains/changeset.py +3 -4
  29. sphinx/domains/cpp/__init__.py +5 -6
  30. sphinx/domains/cpp/_ast.py +822 -25
  31. sphinx/domains/cpp/_symbol.py +3 -0
  32. sphinx/domains/javascript.py +3 -6
  33. sphinx/domains/math.py +3 -2
  34. sphinx/domains/python/__init__.py +44 -6
  35. sphinx/domains/python/_object.py +7 -5
  36. sphinx/domains/rst.py +2 -2
  37. sphinx/domains/std/__init__.py +95 -14
  38. sphinx/environment/__init__.py +35 -15
  39. sphinx/environment/adapters/indexentries.py +71 -24
  40. sphinx/environment/adapters/toctree.py +1 -1
  41. sphinx/environment/collectors/__init__.py +18 -4
  42. sphinx/environment/collectors/asset.py +4 -4
  43. sphinx/environment/collectors/toctree.py +27 -14
  44. sphinx/events.py +7 -6
  45. sphinx/ext/apidoc.py +377 -170
  46. sphinx/ext/autodoc/__init__.py +13 -13
  47. sphinx/ext/autodoc/directive.py +10 -13
  48. sphinx/ext/autodoc/mock.py +10 -7
  49. sphinx/ext/autodoc/preserve_defaults.py +1 -1
  50. sphinx/ext/autodoc/typehints.py +2 -2
  51. sphinx/ext/autosummary/__init__.py +15 -9
  52. sphinx/ext/autosummary/generate.py +270 -154
  53. sphinx/ext/coverage.py +108 -18
  54. sphinx/ext/duration.py +10 -3
  55. sphinx/ext/extlinks.py +3 -2
  56. sphinx/ext/graphviz.py +3 -3
  57. sphinx/ext/ifconfig.py +1 -2
  58. sphinx/ext/imgconverter.py +1 -0
  59. sphinx/ext/imgmath.py +7 -6
  60. sphinx/ext/inheritance_diagram.py +3 -3
  61. sphinx/ext/intersphinx/__init__.py +81 -0
  62. sphinx/ext/intersphinx/__main__.py +10 -0
  63. sphinx/ext/intersphinx/_cli.py +44 -0
  64. sphinx/ext/intersphinx/_load.py +253 -0
  65. sphinx/ext/{intersphinx.py → intersphinx/_resolve.py} +17 -368
  66. sphinx/ext/intersphinx/_shared.py +53 -0
  67. sphinx/ext/mathjax.py +1 -1
  68. sphinx/ext/todo.py +2 -2
  69. sphinx/io.py +2 -6
  70. sphinx/locale/__init__.py +1 -5
  71. sphinx/locale/ar/LC_MESSAGES/sphinx.js +1 -1
  72. sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
  73. sphinx/locale/ar/LC_MESSAGES/sphinx.po +678 -471
  74. sphinx/locale/bg/LC_MESSAGES/sphinx.js +1 -1
  75. sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
  76. sphinx/locale/bg/LC_MESSAGES/sphinx.po +684 -476
  77. sphinx/locale/bn/LC_MESSAGES/sphinx.js +1 -1
  78. sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
  79. sphinx/locale/bn/LC_MESSAGES/sphinx.po +679 -472
  80. sphinx/locale/ca/LC_MESSAGES/sphinx.js +1 -1
  81. sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
  82. sphinx/locale/ca/LC_MESSAGES/sphinx.po +681 -474
  83. sphinx/locale/cak/LC_MESSAGES/sphinx.js +1 -1
  84. sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
  85. sphinx/locale/cak/LC_MESSAGES/sphinx.po +678 -471
  86. sphinx/locale/cs/LC_MESSAGES/sphinx.js +1 -1
  87. sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
  88. sphinx/locale/cs/LC_MESSAGES/sphinx.po +679 -472
  89. sphinx/locale/cy/LC_MESSAGES/sphinx.js +1 -1
  90. sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
  91. sphinx/locale/cy/LC_MESSAGES/sphinx.po +679 -472
  92. sphinx/locale/da/LC_MESSAGES/sphinx.js +1 -1
  93. sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
  94. sphinx/locale/da/LC_MESSAGES/sphinx.po +679 -472
  95. sphinx/locale/de/LC_MESSAGES/sphinx.js +1 -1
  96. sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
  97. sphinx/locale/de/LC_MESSAGES/sphinx.po +679 -472
  98. sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +1 -1
  99. sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
  100. sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +678 -471
  101. sphinx/locale/el/LC_MESSAGES/sphinx.js +1 -1
  102. sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
  103. sphinx/locale/el/LC_MESSAGES/sphinx.po +701 -494
  104. sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +1 -1
  105. sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
  106. sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +700 -493
  107. sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +1 -1
  108. sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
  109. sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +700 -493
  110. sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +1 -1
  111. sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
  112. sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +701 -494
  113. sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +1 -1
  114. sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
  115. sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +700 -493
  116. sphinx/locale/eo/LC_MESSAGES/sphinx.js +1 -1
  117. sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
  118. sphinx/locale/eo/LC_MESSAGES/sphinx.po +701 -494
  119. sphinx/locale/es/LC_MESSAGES/sphinx.js +1 -1
  120. sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
  121. sphinx/locale/es/LC_MESSAGES/sphinx.po +701 -494
  122. sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +1 -1
  123. sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
  124. sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +700 -493
  125. sphinx/locale/et/LC_MESSAGES/sphinx.js +1 -1
  126. sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
  127. sphinx/locale/et/LC_MESSAGES/sphinx.po +701 -494
  128. sphinx/locale/eu/LC_MESSAGES/sphinx.js +1 -1
  129. sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
  130. sphinx/locale/eu/LC_MESSAGES/sphinx.po +701 -494
  131. sphinx/locale/fa/LC_MESSAGES/sphinx.js +1 -1
  132. sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
  133. sphinx/locale/fa/LC_MESSAGES/sphinx.po +701 -494
  134. sphinx/locale/fi/LC_MESSAGES/sphinx.js +1 -1
  135. sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
  136. sphinx/locale/fi/LC_MESSAGES/sphinx.po +700 -493
  137. sphinx/locale/fr/LC_MESSAGES/sphinx.js +1 -1
  138. sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
  139. sphinx/locale/fr/LC_MESSAGES/sphinx.po +725 -518
  140. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +1 -1
  141. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
  142. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +700 -493
  143. sphinx/locale/gl/LC_MESSAGES/sphinx.js +1 -1
  144. sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
  145. sphinx/locale/gl/LC_MESSAGES/sphinx.po +701 -494
  146. sphinx/locale/he/LC_MESSAGES/sphinx.js +1 -1
  147. sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
  148. sphinx/locale/he/LC_MESSAGES/sphinx.po +700 -493
  149. sphinx/locale/hi/LC_MESSAGES/sphinx.js +1 -1
  150. sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
  151. sphinx/locale/hi/LC_MESSAGES/sphinx.po +701 -494
  152. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +1 -1
  153. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
  154. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +700 -493
  155. sphinx/locale/hr/LC_MESSAGES/sphinx.js +1 -1
  156. sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
  157. sphinx/locale/hr/LC_MESSAGES/sphinx.po +701 -494
  158. sphinx/locale/hu/LC_MESSAGES/sphinx.js +1 -1
  159. sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
  160. sphinx/locale/hu/LC_MESSAGES/sphinx.po +701 -494
  161. sphinx/locale/id/LC_MESSAGES/sphinx.js +1 -1
  162. sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
  163. sphinx/locale/id/LC_MESSAGES/sphinx.po +701 -494
  164. sphinx/locale/is/LC_MESSAGES/sphinx.js +1 -1
  165. sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
  166. sphinx/locale/is/LC_MESSAGES/sphinx.po +700 -493
  167. sphinx/locale/it/LC_MESSAGES/sphinx.js +1 -1
  168. sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
  169. sphinx/locale/it/LC_MESSAGES/sphinx.po +708 -500
  170. sphinx/locale/ja/LC_MESSAGES/sphinx.js +1 -1
  171. sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
  172. sphinx/locale/ja/LC_MESSAGES/sphinx.po +701 -494
  173. sphinx/locale/ka/LC_MESSAGES/sphinx.js +1 -1
  174. sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
  175. sphinx/locale/ka/LC_MESSAGES/sphinx.po +700 -493
  176. sphinx/locale/ko/LC_MESSAGES/sphinx.js +1 -1
  177. sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
  178. sphinx/locale/ko/LC_MESSAGES/sphinx.po +701 -494
  179. sphinx/locale/lt/LC_MESSAGES/sphinx.js +1 -1
  180. sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
  181. sphinx/locale/lt/LC_MESSAGES/sphinx.po +701 -494
  182. sphinx/locale/lv/LC_MESSAGES/sphinx.js +1 -1
  183. sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
  184. sphinx/locale/lv/LC_MESSAGES/sphinx.po +701 -494
  185. sphinx/locale/mk/LC_MESSAGES/sphinx.js +1 -1
  186. sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
  187. sphinx/locale/mk/LC_MESSAGES/sphinx.po +700 -493
  188. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +1 -1
  189. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
  190. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +701 -494
  191. sphinx/locale/ne/LC_MESSAGES/sphinx.js +1 -1
  192. sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
  193. sphinx/locale/ne/LC_MESSAGES/sphinx.po +701 -494
  194. sphinx/locale/nl/LC_MESSAGES/sphinx.js +1 -1
  195. sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
  196. sphinx/locale/nl/LC_MESSAGES/sphinx.po +701 -494
  197. sphinx/locale/pl/LC_MESSAGES/sphinx.js +1 -1
  198. sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
  199. sphinx/locale/pl/LC_MESSAGES/sphinx.po +701 -494
  200. sphinx/locale/pt/LC_MESSAGES/sphinx.js +1 -1
  201. sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
  202. sphinx/locale/pt/LC_MESSAGES/sphinx.po +700 -493
  203. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +1 -1
  204. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
  205. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +705 -498
  206. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +1 -1
  207. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
  208. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +701 -494
  209. sphinx/locale/ro/LC_MESSAGES/sphinx.js +1 -1
  210. sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
  211. sphinx/locale/ro/LC_MESSAGES/sphinx.po +701 -494
  212. sphinx/locale/ru/LC_MESSAGES/sphinx.js +1 -1
  213. sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
  214. sphinx/locale/ru/LC_MESSAGES/sphinx.po +890 -680
  215. sphinx/locale/si/LC_MESSAGES/sphinx.js +1 -1
  216. sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
  217. sphinx/locale/si/LC_MESSAGES/sphinx.po +700 -493
  218. sphinx/locale/sk/LC_MESSAGES/sphinx.js +1 -1
  219. sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
  220. sphinx/locale/sk/LC_MESSAGES/sphinx.po +701 -494
  221. sphinx/locale/sl/LC_MESSAGES/sphinx.js +1 -1
  222. sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
  223. sphinx/locale/sl/LC_MESSAGES/sphinx.po +701 -494
  224. sphinx/locale/sphinx.pot +702 -494
  225. sphinx/locale/sq/LC_MESSAGES/sphinx.js +1 -1
  226. sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
  227. sphinx/locale/sq/LC_MESSAGES/sphinx.po +704 -497
  228. sphinx/locale/sr/LC_MESSAGES/sphinx.js +1 -1
  229. sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
  230. sphinx/locale/sr/LC_MESSAGES/sphinx.po +700 -493
  231. sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
  232. sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
  233. sphinx/locale/sv/LC_MESSAGES/sphinx.js +1 -1
  234. sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
  235. sphinx/locale/sv/LC_MESSAGES/sphinx.po +701 -494
  236. sphinx/locale/ta/LC_MESSAGES/sphinx.po +1016 -808
  237. sphinx/locale/te/LC_MESSAGES/sphinx.js +1 -1
  238. sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
  239. sphinx/locale/te/LC_MESSAGES/sphinx.po +700 -493
  240. sphinx/locale/tr/LC_MESSAGES/sphinx.js +1 -1
  241. sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
  242. sphinx/locale/tr/LC_MESSAGES/sphinx.po +701 -494
  243. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +1 -1
  244. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
  245. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +701 -494
  246. sphinx/locale/ur/LC_MESSAGES/sphinx.js +1 -1
  247. sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
  248. sphinx/locale/ur/LC_MESSAGES/sphinx.po +700 -493
  249. sphinx/locale/vi/LC_MESSAGES/sphinx.js +1 -1
  250. sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
  251. sphinx/locale/vi/LC_MESSAGES/sphinx.po +701 -494
  252. sphinx/locale/yue/LC_MESSAGES/sphinx.js +1 -1
  253. sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
  254. sphinx/locale/yue/LC_MESSAGES/sphinx.po +700 -493
  255. sphinx/locale/zh_CN/LC_MESSAGES/sphinx.po +704 -496
  256. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +1 -1
  257. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
  258. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +700 -493
  259. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +1 -1
  260. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
  261. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +729 -522
  262. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +1 -1
  263. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
  264. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +700 -493
  265. sphinx/roles.py +1 -1
  266. sphinx/search/__init__.py +17 -9
  267. sphinx/templates/quickstart/{root_doc.rst_t → root_doc.rst.jinja} +7 -10
  268. sphinx/testing/fixtures.py +22 -20
  269. sphinx/testing/path.py +6 -2
  270. sphinx/testing/util.py +8 -13
  271. sphinx/texinputs/sphinx.sty +449 -332
  272. sphinx/texinputs/sphinxlatexadmonitions.sty +209 -66
  273. sphinx/texinputs/sphinxlatexliterals.sty +9 -16
  274. sphinx/texinputs/sphinxlatexstyletext.sty +4 -38
  275. sphinx/texinputs/sphinxlatextables.sty +6 -14
  276. sphinx/texinputs/sphinxpackageboxes.sty +15 -42
  277. sphinx/texinputs/sphinxpackagefootnote.sty +4 -3
  278. sphinx/themes/agogo/layout.html +3 -3
  279. sphinx/themes/basic/genindex-single.html +2 -1
  280. sphinx/themes/basic/layout.html +3 -6
  281. sphinx/themes/basic/static/searchtools.js +4 -3
  282. sphinx/themes/haiku/layout.html +4 -4
  283. sphinx/themes/pyramid/layout.html +1 -1
  284. sphinx/themes/scrolls/layout.html +2 -2
  285. sphinx/theming.py +3 -3
  286. sphinx/transforms/__init__.py +34 -20
  287. sphinx/transforms/i18n.py +8 -7
  288. sphinx/transforms/post_transforms/__init__.py +1 -1
  289. sphinx/transforms/post_transforms/images.py +7 -10
  290. sphinx/util/_pathlib.py +2 -2
  291. sphinx/util/cfamily.py +52 -30
  292. sphinx/util/console.py +1 -1
  293. sphinx/util/display.py +16 -11
  294. sphinx/util/docutils.py +88 -40
  295. sphinx/util/fileutil.py +15 -3
  296. sphinx/util/images.py +1 -0
  297. sphinx/util/inspect.py +66 -22
  298. sphinx/util/inventory.py +15 -0
  299. sphinx/util/logging.py +14 -21
  300. sphinx/util/math.py +3 -1
  301. sphinx/util/nodes.py +9 -12
  302. sphinx/util/osutil.py +5 -5
  303. sphinx/util/parsing.py +93 -0
  304. sphinx/util/tags.py +71 -47
  305. sphinx/util/typing.py +261 -143
  306. sphinx/versioning.py +17 -17
  307. sphinx/writers/html5.py +26 -19
  308. sphinx/writers/latex.py +58 -28
  309. sphinx/writers/manpage.py +4 -3
  310. sphinx/writers/texinfo.py +19 -14
  311. {sphinx-7.3.7.dist-info → sphinx-7.4.0.dist-info}/METADATA +21 -20
  312. sphinx-7.4.0.dist-info/RECORD +591 -0
  313. sphinx-7.3.7.dist-info/RECORD +0 -581
  314. /sphinx/templates/apidoc/{module.rst_t → module.rst.jinja} +0 -0
  315. /sphinx/templates/apidoc/{package.rst_t → package.rst.jinja} +0 -0
  316. /sphinx/templates/apidoc/{toc.rst_t → toc.rst.jinja} +0 -0
  317. /sphinx/templates/epub3/{content.opf_t → content.opf.jinja} +0 -0
  318. /sphinx/templates/epub3/{nav.xhtml_t → nav.xhtml.jinja} +0 -0
  319. /sphinx/templates/epub3/{toc.ncx_t → toc.ncx.jinja} +0 -0
  320. /sphinx/templates/gettext/{message.pot_t → message.pot.jinja} +0 -0
  321. /sphinx/templates/imgmath/{preview.tex_t → preview.tex.jinja} +0 -0
  322. /sphinx/templates/imgmath/{template.tex_t → template.tex.jinja} +0 -0
  323. /sphinx/templates/latex/{latex.tex_t → latex.tex.jinja} +0 -0
  324. /sphinx/templates/latex/{longtable.tex_t → longtable.tex.jinja} +0 -0
  325. /sphinx/templates/latex/{sphinxmessages.sty_t → sphinxmessages.sty.jinja} +0 -0
  326. /sphinx/templates/latex/{tabular.tex_t → tabular.tex.jinja} +0 -0
  327. /sphinx/templates/latex/{tabulary.tex_t → tabulary.tex.jinja} +0 -0
  328. /sphinx/templates/quickstart/{Makefile_t → Makefile.jinja} +0 -0
  329. /sphinx/templates/quickstart/{Makefile.new_t → Makefile.new.jinja} +0 -0
  330. /sphinx/templates/quickstart/{conf.py_t → conf.py.jinja} +0 -0
  331. /sphinx/templates/quickstart/{make.bat_t → make.bat.jinja} +0 -0
  332. /sphinx/templates/quickstart/{make.bat.new_t → make.bat.new.jinja} +0 -0
  333. /sphinx/texinputs/{Makefile_t → Makefile.jinja} +0 -0
  334. /sphinx/texinputs/{latexmkjarc_t → latexmkjarc.jinja} +0 -0
  335. /sphinx/texinputs/{latexmkrc_t → latexmkrc.jinja} +0 -0
  336. /sphinx/texinputs/{make.bat_t → make.bat.jinja} +0 -0
  337. /sphinx/texinputs_win/{Makefile_t → Makefile.jinja} +0 -0
  338. /sphinx/themes/agogo/static/{agogo.css_t → agogo.css.jinja} +0 -0
  339. /sphinx/themes/basic/static/{basic.css_t → basic.css.jinja} +0 -0
  340. /sphinx/themes/basic/static/{documentation_options.js_t → documentation_options.js.jinja} +0 -0
  341. /sphinx/themes/basic/static/{language_data.js_t → language_data.js.jinja} +0 -0
  342. /sphinx/themes/bizstyle/static/{bizstyle.css_t → bizstyle.css.jinja} +0 -0
  343. /sphinx/themes/bizstyle/static/{bizstyle.js_t → bizstyle.js.jinja} +0 -0
  344. /sphinx/themes/classic/static/{classic.css_t → classic.css.jinja} +0 -0
  345. /sphinx/themes/classic/static/{sidebar.js_t → sidebar.js.jinja} +0 -0
  346. /sphinx/themes/epub/static/{epub.css_t → epub.css.jinja} +0 -0
  347. /sphinx/themes/haiku/static/{haiku.css_t → haiku.css.jinja} +0 -0
  348. /sphinx/themes/nature/static/{nature.css_t → nature.css.jinja} +0 -0
  349. /sphinx/themes/nonav/static/{nonav.css_t → nonav.css.jinja} +0 -0
  350. /sphinx/themes/pyramid/static/{epub.css_t → epub.css.jinja} +0 -0
  351. /sphinx/themes/pyramid/static/{pyramid.css_t → pyramid.css.jinja} +0 -0
  352. /sphinx/themes/scrolls/static/{scrolls.css_t → scrolls.css.jinja} +0 -0
  353. /sphinx/themes/sphinxdoc/static/{sphinxdoc.css_t → sphinxdoc.css.jinja} +0 -0
  354. /sphinx/themes/traditional/static/{traditional.css_t → traditional.css.jinja} +0 -0
  355. {sphinx-7.3.7.dist-info → sphinx-7.4.0.dist-info}/LICENSE.rst +0 -0
  356. {sphinx-7.3.7.dist-info → sphinx-7.4.0.dist-info}/WHEEL +0 -0
  357. {sphinx-7.3.7.dist-info → sphinx-7.4.0.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING, Any, Callable
3
+ from typing import TYPE_CHECKING, Any
4
4
 
5
5
  from sphinx.domains.c._ast import (
6
6
  ASTDeclaration,
@@ -11,7 +11,7 @@ from sphinx.locale import __
11
11
  from sphinx.util import logging
12
12
 
13
13
  if TYPE_CHECKING:
14
- from collections.abc import Iterator
14
+ from collections.abc import Callable, Iterable, Iterator, Sequence
15
15
 
16
16
  from typing_extensions import Self
17
17
 
@@ -32,7 +32,7 @@ class _DuplicateSymbolError(Exception):
32
32
 
33
33
 
34
34
  class SymbolLookupResult:
35
- def __init__(self, symbols: Iterator[Symbol], parentSymbol: Symbol,
35
+ def __init__(self, symbols: Sequence[Symbol], parentSymbol: Symbol,
36
36
  ident: ASTIdentifier) -> None:
37
37
  self.symbols = symbols
38
38
  self.parentSymbol = parentSymbol
@@ -102,18 +102,44 @@ class Symbol:
102
102
  self.isRedeclaration = False
103
103
  self._assert_invariants()
104
104
 
105
- # Remember to modify Symbol.remove if modifications to the parent change.
106
- self._children: list[Symbol] = []
107
- self._anonChildren: list[Symbol] = []
108
- # note: _children includes _anonChildren
105
+ # These properties store the same children for different access patterns.
106
+ # ``_add_child()`` and ``_remove_child()`` should be used for modifying them.
107
+ self._children_by_name: dict[str, Symbol] = {}
108
+ self._children_by_docname: dict[str, dict[str, Symbol]] = {}
109
+ self._anon_children: set[Symbol] = set()
110
+
109
111
  if self.parent:
110
- self.parent._children.append(self)
112
+ self.parent._add_child(self)
111
113
  if self.declaration:
112
114
  self.declaration.symbol = self
113
115
 
114
116
  # Do symbol addition after self._children has been initialised.
115
117
  self._add_function_params()
116
118
 
119
+ def __repr__(self) -> str:
120
+ return f'<Symbol {self.to_string(indent=0)!r}>'
121
+
122
+ @property
123
+ def _children(self) -> Iterable[Symbol]:
124
+ return self._children_by_name.values()
125
+
126
+ def _add_child(self, child: Symbol) -> None:
127
+ name = child.ident.name
128
+ if name in self._children_by_name:
129
+ # Duplicate so don't add - will be reported in _add_symbols()
130
+ return
131
+ self._children_by_name[name] = child
132
+ self._children_by_docname.setdefault(child.docname, {})[name] = child
133
+ if child.ident.is_anonymous:
134
+ self._anon_children.add(child)
135
+
136
+ def _remove_child(self, child: Symbol) -> None:
137
+ name = child.ident.name
138
+ self._children_by_name.pop(name, None)
139
+ self._children_by_docname.get(child.docname, {}).pop(name, None)
140
+ if child.ident.is_anonymous:
141
+ self._anon_children.discard(child)
142
+
117
143
  def _fill_empty(self, declaration: ASTDeclaration, docname: str, line: int) -> None:
118
144
  self._assert_invariants()
119
145
  assert self.declaration is None
@@ -154,25 +180,28 @@ class Symbol:
154
180
  Symbol.debug_indent -= 1
155
181
 
156
182
  def remove(self) -> None:
157
- if self.parent is None:
158
- return
159
- assert self in self.parent._children
160
- self.parent._children.remove(self)
161
- self.parent = None
183
+ if self.parent:
184
+ self.parent._remove_child(self)
185
+ self.parent = None
162
186
 
163
187
  def clear_doc(self, docname: str) -> None:
164
- for sChild in self._children:
165
- sChild.clear_doc(docname)
166
- if sChild.declaration and sChild.docname == docname:
167
- sChild.declaration = None
168
- sChild.docname = None
169
- sChild.line = None
170
- if sChild.siblingAbove is not None:
171
- sChild.siblingAbove.siblingBelow = sChild.siblingBelow
172
- if sChild.siblingBelow is not None:
173
- sChild.siblingBelow.siblingAbove = sChild.siblingAbove
174
- sChild.siblingAbove = None
175
- sChild.siblingBelow = None
188
+ if docname not in self._children_by_docname:
189
+ for child in self._children:
190
+ child.clear_doc(docname)
191
+ return
192
+
193
+ children: dict[str, Symbol] = self._children_by_docname.pop(docname)
194
+ for child in children.values():
195
+ child.declaration = None
196
+ child.docname = None
197
+ child.line = None
198
+ if child.siblingAbove is not None:
199
+ child.siblingAbove.siblingBelow = child.siblingBelow
200
+ if child.siblingBelow is not None:
201
+ child.siblingBelow.siblingAbove = child.siblingAbove
202
+ child.siblingAbove = None
203
+ child.siblingBelow = None
204
+ self._remove_child(child)
176
205
 
177
206
  def get_all_symbols(self) -> Iterator[Symbol]:
178
207
  yield self
@@ -183,14 +212,6 @@ class Symbol:
183
212
  def children(self) -> Iterator[Symbol]:
184
213
  yield from self._children
185
214
 
186
- @property
187
- def children_recurse_anon(self) -> Iterator[Symbol]:
188
- for c in self._children:
189
- yield c
190
- if not c.ident.is_anon():
191
- continue
192
- yield from c.children_recurse_anon
193
-
194
215
  def get_lookup_key(self) -> LookupKey:
195
216
  # The pickle files for the environment and for each document are distinct.
196
217
  # The environment has all the symbols, but the documents has xrefs that
@@ -221,68 +242,6 @@ class Symbol:
221
242
  names = [s.ident for s in symbols]
222
243
  return ASTNestedName(names, rooted=False)
223
244
 
224
- def _find_first_named_symbol(self, ident: ASTIdentifier,
225
- matchSelf: bool, recurseInAnon: bool) -> Symbol | None:
226
- # TODO: further simplification from C++ to C
227
- if Symbol.debug_lookup:
228
- Symbol.debug_print("_find_first_named_symbol ->")
229
- res = self._find_named_symbols(ident, matchSelf, recurseInAnon,
230
- searchInSiblings=False)
231
- try:
232
- return next(res)
233
- except StopIteration:
234
- return None
235
-
236
- def _find_named_symbols(self, ident: ASTIdentifier,
237
- matchSelf: bool, recurseInAnon: bool,
238
- searchInSiblings: bool) -> Iterator[Symbol]:
239
- # TODO: further simplification from C++ to C
240
- if Symbol.debug_lookup:
241
- Symbol.debug_indent += 1
242
- Symbol.debug_print("_find_named_symbols:")
243
- Symbol.debug_indent += 1
244
- Symbol.debug_print("self:")
245
- logger.debug(self.to_string(Symbol.debug_indent + 1, addEndNewline=False))
246
- Symbol.debug_print("ident: ", ident)
247
- Symbol.debug_print("matchSelf: ", matchSelf)
248
- Symbol.debug_print("recurseInAnon: ", recurseInAnon)
249
- Symbol.debug_print("searchInSiblings: ", searchInSiblings)
250
-
251
- def candidates() -> Iterator[Symbol]:
252
- s = self
253
- if Symbol.debug_lookup:
254
- Symbol.debug_print("searching in self:")
255
- logger.debug(s.to_string(Symbol.debug_indent + 1, addEndNewline=False))
256
- while True:
257
- if matchSelf:
258
- yield s
259
- if recurseInAnon:
260
- yield from s.children_recurse_anon
261
- else:
262
- yield from s._children
263
-
264
- if s.siblingAbove is None:
265
- break
266
- s = s.siblingAbove
267
- if Symbol.debug_lookup:
268
- Symbol.debug_print("searching in sibling:")
269
- logger.debug(s.to_string(Symbol.debug_indent + 1, addEndNewline=False))
270
-
271
- for s in candidates():
272
- if Symbol.debug_lookup:
273
- Symbol.debug_print("candidate:")
274
- logger.debug(s.to_string(Symbol.debug_indent + 1, addEndNewline=False))
275
- if s.ident == ident:
276
- if Symbol.debug_lookup:
277
- Symbol.debug_indent += 1
278
- Symbol.debug_print("matches")
279
- Symbol.debug_indent -= 3
280
- yield s
281
- if Symbol.debug_lookup:
282
- Symbol.debug_indent += 2
283
- if Symbol.debug_lookup:
284
- Symbol.debug_indent -= 2
285
-
286
245
  def _symbol_lookup(
287
246
  self,
288
247
  nestedName: ASTNestedName,
@@ -311,16 +270,14 @@ class Symbol:
311
270
  # find the right starting point for lookup
312
271
  parentSymbol = self
313
272
  if nestedName.rooted:
314
- while parentSymbol.parent:
273
+ while parentSymbol.parent is not None:
315
274
  parentSymbol = parentSymbol.parent
275
+
316
276
  if ancestorLookupType is not None:
317
277
  # walk up until we find the first identifier
318
278
  firstName = names[0]
319
279
  while parentSymbol.parent:
320
- if parentSymbol.find_identifier(firstName,
321
- matchSelf=matchSelf,
322
- recurseInAnon=recurseInAnon,
323
- searchInSiblings=searchInSiblings):
280
+ if firstName.name in parentSymbol._children_by_name:
324
281
  break
325
282
  parentSymbol = parentSymbol.parent
326
283
 
@@ -330,18 +287,15 @@ class Symbol:
330
287
 
331
288
  # and now the actual lookup
332
289
  for ident in names[:-1]:
333
- symbol = parentSymbol._find_first_named_symbol(
334
- ident, matchSelf=matchSelf, recurseInAnon=recurseInAnon)
335
- if symbol is None:
290
+ name = ident.name
291
+ if name in parentSymbol._children_by_name:
292
+ symbol = parentSymbol._children_by_name[name]
293
+ else:
336
294
  symbol = onMissingQualifiedSymbol(parentSymbol, ident)
337
295
  if symbol is None:
338
296
  if Symbol.debug_lookup:
339
297
  Symbol.debug_indent -= 2
340
298
  return None
341
- # We have now matched part of a nested name, and need to match more
342
- # so even if we should matchSelf before, we definitely shouldn't
343
- # even more. (see also issue #2666)
344
- matchSelf = False
345
299
  parentSymbol = symbol
346
300
 
347
301
  if Symbol.debug_lookup:
@@ -350,15 +304,19 @@ class Symbol:
350
304
 
351
305
  # handle the last name
352
306
  ident = names[-1]
307
+ name = ident.name
308
+ symbol = parentSymbol._children_by_name.get(name)
309
+ if not symbol and recurseInAnon:
310
+ for child in parentSymbol._anon_children:
311
+ if name in child._children_by_name:
312
+ symbol = child._children_by_name[name]
313
+ break
353
314
 
354
- symbols = parentSymbol._find_named_symbols(
355
- ident, matchSelf=matchSelf,
356
- recurseInAnon=recurseInAnon,
357
- searchInSiblings=searchInSiblings)
358
315
  if Symbol.debug_lookup:
359
- symbols = list(symbols) # type: ignore[assignment]
360
316
  Symbol.debug_indent -= 2
361
- return SymbolLookupResult(symbols, parentSymbol, ident)
317
+
318
+ result = [symbol] if symbol else []
319
+ return SymbolLookupResult(result, parentSymbol, ident)
362
320
 
363
321
  def _add_symbols(
364
322
  self,
@@ -532,17 +490,17 @@ class Symbol:
532
490
  if Symbol.debug_lookup:
533
491
  Symbol.debug_indent += 1
534
492
  Symbol.debug_print("merge_with:")
493
+
535
494
  assert other is not None
536
495
  for otherChild in other._children:
537
- ourChild = self._find_first_named_symbol(
538
- ident=otherChild.ident, matchSelf=False,
539
- recurseInAnon=False)
540
- if ourChild is None:
496
+ otherName = otherChild.ident.name
497
+ if otherName not in self._children_by_name:
541
498
  # TODO: hmm, should we prune by docnames?
542
- self._children.append(otherChild)
543
499
  otherChild.parent = self
500
+ self._add_child(otherChild)
544
501
  otherChild._assert_invariants()
545
502
  continue
503
+ ourChild = self._children_by_name[otherName]
546
504
  if otherChild.declaration and otherChild.docname in docnames:
547
505
  if not ourChild.declaration:
548
506
  ourChild._fill_empty(otherChild.declaration,
@@ -560,6 +518,7 @@ class Symbol:
560
518
  # just ignore it, right?
561
519
  pass
562
520
  ourChild.merge_with(otherChild, docnames, env)
521
+
563
522
  if Symbol.debug_lookup:
564
523
  Symbol.debug_indent -= 1
565
524
 
@@ -608,10 +567,13 @@ class Symbol:
608
567
  Symbol.debug_indent -= 2
609
568
  if matchSelf and current.ident == ident:
610
569
  return current
611
- children = current.children_recurse_anon if recurseInAnon else current._children
612
- for s in children:
613
- if s.ident == ident:
614
- return s
570
+ name = ident.name
571
+ if name in current._children_by_name:
572
+ return current._children_by_name[name]
573
+ if recurseInAnon:
574
+ for child in current._anon_children:
575
+ if name in child._children_by_name:
576
+ return child._children_by_name[name]
615
577
  if not searchInSiblings:
616
578
  break
617
579
  current = current.siblingAbove
@@ -623,24 +585,17 @@ class Symbol:
623
585
  Symbol.debug_print("direct_lookup:")
624
586
  Symbol.debug_indent += 1
625
587
  s = self
626
- for name, id_ in key.data:
627
- res = None
628
- for cand in s._children:
629
- if cand.ident == name:
630
- res = cand
631
- break
632
- s = res
588
+ for ident, id_ in key.data:
589
+ s = s._children_by_name.get(ident.name)
633
590
  if Symbol.debug_lookup:
634
- Symbol.debug_print("name: ", name)
591
+ Symbol.debug_print("name: ", ident.name)
635
592
  Symbol.debug_print("id: ", id_)
636
593
  if s is not None:
637
594
  logger.debug(s.to_string(Symbol.debug_indent + 1, addEndNewline=False))
638
595
  else:
639
596
  Symbol.debug_print("not found")
640
597
  if s is None:
641
- if Symbol.debug_lookup:
642
- Symbol.debug_indent -= 2
643
- return None
598
+ break
644
599
  if Symbol.debug_lookup:
645
600
  Symbol.debug_indent -= 2
646
601
  return s
@@ -680,7 +635,7 @@ class Symbol:
680
635
  res.append('::')
681
636
  else:
682
637
  if self.ident:
683
- res.append(str(self.ident))
638
+ res.append(self.ident.name)
684
639
  else:
685
640
  res.append(str(self.declaration))
686
641
  if self.declaration:
@@ -62,15 +62,14 @@ class VersionChange(SphinxDirective):
62
62
  node['version'] = self.arguments[0]
63
63
  text = versionlabels[self.name] % self.arguments[0]
64
64
  if len(self.arguments) == 2:
65
- inodes, messages = self.state.inline_text(self.arguments[1],
66
- self.lineno + 1)
65
+ inodes, messages = self.parse_inline(self.arguments[1], lineno=self.lineno + 1)
67
66
  para = nodes.paragraph(self.arguments[1], '', *inodes, translatable=False)
68
67
  self.set_source_info(para)
69
68
  node.append(para)
70
69
  else:
71
70
  messages = []
72
71
  if self.content:
73
- self.state.nested_parse(self.content, self.content_offset, node)
72
+ node += self.parse_content_to_nodes()
74
73
  classes = ['versionmodified', versionlabel_classes[self.name]]
75
74
  if len(node) > 0 and isinstance(node[0], nodes.paragraph):
76
75
  # the contents start with a paragraph
@@ -111,7 +110,7 @@ class ChangeSetDomain(Domain):
111
110
  name = 'changeset'
112
111
  label = 'changeset'
113
112
 
114
- initial_data: dict[str, Any] = {
113
+ initial_data: dict[str, dict[str, list[ChangeSet]]] = {
115
114
  'changes': {}, # version -> list of ChangeSet
116
115
  }
117
116
 
@@ -705,7 +705,7 @@ class AliasTransform(SphinxTransform):
705
705
  signode.clear()
706
706
  signode += addnodes.desc_name(sig, sig)
707
707
 
708
- logger.warning("Can not find C++ declaration for alias '%s'." % ast,
708
+ logger.warning("Can not find C++ declaration for alias '%s'.", ast,
709
709
  location=node)
710
710
  node.replace_self(signode)
711
711
  else:
@@ -763,10 +763,9 @@ class CPPAliasObject(ObjectDescription):
763
763
  for sig in signatures:
764
764
  node.append(AliasNode(sig, aliasOptions, env=self.env))
765
765
 
766
- contentnode = addnodes.desc_content()
767
- node.append(contentnode)
768
766
  self.before_content()
769
- self.state.nested_parse(self.content, self.content_offset, contentnode)
767
+ content_node = addnodes.desc_content('', *self.parse_content_to_nodes())
768
+ node.append(content_node)
770
769
  self.env.temp_data['object'] = None
771
770
  self.after_content()
772
771
  return [node]
@@ -1158,8 +1157,8 @@ class CPPDomain(Domain):
1158
1157
  def setup(app: Sphinx) -> ExtensionMetadata:
1159
1158
  app.add_domain(CPPDomain)
1160
1159
  app.add_config_value("cpp_index_common_prefix", [], 'env')
1161
- app.add_config_value("cpp_id_attributes", [], 'env')
1162
- app.add_config_value("cpp_paren_attributes", [], 'env')
1160
+ app.add_config_value("cpp_id_attributes", [], 'env', types={list, tuple})
1161
+ app.add_config_value("cpp_paren_attributes", [], 'env', types={list, tuple})
1163
1162
  app.add_config_value("cpp_maximum_signature_line_length", None, 'env', types={int, None})
1164
1163
  app.add_post_transform(AliasTransform)
1165
1164