Sphinx 8.0.2__py3-none-any.whl → 8.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Sphinx might be problematic. Click here for more details.

Files changed (424) hide show
  1. sphinx/__init__.py +6 -3
  2. sphinx/_cli/__init__.py +40 -20
  3. sphinx/_cli/util/colour.py +5 -4
  4. sphinx/_cli/util/errors.py +28 -11
  5. sphinx/application.py +361 -38
  6. sphinx/builders/__init__.py +229 -83
  7. sphinx/builders/_epub_base.py +118 -71
  8. sphinx/builders/changes.py +39 -21
  9. sphinx/builders/dirhtml.py +4 -4
  10. sphinx/builders/dummy.py +2 -5
  11. sphinx/builders/epub3.py +43 -22
  12. sphinx/builders/gettext.py +43 -25
  13. sphinx/builders/html/__init__.py +284 -218
  14. sphinx/builders/html/_assets.py +62 -26
  15. sphinx/builders/html/_build_info.py +76 -0
  16. sphinx/builders/html/transforms.py +11 -9
  17. sphinx/builders/latex/__init__.py +139 -81
  18. sphinx/builders/latex/constants.py +7 -7
  19. sphinx/builders/latex/nodes.py +3 -2
  20. sphinx/builders/latex/theming.py +7 -5
  21. sphinx/builders/latex/transforms.py +27 -19
  22. sphinx/builders/linkcheck.py +146 -72
  23. sphinx/builders/manpage.py +30 -13
  24. sphinx/builders/singlehtml.py +22 -14
  25. sphinx/builders/texinfo.py +67 -37
  26. sphinx/builders/text.py +5 -5
  27. sphinx/builders/xml.py +6 -9
  28. sphinx/cmd/build.py +282 -103
  29. sphinx/cmd/make_mode.py +106 -63
  30. sphinx/cmd/quickstart.py +341 -145
  31. sphinx/config.py +45 -12
  32. sphinx/deprecation.py +8 -2
  33. sphinx/directives/__init__.py +28 -19
  34. sphinx/directives/code.py +86 -56
  35. sphinx/directives/other.py +50 -36
  36. sphinx/directives/patches.py +29 -19
  37. sphinx/domains/__init__.py +20 -120
  38. sphinx/domains/_domains_container.py +281 -0
  39. sphinx/domains/_index.py +110 -0
  40. sphinx/domains/c/__init__.py +3 -3
  41. sphinx/domains/c/_parser.py +10 -6
  42. sphinx/domains/changeset.py +5 -3
  43. sphinx/domains/citation.py +5 -3
  44. sphinx/domains/cpp/__init__.py +9 -11
  45. sphinx/domains/cpp/_parser.py +8 -7
  46. sphinx/domains/index.py +3 -3
  47. sphinx/domains/javascript.py +12 -7
  48. sphinx/domains/math.py +2 -2
  49. sphinx/domains/python/__init__.py +10 -5
  50. sphinx/domains/python/_object.py +1 -1
  51. sphinx/domains/rst.py +5 -5
  52. sphinx/domains/std/__init__.py +16 -11
  53. sphinx/environment/__init__.py +206 -146
  54. sphinx/environment/adapters/asset.py +3 -2
  55. sphinx/environment/adapters/indexentries.py +74 -33
  56. sphinx/environment/adapters/toctree.py +100 -43
  57. sphinx/environment/collectors/__init__.py +19 -8
  58. sphinx/environment/collectors/asset.py +47 -15
  59. sphinx/environment/collectors/dependencies.py +8 -4
  60. sphinx/environment/collectors/metadata.py +7 -2
  61. sphinx/environment/collectors/title.py +7 -2
  62. sphinx/environment/collectors/toctree.py +54 -22
  63. sphinx/errors.py +4 -1
  64. sphinx/events.py +314 -7
  65. sphinx/ext/apidoc.py +42 -18
  66. sphinx/ext/autodoc/__init__.py +52 -24
  67. sphinx/ext/autodoc/importer.py +6 -9
  68. sphinx/ext/autosectionlabel.py +1 -2
  69. sphinx/ext/autosummary/__init__.py +3 -1
  70. sphinx/ext/autosummary/generate.py +28 -14
  71. sphinx/ext/coverage.py +7 -7
  72. sphinx/ext/doctest.py +4 -8
  73. sphinx/ext/duration.py +6 -5
  74. sphinx/ext/inheritance_diagram.py +1 -1
  75. sphinx/ext/intersphinx/_cli.py +6 -4
  76. sphinx/ext/intersphinx/_load.py +77 -32
  77. sphinx/ext/intersphinx/_resolve.py +173 -79
  78. sphinx/ext/intersphinx/_shared.py +7 -5
  79. sphinx/ext/linkcode.py +7 -1
  80. sphinx/ext/mathjax.py +1 -2
  81. sphinx/ext/napoleon/__init__.py +37 -24
  82. sphinx/ext/napoleon/docstring.py +202 -134
  83. sphinx/ext/todo.py +5 -3
  84. sphinx/highlighting.py +9 -2
  85. sphinx/io.py +1 -1
  86. sphinx/jinja2glue.py +27 -6
  87. sphinx/locale/__init__.py +6 -2
  88. sphinx/locale/ar/LC_MESSAGES/sphinx.js +8 -1
  89. sphinx/locale/ar/LC_MESSAGES/sphinx.mo +0 -0
  90. sphinx/locale/ar/LC_MESSAGES/sphinx.po +2246 -2288
  91. sphinx/locale/bg/LC_MESSAGES/sphinx.js +4 -1
  92. sphinx/locale/bg/LC_MESSAGES/sphinx.mo +0 -0
  93. sphinx/locale/bg/LC_MESSAGES/sphinx.po +2113 -2159
  94. sphinx/locale/bn/LC_MESSAGES/sphinx.js +4 -1
  95. sphinx/locale/bn/LC_MESSAGES/sphinx.mo +0 -0
  96. sphinx/locale/bn/LC_MESSAGES/sphinx.po +2349 -2395
  97. sphinx/locale/ca/LC_MESSAGES/sphinx.js +4 -1
  98. sphinx/locale/ca/LC_MESSAGES/sphinx.mo +0 -0
  99. sphinx/locale/ca/LC_MESSAGES/sphinx.po +2846 -2892
  100. sphinx/locale/cak/LC_MESSAGES/sphinx.js +4 -1
  101. sphinx/locale/cak/LC_MESSAGES/sphinx.mo +0 -0
  102. sphinx/locale/cak/LC_MESSAGES/sphinx.po +2213 -2259
  103. sphinx/locale/cs/LC_MESSAGES/sphinx.js +6 -1
  104. sphinx/locale/cs/LC_MESSAGES/sphinx.mo +0 -0
  105. sphinx/locale/cs/LC_MESSAGES/sphinx.po +2225 -2269
  106. sphinx/locale/cy/LC_MESSAGES/sphinx.js +6 -1
  107. sphinx/locale/cy/LC_MESSAGES/sphinx.mo +0 -0
  108. sphinx/locale/cy/LC_MESSAGES/sphinx.po +2403 -2447
  109. sphinx/locale/da/LC_MESSAGES/sphinx.js +4 -1
  110. sphinx/locale/da/LC_MESSAGES/sphinx.mo +0 -0
  111. sphinx/locale/da/LC_MESSAGES/sphinx.po +2214 -2260
  112. sphinx/locale/de/LC_MESSAGES/sphinx.js +4 -1
  113. sphinx/locale/de/LC_MESSAGES/sphinx.mo +0 -0
  114. sphinx/locale/de/LC_MESSAGES/sphinx.po +2230 -2276
  115. sphinx/locale/de_DE/LC_MESSAGES/sphinx.js +4 -1
  116. sphinx/locale/de_DE/LC_MESSAGES/sphinx.mo +0 -0
  117. sphinx/locale/de_DE/LC_MESSAGES/sphinx.po +2113 -2159
  118. sphinx/locale/el/LC_MESSAGES/sphinx.js +4 -1
  119. sphinx/locale/el/LC_MESSAGES/sphinx.mo +0 -0
  120. sphinx/locale/el/LC_MESSAGES/sphinx.po +2619 -2665
  121. sphinx/locale/en_DE/LC_MESSAGES/sphinx.js +4 -1
  122. sphinx/locale/en_DE/LC_MESSAGES/sphinx.mo +0 -0
  123. sphinx/locale/en_DE/LC_MESSAGES/sphinx.po +2113 -2159
  124. sphinx/locale/en_FR/LC_MESSAGES/sphinx.js +4 -1
  125. sphinx/locale/en_FR/LC_MESSAGES/sphinx.mo +0 -0
  126. sphinx/locale/en_FR/LC_MESSAGES/sphinx.po +2113 -2159
  127. sphinx/locale/en_GB/LC_MESSAGES/sphinx.js +4 -1
  128. sphinx/locale/en_GB/LC_MESSAGES/sphinx.mo +0 -0
  129. sphinx/locale/en_GB/LC_MESSAGES/sphinx.po +2519 -2565
  130. sphinx/locale/en_HK/LC_MESSAGES/sphinx.js +4 -1
  131. sphinx/locale/en_HK/LC_MESSAGES/sphinx.mo +0 -0
  132. sphinx/locale/en_HK/LC_MESSAGES/sphinx.po +2113 -2159
  133. sphinx/locale/eo/LC_MESSAGES/sphinx.js +4 -1
  134. sphinx/locale/eo/LC_MESSAGES/sphinx.mo +0 -0
  135. sphinx/locale/eo/LC_MESSAGES/sphinx.po +2232 -2278
  136. sphinx/locale/es/LC_MESSAGES/sphinx.js +5 -1
  137. sphinx/locale/es/LC_MESSAGES/sphinx.mo +0 -0
  138. sphinx/locale/es/LC_MESSAGES/sphinx.po +2516 -2561
  139. sphinx/locale/es_CO/LC_MESSAGES/sphinx.js +5 -1
  140. sphinx/locale/es_CO/LC_MESSAGES/sphinx.mo +0 -0
  141. sphinx/locale/es_CO/LC_MESSAGES/sphinx.po +2114 -2159
  142. sphinx/locale/et/LC_MESSAGES/sphinx.js +4 -1
  143. sphinx/locale/et/LC_MESSAGES/sphinx.mo +0 -0
  144. sphinx/locale/et/LC_MESSAGES/sphinx.po +2317 -2363
  145. sphinx/locale/eu/LC_MESSAGES/sphinx.js +4 -1
  146. sphinx/locale/eu/LC_MESSAGES/sphinx.mo +0 -0
  147. sphinx/locale/eu/LC_MESSAGES/sphinx.po +2218 -2264
  148. sphinx/locale/fa/LC_MESSAGES/sphinx.js +4 -1
  149. sphinx/locale/fa/LC_MESSAGES/sphinx.mo +0 -0
  150. sphinx/locale/fa/LC_MESSAGES/sphinx.po +2505 -2551
  151. sphinx/locale/fi/LC_MESSAGES/sphinx.js +4 -1
  152. sphinx/locale/fi/LC_MESSAGES/sphinx.mo +0 -0
  153. sphinx/locale/fi/LC_MESSAGES/sphinx.po +2303 -2349
  154. sphinx/locale/fr/LC_MESSAGES/sphinx.js +6 -2
  155. sphinx/locale/fr/LC_MESSAGES/sphinx.mo +0 -0
  156. sphinx/locale/fr/LC_MESSAGES/sphinx.po +2863 -2908
  157. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.js +5 -1
  158. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.mo +0 -0
  159. sphinx/locale/fr_FR/LC_MESSAGES/sphinx.po +2114 -2159
  160. sphinx/locale/gl/LC_MESSAGES/sphinx.js +4 -1
  161. sphinx/locale/gl/LC_MESSAGES/sphinx.mo +0 -0
  162. sphinx/locale/gl/LC_MESSAGES/sphinx.po +2571 -2617
  163. sphinx/locale/he/LC_MESSAGES/sphinx.js +5 -1
  164. sphinx/locale/he/LC_MESSAGES/sphinx.mo +0 -0
  165. sphinx/locale/he/LC_MESSAGES/sphinx.po +2307 -2352
  166. sphinx/locale/hi/LC_MESSAGES/sphinx.js +4 -1
  167. sphinx/locale/hi/LC_MESSAGES/sphinx.mo +0 -0
  168. sphinx/locale/hi/LC_MESSAGES/sphinx.po +2580 -2626
  169. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.js +4 -1
  170. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.mo +0 -0
  171. sphinx/locale/hi_IN/LC_MESSAGES/sphinx.po +2113 -2159
  172. sphinx/locale/hr/LC_MESSAGES/sphinx.js +5 -1
  173. sphinx/locale/hr/LC_MESSAGES/sphinx.mo +0 -0
  174. sphinx/locale/hr/LC_MESSAGES/sphinx.po +2238 -2283
  175. sphinx/locale/hu/LC_MESSAGES/sphinx.js +4 -1
  176. sphinx/locale/hu/LC_MESSAGES/sphinx.mo +0 -0
  177. sphinx/locale/hu/LC_MESSAGES/sphinx.po +2228 -2274
  178. sphinx/locale/id/LC_MESSAGES/sphinx.js +3 -1
  179. sphinx/locale/id/LC_MESSAGES/sphinx.mo +0 -0
  180. sphinx/locale/id/LC_MESSAGES/sphinx.po +2787 -2834
  181. sphinx/locale/is/LC_MESSAGES/sphinx.js +4 -1
  182. sphinx/locale/is/LC_MESSAGES/sphinx.mo +0 -0
  183. sphinx/locale/is/LC_MESSAGES/sphinx.po +2224 -2270
  184. sphinx/locale/it/LC_MESSAGES/sphinx.js +5 -1
  185. sphinx/locale/it/LC_MESSAGES/sphinx.mo +0 -0
  186. sphinx/locale/it/LC_MESSAGES/sphinx.po +2231 -2276
  187. sphinx/locale/ja/LC_MESSAGES/sphinx.js +3 -1
  188. sphinx/locale/ja/LC_MESSAGES/sphinx.mo +0 -0
  189. sphinx/locale/ja/LC_MESSAGES/sphinx.po +2507 -2554
  190. sphinx/locale/ka/LC_MESSAGES/sphinx.js +4 -1
  191. sphinx/locale/ka/LC_MESSAGES/sphinx.mo +0 -0
  192. sphinx/locale/ka/LC_MESSAGES/sphinx.po +2428 -2474
  193. sphinx/locale/ko/LC_MESSAGES/sphinx.js +3 -1
  194. sphinx/locale/ko/LC_MESSAGES/sphinx.mo +0 -0
  195. sphinx/locale/ko/LC_MESSAGES/sphinx.po +2516 -2563
  196. sphinx/locale/lt/LC_MESSAGES/sphinx.js +6 -1
  197. sphinx/locale/lt/LC_MESSAGES/sphinx.mo +0 -0
  198. sphinx/locale/lt/LC_MESSAGES/sphinx.po +2425 -2469
  199. sphinx/locale/lv/LC_MESSAGES/sphinx.js +5 -1
  200. sphinx/locale/lv/LC_MESSAGES/sphinx.mo +0 -0
  201. sphinx/locale/lv/LC_MESSAGES/sphinx.po +2362 -2407
  202. sphinx/locale/mk/LC_MESSAGES/sphinx.js +4 -1
  203. sphinx/locale/mk/LC_MESSAGES/sphinx.mo +0 -0
  204. sphinx/locale/mk/LC_MESSAGES/sphinx.po +2121 -2167
  205. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.js +4 -1
  206. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.mo +0 -0
  207. sphinx/locale/nb_NO/LC_MESSAGES/sphinx.po +2220 -2266
  208. sphinx/locale/ne/LC_MESSAGES/sphinx.js +4 -1
  209. sphinx/locale/ne/LC_MESSAGES/sphinx.mo +0 -0
  210. sphinx/locale/ne/LC_MESSAGES/sphinx.po +2221 -2267
  211. sphinx/locale/nl/LC_MESSAGES/sphinx.js +4 -1
  212. sphinx/locale/nl/LC_MESSAGES/sphinx.mo +0 -0
  213. sphinx/locale/nl/LC_MESSAGES/sphinx.po +2240 -2286
  214. sphinx/locale/pl/LC_MESSAGES/sphinx.js +6 -1
  215. sphinx/locale/pl/LC_MESSAGES/sphinx.mo +0 -0
  216. sphinx/locale/pl/LC_MESSAGES/sphinx.po +2319 -2363
  217. sphinx/locale/pt/LC_MESSAGES/sphinx.js +5 -1
  218. sphinx/locale/pt/LC_MESSAGES/sphinx.mo +0 -0
  219. sphinx/locale/pt/LC_MESSAGES/sphinx.po +2114 -2159
  220. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.js +5 -1
  221. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.mo +0 -0
  222. sphinx/locale/pt_BR/LC_MESSAGES/sphinx.po +2854 -2899
  223. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.js +5 -1
  224. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.mo +0 -0
  225. sphinx/locale/pt_PT/LC_MESSAGES/sphinx.po +2224 -2269
  226. sphinx/locale/ro/LC_MESSAGES/sphinx.js +5 -1
  227. sphinx/locale/ro/LC_MESSAGES/sphinx.mo +0 -0
  228. sphinx/locale/ro/LC_MESSAGES/sphinx.po +2226 -2271
  229. sphinx/locale/ru/LC_MESSAGES/sphinx.js +8 -3
  230. sphinx/locale/ru/LC_MESSAGES/sphinx.mo +0 -0
  231. sphinx/locale/ru/LC_MESSAGES/sphinx.po +2841 -2885
  232. sphinx/locale/si/LC_MESSAGES/sphinx.js +4 -1
  233. sphinx/locale/si/LC_MESSAGES/sphinx.mo +0 -0
  234. sphinx/locale/si/LC_MESSAGES/sphinx.po +2294 -2340
  235. sphinx/locale/sk/LC_MESSAGES/sphinx.js +6 -1
  236. sphinx/locale/sk/LC_MESSAGES/sphinx.mo +0 -0
  237. sphinx/locale/sk/LC_MESSAGES/sphinx.po +2497 -2541
  238. sphinx/locale/sl/LC_MESSAGES/sphinx.js +6 -1
  239. sphinx/locale/sl/LC_MESSAGES/sphinx.mo +0 -0
  240. sphinx/locale/sl/LC_MESSAGES/sphinx.po +2331 -2375
  241. sphinx/locale/sphinx.pot +2121 -2167
  242. sphinx/locale/sq/LC_MESSAGES/sphinx.js +4 -1
  243. sphinx/locale/sq/LC_MESSAGES/sphinx.mo +0 -0
  244. sphinx/locale/sq/LC_MESSAGES/sphinx.po +2855 -2901
  245. sphinx/locale/sr/LC_MESSAGES/sphinx.js +5 -1
  246. sphinx/locale/sr/LC_MESSAGES/sphinx.mo +0 -0
  247. sphinx/locale/sr/LC_MESSAGES/sphinx.po +2203 -2248
  248. sphinx/locale/sr@latin/LC_MESSAGES/sphinx.mo +0 -0
  249. sphinx/locale/sr_RS/LC_MESSAGES/sphinx.mo +0 -0
  250. sphinx/locale/sv/LC_MESSAGES/sphinx.js +4 -1
  251. sphinx/locale/sv/LC_MESSAGES/sphinx.mo +0 -0
  252. sphinx/locale/sv/LC_MESSAGES/sphinx.po +2423 -2469
  253. sphinx/locale/te/LC_MESSAGES/sphinx.js +4 -1
  254. sphinx/locale/te/LC_MESSAGES/sphinx.mo +0 -0
  255. sphinx/locale/te/LC_MESSAGES/sphinx.po +2113 -2159
  256. sphinx/locale/tr/LC_MESSAGES/sphinx.js +4 -1
  257. sphinx/locale/tr/LC_MESSAGES/sphinx.mo +0 -0
  258. sphinx/locale/tr/LC_MESSAGES/sphinx.po +2443 -2489
  259. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.js +6 -1
  260. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.mo +0 -0
  261. sphinx/locale/uk_UA/LC_MESSAGES/sphinx.po +2329 -2373
  262. sphinx/locale/ur/LC_MESSAGES/sphinx.js +4 -1
  263. sphinx/locale/ur/LC_MESSAGES/sphinx.mo +0 -0
  264. sphinx/locale/ur/LC_MESSAGES/sphinx.po +2113 -2159
  265. sphinx/locale/vi/LC_MESSAGES/sphinx.js +3 -1
  266. sphinx/locale/vi/LC_MESSAGES/sphinx.mo +0 -0
  267. sphinx/locale/vi/LC_MESSAGES/sphinx.po +2199 -2246
  268. sphinx/locale/yue/LC_MESSAGES/sphinx.js +3 -1
  269. sphinx/locale/yue/LC_MESSAGES/sphinx.mo +0 -0
  270. sphinx/locale/yue/LC_MESSAGES/sphinx.po +2112 -2159
  271. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.js +3 -1
  272. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.mo +0 -0
  273. sphinx/locale/zh_HK/LC_MESSAGES/sphinx.po +2112 -2159
  274. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.js +3 -1
  275. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.mo +0 -0
  276. sphinx/locale/zh_TW/LC_MESSAGES/sphinx.po +2845 -2892
  277. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.js +3 -1
  278. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.mo +0 -0
  279. sphinx/locale/zh_TW.Big5/LC_MESSAGES/sphinx.po +2112 -2159
  280. sphinx/parsers.py +3 -1
  281. sphinx/project.py +6 -2
  282. sphinx/pycode/__init__.py +11 -4
  283. sphinx/pycode/ast.py +58 -58
  284. sphinx/pycode/parser.py +49 -28
  285. sphinx/pygments_styles.py +49 -49
  286. sphinx/registry.py +8 -3
  287. sphinx/roles.py +133 -13
  288. sphinx/search/__init__.py +146 -87
  289. sphinx/search/da.py +2 -4
  290. sphinx/search/de.py +2 -4
  291. sphinx/search/en.py +4 -4
  292. sphinx/search/es.py +2 -4
  293. sphinx/search/fi.py +2 -4
  294. sphinx/search/fr.py +2 -4
  295. sphinx/search/hu.py +2 -4
  296. sphinx/search/it.py +2 -4
  297. sphinx/search/ja.py +55 -32
  298. sphinx/search/nl.py +2 -4
  299. sphinx/search/no.py +2 -4
  300. sphinx/search/pt.py +2 -4
  301. sphinx/search/ro.py +0 -2
  302. sphinx/search/ru.py +2 -4
  303. sphinx/search/sv.py +2 -4
  304. sphinx/search/tr.py +0 -2
  305. sphinx/search/zh.py +18 -13
  306. sphinx/templates/graphviz/graphviz.css +0 -7
  307. sphinx/testing/fixtures.py +6 -5
  308. sphinx/testing/path.py +7 -5
  309. sphinx/testing/util.py +63 -29
  310. sphinx/texinputs/sphinx.sty +107 -39
  311. sphinx/texinputs/sphinxlatexadmonitions.sty +51 -35
  312. sphinx/texinputs/sphinxlatexcontainers.sty +1 -1
  313. sphinx/texinputs/sphinxlatexgraphics.sty +3 -2
  314. sphinx/texinputs/sphinxlatexindbibtoc.sty +1 -1
  315. sphinx/texinputs/sphinxlatexlists.sty +1 -1
  316. sphinx/texinputs/sphinxlatexliterals.sty +4 -1
  317. sphinx/texinputs/sphinxlatexnumfig.sty +22 -9
  318. sphinx/texinputs/sphinxlatexobjects.sty +1 -1
  319. sphinx/texinputs/sphinxlatexshadowbox.sty +72 -10
  320. sphinx/texinputs/sphinxlatexstyleheadings.sty +7 -2
  321. sphinx/texinputs/sphinxlatexstylepage.sty +2 -8
  322. sphinx/texinputs/sphinxlatexstyletext.sty +2 -4
  323. sphinx/texinputs/sphinxlatextables.sty +1 -1
  324. sphinx/texinputs/sphinxoptionsgeometry.sty +1 -1
  325. sphinx/texinputs/sphinxoptionshyperref.sty +1 -1
  326. sphinx/themes/agogo/layout.html +1 -10
  327. sphinx/themes/agogo/static/agogo.css.jinja +0 -7
  328. sphinx/themes/basic/defindex.html +1 -8
  329. sphinx/themes/basic/domainindex.html +1 -9
  330. sphinx/themes/basic/genindex-single.html +1 -9
  331. sphinx/themes/basic/genindex-split.html +1 -9
  332. sphinx/themes/basic/genindex.html +1 -9
  333. sphinx/themes/basic/globaltoc.html +1 -9
  334. sphinx/themes/basic/layout.html +1 -9
  335. sphinx/themes/basic/localtoc.html +1 -9
  336. sphinx/themes/basic/page.html +1 -9
  337. sphinx/themes/basic/relations.html +1 -9
  338. sphinx/themes/basic/search.html +1 -9
  339. sphinx/themes/basic/searchbox.html +1 -9
  340. sphinx/themes/basic/searchfield.html +4 -10
  341. sphinx/themes/basic/sourcelink.html +1 -9
  342. sphinx/themes/basic/static/basic.css.jinja +2 -13
  343. sphinx/themes/basic/static/doctools.js +0 -7
  344. sphinx/themes/basic/static/language_data.js.jinja +0 -7
  345. sphinx/themes/basic/static/searchtools.js +25 -13
  346. sphinx/themes/bizstyle/layout.html +1 -9
  347. sphinx/themes/bizstyle/static/bizstyle.css.jinja +0 -7
  348. sphinx/themes/bizstyle/static/bizstyle.js.jinja +5 -11
  349. sphinx/themes/classic/layout.html +1 -9
  350. sphinx/themes/classic/static/classic.css.jinja +0 -7
  351. sphinx/themes/classic/static/sidebar.js.jinja +0 -6
  352. sphinx/themes/epub/epub-cover.html +1 -9
  353. sphinx/themes/epub/layout.html +1 -9
  354. sphinx/themes/epub/static/epub.css.jinja +0 -7
  355. sphinx/themes/haiku/layout.html +1 -9
  356. sphinx/themes/haiku/static/haiku.css.jinja +0 -6
  357. sphinx/themes/nature/static/nature.css.jinja +0 -7
  358. sphinx/themes/nonav/layout.html +1 -9
  359. sphinx/themes/nonav/static/nonav.css.jinja +0 -7
  360. sphinx/themes/pyramid/static/epub.css.jinja +0 -7
  361. sphinx/themes/pyramid/static/pyramid.css.jinja +0 -7
  362. sphinx/themes/scrolls/layout.html +1 -10
  363. sphinx/themes/scrolls/static/scrolls.css.jinja +0 -7
  364. sphinx/themes/sphinxdoc/static/sphinxdoc.css.jinja +2 -7
  365. sphinx/themes/traditional/static/traditional.css.jinja +0 -7
  366. sphinx/theming.py +18 -6
  367. sphinx/transforms/__init__.py +56 -35
  368. sphinx/transforms/compact_bullet_list.py +3 -2
  369. sphinx/transforms/i18n.py +132 -50
  370. sphinx/transforms/post_transforms/__init__.py +94 -43
  371. sphinx/transforms/post_transforms/code.py +7 -6
  372. sphinx/transforms/post_transforms/images.py +71 -54
  373. sphinx/transforms/references.py +1 -2
  374. sphinx/util/__init__.py +23 -194
  375. sphinx/util/_files.py +80 -0
  376. sphinx/util/_importer.py +27 -0
  377. sphinx/util/_io.py +1 -2
  378. sphinx/util/_lines.py +26 -0
  379. sphinx/util/_pathlib.py +5 -2
  380. sphinx/util/_serialise.py +53 -0
  381. sphinx/util/_timestamps.py +2 -1
  382. sphinx/util/_uri.py +16 -0
  383. sphinx/util/cfamily.py +48 -25
  384. sphinx/util/console.py +1 -0
  385. sphinx/util/display.py +1 -1
  386. sphinx/util/docfields.py +125 -45
  387. sphinx/util/docstrings.py +1 -1
  388. sphinx/util/docutils.py +118 -44
  389. sphinx/util/exceptions.py +11 -5
  390. sphinx/util/fileutil.py +53 -32
  391. sphinx/util/http_date.py +9 -7
  392. sphinx/util/i18n.py +49 -16
  393. sphinx/util/images.py +7 -6
  394. sphinx/util/inspect.py +29 -12
  395. sphinx/util/inventory.py +47 -29
  396. sphinx/util/logging.py +58 -85
  397. sphinx/util/matching.py +3 -3
  398. sphinx/util/math.py +1 -1
  399. sphinx/util/nodes.py +176 -108
  400. sphinx/util/osutil.py +13 -10
  401. sphinx/util/parallel.py +5 -4
  402. sphinx/util/parsing.py +5 -3
  403. sphinx/util/png.py +3 -3
  404. sphinx/util/requests.py +8 -4
  405. sphinx/util/rst.py +5 -3
  406. sphinx/util/tags.py +5 -2
  407. sphinx/util/template.py +26 -11
  408. sphinx/util/texescape.py +2 -2
  409. sphinx/util/typing.py +89 -38
  410. sphinx/versioning.py +3 -1
  411. sphinx/writers/html.py +22 -7
  412. sphinx/writers/html5.py +113 -64
  413. sphinx/writers/latex.py +408 -221
  414. sphinx/writers/manpage.py +25 -15
  415. sphinx/writers/texinfo.py +94 -82
  416. sphinx/writers/text.py +87 -53
  417. sphinx/writers/xml.py +5 -4
  418. sphinx-8.1.0.dist-info/LICENSE.rst +31 -0
  419. {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/METADATA +13 -11
  420. sphinx-8.1.0.dist-info/RECORD +598 -0
  421. sphinx-8.0.2.dist-info/LICENSE.rst +0 -67
  422. sphinx-8.0.2.dist-info/RECORD +0 -590
  423. {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/WHEEL +0 -0
  424. {sphinx-8.0.2.dist-info → sphinx-8.1.0.dist-info}/entry_points.txt +0 -0
sphinx/search/es.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- spanish_stopwords = parse_stop_word('''
9
+ spanish_stopwords = parse_stop_word("""
12
10
  |source: https://snowball.tartarus.org/algorithms/spanish/stop.txt
13
11
  de | from, of
14
12
  la | the, her
@@ -347,7 +345,7 @@ tenida
347
345
  tenidos
348
346
  tenidas
349
347
  tened
350
- ''')
348
+ """)
351
349
 
352
350
 
353
351
  class SearchSpanish(SearchLanguage):
sphinx/search/fi.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- finnish_stopwords = parse_stop_word('''
9
+ finnish_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/finnish/stop.txt
13
11
  | forms of BE
14
12
 
@@ -97,7 +95,7 @@ kun | when
97
95
  niin | so
98
96
  nyt | now
99
97
  itse | self
100
- ''')
98
+ """)
101
99
 
102
100
 
103
101
  class SearchFinnish(SearchLanguage):
sphinx/search/fr.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- french_stopwords = parse_stop_word('''
9
+ french_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/french/stop.txt
13
11
  au | a + le
14
12
  aux | a + les
@@ -183,7 +181,7 @@ quelle | which
183
181
  quelles | which
184
182
  sans | without
185
183
  soi | oneself
186
- ''')
184
+ """)
187
185
 
188
186
 
189
187
  class SearchFrench(SearchLanguage):
sphinx/search/hu.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- hungarian_stopwords = parse_stop_word('''
9
+ hungarian_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/hungarian/stop.txt
13
11
  | prepared by Anna Tordai
14
12
  a
@@ -210,7 +208,7 @@ vissza
210
208
  vele
211
209
  viszont
212
210
  volna
213
- ''')
211
+ """)
214
212
 
215
213
 
216
214
  class SearchHungarian(SearchLanguage):
sphinx/search/it.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- italian_stopwords = parse_stop_word('''
9
+ italian_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/italian/stop.txt
13
11
  ad | a (to) before vowel
14
12
  al | a + il
@@ -300,7 +298,7 @@ stessi
300
298
  stesse
301
299
  stessimo
302
300
  stessero
303
- ''')
301
+ """)
304
302
 
305
303
 
306
304
  class SearchItalian(SearchLanguage):
sphinx/search/ja.py CHANGED
@@ -17,19 +17,21 @@ from typing import Any
17
17
 
18
18
  try:
19
19
  import MeCab # type: ignore[import-not-found]
20
+
20
21
  native_module = True
21
22
  except ImportError:
22
23
  native_module = False
23
24
 
24
25
  try:
25
26
  import janome.tokenizer # type: ignore[import-not-found]
27
+
26
28
  janome_module = True
27
29
  except ImportError:
28
30
  janome_module = False
29
31
 
30
32
  from sphinx.errors import ExtensionError, SphinxError
31
33
  from sphinx.search import SearchLanguage
32
- from sphinx.util import import_object
34
+ from sphinx.util._importer import import_object
33
35
 
34
36
 
35
37
  class BaseSplitter:
@@ -61,7 +63,8 @@ class MecabSplitter(BaseSplitter):
61
63
  result = self.native.parse(input)
62
64
  else:
63
65
  result = self.ctypes_libmecab.mecab_sparse_tostr(
64
- self.ctypes_mecab, input.encode(self.dict_encode))
66
+ self.ctypes_mecab, input.encode(self.dict_encode)
67
+ )
65
68
  return result.split(' ')
66
69
 
67
70
  def init_native(self, options: dict[str, str]) -> None:
@@ -89,7 +92,8 @@ class MecabSplitter(BaseSplitter):
89
92
  if os.path.exists(lib):
90
93
  libpath = lib
91
94
  if libpath is None:
92
- raise RuntimeError('MeCab dynamic library is not available')
95
+ msg = 'MeCab dynamic library is not available'
96
+ raise RuntimeError(msg)
93
97
 
94
98
  param = 'mecab -Owakati'
95
99
  dict = options.get('dict')
@@ -101,11 +105,15 @@ class MecabSplitter(BaseSplitter):
101
105
  self.ctypes_libmecab = ctypes.CDLL(libpath)
102
106
  self.ctypes_libmecab.mecab_new2.argtypes = (ctypes.c_char_p,)
103
107
  self.ctypes_libmecab.mecab_new2.restype = ctypes.c_void_p
104
- self.ctypes_libmecab.mecab_sparse_tostr.argtypes = (ctypes.c_void_p, ctypes.c_char_p)
108
+ self.ctypes_libmecab.mecab_sparse_tostr.argtypes = (
109
+ ctypes.c_void_p,
110
+ ctypes.c_char_p,
111
+ )
105
112
  self.ctypes_libmecab.mecab_sparse_tostr.restype = ctypes.c_char_p
106
113
  self.ctypes_mecab = self.ctypes_libmecab.mecab_new2(param.encode(fs_enc))
107
114
  if self.ctypes_mecab is None:
108
- raise SphinxError('mecab initialization failed')
115
+ msg = 'mecab initialization failed'
116
+ raise SphinxError(msg)
109
117
 
110
118
  def __del__(self) -> None:
111
119
  if self.ctypes_libmecab:
@@ -121,8 +129,11 @@ class JanomeSplitter(BaseSplitter):
121
129
 
122
130
  def init_tokenizer(self) -> None:
123
131
  if not janome_module:
124
- raise RuntimeError('Janome is not available')
125
- self.tokenizer = janome.tokenizer.Tokenizer(udic=self.user_dict, udic_enc=self.user_dict_enc)
132
+ msg = 'Janome is not available'
133
+ raise RuntimeError(msg)
134
+ self.tokenizer = janome.tokenizer.Tokenizer(
135
+ udic=self.user_dict, udic_enc=self.user_dict_enc
136
+ )
126
137
 
127
138
  def split(self, input: str) -> list[str]:
128
139
  result = ' '.join(token.surface for token in self.tokenizer.tokenize(input))
@@ -130,14 +141,18 @@ class JanomeSplitter(BaseSplitter):
130
141
 
131
142
 
132
143
  class DefaultSplitter(BaseSplitter):
133
- patterns_ = {re.compile(pattern): value for pattern, value in {
134
- '[一二三四五六七八九十百千万億兆]': 'M',
135
- '[一-龠々〆ヵヶ]': 'H',
136
- '[ぁ-ん]': 'I',
137
- '[ァ-ヴーア-ン゙ー]': 'K',
138
- '[a-zA-Za-zA-Z]': 'A',
139
- '[0-90-9]': 'N',
140
- }.items()}
144
+ patterns_ = {
145
+ re.compile(pattern): value
146
+ for pattern, value in {
147
+ '[一二三四五六七八九十百千万億兆]': 'M',
148
+ '[一-龠々〆ヵヶ]': 'H',
149
+ '[ぁ-ん]': 'I',
150
+ '[ァ-ヴーア-ン゙ー]': 'K',
151
+ '[a-zA-Za-zA-Z]': 'A',
152
+ '[0-90-9]': 'N',
153
+ }.items()
154
+ }
155
+ # fmt: off
141
156
  BIAS__ = -332
142
157
  BC1__ = {'HH': 6, 'II': 2461, 'KH': 406, 'OH': -1378}
143
158
  BC2__ = {'AA': -3267, 'AI': 2744, 'AN': -878, 'HH': -4070, 'HM': -1711,
@@ -398,6 +413,7 @@ class DefaultSplitter(BaseSplitter):
398
413
  '委': 798, '学': -960, '市': 887, '広': -695, '後': 535, '業': -697,
399
414
  '相': 753, '社': -507, '福': 974, '空': -822, '者': 1811, '連': 463,
400
415
  '郎': 1082, '1': -270, 'E1': 306, 'ル': -673, 'ン': -496}
416
+ # fmt: on
401
417
 
402
418
  # ctype_
403
419
  def ctype_(self, char: str) -> str:
@@ -427,18 +443,18 @@ class DefaultSplitter(BaseSplitter):
427
443
 
428
444
  for i in range(4, len(seg) - 3):
429
445
  score = self.BIAS__
430
- w1 = seg[i-3]
431
- w2 = seg[i-2]
432
- w3 = seg[i-1]
446
+ w1 = seg[i - 3]
447
+ w2 = seg[i - 2]
448
+ w3 = seg[i - 1]
433
449
  w4 = seg[i]
434
- w5 = seg[i+1]
435
- w6 = seg[i+2]
436
- c1 = ctype[i-3]
437
- c2 = ctype[i-2]
438
- c3 = ctype[i-1]
450
+ w5 = seg[i + 1]
451
+ w6 = seg[i + 2]
452
+ c1 = ctype[i - 3]
453
+ c2 = ctype[i - 2]
454
+ c3 = ctype[i - 1]
439
455
  c4 = ctype[i]
440
- c5 = ctype[i+1]
441
- c6 = ctype[i+2]
456
+ c5 = ctype[i + 1]
457
+ c6 = ctype[i + 2]
442
458
  score += self.ts_(self.UP1__, p1)
443
459
  score += self.ts_(self.UP2__, p2)
444
460
  score += self.ts_(self.UP3__, p3)
@@ -470,7 +486,7 @@ class DefaultSplitter(BaseSplitter):
470
486
  score += self.ts_(self.TC2__, c2 + c3 + c4)
471
487
  score += self.ts_(self.TC3__, c3 + c4 + c5)
472
488
  score += self.ts_(self.TC4__, c4 + c5 + c6)
473
- # score += self.ts_(self.TC5__, c4 + c5 + c6)
489
+ # score += self.ts_(self.TC5__, c4 + c5 + c6)
474
490
  score += self.ts_(self.UQ1__, p1 + c1)
475
491
  score += self.ts_(self.UQ2__, p2 + c2)
476
492
  score += self.ts_(self.UQ1__, p3 + c3)
@@ -501,16 +517,23 @@ class SearchJapanese(SearchLanguage):
501
517
  Japanese search implementation: uses no stemmer, but word splitting is quite
502
518
  complicated.
503
519
  """
520
+
504
521
  lang = 'ja'
505
522
  language_name = 'Japanese'
506
523
 
507
524
  def init(self, options: dict[str, str]) -> None:
508
- dotted_path = options.get('type', 'sphinx.search.ja.DefaultSplitter')
509
- try:
510
- self.splitter = import_object(dotted_path)(options)
511
- except ExtensionError as exc:
512
- raise ExtensionError("Splitter module %r can't be imported" %
513
- dotted_path) from exc
525
+ dotted_path = options.get('type')
526
+ if dotted_path is None:
527
+ self.splitter = DefaultSplitter(options)
528
+ else:
529
+ try:
530
+ splitter_cls = import_object(
531
+ dotted_path, "html_search_options['type'] setting"
532
+ )
533
+ self.splitter = splitter_cls(options)
534
+ except ExtensionError as exc:
535
+ msg = f"Splitter module {dotted_path!r} can't be imported"
536
+ raise ExtensionError(msg) from exc
514
537
 
515
538
  def split(self, input: str) -> list[str]:
516
539
  return self.splitter.split(input)
sphinx/search/nl.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- dutch_stopwords = parse_stop_word('''
9
+ dutch_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/dutch/stop.txt
13
11
  de | the
14
12
  en | and
@@ -111,7 +109,7 @@ uw | your
111
109
  iemand | somebody
112
110
  geweest | been; past participle of 'be'
113
111
  andere | other
114
- ''')
112
+ """)
115
113
 
116
114
 
117
115
  class SearchDutch(SearchLanguage):
sphinx/search/no.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- norwegian_stopwords = parse_stop_word('''
9
+ norwegian_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/norwegian/stop.txt
13
11
  og | and
14
12
  i | in
@@ -186,7 +184,7 @@ verte | become *
186
184
  vort | become *
187
185
  varte | became *
188
186
  vart | became *
189
- ''')
187
+ """)
190
188
 
191
189
 
192
190
  class SearchNorwegian(SearchLanguage):
sphinx/search/pt.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- portuguese_stopwords = parse_stop_word('''
9
+ portuguese_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/portuguese/stop.txt
13
11
  de | of, from
14
12
  a | the; to, at; her
@@ -245,7 +243,7 @@ terão
245
243
  teria
246
244
  teríamos
247
245
  teriam
248
- ''')
246
+ """)
249
247
 
250
248
 
251
249
  class SearchPortuguese(SearchLanguage):
sphinx/search/ro.py CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict, Set
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage
sphinx/search/ru.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- russian_stopwords = parse_stop_word('''
9
+ russian_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/russian/stop.txt
13
11
  и | and
14
12
  в | in/into
@@ -235,7 +233,7 @@ russian_stopwords = parse_stop_word('''
235
233
  | можн
236
234
  | нужн
237
235
  | нельзя
238
- ''')
236
+ """)
239
237
 
240
238
 
241
239
  class SearchRussian(SearchLanguage):
sphinx/search/sv.py CHANGED
@@ -2,13 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage, parse_stop_word
10
8
 
11
- swedish_stopwords = parse_stop_word('''
9
+ swedish_stopwords = parse_stop_word("""
12
10
  | source: https://snowball.tartarus.org/algorithms/swedish/stop.txt
13
11
  och | and
14
12
  det | it, this/that
@@ -124,7 +122,7 @@ våra | our
124
122
  ert | your
125
123
  era | your
126
124
  vilkas | whose
127
- ''')
125
+ """)
128
126
 
129
127
 
130
128
  class SearchSwedish(SearchLanguage):
sphinx/search/tr.py CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Dict, Set
6
-
7
5
  import snowballstemmer
8
6
 
9
7
  from sphinx.search import SearchLanguage
sphinx/search/zh.py CHANGED
@@ -11,11 +11,13 @@ from sphinx.search import SearchLanguage
11
11
 
12
12
  try:
13
13
  import jieba # type: ignore[import-not-found]
14
+
14
15
  JIEBA = True
15
16
  except ImportError:
16
17
  JIEBA = False
17
18
 
18
- english_stopwords = set("""
19
+ english_stopwords = set(
20
+ """
19
21
  a and are as at
20
22
  be but by
21
23
  for
@@ -25,7 +27,8 @@ of on or
25
27
  such
26
28
  that the their then there these they this to
27
29
  was will with
28
- """.split())
30
+ """.split()
31
+ )
29
32
 
30
33
  js_porter_stemmer = """
31
34
  /**
@@ -224,7 +227,10 @@ class SearchChinese(SearchLanguage):
224
227
  js_stemmer_code = js_porter_stemmer
225
228
  stopwords = english_stopwords
226
229
  latin1_letters = re.compile(r'[a-zA-Z0-9_]+')
227
- latin_terms: list[str] = []
230
+
231
+ def __init__(self, options: dict[str, str]) -> None:
232
+ super().__init__(options)
233
+ self.latin_terms: set[str] = set()
228
234
 
229
235
  def init(self, options: dict[str, str]) -> None:
230
236
  if JIEBA:
@@ -235,13 +241,13 @@ class SearchChinese(SearchLanguage):
235
241
  self.stemmer = snowballstemmer.stemmer('english')
236
242
 
237
243
  def split(self, input: str) -> list[str]:
238
- chinese: list[str] = []
239
244
  if JIEBA:
240
- chinese = list(jieba.cut_for_search(input))
245
+ chinese: list[str] = list(jieba.cut_for_search(input))
246
+ else:
247
+ chinese = []
241
248
 
242
- latin1 = \
243
- [term.strip() for term in self.latin1_letters.findall(input)]
244
- self.latin_terms.extend(latin1)
249
+ latin1 = [term.strip() for term in self.latin1_letters.findall(input)]
250
+ self.latin_terms.update(latin1)
245
251
  return chinese + latin1
246
252
 
247
253
  def word_filter(self, stemmed_word: str) -> bool:
@@ -251,11 +257,10 @@ class SearchChinese(SearchLanguage):
251
257
  # Don't stem Latin words that are long enough to be relevant for search
252
258
  # if not stemmed, but would be too short after being stemmed
253
259
  # avoids some issues with acronyms
260
+ stemmed = self.stemmer.stemWord(word.lower())
254
261
  should_not_be_stemmed = (
255
- word in self.latin_terms and
256
- len(word) >= 3 and
257
- len(self.stemmer.stemWord(word.lower())) < 3
258
- )
262
+ len(word) >= 3 > len(stemmed) and word in self.latin_terms
263
+ ) # fmt: skip
259
264
  if should_not_be_stemmed:
260
265
  return word.lower()
261
- return self.stemmer.stemWord(word.lower())
266
+ return stemmed
@@ -1,12 +1,5 @@
1
1
  /*
2
- * graphviz.css
3
- * ~~~~~~~~~~~~
4
- *
5
2
  * Sphinx stylesheet -- graphviz extension.
6
- *
7
- * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
8
- * :license: BSD, see LICENSE for details.
9
- *
10
3
  */
11
4
 
12
5
  img.graphviz {
@@ -28,7 +28,7 @@ DEFAULT_ENABLED_MARKERS = [
28
28
  'testroot="root", srcdir=None, '
29
29
  'confoverrides=None, freshenv=False, '
30
30
  'warningiserror=False, tags=None, verbosity=0, parallel=0, '
31
- 'keep_going=False, builddir=None, docutils_conf=None'
31
+ 'builddir=None, docutils_conf=None'
32
32
  '): arguments to initialize the sphinx test application.'
33
33
  ),
34
34
  'test_params(shared_result=...): test parameters.',
@@ -42,7 +42,7 @@ def pytest_configure(config: pytest.Config) -> None:
42
42
 
43
43
 
44
44
  @pytest.fixture(scope='session')
45
- def rootdir() -> str | None:
45
+ def rootdir() -> Path | None:
46
46
  return None
47
47
 
48
48
 
@@ -74,7 +74,7 @@ def app_params(
74
74
  test_params: dict[str, Any],
75
75
  shared_result: SharedResult,
76
76
  sphinx_test_tempdir: str,
77
- rootdir: str,
77
+ rootdir: Path,
78
78
  ) -> _app_params:
79
79
  """
80
80
  Parameters that are specified by 'pytest.mark.sphinx' for
@@ -86,7 +86,7 @@ def app_params(
86
86
  kwargs: dict[str, Any] = {}
87
87
 
88
88
  # to avoid stacking positional args
89
- for info in reversed(list(request.node.iter_markers("sphinx"))):
89
+ for info in reversed(list(request.node.iter_markers('sphinx'))):
90
90
  pargs |= dict(enumerate(info.args))
91
91
  kwargs.update(info.kwargs)
92
92
 
@@ -203,6 +203,7 @@ def make_app(test_params: dict[str, Any]) -> Iterator[Callable[[], SphinxTestApp
203
203
  app_ = SphinxTestApp(*args, **kwargs)
204
204
  apps.append(app_)
205
205
  return app_
206
+
206
207
  yield make
207
208
 
208
209
  sys.path[:] = syspath
@@ -239,7 +240,7 @@ def if_graphviz_found(app: SphinxTestApp) -> None: # NoQA: PT004
239
240
 
240
241
 
241
242
  @pytest.fixture(scope='session')
242
- def sphinx_test_tempdir(tmp_path_factory: Any) -> Path:
243
+ def sphinx_test_tempdir(tmp_path_factory: pytest.TempPathFactory) -> Path:
243
244
  """Temporary directory."""
244
245
  return tmp_path_factory.getbasetemp()
245
246
 
sphinx/testing/path.py CHANGED
@@ -12,9 +12,11 @@ if TYPE_CHECKING:
12
12
  import builtins
13
13
  from collections.abc import Callable
14
14
 
15
- warnings.warn("'sphinx.testing.path' is deprecated. "
16
- "Use 'os.path' or 'pathlib' instead.",
17
- RemovedInSphinx90Warning, stacklevel=2)
15
+ warnings.warn(
16
+ "'sphinx.testing.path' is deprecated. " "Use 'os.path' or 'pathlib' instead.",
17
+ RemovedInSphinx90Warning,
18
+ stacklevel=2,
19
+ )
18
20
 
19
21
  FILESYSTEMENCODING = sys.getfilesystemencoding() or sys.getdefaultencoding()
20
22
 
@@ -86,7 +88,7 @@ class path(str):
86
88
  def rmtree(
87
89
  self,
88
90
  ignore_errors: bool = False,
89
- onerror: Callable[[Callable[..., Any], str, Any], object] | None = None,
91
+ onerror: Callable[[Callable[..., Any], str, Any], object] | None = None,
90
92
  ) -> None:
91
93
  """
92
94
  Removes the file or directory and any files or directories it may
@@ -178,7 +180,7 @@ class path(str):
178
180
  with open(self, mode='rb') as f:
179
181
  return f.read()
180
182
 
181
- def write_bytes(self, bytes: str, append: bool = False) -> None:
183
+ def write_bytes(self, bytes: bytes, append: bool = False) -> None:
182
184
  """
183
185
  Writes the given `bytes` to the file.
184
186