android-notify 1.59.3__py3-none-any.whl → 1.60.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 android-notify might be problematic. Click here for more details.

Files changed (1351) hide show
  1. android_notify/__init__.py +4 -4
  2. android_notify/__main__.py +24 -0
  3. android_notify/an_types.py +226 -91
  4. android_notify/an_utils.py +129 -18
  5. android_notify/base.py +97 -90
  6. android_notify/config.py +145 -0
  7. android_notify/core.py +227 -139
  8. android_notify/styles.py +25 -22
  9. android_notify/sword.py +1043 -961
  10. {android_notify-1.59.3.dist-info → android_notify-1.60.0.dist-info}/METADATA +164 -119
  11. android_notify-1.60.0.dist-info/RECORD +1350 -0
  12. android_notify-1.60.0.dist-info/entry_points.txt +2 -0
  13. {android_notify-1.59.3.dist-info → android_notify-1.60.0.dist-info}/top_level.txt +2 -0
  14. docs/examples/flet-working/src/core.py +221 -0
  15. docs/examples/flet-working/src/main.py +68 -0
  16. docs/tests/flet/adv/main.py +97 -0
  17. docs/tests/flet/adv/tests/__init__.py +0 -0
  18. docs/tests/flet/adv/tests/test_android_notify_full.py +199 -0
  19. docs/tests/flet/basic/src/core.py +221 -0
  20. docs/tests/flet/basic/src/main.py +112 -0
  21. docs/website/src/pages/data/laner_Sent.py +24 -0
  22. venv/Lib/site-packages/__editable___android_notify_1_60_0_finder.py +85 -0
  23. venv/Lib/site-packages/build/__init__.py +39 -0
  24. venv/Lib/site-packages/build/__main__.py +486 -0
  25. venv/Lib/site-packages/build/_builder.py +355 -0
  26. venv/Lib/site-packages/build/_compat/__init__.py +0 -0
  27. venv/Lib/site-packages/build/_compat/importlib.py +22 -0
  28. venv/Lib/site-packages/build/_compat/tarfile.py +31 -0
  29. venv/Lib/site-packages/build/_compat/tomllib.py +16 -0
  30. venv/Lib/site-packages/build/_ctx.py +99 -0
  31. venv/Lib/site-packages/build/_exceptions.py +65 -0
  32. venv/Lib/site-packages/build/_types.py +19 -0
  33. venv/Lib/site-packages/build/_util.py +63 -0
  34. venv/Lib/site-packages/build/env.py +393 -0
  35. venv/Lib/site-packages/build/py.typed +0 -0
  36. venv/Lib/site-packages/build/util.py +63 -0
  37. venv/Lib/site-packages/certifi/__init__.py +4 -0
  38. venv/Lib/site-packages/certifi/__main__.py +12 -0
  39. venv/Lib/site-packages/certifi/core.py +83 -0
  40. venv/Lib/site-packages/certifi/py.typed +0 -0
  41. venv/Lib/site-packages/charset_normalizer/__init__.py +48 -0
  42. venv/Lib/site-packages/charset_normalizer/__main__.py +6 -0
  43. venv/Lib/site-packages/charset_normalizer/api.py +669 -0
  44. venv/Lib/site-packages/charset_normalizer/cd.py +395 -0
  45. venv/Lib/site-packages/charset_normalizer/cli/__init__.py +8 -0
  46. venv/Lib/site-packages/charset_normalizer/cli/__main__.py +381 -0
  47. venv/Lib/site-packages/charset_normalizer/constant.py +2015 -0
  48. venv/Lib/site-packages/charset_normalizer/legacy.py +80 -0
  49. venv/Lib/site-packages/charset_normalizer/md.py +635 -0
  50. venv/Lib/site-packages/charset_normalizer/models.py +360 -0
  51. venv/Lib/site-packages/charset_normalizer/py.typed +0 -0
  52. venv/Lib/site-packages/charset_normalizer/utils.py +414 -0
  53. venv/Lib/site-packages/charset_normalizer/version.py +8 -0
  54. venv/Lib/site-packages/colorama/__init__.py +7 -0
  55. venv/Lib/site-packages/colorama/ansi.py +102 -0
  56. venv/Lib/site-packages/colorama/ansitowin32.py +277 -0
  57. venv/Lib/site-packages/colorama/initialise.py +121 -0
  58. venv/Lib/site-packages/colorama/tests/__init__.py +1 -0
  59. venv/Lib/site-packages/colorama/tests/ansi_test.py +76 -0
  60. venv/Lib/site-packages/colorama/tests/ansitowin32_test.py +294 -0
  61. venv/Lib/site-packages/colorama/tests/initialise_test.py +189 -0
  62. venv/Lib/site-packages/colorama/tests/isatty_test.py +57 -0
  63. venv/Lib/site-packages/colorama/tests/utils.py +49 -0
  64. venv/Lib/site-packages/colorama/tests/winterm_test.py +131 -0
  65. venv/Lib/site-packages/colorama/win32.py +180 -0
  66. venv/Lib/site-packages/colorama/winterm.py +195 -0
  67. venv/Lib/site-packages/docutils/__init__.py +341 -0
  68. venv/Lib/site-packages/docutils/__main__.py +103 -0
  69. venv/Lib/site-packages/docutils/core.py +855 -0
  70. venv/Lib/site-packages/docutils/examples.py +123 -0
  71. venv/Lib/site-packages/docutils/frontend.py +1178 -0
  72. venv/Lib/site-packages/docutils/io.py +718 -0
  73. venv/Lib/site-packages/docutils/languages/__init__.py +117 -0
  74. venv/Lib/site-packages/docutils/languages/af.py +58 -0
  75. venv/Lib/site-packages/docutils/languages/ar.py +60 -0
  76. venv/Lib/site-packages/docutils/languages/ca.py +65 -0
  77. venv/Lib/site-packages/docutils/languages/cs.py +60 -0
  78. venv/Lib/site-packages/docutils/languages/da.py +61 -0
  79. venv/Lib/site-packages/docutils/languages/de.py +58 -0
  80. venv/Lib/site-packages/docutils/languages/en.py +60 -0
  81. venv/Lib/site-packages/docutils/languages/eo.py +61 -0
  82. venv/Lib/site-packages/docutils/languages/es.py +58 -0
  83. venv/Lib/site-packages/docutils/languages/fa.py +60 -0
  84. venv/Lib/site-packages/docutils/languages/fi.py +60 -0
  85. venv/Lib/site-packages/docutils/languages/fr.py +58 -0
  86. venv/Lib/site-packages/docutils/languages/gl.py +62 -0
  87. venv/Lib/site-packages/docutils/languages/he.py +62 -0
  88. venv/Lib/site-packages/docutils/languages/it.py +58 -0
  89. venv/Lib/site-packages/docutils/languages/ja.py +60 -0
  90. venv/Lib/site-packages/docutils/languages/ka.py +58 -0
  91. venv/Lib/site-packages/docutils/languages/ko.py +60 -0
  92. venv/Lib/site-packages/docutils/languages/lt.py +60 -0
  93. venv/Lib/site-packages/docutils/languages/lv.py +59 -0
  94. venv/Lib/site-packages/docutils/languages/nl.py +60 -0
  95. venv/Lib/site-packages/docutils/languages/pl.py +60 -0
  96. venv/Lib/site-packages/docutils/languages/pt_br.py +60 -0
  97. venv/Lib/site-packages/docutils/languages/ru.py +58 -0
  98. venv/Lib/site-packages/docutils/languages/sk.py +58 -0
  99. venv/Lib/site-packages/docutils/languages/sv.py +59 -0
  100. venv/Lib/site-packages/docutils/languages/uk.py +58 -0
  101. venv/Lib/site-packages/docutils/languages/zh_cn.py +62 -0
  102. venv/Lib/site-packages/docutils/languages/zh_tw.py +61 -0
  103. venv/Lib/site-packages/docutils/nodes.py +3341 -0
  104. venv/Lib/site-packages/docutils/parsers/__init__.py +115 -0
  105. venv/Lib/site-packages/docutils/parsers/commonmark_wrapper.py +56 -0
  106. venv/Lib/site-packages/docutils/parsers/docutils_xml.py +194 -0
  107. venv/Lib/site-packages/docutils/parsers/null.py +24 -0
  108. venv/Lib/site-packages/docutils/parsers/recommonmark_wrapper.py +174 -0
  109. venv/Lib/site-packages/docutils/parsers/rst/__init__.py +414 -0
  110. venv/Lib/site-packages/docutils/parsers/rst/directives/__init__.py +480 -0
  111. venv/Lib/site-packages/docutils/parsers/rst/directives/admonitions.py +101 -0
  112. venv/Lib/site-packages/docutils/parsers/rst/directives/body.py +318 -0
  113. venv/Lib/site-packages/docutils/parsers/rst/directives/html.py +21 -0
  114. venv/Lib/site-packages/docutils/parsers/rst/directives/images.py +186 -0
  115. venv/Lib/site-packages/docutils/parsers/rst/directives/misc.py +690 -0
  116. venv/Lib/site-packages/docutils/parsers/rst/directives/parts.py +126 -0
  117. venv/Lib/site-packages/docutils/parsers/rst/directives/references.py +28 -0
  118. venv/Lib/site-packages/docutils/parsers/rst/directives/tables.py +523 -0
  119. venv/Lib/site-packages/docutils/parsers/rst/languages/__init__.py +63 -0
  120. venv/Lib/site-packages/docutils/parsers/rst/languages/af.py +107 -0
  121. venv/Lib/site-packages/docutils/parsers/rst/languages/ar.py +99 -0
  122. venv/Lib/site-packages/docutils/parsers/rst/languages/ca.py +130 -0
  123. venv/Lib/site-packages/docutils/parsers/rst/languages/cs.py +110 -0
  124. venv/Lib/site-packages/docutils/parsers/rst/languages/da.py +113 -0
  125. venv/Lib/site-packages/docutils/parsers/rst/languages/de.py +106 -0
  126. venv/Lib/site-packages/docutils/parsers/rst/languages/en.py +115 -0
  127. venv/Lib/site-packages/docutils/parsers/rst/languages/eo.py +118 -0
  128. venv/Lib/site-packages/docutils/parsers/rst/languages/es.py +121 -0
  129. venv/Lib/site-packages/docutils/parsers/rst/languages/fa.py +102 -0
  130. venv/Lib/site-packages/docutils/parsers/rst/languages/fi.py +98 -0
  131. venv/Lib/site-packages/docutils/parsers/rst/languages/fr.py +107 -0
  132. venv/Lib/site-packages/docutils/parsers/rst/languages/gl.py +106 -0
  133. venv/Lib/site-packages/docutils/parsers/rst/languages/he.py +110 -0
  134. venv/Lib/site-packages/docutils/parsers/rst/languages/it.py +98 -0
  135. venv/Lib/site-packages/docutils/parsers/rst/languages/ja.py +119 -0
  136. venv/Lib/site-packages/docutils/parsers/rst/languages/ka.py +89 -0
  137. venv/Lib/site-packages/docutils/parsers/rst/languages/ko.py +111 -0
  138. venv/Lib/site-packages/docutils/parsers/rst/languages/lt.py +109 -0
  139. venv/Lib/site-packages/docutils/parsers/rst/languages/lv.py +108 -0
  140. venv/Lib/site-packages/docutils/parsers/rst/languages/nl.py +113 -0
  141. venv/Lib/site-packages/docutils/parsers/rst/languages/pl.py +100 -0
  142. venv/Lib/site-packages/docutils/parsers/rst/languages/pt_br.py +109 -0
  143. venv/Lib/site-packages/docutils/parsers/rst/languages/ru.py +90 -0
  144. venv/Lib/site-packages/docutils/parsers/rst/languages/sk.py +96 -0
  145. venv/Lib/site-packages/docutils/parsers/rst/languages/sv.py +96 -0
  146. venv/Lib/site-packages/docutils/parsers/rst/languages/uk.py +91 -0
  147. venv/Lib/site-packages/docutils/parsers/rst/languages/zh_cn.py +104 -0
  148. venv/Lib/site-packages/docutils/parsers/rst/languages/zh_tw.py +109 -0
  149. venv/Lib/site-packages/docutils/parsers/rst/roles.py +450 -0
  150. venv/Lib/site-packages/docutils/parsers/rst/states.py +3255 -0
  151. venv/Lib/site-packages/docutils/parsers/rst/tableparser.py +540 -0
  152. venv/Lib/site-packages/docutils/readers/__init__.py +135 -0
  153. venv/Lib/site-packages/docutils/readers/doctree.py +50 -0
  154. venv/Lib/site-packages/docutils/readers/pep.py +55 -0
  155. venv/Lib/site-packages/docutils/readers/standalone.py +65 -0
  156. venv/Lib/site-packages/docutils/statemachine.py +1534 -0
  157. venv/Lib/site-packages/docutils/transforms/__init__.py +196 -0
  158. venv/Lib/site-packages/docutils/transforms/components.py +56 -0
  159. venv/Lib/site-packages/docutils/transforms/frontmatter.py +548 -0
  160. venv/Lib/site-packages/docutils/transforms/misc.py +151 -0
  161. venv/Lib/site-packages/docutils/transforms/parts.py +175 -0
  162. venv/Lib/site-packages/docutils/transforms/peps.py +315 -0
  163. venv/Lib/site-packages/docutils/transforms/references.py +990 -0
  164. venv/Lib/site-packages/docutils/transforms/universal.py +364 -0
  165. venv/Lib/site-packages/docutils/transforms/writer_aux.py +57 -0
  166. venv/Lib/site-packages/docutils/utils/__init__.py +853 -0
  167. venv/Lib/site-packages/docutils/utils/_roman_numerals.py +264 -0
  168. venv/Lib/site-packages/docutils/utils/_typing.py +39 -0
  169. venv/Lib/site-packages/docutils/utils/code_analyzer.py +140 -0
  170. venv/Lib/site-packages/docutils/utils/math/__init__.py +77 -0
  171. venv/Lib/site-packages/docutils/utils/math/latex2mathml.py +1252 -0
  172. venv/Lib/site-packages/docutils/utils/math/math2html.py +3166 -0
  173. venv/Lib/site-packages/docutils/utils/math/mathalphabet2unichar.py +892 -0
  174. venv/Lib/site-packages/docutils/utils/math/mathml_elements.py +482 -0
  175. venv/Lib/site-packages/docutils/utils/math/tex2mathml_extern.py +263 -0
  176. venv/Lib/site-packages/docutils/utils/math/tex2unichar.py +730 -0
  177. venv/Lib/site-packages/docutils/utils/math/unichar2tex.py +808 -0
  178. venv/Lib/site-packages/docutils/utils/punctuation_chars.py +123 -0
  179. venv/Lib/site-packages/docutils/utils/smartquotes.py +1006 -0
  180. venv/Lib/site-packages/docutils/utils/urischemes.py +138 -0
  181. venv/Lib/site-packages/docutils/writers/__init__.py +277 -0
  182. venv/Lib/site-packages/docutils/writers/_html_base.py +1885 -0
  183. venv/Lib/site-packages/docutils/writers/docutils_xml.py +191 -0
  184. venv/Lib/site-packages/docutils/writers/html4css1/__init__.py +964 -0
  185. venv/Lib/site-packages/docutils/writers/html5_polyglot/__init__.py +396 -0
  186. venv/Lib/site-packages/docutils/writers/latex2e/__init__.py +3419 -0
  187. venv/Lib/site-packages/docutils/writers/manpage.py +1353 -0
  188. venv/Lib/site-packages/docutils/writers/null.py +28 -0
  189. venv/Lib/site-packages/docutils/writers/odf_odt/__init__.py +3461 -0
  190. venv/Lib/site-packages/docutils/writers/odf_odt/prepstyles.py +80 -0
  191. venv/Lib/site-packages/docutils/writers/odf_odt/pygmentsformatter.py +106 -0
  192. venv/Lib/site-packages/docutils/writers/pep_html/__init__.py +102 -0
  193. venv/Lib/site-packages/docutils/writers/pseudoxml.py +41 -0
  194. venv/Lib/site-packages/docutils/writers/s5_html/__init__.py +354 -0
  195. venv/Lib/site-packages/docutils/writers/xetex/__init__.py +168 -0
  196. venv/Lib/site-packages/id/__init__.py +91 -0
  197. venv/Lib/site-packages/id/__main__.py +88 -0
  198. venv/Lib/site-packages/id/_internal/oidc/__init__.py +13 -0
  199. venv/Lib/site-packages/id/_internal/oidc/ambient.py +328 -0
  200. venv/Lib/site-packages/idna/__init__.py +45 -0
  201. venv/Lib/site-packages/idna/codec.py +122 -0
  202. venv/Lib/site-packages/idna/compat.py +15 -0
  203. venv/Lib/site-packages/idna/core.py +437 -0
  204. venv/Lib/site-packages/idna/idnadata.py +4309 -0
  205. venv/Lib/site-packages/idna/intranges.py +57 -0
  206. venv/Lib/site-packages/idna/package_data.py +1 -0
  207. venv/Lib/site-packages/idna/py.typed +0 -0
  208. venv/Lib/site-packages/idna/uts46data.py +8841 -0
  209. venv/Lib/site-packages/jaraco/classes/__init__.py +0 -0
  210. venv/Lib/site-packages/jaraco/classes/ancestry.py +76 -0
  211. venv/Lib/site-packages/jaraco/classes/meta.py +85 -0
  212. venv/Lib/site-packages/jaraco/classes/properties.py +241 -0
  213. venv/Lib/site-packages/jaraco/classes/py.typed +0 -0
  214. venv/Lib/site-packages/jaraco/context/__init__.py +356 -0
  215. venv/Lib/site-packages/jaraco/context/py.typed +0 -0
  216. venv/Lib/site-packages/jaraco/functools/__init__.py +714 -0
  217. venv/Lib/site-packages/jaraco/functools/__init__.pyi +123 -0
  218. venv/Lib/site-packages/jaraco/functools/py.typed +0 -0
  219. venv/Lib/site-packages/jnius/__init__.py +89 -0
  220. venv/Lib/site-packages/jnius/env.py +378 -0
  221. venv/Lib/site-packages/jnius/reflect.py +440 -0
  222. venv/Lib/site-packages/jnius/signatures.py +105 -0
  223. venv/Lib/site-packages/jnius_config.py +112 -0
  224. venv/Lib/site-packages/keyring/__init__.py +17 -0
  225. venv/Lib/site-packages/keyring/__main__.py +4 -0
  226. venv/Lib/site-packages/keyring/backend.py +300 -0
  227. venv/Lib/site-packages/keyring/backends/SecretService.py +120 -0
  228. venv/Lib/site-packages/keyring/backends/Windows.py +168 -0
  229. venv/Lib/site-packages/keyring/backends/__init__.py +0 -0
  230. venv/Lib/site-packages/keyring/backends/chainer.py +71 -0
  231. venv/Lib/site-packages/keyring/backends/fail.py +30 -0
  232. venv/Lib/site-packages/keyring/backends/kwallet.py +164 -0
  233. venv/Lib/site-packages/keyring/backends/libsecret.py +155 -0
  234. venv/Lib/site-packages/keyring/backends/macOS/__init__.py +85 -0
  235. venv/Lib/site-packages/keyring/backends/macOS/api.py +184 -0
  236. venv/Lib/site-packages/keyring/backends/null.py +20 -0
  237. venv/Lib/site-packages/keyring/cli.py +220 -0
  238. venv/Lib/site-packages/keyring/compat/__init__.py +7 -0
  239. venv/Lib/site-packages/keyring/compat/properties.py +169 -0
  240. venv/Lib/site-packages/keyring/compat/py312.py +9 -0
  241. venv/Lib/site-packages/keyring/compat/py38.py +9 -0
  242. venv/Lib/site-packages/keyring/completion.py +56 -0
  243. venv/Lib/site-packages/keyring/core.py +200 -0
  244. venv/Lib/site-packages/keyring/credentials.py +85 -0
  245. venv/Lib/site-packages/keyring/devpi_client.py +29 -0
  246. venv/Lib/site-packages/keyring/errors.py +67 -0
  247. venv/Lib/site-packages/keyring/http.py +39 -0
  248. venv/Lib/site-packages/keyring/py.typed +0 -0
  249. venv/Lib/site-packages/keyring/testing/__init__.py +0 -0
  250. venv/Lib/site-packages/keyring/testing/backend.py +200 -0
  251. venv/Lib/site-packages/keyring/testing/util.py +68 -0
  252. venv/Lib/site-packages/keyring/util/__init__.py +11 -0
  253. venv/Lib/site-packages/keyring/util/platform_.py +40 -0
  254. venv/Lib/site-packages/markdown_it/__init__.py +6 -0
  255. venv/Lib/site-packages/markdown_it/_compat.py +1 -0
  256. venv/Lib/site-packages/markdown_it/_punycode.py +67 -0
  257. venv/Lib/site-packages/markdown_it/cli/__init__.py +0 -0
  258. venv/Lib/site-packages/markdown_it/cli/parse.py +110 -0
  259. venv/Lib/site-packages/markdown_it/common/__init__.py +0 -0
  260. venv/Lib/site-packages/markdown_it/common/entities.py +5 -0
  261. venv/Lib/site-packages/markdown_it/common/html_blocks.py +69 -0
  262. venv/Lib/site-packages/markdown_it/common/html_re.py +39 -0
  263. venv/Lib/site-packages/markdown_it/common/normalize_url.py +81 -0
  264. venv/Lib/site-packages/markdown_it/common/utils.py +313 -0
  265. venv/Lib/site-packages/markdown_it/helpers/__init__.py +6 -0
  266. venv/Lib/site-packages/markdown_it/helpers/parse_link_destination.py +83 -0
  267. venv/Lib/site-packages/markdown_it/helpers/parse_link_label.py +44 -0
  268. venv/Lib/site-packages/markdown_it/helpers/parse_link_title.py +75 -0
  269. venv/Lib/site-packages/markdown_it/main.py +350 -0
  270. venv/Lib/site-packages/markdown_it/parser_block.py +113 -0
  271. venv/Lib/site-packages/markdown_it/parser_core.py +46 -0
  272. venv/Lib/site-packages/markdown_it/parser_inline.py +148 -0
  273. venv/Lib/site-packages/markdown_it/presets/__init__.py +28 -0
  274. venv/Lib/site-packages/markdown_it/presets/commonmark.py +75 -0
  275. venv/Lib/site-packages/markdown_it/presets/default.py +36 -0
  276. venv/Lib/site-packages/markdown_it/presets/zero.py +44 -0
  277. venv/Lib/site-packages/markdown_it/py.typed +1 -0
  278. venv/Lib/site-packages/markdown_it/renderer.py +336 -0
  279. venv/Lib/site-packages/markdown_it/ruler.py +275 -0
  280. venv/Lib/site-packages/markdown_it/rules_block/__init__.py +27 -0
  281. venv/Lib/site-packages/markdown_it/rules_block/blockquote.py +299 -0
  282. venv/Lib/site-packages/markdown_it/rules_block/code.py +36 -0
  283. venv/Lib/site-packages/markdown_it/rules_block/fence.py +101 -0
  284. venv/Lib/site-packages/markdown_it/rules_block/heading.py +69 -0
  285. venv/Lib/site-packages/markdown_it/rules_block/hr.py +56 -0
  286. venv/Lib/site-packages/markdown_it/rules_block/html_block.py +90 -0
  287. venv/Lib/site-packages/markdown_it/rules_block/lheading.py +86 -0
  288. venv/Lib/site-packages/markdown_it/rules_block/list.py +345 -0
  289. venv/Lib/site-packages/markdown_it/rules_block/paragraph.py +66 -0
  290. venv/Lib/site-packages/markdown_it/rules_block/reference.py +235 -0
  291. venv/Lib/site-packages/markdown_it/rules_block/state_block.py +261 -0
  292. venv/Lib/site-packages/markdown_it/rules_block/table.py +250 -0
  293. venv/Lib/site-packages/markdown_it/rules_core/__init__.py +19 -0
  294. venv/Lib/site-packages/markdown_it/rules_core/block.py +13 -0
  295. venv/Lib/site-packages/markdown_it/rules_core/inline.py +10 -0
  296. venv/Lib/site-packages/markdown_it/rules_core/linkify.py +149 -0
  297. venv/Lib/site-packages/markdown_it/rules_core/normalize.py +19 -0
  298. venv/Lib/site-packages/markdown_it/rules_core/replacements.py +127 -0
  299. venv/Lib/site-packages/markdown_it/rules_core/smartquotes.py +202 -0
  300. venv/Lib/site-packages/markdown_it/rules_core/state_core.py +25 -0
  301. venv/Lib/site-packages/markdown_it/rules_core/text_join.py +35 -0
  302. venv/Lib/site-packages/markdown_it/rules_inline/__init__.py +31 -0
  303. venv/Lib/site-packages/markdown_it/rules_inline/autolink.py +77 -0
  304. venv/Lib/site-packages/markdown_it/rules_inline/backticks.py +72 -0
  305. venv/Lib/site-packages/markdown_it/rules_inline/balance_pairs.py +138 -0
  306. venv/Lib/site-packages/markdown_it/rules_inline/emphasis.py +102 -0
  307. venv/Lib/site-packages/markdown_it/rules_inline/entity.py +53 -0
  308. venv/Lib/site-packages/markdown_it/rules_inline/escape.py +93 -0
  309. venv/Lib/site-packages/markdown_it/rules_inline/fragments_join.py +43 -0
  310. venv/Lib/site-packages/markdown_it/rules_inline/html_inline.py +43 -0
  311. venv/Lib/site-packages/markdown_it/rules_inline/image.py +148 -0
  312. venv/Lib/site-packages/markdown_it/rules_inline/link.py +149 -0
  313. venv/Lib/site-packages/markdown_it/rules_inline/linkify.py +62 -0
  314. venv/Lib/site-packages/markdown_it/rules_inline/newline.py +44 -0
  315. venv/Lib/site-packages/markdown_it/rules_inline/state_inline.py +165 -0
  316. venv/Lib/site-packages/markdown_it/rules_inline/strikethrough.py +127 -0
  317. venv/Lib/site-packages/markdown_it/rules_inline/text.py +62 -0
  318. venv/Lib/site-packages/markdown_it/token.py +178 -0
  319. venv/Lib/site-packages/markdown_it/tree.py +333 -0
  320. venv/Lib/site-packages/markdown_it/utils.py +186 -0
  321. venv/Lib/site-packages/mdurl/__init__.py +18 -0
  322. venv/Lib/site-packages/mdurl/_decode.py +104 -0
  323. venv/Lib/site-packages/mdurl/_encode.py +85 -0
  324. venv/Lib/site-packages/mdurl/_format.py +27 -0
  325. venv/Lib/site-packages/mdurl/_parse.py +304 -0
  326. venv/Lib/site-packages/mdurl/_url.py +14 -0
  327. venv/Lib/site-packages/mdurl/py.typed +1 -0
  328. venv/Lib/site-packages/more_itertools/__init__.py +6 -0
  329. venv/Lib/site-packages/more_itertools/__init__.pyi +2 -0
  330. venv/Lib/site-packages/more_itertools/more.py +5303 -0
  331. venv/Lib/site-packages/more_itertools/more.pyi +949 -0
  332. venv/Lib/site-packages/more_itertools/py.typed +0 -0
  333. venv/Lib/site-packages/more_itertools/recipes.py +1471 -0
  334. venv/Lib/site-packages/more_itertools/recipes.pyi +205 -0
  335. venv/Lib/site-packages/nh3/__init__.py +5 -0
  336. venv/Lib/site-packages/nh3/__init__.pyi +41 -0
  337. venv/Lib/site-packages/nh3/py.typed +0 -0
  338. venv/Lib/site-packages/packaging/__init__.py +15 -0
  339. venv/Lib/site-packages/packaging/_elffile.py +109 -0
  340. venv/Lib/site-packages/packaging/_manylinux.py +262 -0
  341. venv/Lib/site-packages/packaging/_musllinux.py +85 -0
  342. venv/Lib/site-packages/packaging/_parser.py +353 -0
  343. venv/Lib/site-packages/packaging/_structures.py +61 -0
  344. venv/Lib/site-packages/packaging/_tokenizer.py +195 -0
  345. venv/Lib/site-packages/packaging/licenses/__init__.py +145 -0
  346. venv/Lib/site-packages/packaging/licenses/_spdx.py +759 -0
  347. venv/Lib/site-packages/packaging/markers.py +362 -0
  348. venv/Lib/site-packages/packaging/metadata.py +862 -0
  349. venv/Lib/site-packages/packaging/py.typed +0 -0
  350. venv/Lib/site-packages/packaging/requirements.py +91 -0
  351. venv/Lib/site-packages/packaging/specifiers.py +1019 -0
  352. venv/Lib/site-packages/packaging/tags.py +656 -0
  353. venv/Lib/site-packages/packaging/utils.py +163 -0
  354. venv/Lib/site-packages/packaging/version.py +582 -0
  355. venv/Lib/site-packages/pip/__init__.py +13 -0
  356. venv/Lib/site-packages/pip/__main__.py +24 -0
  357. venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
  358. venv/Lib/site-packages/pip/_internal/__init__.py +18 -0
  359. venv/Lib/site-packages/pip/_internal/build_env.py +417 -0
  360. venv/Lib/site-packages/pip/_internal/cache.py +291 -0
  361. venv/Lib/site-packages/pip/_internal/cli/__init__.py +3 -0
  362. venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +184 -0
  363. venv/Lib/site-packages/pip/_internal/cli/base_command.py +244 -0
  364. venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1110 -0
  365. venv/Lib/site-packages/pip/_internal/cli/command_context.py +28 -0
  366. venv/Lib/site-packages/pip/_internal/cli/index_command.py +175 -0
  367. venv/Lib/site-packages/pip/_internal/cli/main.py +80 -0
  368. venv/Lib/site-packages/pip/_internal/cli/main_parser.py +134 -0
  369. venv/Lib/site-packages/pip/_internal/cli/parser.py +298 -0
  370. venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +151 -0
  371. venv/Lib/site-packages/pip/_internal/cli/req_command.py +371 -0
  372. venv/Lib/site-packages/pip/_internal/cli/spinners.py +235 -0
  373. venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
  374. venv/Lib/site-packages/pip/_internal/commands/__init__.py +139 -0
  375. venv/Lib/site-packages/pip/_internal/commands/cache.py +231 -0
  376. venv/Lib/site-packages/pip/_internal/commands/check.py +66 -0
  377. venv/Lib/site-packages/pip/_internal/commands/completion.py +135 -0
  378. venv/Lib/site-packages/pip/_internal/commands/configuration.py +288 -0
  379. venv/Lib/site-packages/pip/_internal/commands/debug.py +203 -0
  380. venv/Lib/site-packages/pip/_internal/commands/download.py +142 -0
  381. venv/Lib/site-packages/pip/_internal/commands/freeze.py +107 -0
  382. venv/Lib/site-packages/pip/_internal/commands/hash.py +58 -0
  383. venv/Lib/site-packages/pip/_internal/commands/help.py +40 -0
  384. venv/Lib/site-packages/pip/_internal/commands/index.py +159 -0
  385. venv/Lib/site-packages/pip/_internal/commands/inspect.py +92 -0
  386. venv/Lib/site-packages/pip/_internal/commands/install.py +803 -0
  387. venv/Lib/site-packages/pip/_internal/commands/list.py +400 -0
  388. venv/Lib/site-packages/pip/_internal/commands/lock.py +167 -0
  389. venv/Lib/site-packages/pip/_internal/commands/search.py +178 -0
  390. venv/Lib/site-packages/pip/_internal/commands/show.py +231 -0
  391. venv/Lib/site-packages/pip/_internal/commands/uninstall.py +113 -0
  392. venv/Lib/site-packages/pip/_internal/commands/wheel.py +176 -0
  393. venv/Lib/site-packages/pip/_internal/configuration.py +396 -0
  394. venv/Lib/site-packages/pip/_internal/distributions/__init__.py +21 -0
  395. venv/Lib/site-packages/pip/_internal/distributions/base.py +55 -0
  396. venv/Lib/site-packages/pip/_internal/distributions/installed.py +33 -0
  397. venv/Lib/site-packages/pip/_internal/distributions/sdist.py +164 -0
  398. venv/Lib/site-packages/pip/_internal/distributions/wheel.py +44 -0
  399. venv/Lib/site-packages/pip/_internal/exceptions.py +898 -0
  400. venv/Lib/site-packages/pip/_internal/index/__init__.py +1 -0
  401. venv/Lib/site-packages/pip/_internal/index/collector.py +489 -0
  402. venv/Lib/site-packages/pip/_internal/index/package_finder.py +1059 -0
  403. venv/Lib/site-packages/pip/_internal/index/sources.py +287 -0
  404. venv/Lib/site-packages/pip/_internal/locations/__init__.py +441 -0
  405. venv/Lib/site-packages/pip/_internal/locations/_distutils.py +173 -0
  406. venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +215 -0
  407. venv/Lib/site-packages/pip/_internal/locations/base.py +82 -0
  408. venv/Lib/site-packages/pip/_internal/main.py +12 -0
  409. venv/Lib/site-packages/pip/_internal/metadata/__init__.py +169 -0
  410. venv/Lib/site-packages/pip/_internal/metadata/_json.py +87 -0
  411. venv/Lib/site-packages/pip/_internal/metadata/base.py +685 -0
  412. venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +6 -0
  413. venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +87 -0
  414. venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +229 -0
  415. venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +143 -0
  416. venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +298 -0
  417. venv/Lib/site-packages/pip/_internal/models/__init__.py +1 -0
  418. venv/Lib/site-packages/pip/_internal/models/candidate.py +25 -0
  419. venv/Lib/site-packages/pip/_internal/models/direct_url.py +227 -0
  420. venv/Lib/site-packages/pip/_internal/models/format_control.py +78 -0
  421. venv/Lib/site-packages/pip/_internal/models/index.py +28 -0
  422. venv/Lib/site-packages/pip/_internal/models/installation_report.py +57 -0
  423. venv/Lib/site-packages/pip/_internal/models/link.py +613 -0
  424. venv/Lib/site-packages/pip/_internal/models/pylock.py +188 -0
  425. venv/Lib/site-packages/pip/_internal/models/scheme.py +25 -0
  426. venv/Lib/site-packages/pip/_internal/models/search_scope.py +126 -0
  427. venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +53 -0
  428. venv/Lib/site-packages/pip/_internal/models/target_python.py +122 -0
  429. venv/Lib/site-packages/pip/_internal/models/wheel.py +80 -0
  430. venv/Lib/site-packages/pip/_internal/network/__init__.py +1 -0
  431. venv/Lib/site-packages/pip/_internal/network/auth.py +564 -0
  432. venv/Lib/site-packages/pip/_internal/network/cache.py +128 -0
  433. venv/Lib/site-packages/pip/_internal/network/download.py +342 -0
  434. venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +215 -0
  435. venv/Lib/site-packages/pip/_internal/network/session.py +528 -0
  436. venv/Lib/site-packages/pip/_internal/network/utils.py +98 -0
  437. venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +61 -0
  438. venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
  439. venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
  440. venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +140 -0
  441. venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +38 -0
  442. venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +41 -0
  443. venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +38 -0
  444. venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +47 -0
  445. venv/Lib/site-packages/pip/_internal/operations/check.py +175 -0
  446. venv/Lib/site-packages/pip/_internal/operations/freeze.py +259 -0
  447. venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +1 -0
  448. venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +746 -0
  449. venv/Lib/site-packages/pip/_internal/operations/prepare.py +748 -0
  450. venv/Lib/site-packages/pip/_internal/pyproject.py +123 -0
  451. venv/Lib/site-packages/pip/_internal/req/__init__.py +103 -0
  452. venv/Lib/site-packages/pip/_internal/req/constructors.py +566 -0
  453. venv/Lib/site-packages/pip/_internal/req/req_dependency_group.py +75 -0
  454. venv/Lib/site-packages/pip/_internal/req/req_file.py +619 -0
  455. venv/Lib/site-packages/pip/_internal/req/req_install.py +828 -0
  456. venv/Lib/site-packages/pip/_internal/req/req_set.py +81 -0
  457. venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +639 -0
  458. venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
  459. venv/Lib/site-packages/pip/_internal/resolution/base.py +20 -0
  460. venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
  461. venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +598 -0
  462. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
  463. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +142 -0
  464. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +591 -0
  465. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +845 -0
  466. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +166 -0
  467. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +285 -0
  468. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +98 -0
  469. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +247 -0
  470. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +332 -0
  471. venv/Lib/site-packages/pip/_internal/self_outdated_check.py +262 -0
  472. venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
  473. venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +109 -0
  474. venv/Lib/site-packages/pip/_internal/utils/_log.py +38 -0
  475. venv/Lib/site-packages/pip/_internal/utils/appdirs.py +52 -0
  476. venv/Lib/site-packages/pip/_internal/utils/compat.py +85 -0
  477. venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +201 -0
  478. venv/Lib/site-packages/pip/_internal/utils/datetime.py +10 -0
  479. venv/Lib/site-packages/pip/_internal/utils/deprecation.py +126 -0
  480. venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +87 -0
  481. venv/Lib/site-packages/pip/_internal/utils/egg_link.py +81 -0
  482. venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +88 -0
  483. venv/Lib/site-packages/pip/_internal/utils/filesystem.py +164 -0
  484. venv/Lib/site-packages/pip/_internal/utils/filetypes.py +24 -0
  485. venv/Lib/site-packages/pip/_internal/utils/glibc.py +102 -0
  486. venv/Lib/site-packages/pip/_internal/utils/hashes.py +150 -0
  487. venv/Lib/site-packages/pip/_internal/utils/logging.py +364 -0
  488. venv/Lib/site-packages/pip/_internal/utils/misc.py +765 -0
  489. venv/Lib/site-packages/pip/_internal/utils/packaging.py +44 -0
  490. venv/Lib/site-packages/pip/_internal/utils/retry.py +45 -0
  491. venv/Lib/site-packages/pip/_internal/utils/subprocess.py +248 -0
  492. venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +294 -0
  493. venv/Lib/site-packages/pip/_internal/utils/unpacking.py +362 -0
  494. venv/Lib/site-packages/pip/_internal/utils/urls.py +55 -0
  495. venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +105 -0
  496. venv/Lib/site-packages/pip/_internal/utils/wheel.py +132 -0
  497. venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
  498. venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +130 -0
  499. venv/Lib/site-packages/pip/_internal/vcs/git.py +571 -0
  500. venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +186 -0
  501. venv/Lib/site-packages/pip/_internal/vcs/subversion.py +335 -0
  502. venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +693 -0
  503. venv/Lib/site-packages/pip/_internal/wheel_builder.py +261 -0
  504. venv/Lib/site-packages/pip/_vendor/__init__.py +117 -0
  505. venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +29 -0
  506. venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +70 -0
  507. venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +168 -0
  508. venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +75 -0
  509. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +8 -0
  510. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +145 -0
  511. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +48 -0
  512. venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +511 -0
  513. venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +119 -0
  514. venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +157 -0
  515. venv/Lib/site-packages/pip/_vendor/cachecontrol/py.typed +0 -0
  516. venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +146 -0
  517. venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +43 -0
  518. venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +4 -0
  519. venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
  520. venv/Lib/site-packages/pip/_vendor/certifi/core.py +83 -0
  521. venv/Lib/site-packages/pip/_vendor/certifi/py.typed +0 -0
  522. venv/Lib/site-packages/pip/_vendor/dependency_groups/__init__.py +13 -0
  523. venv/Lib/site-packages/pip/_vendor/dependency_groups/__main__.py +65 -0
  524. venv/Lib/site-packages/pip/_vendor/dependency_groups/_implementation.py +209 -0
  525. venv/Lib/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py +59 -0
  526. venv/Lib/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py +62 -0
  527. venv/Lib/site-packages/pip/_vendor/dependency_groups/_toml_compat.py +9 -0
  528. venv/Lib/site-packages/pip/_vendor/dependency_groups/py.typed +0 -0
  529. venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +33 -0
  530. venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1137 -0
  531. venv/Lib/site-packages/pip/_vendor/distlib/resources.py +358 -0
  532. venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +447 -0
  533. venv/Lib/site-packages/pip/_vendor/distlib/util.py +1984 -0
  534. venv/Lib/site-packages/pip/_vendor/distro/__init__.py +54 -0
  535. venv/Lib/site-packages/pip/_vendor/distro/__main__.py +4 -0
  536. venv/Lib/site-packages/pip/_vendor/distro/distro.py +1403 -0
  537. venv/Lib/site-packages/pip/_vendor/distro/py.typed +0 -0
  538. venv/Lib/site-packages/pip/_vendor/idna/__init__.py +45 -0
  539. venv/Lib/site-packages/pip/_vendor/idna/codec.py +122 -0
  540. venv/Lib/site-packages/pip/_vendor/idna/compat.py +15 -0
  541. venv/Lib/site-packages/pip/_vendor/idna/core.py +437 -0
  542. venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +4243 -0
  543. venv/Lib/site-packages/pip/_vendor/idna/intranges.py +57 -0
  544. venv/Lib/site-packages/pip/_vendor/idna/package_data.py +1 -0
  545. venv/Lib/site-packages/pip/_vendor/idna/py.typed +0 -0
  546. venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8681 -0
  547. venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +55 -0
  548. venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
  549. venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +170 -0
  550. venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +929 -0
  551. venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +15 -0
  552. venv/Lib/site-packages/pip/_vendor/packaging/_elffile.py +109 -0
  553. venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +262 -0
  554. venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +85 -0
  555. venv/Lib/site-packages/pip/_vendor/packaging/_parser.py +353 -0
  556. venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +61 -0
  557. venv/Lib/site-packages/pip/_vendor/packaging/_tokenizer.py +195 -0
  558. venv/Lib/site-packages/pip/_vendor/packaging/licenses/__init__.py +145 -0
  559. venv/Lib/site-packages/pip/_vendor/packaging/licenses/_spdx.py +759 -0
  560. venv/Lib/site-packages/pip/_vendor/packaging/markers.py +362 -0
  561. venv/Lib/site-packages/pip/_vendor/packaging/metadata.py +862 -0
  562. venv/Lib/site-packages/pip/_vendor/packaging/py.typed +0 -0
  563. venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +91 -0
  564. venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +1019 -0
  565. venv/Lib/site-packages/pip/_vendor/packaging/tags.py +656 -0
  566. venv/Lib/site-packages/pip/_vendor/packaging/utils.py +163 -0
  567. venv/Lib/site-packages/pip/_vendor/packaging/version.py +582 -0
  568. venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3676 -0
  569. venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +631 -0
  570. venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +55 -0
  571. venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +249 -0
  572. venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +299 -0
  573. venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +146 -0
  574. venv/Lib/site-packages/pip/_vendor/platformdirs/py.typed +0 -0
  575. venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +272 -0
  576. venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +34 -0
  577. venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +272 -0
  578. venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +82 -0
  579. venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +17 -0
  580. venv/Lib/site-packages/pip/_vendor/pygments/console.py +70 -0
  581. venv/Lib/site-packages/pip/_vendor/pygments/filter.py +70 -0
  582. venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +940 -0
  583. venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +129 -0
  584. venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +157 -0
  585. venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +23 -0
  586. venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +963 -0
  587. venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +362 -0
  588. venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +602 -0
  589. venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +1201 -0
  590. venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +43 -0
  591. venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +72 -0
  592. venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +91 -0
  593. venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +104 -0
  594. venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +247 -0
  595. venv/Lib/site-packages/pip/_vendor/pygments/style.py +203 -0
  596. venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +61 -0
  597. venv/Lib/site-packages/pip/_vendor/pygments/styles/_mapping.py +54 -0
  598. venv/Lib/site-packages/pip/_vendor/pygments/token.py +214 -0
  599. venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +153 -0
  600. venv/Lib/site-packages/pip/_vendor/pygments/util.py +324 -0
  601. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +31 -0
  602. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +410 -0
  603. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +21 -0
  604. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +389 -0
  605. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/py.typed +0 -0
  606. venv/Lib/site-packages/pip/_vendor/requests/__init__.py +179 -0
  607. venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
  608. venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +50 -0
  609. venv/Lib/site-packages/pip/_vendor/requests/adapters.py +696 -0
  610. venv/Lib/site-packages/pip/_vendor/requests/api.py +157 -0
  611. venv/Lib/site-packages/pip/_vendor/requests/auth.py +314 -0
  612. venv/Lib/site-packages/pip/_vendor/requests/certs.py +17 -0
  613. venv/Lib/site-packages/pip/_vendor/requests/compat.py +90 -0
  614. venv/Lib/site-packages/pip/_vendor/requests/cookies.py +561 -0
  615. venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +151 -0
  616. venv/Lib/site-packages/pip/_vendor/requests/help.py +127 -0
  617. venv/Lib/site-packages/pip/_vendor/requests/hooks.py +33 -0
  618. venv/Lib/site-packages/pip/_vendor/requests/models.py +1039 -0
  619. venv/Lib/site-packages/pip/_vendor/requests/packages.py +25 -0
  620. venv/Lib/site-packages/pip/_vendor/requests/sessions.py +831 -0
  621. venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +128 -0
  622. venv/Lib/site-packages/pip/_vendor/requests/structures.py +99 -0
  623. venv/Lib/site-packages/pip/_vendor/requests/utils.py +1086 -0
  624. venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +27 -0
  625. venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +196 -0
  626. venv/Lib/site-packages/pip/_vendor/resolvelib/py.typed +0 -0
  627. venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +55 -0
  628. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py +27 -0
  629. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py +47 -0
  630. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py +48 -0
  631. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py +57 -0
  632. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py +627 -0
  633. venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +209 -0
  634. venv/Lib/site-packages/pip/_vendor/rich/__init__.py +177 -0
  635. venv/Lib/site-packages/pip/_vendor/rich/__main__.py +245 -0
  636. venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +454 -0
  637. venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +3610 -0
  638. venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +32 -0
  639. venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +76 -0
  640. venv/Lib/site-packages/pip/_vendor/rich/_extension.py +10 -0
  641. venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +24 -0
  642. venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +268 -0
  643. venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +94 -0
  644. venv/Lib/site-packages/pip/_vendor/rich/_loop.py +43 -0
  645. venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +69 -0
  646. venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +309 -0
  647. venv/Lib/site-packages/pip/_vendor/rich/_pick.py +17 -0
  648. venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +153 -0
  649. venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +482 -0
  650. venv/Lib/site-packages/pip/_vendor/rich/_stack.py +16 -0
  651. venv/Lib/site-packages/pip/_vendor/rich/_timer.py +19 -0
  652. venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +661 -0
  653. venv/Lib/site-packages/pip/_vendor/rich/_windows.py +71 -0
  654. venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +56 -0
  655. venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +93 -0
  656. venv/Lib/site-packages/pip/_vendor/rich/abc.py +33 -0
  657. venv/Lib/site-packages/pip/_vendor/rich/align.py +306 -0
  658. venv/Lib/site-packages/pip/_vendor/rich/ansi.py +241 -0
  659. venv/Lib/site-packages/pip/_vendor/rich/bar.py +93 -0
  660. venv/Lib/site-packages/pip/_vendor/rich/box.py +474 -0
  661. venv/Lib/site-packages/pip/_vendor/rich/cells.py +174 -0
  662. venv/Lib/site-packages/pip/_vendor/rich/color.py +621 -0
  663. venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +38 -0
  664. venv/Lib/site-packages/pip/_vendor/rich/columns.py +187 -0
  665. venv/Lib/site-packages/pip/_vendor/rich/console.py +2680 -0
  666. venv/Lib/site-packages/pip/_vendor/rich/constrain.py +37 -0
  667. venv/Lib/site-packages/pip/_vendor/rich/containers.py +167 -0
  668. venv/Lib/site-packages/pip/_vendor/rich/control.py +219 -0
  669. venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +193 -0
  670. venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +39 -0
  671. venv/Lib/site-packages/pip/_vendor/rich/emoji.py +91 -0
  672. venv/Lib/site-packages/pip/_vendor/rich/errors.py +34 -0
  673. venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +57 -0
  674. venv/Lib/site-packages/pip/_vendor/rich/filesize.py +88 -0
  675. venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +232 -0
  676. venv/Lib/site-packages/pip/_vendor/rich/json.py +139 -0
  677. venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +101 -0
  678. venv/Lib/site-packages/pip/_vendor/rich/layout.py +442 -0
  679. venv/Lib/site-packages/pip/_vendor/rich/live.py +400 -0
  680. venv/Lib/site-packages/pip/_vendor/rich/live_render.py +106 -0
  681. venv/Lib/site-packages/pip/_vendor/rich/logging.py +297 -0
  682. venv/Lib/site-packages/pip/_vendor/rich/markup.py +251 -0
  683. venv/Lib/site-packages/pip/_vendor/rich/measure.py +151 -0
  684. venv/Lib/site-packages/pip/_vendor/rich/padding.py +141 -0
  685. venv/Lib/site-packages/pip/_vendor/rich/pager.py +34 -0
  686. venv/Lib/site-packages/pip/_vendor/rich/palette.py +100 -0
  687. venv/Lib/site-packages/pip/_vendor/rich/panel.py +317 -0
  688. venv/Lib/site-packages/pip/_vendor/rich/pretty.py +1016 -0
  689. venv/Lib/site-packages/pip/_vendor/rich/progress.py +1715 -0
  690. venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +223 -0
  691. venv/Lib/site-packages/pip/_vendor/rich/prompt.py +400 -0
  692. venv/Lib/site-packages/pip/_vendor/rich/protocol.py +42 -0
  693. venv/Lib/site-packages/pip/_vendor/rich/py.typed +0 -0
  694. venv/Lib/site-packages/pip/_vendor/rich/region.py +10 -0
  695. venv/Lib/site-packages/pip/_vendor/rich/repr.py +149 -0
  696. venv/Lib/site-packages/pip/_vendor/rich/rule.py +130 -0
  697. venv/Lib/site-packages/pip/_vendor/rich/scope.py +86 -0
  698. venv/Lib/site-packages/pip/_vendor/rich/screen.py +54 -0
  699. venv/Lib/site-packages/pip/_vendor/rich/segment.py +752 -0
  700. venv/Lib/site-packages/pip/_vendor/rich/spinner.py +132 -0
  701. venv/Lib/site-packages/pip/_vendor/rich/status.py +131 -0
  702. venv/Lib/site-packages/pip/_vendor/rich/style.py +792 -0
  703. venv/Lib/site-packages/pip/_vendor/rich/styled.py +42 -0
  704. venv/Lib/site-packages/pip/_vendor/rich/syntax.py +985 -0
  705. venv/Lib/site-packages/pip/_vendor/rich/table.py +1006 -0
  706. venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +153 -0
  707. venv/Lib/site-packages/pip/_vendor/rich/text.py +1361 -0
  708. venv/Lib/site-packages/pip/_vendor/rich/theme.py +115 -0
  709. venv/Lib/site-packages/pip/_vendor/rich/themes.py +5 -0
  710. venv/Lib/site-packages/pip/_vendor/rich/traceback.py +899 -0
  711. venv/Lib/site-packages/pip/_vendor/rich/tree.py +257 -0
  712. venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +8 -0
  713. venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +777 -0
  714. venv/Lib/site-packages/pip/_vendor/tomli/_re.py +115 -0
  715. venv/Lib/site-packages/pip/_vendor/tomli/_types.py +10 -0
  716. venv/Lib/site-packages/pip/_vendor/tomli/py.typed +1 -0
  717. venv/Lib/site-packages/pip/_vendor/tomli_w/__init__.py +4 -0
  718. venv/Lib/site-packages/pip/_vendor/tomli_w/_writer.py +229 -0
  719. venv/Lib/site-packages/pip/_vendor/tomli_w/py.typed +1 -0
  720. venv/Lib/site-packages/pip/_vendor/truststore/__init__.py +36 -0
  721. venv/Lib/site-packages/pip/_vendor/truststore/_api.py +341 -0
  722. venv/Lib/site-packages/pip/_vendor/truststore/_macos.py +571 -0
  723. venv/Lib/site-packages/pip/_vendor/truststore/_openssl.py +68 -0
  724. venv/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py +31 -0
  725. venv/Lib/site-packages/pip/_vendor/truststore/_windows.py +567 -0
  726. venv/Lib/site-packages/pip/_vendor/truststore/py.typed +0 -0
  727. venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +102 -0
  728. venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +355 -0
  729. venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
  730. venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +572 -0
  731. venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1140 -0
  732. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  733. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
  734. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  735. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
  736. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +397 -0
  737. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
  738. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +130 -0
  739. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +518 -0
  740. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +920 -0
  741. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
  742. venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +323 -0
  743. venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
  744. venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
  745. venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
  746. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  747. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
  748. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +155 -0
  749. venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1076 -0
  750. venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +540 -0
  751. venv/Lib/site-packages/pip/_vendor/urllib3/request.py +191 -0
  752. venv/Lib/site-packages/pip/_vendor/urllib3/response.py +879 -0
  753. venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
  754. venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +149 -0
  755. venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +57 -0
  756. venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
  757. venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +137 -0
  758. venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
  759. venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +622 -0
  760. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +504 -0
  761. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +159 -0
  762. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
  763. venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +271 -0
  764. venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +435 -0
  765. venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +152 -0
  766. venv/Lib/site-packages/pip/py.typed +4 -0
  767. venv/Lib/site-packages/pygments/__init__.py +82 -0
  768. venv/Lib/site-packages/pygments/__main__.py +17 -0
  769. venv/Lib/site-packages/pygments/cmdline.py +668 -0
  770. venv/Lib/site-packages/pygments/console.py +70 -0
  771. venv/Lib/site-packages/pygments/filter.py +70 -0
  772. venv/Lib/site-packages/pygments/filters/__init__.py +940 -0
  773. venv/Lib/site-packages/pygments/formatter.py +129 -0
  774. venv/Lib/site-packages/pygments/formatters/__init__.py +157 -0
  775. venv/Lib/site-packages/pygments/formatters/_mapping.py +23 -0
  776. venv/Lib/site-packages/pygments/formatters/bbcode.py +108 -0
  777. venv/Lib/site-packages/pygments/formatters/groff.py +170 -0
  778. venv/Lib/site-packages/pygments/formatters/html.py +995 -0
  779. venv/Lib/site-packages/pygments/formatters/img.py +686 -0
  780. venv/Lib/site-packages/pygments/formatters/irc.py +154 -0
  781. venv/Lib/site-packages/pygments/formatters/latex.py +518 -0
  782. venv/Lib/site-packages/pygments/formatters/other.py +160 -0
  783. venv/Lib/site-packages/pygments/formatters/pangomarkup.py +83 -0
  784. venv/Lib/site-packages/pygments/formatters/rtf.py +349 -0
  785. venv/Lib/site-packages/pygments/formatters/svg.py +185 -0
  786. venv/Lib/site-packages/pygments/formatters/terminal.py +127 -0
  787. venv/Lib/site-packages/pygments/formatters/terminal256.py +338 -0
  788. venv/Lib/site-packages/pygments/lexer.py +961 -0
  789. venv/Lib/site-packages/pygments/lexers/__init__.py +362 -0
  790. venv/Lib/site-packages/pygments/lexers/_ada_builtins.py +103 -0
  791. venv/Lib/site-packages/pygments/lexers/_asy_builtins.py +1644 -0
  792. venv/Lib/site-packages/pygments/lexers/_cl_builtins.py +231 -0
  793. venv/Lib/site-packages/pygments/lexers/_cocoa_builtins.py +75 -0
  794. venv/Lib/site-packages/pygments/lexers/_csound_builtins.py +1780 -0
  795. venv/Lib/site-packages/pygments/lexers/_css_builtins.py +558 -0
  796. venv/Lib/site-packages/pygments/lexers/_googlesql_builtins.py +918 -0
  797. venv/Lib/site-packages/pygments/lexers/_julia_builtins.py +411 -0
  798. venv/Lib/site-packages/pygments/lexers/_lasso_builtins.py +5326 -0
  799. venv/Lib/site-packages/pygments/lexers/_lilypond_builtins.py +4932 -0
  800. venv/Lib/site-packages/pygments/lexers/_lua_builtins.py +285 -0
  801. venv/Lib/site-packages/pygments/lexers/_luau_builtins.py +62 -0
  802. venv/Lib/site-packages/pygments/lexers/_mapping.py +602 -0
  803. venv/Lib/site-packages/pygments/lexers/_mql_builtins.py +1171 -0
  804. venv/Lib/site-packages/pygments/lexers/_mysql_builtins.py +1335 -0
  805. venv/Lib/site-packages/pygments/lexers/_openedge_builtins.py +2600 -0
  806. venv/Lib/site-packages/pygments/lexers/_php_builtins.py +3325 -0
  807. venv/Lib/site-packages/pygments/lexers/_postgres_builtins.py +739 -0
  808. venv/Lib/site-packages/pygments/lexers/_qlik_builtins.py +666 -0
  809. venv/Lib/site-packages/pygments/lexers/_scheme_builtins.py +1609 -0
  810. venv/Lib/site-packages/pygments/lexers/_scilab_builtins.py +3093 -0
  811. venv/Lib/site-packages/pygments/lexers/_sourcemod_builtins.py +1151 -0
  812. venv/Lib/site-packages/pygments/lexers/_sql_builtins.py +106 -0
  813. venv/Lib/site-packages/pygments/lexers/_stan_builtins.py +648 -0
  814. venv/Lib/site-packages/pygments/lexers/_stata_builtins.py +457 -0
  815. venv/Lib/site-packages/pygments/lexers/_tsql_builtins.py +1003 -0
  816. venv/Lib/site-packages/pygments/lexers/_usd_builtins.py +112 -0
  817. venv/Lib/site-packages/pygments/lexers/_vbscript_builtins.py +279 -0
  818. venv/Lib/site-packages/pygments/lexers/_vim_builtins.py +1938 -0
  819. venv/Lib/site-packages/pygments/lexers/actionscript.py +243 -0
  820. venv/Lib/site-packages/pygments/lexers/ada.py +144 -0
  821. venv/Lib/site-packages/pygments/lexers/agile.py +25 -0
  822. venv/Lib/site-packages/pygments/lexers/algebra.py +299 -0
  823. venv/Lib/site-packages/pygments/lexers/ambient.py +75 -0
  824. venv/Lib/site-packages/pygments/lexers/amdgpu.py +54 -0
  825. venv/Lib/site-packages/pygments/lexers/ampl.py +87 -0
  826. venv/Lib/site-packages/pygments/lexers/apdlexer.py +593 -0
  827. venv/Lib/site-packages/pygments/lexers/apl.py +103 -0
  828. venv/Lib/site-packages/pygments/lexers/archetype.py +315 -0
  829. venv/Lib/site-packages/pygments/lexers/arrow.py +116 -0
  830. venv/Lib/site-packages/pygments/lexers/arturo.py +249 -0
  831. venv/Lib/site-packages/pygments/lexers/asc.py +55 -0
  832. venv/Lib/site-packages/pygments/lexers/asm.py +1051 -0
  833. venv/Lib/site-packages/pygments/lexers/asn1.py +178 -0
  834. venv/Lib/site-packages/pygments/lexers/automation.py +379 -0
  835. venv/Lib/site-packages/pygments/lexers/bare.py +101 -0
  836. venv/Lib/site-packages/pygments/lexers/basic.py +656 -0
  837. venv/Lib/site-packages/pygments/lexers/bdd.py +57 -0
  838. venv/Lib/site-packages/pygments/lexers/berry.py +99 -0
  839. venv/Lib/site-packages/pygments/lexers/bibtex.py +159 -0
  840. venv/Lib/site-packages/pygments/lexers/blueprint.py +173 -0
  841. venv/Lib/site-packages/pygments/lexers/boa.py +97 -0
  842. venv/Lib/site-packages/pygments/lexers/bqn.py +112 -0
  843. venv/Lib/site-packages/pygments/lexers/business.py +625 -0
  844. venv/Lib/site-packages/pygments/lexers/c_cpp.py +414 -0
  845. venv/Lib/site-packages/pygments/lexers/c_like.py +738 -0
  846. venv/Lib/site-packages/pygments/lexers/capnproto.py +74 -0
  847. venv/Lib/site-packages/pygments/lexers/carbon.py +95 -0
  848. venv/Lib/site-packages/pygments/lexers/cddl.py +172 -0
  849. venv/Lib/site-packages/pygments/lexers/chapel.py +139 -0
  850. venv/Lib/site-packages/pygments/lexers/clean.py +180 -0
  851. venv/Lib/site-packages/pygments/lexers/codeql.py +80 -0
  852. venv/Lib/site-packages/pygments/lexers/comal.py +81 -0
  853. venv/Lib/site-packages/pygments/lexers/compiled.py +35 -0
  854. venv/Lib/site-packages/pygments/lexers/configs.py +1433 -0
  855. venv/Lib/site-packages/pygments/lexers/console.py +114 -0
  856. venv/Lib/site-packages/pygments/lexers/cplint.py +43 -0
  857. venv/Lib/site-packages/pygments/lexers/crystal.py +364 -0
  858. venv/Lib/site-packages/pygments/lexers/csound.py +466 -0
  859. venv/Lib/site-packages/pygments/lexers/css.py +602 -0
  860. venv/Lib/site-packages/pygments/lexers/d.py +259 -0
  861. venv/Lib/site-packages/pygments/lexers/dalvik.py +126 -0
  862. venv/Lib/site-packages/pygments/lexers/data.py +763 -0
  863. venv/Lib/site-packages/pygments/lexers/dax.py +135 -0
  864. venv/Lib/site-packages/pygments/lexers/devicetree.py +108 -0
  865. venv/Lib/site-packages/pygments/lexers/diff.py +169 -0
  866. venv/Lib/site-packages/pygments/lexers/dns.py +109 -0
  867. venv/Lib/site-packages/pygments/lexers/dotnet.py +873 -0
  868. venv/Lib/site-packages/pygments/lexers/dsls.py +970 -0
  869. venv/Lib/site-packages/pygments/lexers/dylan.py +279 -0
  870. venv/Lib/site-packages/pygments/lexers/ecl.py +144 -0
  871. venv/Lib/site-packages/pygments/lexers/eiffel.py +68 -0
  872. venv/Lib/site-packages/pygments/lexers/elm.py +123 -0
  873. venv/Lib/site-packages/pygments/lexers/elpi.py +175 -0
  874. venv/Lib/site-packages/pygments/lexers/email.py +132 -0
  875. venv/Lib/site-packages/pygments/lexers/erlang.py +526 -0
  876. venv/Lib/site-packages/pygments/lexers/esoteric.py +300 -0
  877. venv/Lib/site-packages/pygments/lexers/ezhil.py +76 -0
  878. venv/Lib/site-packages/pygments/lexers/factor.py +363 -0
  879. venv/Lib/site-packages/pygments/lexers/fantom.py +251 -0
  880. venv/Lib/site-packages/pygments/lexers/felix.py +275 -0
  881. venv/Lib/site-packages/pygments/lexers/fift.py +68 -0
  882. venv/Lib/site-packages/pygments/lexers/floscript.py +81 -0
  883. venv/Lib/site-packages/pygments/lexers/forth.py +178 -0
  884. venv/Lib/site-packages/pygments/lexers/fortran.py +212 -0
  885. venv/Lib/site-packages/pygments/lexers/foxpro.py +427 -0
  886. venv/Lib/site-packages/pygments/lexers/freefem.py +893 -0
  887. venv/Lib/site-packages/pygments/lexers/func.py +110 -0
  888. venv/Lib/site-packages/pygments/lexers/functional.py +21 -0
  889. venv/Lib/site-packages/pygments/lexers/futhark.py +105 -0
  890. venv/Lib/site-packages/pygments/lexers/gcodelexer.py +35 -0
  891. venv/Lib/site-packages/pygments/lexers/gdscript.py +189 -0
  892. venv/Lib/site-packages/pygments/lexers/gleam.py +74 -0
  893. venv/Lib/site-packages/pygments/lexers/go.py +97 -0
  894. venv/Lib/site-packages/pygments/lexers/grammar_notation.py +262 -0
  895. venv/Lib/site-packages/pygments/lexers/graph.py +108 -0
  896. venv/Lib/site-packages/pygments/lexers/graphics.py +794 -0
  897. venv/Lib/site-packages/pygments/lexers/graphql.py +176 -0
  898. venv/Lib/site-packages/pygments/lexers/graphviz.py +58 -0
  899. venv/Lib/site-packages/pygments/lexers/gsql.py +103 -0
  900. venv/Lib/site-packages/pygments/lexers/hare.py +73 -0
  901. venv/Lib/site-packages/pygments/lexers/haskell.py +866 -0
  902. venv/Lib/site-packages/pygments/lexers/haxe.py +935 -0
  903. venv/Lib/site-packages/pygments/lexers/hdl.py +466 -0
  904. venv/Lib/site-packages/pygments/lexers/hexdump.py +102 -0
  905. venv/Lib/site-packages/pygments/lexers/html.py +670 -0
  906. venv/Lib/site-packages/pygments/lexers/idl.py +284 -0
  907. venv/Lib/site-packages/pygments/lexers/igor.py +435 -0
  908. venv/Lib/site-packages/pygments/lexers/inferno.py +95 -0
  909. venv/Lib/site-packages/pygments/lexers/installers.py +352 -0
  910. venv/Lib/site-packages/pygments/lexers/int_fiction.py +1370 -0
  911. venv/Lib/site-packages/pygments/lexers/iolang.py +61 -0
  912. venv/Lib/site-packages/pygments/lexers/j.py +151 -0
  913. venv/Lib/site-packages/pygments/lexers/javascript.py +1591 -0
  914. venv/Lib/site-packages/pygments/lexers/jmespath.py +69 -0
  915. venv/Lib/site-packages/pygments/lexers/jslt.py +94 -0
  916. venv/Lib/site-packages/pygments/lexers/json5.py +83 -0
  917. venv/Lib/site-packages/pygments/lexers/jsonnet.py +169 -0
  918. venv/Lib/site-packages/pygments/lexers/jsx.py +100 -0
  919. venv/Lib/site-packages/pygments/lexers/julia.py +294 -0
  920. venv/Lib/site-packages/pygments/lexers/jvm.py +1802 -0
  921. venv/Lib/site-packages/pygments/lexers/kuin.py +332 -0
  922. venv/Lib/site-packages/pygments/lexers/kusto.py +93 -0
  923. venv/Lib/site-packages/pygments/lexers/ldap.py +155 -0
  924. venv/Lib/site-packages/pygments/lexers/lean.py +241 -0
  925. venv/Lib/site-packages/pygments/lexers/lilypond.py +225 -0
  926. venv/Lib/site-packages/pygments/lexers/lisp.py +3146 -0
  927. venv/Lib/site-packages/pygments/lexers/macaulay2.py +1814 -0
  928. venv/Lib/site-packages/pygments/lexers/make.py +212 -0
  929. venv/Lib/site-packages/pygments/lexers/maple.py +291 -0
  930. venv/Lib/site-packages/pygments/lexers/markup.py +1654 -0
  931. venv/Lib/site-packages/pygments/lexers/math.py +21 -0
  932. venv/Lib/site-packages/pygments/lexers/matlab.py +3307 -0
  933. venv/Lib/site-packages/pygments/lexers/maxima.py +84 -0
  934. venv/Lib/site-packages/pygments/lexers/meson.py +139 -0
  935. venv/Lib/site-packages/pygments/lexers/mime.py +210 -0
  936. venv/Lib/site-packages/pygments/lexers/minecraft.py +391 -0
  937. venv/Lib/site-packages/pygments/lexers/mips.py +130 -0
  938. venv/Lib/site-packages/pygments/lexers/ml.py +958 -0
  939. venv/Lib/site-packages/pygments/lexers/modeling.py +366 -0
  940. venv/Lib/site-packages/pygments/lexers/modula2.py +1579 -0
  941. venv/Lib/site-packages/pygments/lexers/mojo.py +707 -0
  942. venv/Lib/site-packages/pygments/lexers/monte.py +203 -0
  943. venv/Lib/site-packages/pygments/lexers/mosel.py +447 -0
  944. venv/Lib/site-packages/pygments/lexers/ncl.py +894 -0
  945. venv/Lib/site-packages/pygments/lexers/nimrod.py +199 -0
  946. venv/Lib/site-packages/pygments/lexers/nit.py +63 -0
  947. venv/Lib/site-packages/pygments/lexers/nix.py +144 -0
  948. venv/Lib/site-packages/pygments/lexers/numbair.py +63 -0
  949. venv/Lib/site-packages/pygments/lexers/oberon.py +120 -0
  950. venv/Lib/site-packages/pygments/lexers/objective.py +513 -0
  951. venv/Lib/site-packages/pygments/lexers/ooc.py +84 -0
  952. venv/Lib/site-packages/pygments/lexers/openscad.py +96 -0
  953. venv/Lib/site-packages/pygments/lexers/other.py +41 -0
  954. venv/Lib/site-packages/pygments/lexers/parasail.py +78 -0
  955. venv/Lib/site-packages/pygments/lexers/parsers.py +798 -0
  956. venv/Lib/site-packages/pygments/lexers/pascal.py +644 -0
  957. venv/Lib/site-packages/pygments/lexers/pawn.py +202 -0
  958. venv/Lib/site-packages/pygments/lexers/pddl.py +82 -0
  959. venv/Lib/site-packages/pygments/lexers/perl.py +733 -0
  960. venv/Lib/site-packages/pygments/lexers/phix.py +363 -0
  961. venv/Lib/site-packages/pygments/lexers/php.py +334 -0
  962. venv/Lib/site-packages/pygments/lexers/pointless.py +70 -0
  963. venv/Lib/site-packages/pygments/lexers/pony.py +93 -0
  964. venv/Lib/site-packages/pygments/lexers/praat.py +303 -0
  965. venv/Lib/site-packages/pygments/lexers/procfile.py +41 -0
  966. venv/Lib/site-packages/pygments/lexers/prolog.py +318 -0
  967. venv/Lib/site-packages/pygments/lexers/promql.py +176 -0
  968. venv/Lib/site-packages/pygments/lexers/prql.py +251 -0
  969. venv/Lib/site-packages/pygments/lexers/ptx.py +119 -0
  970. venv/Lib/site-packages/pygments/lexers/python.py +1201 -0
  971. venv/Lib/site-packages/pygments/lexers/q.py +187 -0
  972. venv/Lib/site-packages/pygments/lexers/qlik.py +117 -0
  973. venv/Lib/site-packages/pygments/lexers/qvt.py +153 -0
  974. venv/Lib/site-packages/pygments/lexers/r.py +196 -0
  975. venv/Lib/site-packages/pygments/lexers/rdf.py +468 -0
  976. venv/Lib/site-packages/pygments/lexers/rebol.py +419 -0
  977. venv/Lib/site-packages/pygments/lexers/rego.py +57 -0
  978. venv/Lib/site-packages/pygments/lexers/resource.py +83 -0
  979. venv/Lib/site-packages/pygments/lexers/ride.py +138 -0
  980. venv/Lib/site-packages/pygments/lexers/rita.py +42 -0
  981. venv/Lib/site-packages/pygments/lexers/rnc.py +66 -0
  982. venv/Lib/site-packages/pygments/lexers/roboconf.py +81 -0
  983. venv/Lib/site-packages/pygments/lexers/robotframework.py +551 -0
  984. venv/Lib/site-packages/pygments/lexers/ruby.py +518 -0
  985. venv/Lib/site-packages/pygments/lexers/rust.py +222 -0
  986. venv/Lib/site-packages/pygments/lexers/sas.py +227 -0
  987. venv/Lib/site-packages/pygments/lexers/savi.py +171 -0
  988. venv/Lib/site-packages/pygments/lexers/scdoc.py +85 -0
  989. venv/Lib/site-packages/pygments/lexers/scripting.py +1616 -0
  990. venv/Lib/site-packages/pygments/lexers/sgf.py +59 -0
  991. venv/Lib/site-packages/pygments/lexers/shell.py +902 -0
  992. venv/Lib/site-packages/pygments/lexers/sieve.py +78 -0
  993. venv/Lib/site-packages/pygments/lexers/slash.py +183 -0
  994. venv/Lib/site-packages/pygments/lexers/smalltalk.py +194 -0
  995. venv/Lib/site-packages/pygments/lexers/smithy.py +77 -0
  996. venv/Lib/site-packages/pygments/lexers/smv.py +78 -0
  997. venv/Lib/site-packages/pygments/lexers/snobol.py +82 -0
  998. venv/Lib/site-packages/pygments/lexers/solidity.py +87 -0
  999. venv/Lib/site-packages/pygments/lexers/soong.py +78 -0
  1000. venv/Lib/site-packages/pygments/lexers/sophia.py +102 -0
  1001. venv/Lib/site-packages/pygments/lexers/special.py +122 -0
  1002. venv/Lib/site-packages/pygments/lexers/spice.py +70 -0
  1003. venv/Lib/site-packages/pygments/lexers/sql.py +1109 -0
  1004. venv/Lib/site-packages/pygments/lexers/srcinfo.py +62 -0
  1005. venv/Lib/site-packages/pygments/lexers/stata.py +170 -0
  1006. venv/Lib/site-packages/pygments/lexers/supercollider.py +94 -0
  1007. venv/Lib/site-packages/pygments/lexers/tablegen.py +177 -0
  1008. venv/Lib/site-packages/pygments/lexers/tact.py +303 -0
  1009. venv/Lib/site-packages/pygments/lexers/tal.py +77 -0
  1010. venv/Lib/site-packages/pygments/lexers/tcl.py +148 -0
  1011. venv/Lib/site-packages/pygments/lexers/teal.py +88 -0
  1012. venv/Lib/site-packages/pygments/lexers/templates.py +2355 -0
  1013. venv/Lib/site-packages/pygments/lexers/teraterm.py +325 -0
  1014. venv/Lib/site-packages/pygments/lexers/testing.py +209 -0
  1015. venv/Lib/site-packages/pygments/lexers/text.py +27 -0
  1016. venv/Lib/site-packages/pygments/lexers/textedit.py +205 -0
  1017. venv/Lib/site-packages/pygments/lexers/textfmts.py +436 -0
  1018. venv/Lib/site-packages/pygments/lexers/theorem.py +410 -0
  1019. venv/Lib/site-packages/pygments/lexers/thingsdb.py +140 -0
  1020. venv/Lib/site-packages/pygments/lexers/tlb.py +59 -0
  1021. venv/Lib/site-packages/pygments/lexers/tls.py +54 -0
  1022. venv/Lib/site-packages/pygments/lexers/tnt.py +270 -0
  1023. venv/Lib/site-packages/pygments/lexers/trafficscript.py +51 -0
  1024. venv/Lib/site-packages/pygments/lexers/typoscript.py +216 -0
  1025. venv/Lib/site-packages/pygments/lexers/typst.py +160 -0
  1026. venv/Lib/site-packages/pygments/lexers/ul4.py +309 -0
  1027. venv/Lib/site-packages/pygments/lexers/unicon.py +413 -0
  1028. venv/Lib/site-packages/pygments/lexers/urbi.py +145 -0
  1029. venv/Lib/site-packages/pygments/lexers/usd.py +85 -0
  1030. venv/Lib/site-packages/pygments/lexers/varnish.py +189 -0
  1031. venv/Lib/site-packages/pygments/lexers/verification.py +113 -0
  1032. venv/Lib/site-packages/pygments/lexers/verifpal.py +65 -0
  1033. venv/Lib/site-packages/pygments/lexers/vip.py +150 -0
  1034. venv/Lib/site-packages/pygments/lexers/vyper.py +140 -0
  1035. venv/Lib/site-packages/pygments/lexers/web.py +24 -0
  1036. venv/Lib/site-packages/pygments/lexers/webassembly.py +119 -0
  1037. venv/Lib/site-packages/pygments/lexers/webidl.py +298 -0
  1038. venv/Lib/site-packages/pygments/lexers/webmisc.py +1006 -0
  1039. venv/Lib/site-packages/pygments/lexers/wgsl.py +406 -0
  1040. venv/Lib/site-packages/pygments/lexers/whiley.py +115 -0
  1041. venv/Lib/site-packages/pygments/lexers/wowtoc.py +120 -0
  1042. venv/Lib/site-packages/pygments/lexers/wren.py +98 -0
  1043. venv/Lib/site-packages/pygments/lexers/x10.py +66 -0
  1044. venv/Lib/site-packages/pygments/lexers/xorg.py +38 -0
  1045. venv/Lib/site-packages/pygments/lexers/yang.py +103 -0
  1046. venv/Lib/site-packages/pygments/lexers/yara.py +69 -0
  1047. venv/Lib/site-packages/pygments/lexers/zig.py +125 -0
  1048. venv/Lib/site-packages/pygments/modeline.py +43 -0
  1049. venv/Lib/site-packages/pygments/plugin.py +72 -0
  1050. venv/Lib/site-packages/pygments/regexopt.py +91 -0
  1051. venv/Lib/site-packages/pygments/scanner.py +104 -0
  1052. venv/Lib/site-packages/pygments/sphinxext.py +247 -0
  1053. venv/Lib/site-packages/pygments/style.py +203 -0
  1054. venv/Lib/site-packages/pygments/styles/__init__.py +61 -0
  1055. venv/Lib/site-packages/pygments/styles/_mapping.py +54 -0
  1056. venv/Lib/site-packages/pygments/styles/abap.py +32 -0
  1057. venv/Lib/site-packages/pygments/styles/algol.py +65 -0
  1058. venv/Lib/site-packages/pygments/styles/algol_nu.py +65 -0
  1059. venv/Lib/site-packages/pygments/styles/arduino.py +100 -0
  1060. venv/Lib/site-packages/pygments/styles/autumn.py +67 -0
  1061. venv/Lib/site-packages/pygments/styles/borland.py +53 -0
  1062. venv/Lib/site-packages/pygments/styles/bw.py +52 -0
  1063. venv/Lib/site-packages/pygments/styles/coffee.py +80 -0
  1064. venv/Lib/site-packages/pygments/styles/colorful.py +83 -0
  1065. venv/Lib/site-packages/pygments/styles/default.py +76 -0
  1066. venv/Lib/site-packages/pygments/styles/dracula.py +90 -0
  1067. venv/Lib/site-packages/pygments/styles/emacs.py +75 -0
  1068. venv/Lib/site-packages/pygments/styles/friendly.py +76 -0
  1069. venv/Lib/site-packages/pygments/styles/friendly_grayscale.py +80 -0
  1070. venv/Lib/site-packages/pygments/styles/fruity.py +47 -0
  1071. venv/Lib/site-packages/pygments/styles/gh_dark.py +113 -0
  1072. venv/Lib/site-packages/pygments/styles/gruvbox.py +118 -0
  1073. venv/Lib/site-packages/pygments/styles/igor.py +32 -0
  1074. venv/Lib/site-packages/pygments/styles/inkpot.py +72 -0
  1075. venv/Lib/site-packages/pygments/styles/lightbulb.py +110 -0
  1076. venv/Lib/site-packages/pygments/styles/lilypond.py +62 -0
  1077. venv/Lib/site-packages/pygments/styles/lovelace.py +100 -0
  1078. venv/Lib/site-packages/pygments/styles/manni.py +79 -0
  1079. venv/Lib/site-packages/pygments/styles/material.py +124 -0
  1080. venv/Lib/site-packages/pygments/styles/monokai.py +112 -0
  1081. venv/Lib/site-packages/pygments/styles/murphy.py +82 -0
  1082. venv/Lib/site-packages/pygments/styles/native.py +70 -0
  1083. venv/Lib/site-packages/pygments/styles/nord.py +156 -0
  1084. venv/Lib/site-packages/pygments/styles/onedark.py +63 -0
  1085. venv/Lib/site-packages/pygments/styles/paraiso_dark.py +124 -0
  1086. venv/Lib/site-packages/pygments/styles/paraiso_light.py +124 -0
  1087. venv/Lib/site-packages/pygments/styles/pastie.py +78 -0
  1088. venv/Lib/site-packages/pygments/styles/perldoc.py +73 -0
  1089. venv/Lib/site-packages/pygments/styles/rainbow_dash.py +95 -0
  1090. venv/Lib/site-packages/pygments/styles/rrt.py +40 -0
  1091. venv/Lib/site-packages/pygments/styles/sas.py +46 -0
  1092. venv/Lib/site-packages/pygments/styles/solarized.py +144 -0
  1093. venv/Lib/site-packages/pygments/styles/staroffice.py +31 -0
  1094. venv/Lib/site-packages/pygments/styles/stata_dark.py +42 -0
  1095. venv/Lib/site-packages/pygments/styles/stata_light.py +42 -0
  1096. venv/Lib/site-packages/pygments/styles/tango.py +143 -0
  1097. venv/Lib/site-packages/pygments/styles/trac.py +66 -0
  1098. venv/Lib/site-packages/pygments/styles/vim.py +67 -0
  1099. venv/Lib/site-packages/pygments/styles/vs.py +41 -0
  1100. venv/Lib/site-packages/pygments/styles/xcode.py +53 -0
  1101. venv/Lib/site-packages/pygments/styles/zenburn.py +83 -0
  1102. venv/Lib/site-packages/pygments/token.py +214 -0
  1103. venv/Lib/site-packages/pygments/unistring.py +153 -0
  1104. venv/Lib/site-packages/pygments/util.py +324 -0
  1105. venv/Lib/site-packages/pyproject_hooks/__init__.py +31 -0
  1106. venv/Lib/site-packages/pyproject_hooks/_impl.py +410 -0
  1107. venv/Lib/site-packages/pyproject_hooks/_in_process/__init__.py +21 -0
  1108. venv/Lib/site-packages/pyproject_hooks/_in_process/_in_process.py +389 -0
  1109. venv/Lib/site-packages/pyproject_hooks/py.typed +0 -0
  1110. venv/Lib/site-packages/readme_renderer/__init__.py +13 -0
  1111. venv/Lib/site-packages/readme_renderer/__main__.py +66 -0
  1112. venv/Lib/site-packages/readme_renderer/clean.py +89 -0
  1113. venv/Lib/site-packages/readme_renderer/markdown.py +123 -0
  1114. venv/Lib/site-packages/readme_renderer/py.typed +0 -0
  1115. venv/Lib/site-packages/readme_renderer/rst.py +135 -0
  1116. venv/Lib/site-packages/readme_renderer/txt.py +24 -0
  1117. venv/Lib/site-packages/requests/__init__.py +184 -0
  1118. venv/Lib/site-packages/requests/__version__.py +14 -0
  1119. venv/Lib/site-packages/requests/_internal_utils.py +50 -0
  1120. venv/Lib/site-packages/requests/adapters.py +696 -0
  1121. venv/Lib/site-packages/requests/api.py +157 -0
  1122. venv/Lib/site-packages/requests/auth.py +314 -0
  1123. venv/Lib/site-packages/requests/certs.py +17 -0
  1124. venv/Lib/site-packages/requests/compat.py +106 -0
  1125. venv/Lib/site-packages/requests/cookies.py +561 -0
  1126. venv/Lib/site-packages/requests/exceptions.py +151 -0
  1127. venv/Lib/site-packages/requests/help.py +134 -0
  1128. venv/Lib/site-packages/requests/hooks.py +33 -0
  1129. venv/Lib/site-packages/requests/models.py +1039 -0
  1130. venv/Lib/site-packages/requests/packages.py +23 -0
  1131. venv/Lib/site-packages/requests/sessions.py +831 -0
  1132. venv/Lib/site-packages/requests/status_codes.py +128 -0
  1133. venv/Lib/site-packages/requests/structures.py +99 -0
  1134. venv/Lib/site-packages/requests/utils.py +1086 -0
  1135. venv/Lib/site-packages/requests_toolbelt/__init__.py +34 -0
  1136. venv/Lib/site-packages/requests_toolbelt/_compat.py +302 -0
  1137. venv/Lib/site-packages/requests_toolbelt/adapters/__init__.py +15 -0
  1138. venv/Lib/site-packages/requests_toolbelt/adapters/appengine.py +206 -0
  1139. venv/Lib/site-packages/requests_toolbelt/adapters/fingerprint.py +48 -0
  1140. venv/Lib/site-packages/requests_toolbelt/adapters/host_header_ssl.py +43 -0
  1141. venv/Lib/site-packages/requests_toolbelt/adapters/socket_options.py +129 -0
  1142. venv/Lib/site-packages/requests_toolbelt/adapters/source.py +67 -0
  1143. venv/Lib/site-packages/requests_toolbelt/adapters/ssl.py +66 -0
  1144. venv/Lib/site-packages/requests_toolbelt/adapters/x509.py +196 -0
  1145. venv/Lib/site-packages/requests_toolbelt/auth/__init__.py +0 -0
  1146. venv/Lib/site-packages/requests_toolbelt/auth/_digest_auth_compat.py +29 -0
  1147. venv/Lib/site-packages/requests_toolbelt/auth/guess.py +146 -0
  1148. venv/Lib/site-packages/requests_toolbelt/auth/handler.py +142 -0
  1149. venv/Lib/site-packages/requests_toolbelt/auth/http_proxy_digest.py +103 -0
  1150. venv/Lib/site-packages/requests_toolbelt/cookies/__init__.py +0 -0
  1151. venv/Lib/site-packages/requests_toolbelt/cookies/forgetful.py +7 -0
  1152. venv/Lib/site-packages/requests_toolbelt/downloadutils/__init__.py +0 -0
  1153. venv/Lib/site-packages/requests_toolbelt/downloadutils/stream.py +176 -0
  1154. venv/Lib/site-packages/requests_toolbelt/downloadutils/tee.py +123 -0
  1155. venv/Lib/site-packages/requests_toolbelt/exceptions.py +25 -0
  1156. venv/Lib/site-packages/requests_toolbelt/multipart/__init__.py +31 -0
  1157. venv/Lib/site-packages/requests_toolbelt/multipart/decoder.py +156 -0
  1158. venv/Lib/site-packages/requests_toolbelt/multipart/encoder.py +655 -0
  1159. venv/Lib/site-packages/requests_toolbelt/sessions.py +89 -0
  1160. venv/Lib/site-packages/requests_toolbelt/streaming_iterator.py +116 -0
  1161. venv/Lib/site-packages/requests_toolbelt/threaded/__init__.py +97 -0
  1162. venv/Lib/site-packages/requests_toolbelt/threaded/pool.py +211 -0
  1163. venv/Lib/site-packages/requests_toolbelt/threaded/thread.py +53 -0
  1164. venv/Lib/site-packages/requests_toolbelt/utils/__init__.py +0 -0
  1165. venv/Lib/site-packages/requests_toolbelt/utils/deprecated.py +91 -0
  1166. venv/Lib/site-packages/requests_toolbelt/utils/dump.py +198 -0
  1167. venv/Lib/site-packages/requests_toolbelt/utils/formdata.py +108 -0
  1168. venv/Lib/site-packages/requests_toolbelt/utils/user_agent.py +143 -0
  1169. venv/Lib/site-packages/rfc3986/__init__.py +53 -0
  1170. venv/Lib/site-packages/rfc3986/_mixin.py +373 -0
  1171. venv/Lib/site-packages/rfc3986/abnf_regexp.py +275 -0
  1172. venv/Lib/site-packages/rfc3986/api.py +104 -0
  1173. venv/Lib/site-packages/rfc3986/builder.py +388 -0
  1174. venv/Lib/site-packages/rfc3986/compat.py +59 -0
  1175. venv/Lib/site-packages/rfc3986/exceptions.py +120 -0
  1176. venv/Lib/site-packages/rfc3986/iri.py +161 -0
  1177. venv/Lib/site-packages/rfc3986/misc.py +131 -0
  1178. venv/Lib/site-packages/rfc3986/normalizers.py +171 -0
  1179. venv/Lib/site-packages/rfc3986/parseresult.py +474 -0
  1180. venv/Lib/site-packages/rfc3986/uri.py +160 -0
  1181. venv/Lib/site-packages/rfc3986/validators.py +440 -0
  1182. venv/Lib/site-packages/rich/__init__.py +177 -0
  1183. venv/Lib/site-packages/rich/__main__.py +245 -0
  1184. venv/Lib/site-packages/rich/_cell_widths.py +454 -0
  1185. venv/Lib/site-packages/rich/_emoji_codes.py +3610 -0
  1186. venv/Lib/site-packages/rich/_emoji_replace.py +32 -0
  1187. venv/Lib/site-packages/rich/_export_format.py +76 -0
  1188. venv/Lib/site-packages/rich/_extension.py +10 -0
  1189. venv/Lib/site-packages/rich/_fileno.py +24 -0
  1190. venv/Lib/site-packages/rich/_inspect.py +268 -0
  1191. venv/Lib/site-packages/rich/_log_render.py +94 -0
  1192. venv/Lib/site-packages/rich/_loop.py +43 -0
  1193. venv/Lib/site-packages/rich/_null_file.py +69 -0
  1194. venv/Lib/site-packages/rich/_palettes.py +309 -0
  1195. venv/Lib/site-packages/rich/_pick.py +17 -0
  1196. venv/Lib/site-packages/rich/_ratio.py +153 -0
  1197. venv/Lib/site-packages/rich/_spinners.py +482 -0
  1198. venv/Lib/site-packages/rich/_stack.py +16 -0
  1199. venv/Lib/site-packages/rich/_timer.py +19 -0
  1200. venv/Lib/site-packages/rich/_win32_console.py +661 -0
  1201. venv/Lib/site-packages/rich/_windows.py +71 -0
  1202. venv/Lib/site-packages/rich/_windows_renderer.py +56 -0
  1203. venv/Lib/site-packages/rich/_wrap.py +93 -0
  1204. venv/Lib/site-packages/rich/abc.py +33 -0
  1205. venv/Lib/site-packages/rich/align.py +306 -0
  1206. venv/Lib/site-packages/rich/ansi.py +241 -0
  1207. venv/Lib/site-packages/rich/bar.py +93 -0
  1208. venv/Lib/site-packages/rich/box.py +474 -0
  1209. venv/Lib/site-packages/rich/cells.py +174 -0
  1210. venv/Lib/site-packages/rich/color.py +621 -0
  1211. venv/Lib/site-packages/rich/color_triplet.py +38 -0
  1212. venv/Lib/site-packages/rich/columns.py +187 -0
  1213. venv/Lib/site-packages/rich/console.py +2680 -0
  1214. venv/Lib/site-packages/rich/constrain.py +37 -0
  1215. venv/Lib/site-packages/rich/containers.py +167 -0
  1216. venv/Lib/site-packages/rich/control.py +219 -0
  1217. venv/Lib/site-packages/rich/default_styles.py +193 -0
  1218. venv/Lib/site-packages/rich/diagnose.py +39 -0
  1219. venv/Lib/site-packages/rich/emoji.py +91 -0
  1220. venv/Lib/site-packages/rich/errors.py +34 -0
  1221. venv/Lib/site-packages/rich/file_proxy.py +57 -0
  1222. venv/Lib/site-packages/rich/filesize.py +88 -0
  1223. venv/Lib/site-packages/rich/highlighter.py +232 -0
  1224. venv/Lib/site-packages/rich/json.py +139 -0
  1225. venv/Lib/site-packages/rich/jupyter.py +101 -0
  1226. venv/Lib/site-packages/rich/layout.py +442 -0
  1227. venv/Lib/site-packages/rich/live.py +400 -0
  1228. venv/Lib/site-packages/rich/live_render.py +106 -0
  1229. venv/Lib/site-packages/rich/logging.py +297 -0
  1230. venv/Lib/site-packages/rich/markdown.py +779 -0
  1231. venv/Lib/site-packages/rich/markup.py +251 -0
  1232. venv/Lib/site-packages/rich/measure.py +151 -0
  1233. venv/Lib/site-packages/rich/padding.py +141 -0
  1234. venv/Lib/site-packages/rich/pager.py +34 -0
  1235. venv/Lib/site-packages/rich/palette.py +100 -0
  1236. venv/Lib/site-packages/rich/panel.py +317 -0
  1237. venv/Lib/site-packages/rich/pretty.py +1016 -0
  1238. venv/Lib/site-packages/rich/progress.py +1715 -0
  1239. venv/Lib/site-packages/rich/progress_bar.py +223 -0
  1240. venv/Lib/site-packages/rich/prompt.py +400 -0
  1241. venv/Lib/site-packages/rich/protocol.py +42 -0
  1242. venv/Lib/site-packages/rich/py.typed +0 -0
  1243. venv/Lib/site-packages/rich/region.py +10 -0
  1244. venv/Lib/site-packages/rich/repr.py +149 -0
  1245. venv/Lib/site-packages/rich/rule.py +130 -0
  1246. venv/Lib/site-packages/rich/scope.py +86 -0
  1247. venv/Lib/site-packages/rich/screen.py +54 -0
  1248. venv/Lib/site-packages/rich/segment.py +752 -0
  1249. venv/Lib/site-packages/rich/spinner.py +132 -0
  1250. venv/Lib/site-packages/rich/status.py +131 -0
  1251. venv/Lib/site-packages/rich/style.py +792 -0
  1252. venv/Lib/site-packages/rich/styled.py +42 -0
  1253. venv/Lib/site-packages/rich/syntax.py +985 -0
  1254. venv/Lib/site-packages/rich/table.py +1006 -0
  1255. venv/Lib/site-packages/rich/terminal_theme.py +153 -0
  1256. venv/Lib/site-packages/rich/text.py +1361 -0
  1257. venv/Lib/site-packages/rich/theme.py +115 -0
  1258. venv/Lib/site-packages/rich/themes.py +5 -0
  1259. venv/Lib/site-packages/rich/traceback.py +899 -0
  1260. venv/Lib/site-packages/rich/tree.py +257 -0
  1261. venv/Lib/site-packages/setup_sdist.py +69 -0
  1262. venv/Lib/site-packages/twine/__init__.py +54 -0
  1263. venv/Lib/site-packages/twine/__main__.py +54 -0
  1264. venv/Lib/site-packages/twine/auth.py +307 -0
  1265. venv/Lib/site-packages/twine/cli.py +139 -0
  1266. venv/Lib/site-packages/twine/commands/__init__.py +93 -0
  1267. venv/Lib/site-packages/twine/commands/check.py +195 -0
  1268. venv/Lib/site-packages/twine/commands/register.py +87 -0
  1269. venv/Lib/site-packages/twine/commands/upload.py +253 -0
  1270. venv/Lib/site-packages/twine/distribution.py +8 -0
  1271. venv/Lib/site-packages/twine/exceptions.py +175 -0
  1272. venv/Lib/site-packages/twine/package.py +403 -0
  1273. venv/Lib/site-packages/twine/py.typed +0 -0
  1274. venv/Lib/site-packages/twine/repository.py +246 -0
  1275. venv/Lib/site-packages/twine/sdist.py +83 -0
  1276. venv/Lib/site-packages/twine/settings.py +360 -0
  1277. venv/Lib/site-packages/twine/utils.py +387 -0
  1278. venv/Lib/site-packages/twine/wheel.py +81 -0
  1279. venv/Lib/site-packages/urllib3/__init__.py +211 -0
  1280. venv/Lib/site-packages/urllib3/_base_connection.py +165 -0
  1281. venv/Lib/site-packages/urllib3/_collections.py +479 -0
  1282. venv/Lib/site-packages/urllib3/_request_methods.py +278 -0
  1283. venv/Lib/site-packages/urllib3/_version.py +21 -0
  1284. venv/Lib/site-packages/urllib3/connection.py +1093 -0
  1285. venv/Lib/site-packages/urllib3/connectionpool.py +1178 -0
  1286. venv/Lib/site-packages/urllib3/contrib/__init__.py +0 -0
  1287. venv/Lib/site-packages/urllib3/contrib/emscripten/__init__.py +16 -0
  1288. venv/Lib/site-packages/urllib3/contrib/emscripten/connection.py +255 -0
  1289. venv/Lib/site-packages/urllib3/contrib/emscripten/fetch.py +728 -0
  1290. venv/Lib/site-packages/urllib3/contrib/emscripten/request.py +22 -0
  1291. venv/Lib/site-packages/urllib3/contrib/emscripten/response.py +277 -0
  1292. venv/Lib/site-packages/urllib3/contrib/pyopenssl.py +564 -0
  1293. venv/Lib/site-packages/urllib3/contrib/socks.py +228 -0
  1294. venv/Lib/site-packages/urllib3/exceptions.py +335 -0
  1295. venv/Lib/site-packages/urllib3/fields.py +341 -0
  1296. venv/Lib/site-packages/urllib3/filepost.py +89 -0
  1297. venv/Lib/site-packages/urllib3/http2/__init__.py +53 -0
  1298. venv/Lib/site-packages/urllib3/http2/connection.py +356 -0
  1299. venv/Lib/site-packages/urllib3/http2/probe.py +87 -0
  1300. venv/Lib/site-packages/urllib3/poolmanager.py +653 -0
  1301. venv/Lib/site-packages/urllib3/py.typed +2 -0
  1302. venv/Lib/site-packages/urllib3/response.py +1307 -0
  1303. venv/Lib/site-packages/urllib3/util/__init__.py +42 -0
  1304. venv/Lib/site-packages/urllib3/util/connection.py +137 -0
  1305. venv/Lib/site-packages/urllib3/util/proxy.py +43 -0
  1306. venv/Lib/site-packages/urllib3/util/request.py +266 -0
  1307. venv/Lib/site-packages/urllib3/util/response.py +101 -0
  1308. venv/Lib/site-packages/urllib3/util/retry.py +533 -0
  1309. venv/Lib/site-packages/urllib3/util/ssl_.py +524 -0
  1310. venv/Lib/site-packages/urllib3/util/ssl_match_hostname.py +159 -0
  1311. venv/Lib/site-packages/urllib3/util/ssltransport.py +271 -0
  1312. venv/Lib/site-packages/urllib3/util/timeout.py +275 -0
  1313. venv/Lib/site-packages/urllib3/util/url.py +469 -0
  1314. venv/Lib/site-packages/urllib3/util/util.py +42 -0
  1315. venv/Lib/site-packages/urllib3/util/wait.py +124 -0
  1316. venv/Lib/site-packages/win32ctypes/__init__.py +8 -0
  1317. venv/Lib/site-packages/win32ctypes/core/__init__.py +60 -0
  1318. venv/Lib/site-packages/win32ctypes/core/_winerrors.py +9 -0
  1319. venv/Lib/site-packages/win32ctypes/core/cffi/__init__.py +11 -0
  1320. venv/Lib/site-packages/win32ctypes/core/cffi/_authentication.py +172 -0
  1321. venv/Lib/site-packages/win32ctypes/core/cffi/_common.py +29 -0
  1322. venv/Lib/site-packages/win32ctypes/core/cffi/_dll.py +30 -0
  1323. venv/Lib/site-packages/win32ctypes/core/cffi/_nl_support.py +18 -0
  1324. venv/Lib/site-packages/win32ctypes/core/cffi/_resource.py +132 -0
  1325. venv/Lib/site-packages/win32ctypes/core/cffi/_system_information.py +32 -0
  1326. venv/Lib/site-packages/win32ctypes/core/cffi/_time.py +18 -0
  1327. venv/Lib/site-packages/win32ctypes/core/cffi/_util.py +105 -0
  1328. venv/Lib/site-packages/win32ctypes/core/compat.py +10 -0
  1329. venv/Lib/site-packages/win32ctypes/core/ctypes/__init__.py +11 -0
  1330. venv/Lib/site-packages/win32ctypes/core/ctypes/_authentication.py +122 -0
  1331. venv/Lib/site-packages/win32ctypes/core/ctypes/_common.py +53 -0
  1332. venv/Lib/site-packages/win32ctypes/core/ctypes/_dll.py +21 -0
  1333. venv/Lib/site-packages/win32ctypes/core/ctypes/_nl_support.py +12 -0
  1334. venv/Lib/site-packages/win32ctypes/core/ctypes/_resource.py +148 -0
  1335. venv/Lib/site-packages/win32ctypes/core/ctypes/_system_information.py +36 -0
  1336. venv/Lib/site-packages/win32ctypes/core/ctypes/_time.py +15 -0
  1337. venv/Lib/site-packages/win32ctypes/core/ctypes/_util.py +78 -0
  1338. venv/Lib/site-packages/win32ctypes/pywin32/__init__.py +12 -0
  1339. venv/Lib/site-packages/win32ctypes/pywin32/pywintypes.py +67 -0
  1340. venv/Lib/site-packages/win32ctypes/pywin32/win32api.py +294 -0
  1341. venv/Lib/site-packages/win32ctypes/pywin32/win32cred.py +145 -0
  1342. venv/Lib/site-packages/win32ctypes/pywintypes.py +13 -0
  1343. venv/Lib/site-packages/win32ctypes/tests/__init__.py +21 -0
  1344. venv/Lib/site-packages/win32ctypes/tests/test_backends.py +36 -0
  1345. venv/Lib/site-packages/win32ctypes/tests/test_win32api.py +304 -0
  1346. venv/Lib/site-packages/win32ctypes/tests/test_win32cred.py +230 -0
  1347. venv/Lib/site-packages/win32ctypes/version.py +1 -0
  1348. venv/Lib/site-packages/win32ctypes/win32api.py +13 -0
  1349. venv/Lib/site-packages/win32ctypes/win32cred.py +13 -0
  1350. android_notify-1.59.3.dist-info/RECORD +0 -12
  1351. {android_notify-1.59.3.dist-info → android_notify-1.60.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,3419 @@
1
+ # $Id: __init__.py 10231 2025-09-11 14:16:33Z milde $
2
+ # Author: Engelbert Gruber, Günter Milde
3
+ # Maintainer: docutils-develop@lists.sourceforge.net
4
+ # Copyright: This module has been placed in the public domain.
5
+
6
+ """LaTeX2e document tree Writer."""
7
+
8
+ from __future__ import annotations
9
+
10
+ __docformat__ = 'reStructuredText'
11
+
12
+ # code contributions from several people included, thanks to all.
13
+ # some named: David Abrahams, Julien Letessier, Lele Gaifax, and others.
14
+ #
15
+ # convention deactivate code by two # i.e. ##.
16
+
17
+ import re
18
+ import string
19
+ import warnings
20
+ from pathlib import Path
21
+
22
+ from docutils import frontend, nodes, languages, writers, utils
23
+ from docutils.transforms import references, writer_aux
24
+ from docutils.utils._roman_numerals import RomanNumeral
25
+ from docutils.utils.math import pick_math_environment, unichar2tex
26
+
27
+ LATEX_WRITER_DIR = Path(__file__).parent
28
+
29
+
30
+ class Writer(writers.Writer):
31
+
32
+ supported = ('latex', 'latex2e')
33
+ """Formats this writer supports."""
34
+
35
+ default_template = 'default.tex'
36
+ default_template_path = LATEX_WRITER_DIR
37
+ default_preamble = ('% PDF Standard Fonts\n'
38
+ '\\usepackage{mathptmx} % Times\n'
39
+ '\\usepackage[scaled=.90]{helvet}\n'
40
+ '\\usepackage{courier}')
41
+ table_style_values = [ # TODO: align-left, align-center, align-right, ??
42
+ 'booktabs', 'borderless', 'colwidths-auto',
43
+ 'nolines', 'standard']
44
+
45
+ settings_spec = (
46
+ 'LaTeX-Specific Options',
47
+ None,
48
+ (('Specify LaTeX documentclass. Default: "article".',
49
+ ['--documentclass'],
50
+ {'metavar': '<documentclass>', 'default': 'article'}),
51
+ ('Specify document options. Multiple options can be given, '
52
+ 'separated by commas. Default: "a4paper".',
53
+ ['--documentoptions'],
54
+ {'metavar': '<options>', 'default': 'a4paper'}),
55
+ ('Format for footnote references: one of "superscript" or '
56
+ '"brackets". Default: "superscript".',
57
+ ['--footnote-references'],
58
+ {'choices': ['superscript', 'brackets'], 'default': 'superscript',
59
+ 'metavar': '<format>',
60
+ 'overrides': 'trim_footnote_reference_space'}),
61
+ ('Use \\cite command for citations. (future default)',
62
+ ['--use-latex-citations'],
63
+ {'default': None, 'action': 'store_true',
64
+ 'validator': frontend.validate_boolean}),
65
+ ('Use figure floats for citations '
66
+ '(might get mixed with real figures). (provisional default)',
67
+ ['--figure-citations'],
68
+ {'dest': 'use_latex_citations', 'action': 'store_false',
69
+ 'validator': frontend.validate_boolean}),
70
+ ('Format for block quote attributions: one of "dash" (em-dash '
71
+ 'prefix), "parentheses"/"parens", or "none". Default: "dash".',
72
+ ['--attribution'],
73
+ {'choices': ['dash', 'parentheses', 'parens', 'none'],
74
+ 'default': 'dash', 'metavar': '<format>'}),
75
+ ('Specify LaTeX packages/stylesheets. '
76
+ 'A style is referenced with "\\usepackage" if extension is '
77
+ '".sty" or omitted and with "\\input" else. '
78
+ ' Overrides previous --stylesheet and --stylesheet-path settings.',
79
+ ['--stylesheet'],
80
+ {'default': '', 'metavar': '<file[,file,...]>',
81
+ 'overrides': 'stylesheet_path',
82
+ 'validator': frontend.validate_comma_separated_list}),
83
+ ('Comma separated list of LaTeX packages/stylesheets. '
84
+ 'Relative paths are expanded if a matching file is found in '
85
+ 'the --stylesheet-dirs. With --link-stylesheet, '
86
+ 'the path is rewritten relative to the output *.tex file. ',
87
+ ['--stylesheet-path'],
88
+ {'metavar': '<file[,file,...]>', 'overrides': 'stylesheet',
89
+ 'validator': frontend.validate_comma_separated_list}),
90
+ ('Link to the stylesheet(s) in the output file. (default)',
91
+ ['--link-stylesheet'],
92
+ {'dest': 'embed_stylesheet', 'action': 'store_false'}),
93
+ ('Embed the stylesheet(s) in the output file. '
94
+ 'Stylesheets must be accessible during processing. ',
95
+ ['--embed-stylesheet'],
96
+ {'default': False, 'action': 'store_true',
97
+ 'validator': frontend.validate_boolean}),
98
+ ('Comma-separated list of directories where stylesheets are found. '
99
+ 'Used by --stylesheet-path when expanding relative path arguments. '
100
+ 'Default: ".".',
101
+ ['--stylesheet-dirs'],
102
+ {'metavar': '<dir[,dir,...]>',
103
+ 'validator': frontend.validate_comma_separated_list,
104
+ 'default': ['.']}),
105
+ ('Customization by LaTeX code in the preamble. '
106
+ 'Default: select PDF standard fonts (Times, Helvetica, Courier).',
107
+ ['--latex-preamble'],
108
+ {'metavar': '<preamble>', 'default': default_preamble}),
109
+ ('Specify the template file. Default: "%s".' % default_template,
110
+ ['--template'],
111
+ {'default': default_template, 'metavar': '<file>'}),
112
+ ('Table of contents by LaTeX. (default)',
113
+ ['--use-latex-toc'],
114
+ {'default': True, 'action': 'store_true',
115
+ 'validator': frontend.validate_boolean}),
116
+ ('Table of contents by Docutils (without page numbers).',
117
+ ['--use-docutils-toc'],
118
+ {'dest': 'use_latex_toc', 'action': 'store_false',
119
+ 'validator': frontend.validate_boolean}),
120
+ ('Add parts on top of the section hierarchy.',
121
+ ['--use-part-section'],
122
+ {'default': False, 'action': 'store_true',
123
+ 'validator': frontend.validate_boolean}),
124
+ ('Attach author and date to the document info table. (default)',
125
+ ['--use-docutils-docinfo'],
126
+ {'dest': 'use_latex_docinfo', 'action': 'store_false',
127
+ 'validator': frontend.validate_boolean}),
128
+ ('Attach author and date to the document title.',
129
+ ['--use-latex-docinfo'],
130
+ {'default': False, 'action': 'store_true',
131
+ 'validator': frontend.validate_boolean}),
132
+ ("Typeset abstract as topic. (default)",
133
+ ['--topic-abstract'],
134
+ {'dest': 'use_latex_abstract', 'action': 'store_false',
135
+ 'validator': frontend.validate_boolean}),
136
+ ("Use LaTeX abstract environment for the document's abstract.",
137
+ ['--use-latex-abstract'],
138
+ {'default': False, 'action': 'store_true',
139
+ 'validator': frontend.validate_boolean}),
140
+ ('Color of any hyperlinks embedded in text. '
141
+ 'Default: "blue" (use "false" to disable).',
142
+ ['--hyperlink-color'],
143
+ {'metavar': '<color>', 'default': 'blue'}),
144
+ ('Additional options to the "hyperref" package.',
145
+ ['--hyperref-options'],
146
+ {'metavar': '<options>', 'default': ''}),
147
+ ('Enable compound enumerators for nested enumerated lists '
148
+ '(e.g. "1.2.a.ii").',
149
+ ['--compound-enumerators'],
150
+ {'default': False, 'action': 'store_true',
151
+ 'validator': frontend.validate_boolean}),
152
+ ('Disable compound enumerators for nested enumerated lists. '
153
+ '(default)',
154
+ ['--no-compound-enumerators'],
155
+ {'action': 'store_false', 'dest': 'compound_enumerators'}),
156
+ ('Enable section ("." subsection ...) prefixes for compound '
157
+ 'enumerators. This has no effect without --compound-enumerators.',
158
+ ['--section-prefix-for-enumerators'],
159
+ {'default': None, 'action': 'store_true',
160
+ 'validator': frontend.validate_boolean}),
161
+ ('Disable section prefixes for compound enumerators. (default)',
162
+ ['--no-section-prefix-for-enumerators'],
163
+ {'action': 'store_false', 'dest': 'section_prefix_for_enumerators'}),
164
+ ('Set the separator between section number and enumerator '
165
+ 'for compound enumerated lists. Default: "-".',
166
+ ['--section-enumerator-separator'],
167
+ {'default': '-', 'metavar': '<char>'}),
168
+ ('When possible, use the specified environment for literal-blocks. '
169
+ 'Default: "" (fall back to "alltt").',
170
+ ['--literal-block-env'],
171
+ {'metavar': '<environment>', 'default': ''}),
172
+ (frontend.SUPPRESS_HELP, # deprecated legacy option
173
+ ['--use-verbatim-when-possible'],
174
+ {'action': 'store_true',
175
+ 'validator': frontend.validate_boolean}),
176
+ ('Table style. "standard" with horizontal and vertical lines, '
177
+ '"booktabs" (LaTeX booktabs style) only horizontal lines '
178
+ 'above and below the table and below the header, or "borderless". '
179
+ 'Default: "standard"',
180
+ ['--table-style'],
181
+ {'default': ['standard'],
182
+ 'metavar': '<format>',
183
+ 'action': 'append',
184
+ 'validator': frontend.validate_comma_separated_list,
185
+ 'choices': table_style_values}),
186
+ ('LaTeX graphicx package option. Default: "".',
187
+ ['--graphicx-option'],
188
+ {'metavar': '<option>', 'default': ''}),
189
+ ('LaTeX font encoding. '
190
+ 'Possible values are "", "T1" (default), "OT1", "LGR,T1" or '
191
+ 'any other combination of options to the `fontenc` package. ',
192
+ ['--font-encoding'],
193
+ {'metavar': '<encoding>', 'default': 'T1'}),
194
+ ('Per default the latex-writer puts the reference title into '
195
+ 'hyperreferences. Specify "ref" or "pageref" to get the section '
196
+ 'number or the page number.',
197
+ ['--reference-label'],
198
+ {'metavar': '<command name>', 'default': ''}),
199
+ ('Specify style and database(s) for bibtex, for example '
200
+ '"--use-bibtex=unsrt,mydb1,mydb2". Provisional!',
201
+ ['--use-bibtex'],
202
+ {'default': '',
203
+ 'metavar': '<style,bibfile[,bibfile,...]>',
204
+ 'validator': frontend.validate_comma_separated_list}),
205
+ ('Use legacy functions with class value list for '
206
+ '\\DUtitle and \\DUadmonition.',
207
+ ['--legacy-class-functions'],
208
+ {'default': False,
209
+ 'action': 'store_true',
210
+ 'validator': frontend.validate_boolean}),
211
+ ('Use \\DUrole and "DUclass" wrappers for class values. '
212
+ 'Place admonition content in an environment. (default)',
213
+ ['--new-class-functions'],
214
+ {'dest': 'legacy_class_functions',
215
+ 'action': 'store_false',
216
+ 'validator': frontend.validate_boolean}),
217
+ ('Use legacy algorithm to determine table column widths. '
218
+ '(provisional default)',
219
+ ['--legacy-column-widths'],
220
+ {'default': None,
221
+ 'action': 'store_true',
222
+ 'validator': frontend.validate_boolean}),
223
+ ('Use new algorithm to determine table column widths. '
224
+ '(future default)',
225
+ ['--new-column-widths'],
226
+ {'dest': 'legacy_column_widths',
227
+ 'action': 'store_false',
228
+ 'validator': frontend.validate_boolean}),
229
+ # TODO: implement "latex footnotes" alternative
230
+ ('Footnotes with numbers/symbols by Docutils. (default) '
231
+ '(The alternative, --latex-footnotes, is not implemented yet.)',
232
+ ['--docutils-footnotes'],
233
+ {'default': True,
234
+ 'action': 'store_true',
235
+ 'validator': frontend.validate_boolean}),
236
+ ),
237
+ )
238
+
239
+ relative_path_settings = ('template',)
240
+ settings_defaults = {}
241
+ config_section = 'latex2e writer'
242
+ config_section_dependencies = ('writers', 'latex writers')
243
+
244
+ head_parts = ('head_prefix', 'requirements', 'latex_preamble',
245
+ 'stylesheet', 'fallbacks', 'pdfsetup', 'titledata')
246
+ visitor_attributes = head_parts + ('title', 'subtitle',
247
+ 'body_pre_docinfo', 'docinfo',
248
+ 'dedication', 'abstract', 'body')
249
+
250
+ output = None
251
+ """Final translated form of `document`."""
252
+
253
+ def __init__(self) -> None:
254
+ writers.Writer.__init__(self)
255
+ self.translator_class = LaTeXTranslator
256
+
257
+ def get_transforms(self):
258
+ # Override parent method to add latex-specific transforms
259
+ return super().get_transforms() + [
260
+ # Convert specific admonitions to generic one
261
+ writer_aux.Admonitions,
262
+ references.CitationReferences,
263
+ ]
264
+
265
+ def translate(self) -> None:
266
+ visitor = self.translator_class(self.document)
267
+ self.document.walkabout(visitor)
268
+ # copy parts
269
+ for part in self.visitor_attributes:
270
+ setattr(self, part, getattr(visitor, part))
271
+ # fill template
272
+ self.assemble_parts() # create dictionary of parts
273
+ self.output = string.Template(self.parts['template']
274
+ ).substitute(self.parts)
275
+
276
+ def assemble_parts(self) -> None:
277
+ """Assemble the `self.parts` dictionary of output fragments."""
278
+ super().assemble_parts()
279
+ for part in self.visitor_attributes:
280
+ if part in self.parts:
281
+ continue # make the function idempotent
282
+ lines = getattr(self, part)
283
+ if part in self.head_parts:
284
+ if lines:
285
+ lines.append('') # to get a trailing newline
286
+ self.parts[part] = '\n'.join(lines)
287
+ else:
288
+ # body contains inline elements, so join without newline
289
+ self.parts[part] = ''.join(lines)
290
+ # get template string from file
291
+ templatepath = Path(self.document.settings.template)
292
+ if not templatepath.exists():
293
+ templatepath = self.default_template_path / templatepath.name
294
+ self.parts['template'] = templatepath.read_text(encoding='utf-8')
295
+
296
+
297
+ class Babel:
298
+ """Language specifics for LaTeX."""
299
+
300
+ # TeX (babel) language names:
301
+ # ! not all of these are supported by Docutils!
302
+ #
303
+ # based on LyX' languages file with adaptions to `BCP 47`_
304
+ # (https://www.rfc-editor.org/rfc/bcp/bcp47.txt) and
305
+ # http://www.tug.org/TUGboat/Articles/tb29-3/tb93miklavec.pdf
306
+ # * the key without subtags is the default
307
+ # * case is ignored
308
+ # cf. https://docutils.sourceforge.io/docs/howto/i18n.html
309
+ # https://www.w3.org/International/articles/language-tags/
310
+ # and http://www.iana.org/assignments/language-subtag-registry
311
+ language_codes = {
312
+ # code TeX/Babel-name comment
313
+ 'af': 'afrikaans',
314
+ 'ar': 'arabic',
315
+ # 'be': 'belarusian',
316
+ 'bg': 'bulgarian',
317
+ 'br': 'breton',
318
+ 'ca': 'catalan',
319
+ # 'cop': 'coptic',
320
+ 'cs': 'czech',
321
+ 'cy': 'welsh',
322
+ 'da': 'danish',
323
+ 'de': 'ngerman', # new spelling (de_1996)
324
+ 'de-1901': 'german', # old spelling
325
+ 'de-AT': 'naustrian',
326
+ 'de-AT-1901': 'austrian',
327
+ 'dsb': 'lowersorbian',
328
+ 'el': 'greek', # monotonic (el-monoton)
329
+ 'el-polyton': 'polutonikogreek',
330
+ 'en': 'english', # TeX' default language
331
+ 'en-AU': 'australian',
332
+ 'en-CA': 'canadian',
333
+ 'en-GB': 'british',
334
+ 'en-NZ': 'newzealand',
335
+ 'en-US': 'american',
336
+ 'eo': 'esperanto',
337
+ 'es': 'spanish',
338
+ 'et': 'estonian',
339
+ 'eu': 'basque',
340
+ # 'fa': 'farsi',
341
+ 'fi': 'finnish',
342
+ 'fr': 'french',
343
+ 'fr-CA': 'canadien',
344
+ 'ga': 'irish', # Irish Gaelic
345
+ # 'grc': # Ancient Greek
346
+ 'grc-ibycus': 'ibycus', # Ibycus encoding
347
+ 'gl': 'galician',
348
+ 'he': 'hebrew',
349
+ 'hr': 'croatian',
350
+ 'hsb': 'uppersorbian',
351
+ 'hu': 'magyar',
352
+ 'ia': 'interlingua',
353
+ 'id': 'bahasai', # Bahasa (Indonesian)
354
+ 'is': 'icelandic',
355
+ 'it': 'italian',
356
+ 'ja': 'japanese',
357
+ 'kk': 'kazakh',
358
+ 'la': 'latin',
359
+ 'lt': 'lithuanian',
360
+ 'lv': 'latvian',
361
+ 'mn': 'mongolian', # Mongolian, Cyrillic (mn-cyrl)
362
+ 'ms': 'bahasam', # Bahasa (Malay)
363
+ 'nb': 'norsk', # Norwegian Bokmal
364
+ 'nl': 'dutch',
365
+ 'nn': 'nynorsk', # Norwegian Nynorsk
366
+ 'no': 'norsk', # Norwegian (Bokmal)
367
+ 'pl': 'polish',
368
+ 'pt': 'portuges',
369
+ 'pt-BR': 'brazil',
370
+ 'ro': 'romanian',
371
+ 'ru': 'russian',
372
+ 'se': 'samin', # North Sami
373
+ 'sh-Cyrl': 'serbianc', # Serbo-Croatian, Cyrillic
374
+ 'sh-Latn': 'serbian', # Serbo-Croatian, Latin (cf. 'hr')
375
+ 'sk': 'slovak',
376
+ 'sl': 'slovene',
377
+ 'sq': 'albanian',
378
+ 'sr': 'serbianc', # Serbian, Cyrillic (contributed)
379
+ 'sr-Latn': 'serbian', # Serbian, Latin script
380
+ 'sv': 'swedish',
381
+ # 'th': 'thai',
382
+ 'tr': 'turkish',
383
+ 'uk': 'ukrainian',
384
+ 'vi': 'vietnam',
385
+ # zh-Latn: Chinese Pinyin
386
+ }
387
+ # normalize (downcase) keys
388
+ language_codes = {k.lower(): v for k, v in language_codes.items()}
389
+
390
+ warn_msg = 'Language "%s" not supported by LaTeX (babel)'
391
+
392
+ # "Active characters" are shortcuts that start a LaTeX macro and may need
393
+ # escaping for literals use. Characters that prevent literal use (e.g.
394
+ # starting accent macros like "a -> ä) will be deactivated if one of the
395
+ # defining languages is used in the document.
396
+ # Special cases:
397
+ # ~ (tilde) -- used in estonian, basque, galician, and old versions of
398
+ # spanish -- cannot be deactivated as it denotes a no-break space macro,
399
+ # " (straight quote) -- used in albanian, austrian, basque
400
+ # brazil, bulgarian, catalan, czech, danish, dutch, estonian,
401
+ # finnish, galician, german, icelandic, italian, latin, naustrian,
402
+ # ngerman, norsk, nynorsk, polish, portuges, russian, serbian, slovak,
403
+ # slovene, spanish, swedish, ukrainian, and uppersorbian --
404
+ # is escaped as ``\textquotedbl``.
405
+ active_chars = {
406
+ # TeX/Babel-name: active characters to deactivate
407
+ # 'breton': ':;!?' # ensure whitespace
408
+ # 'esperanto': '^',
409
+ # 'estonian': '~"`',
410
+ # 'french': ':;!?' # ensure whitespace
411
+ 'galician': '.<>', # also '~"'
412
+ # 'magyar': '`', # for special hyphenation cases
413
+ 'spanish': '.<>', # old versions also '~'
414
+ # 'turkish': ':!=' # ensure whitespace
415
+ }
416
+
417
+ def __init__(self, language_code, reporter=None) -> None:
418
+ self.reporter = reporter
419
+ self.language = self.language_name(language_code)
420
+ self.otherlanguages = {}
421
+
422
+ def __call__(self):
423
+ """Return the babel call with correct options and settings"""
424
+ languages = sorted(self.otherlanguages.keys())
425
+ if languages:
426
+ languages.append(f'main={self.language or "english"}')
427
+ else:
428
+ languages.append(self.language or 'english')
429
+ self.setup = [r'\usepackage[%s]{babel}' % ','.join(languages)]
430
+ # Deactivate "active characters"
431
+ shorthands = []
432
+ for c in ''.join(self.active_chars.get(lng, '') for lng in languages):
433
+ if c not in shorthands:
434
+ shorthands.append(c)
435
+ if shorthands:
436
+ self.setup.append(r'\AtBeginDocument{\shorthandoff{%s}}'
437
+ % ''.join(shorthands))
438
+ # Including '~' in shorthandoff prevents its use as no-break space
439
+ if 'galician' in languages:
440
+ self.setup.append(r'\deactivatetilden % restore ~ in Galician')
441
+ if 'estonian' in languages:
442
+ self.setup.extend([r'\makeatletter',
443
+ r' \addto\extrasestonian{\bbl@deactivate{~}}',
444
+ r'\makeatother'])
445
+ if 'basque' in languages:
446
+ self.setup.extend([r'\makeatletter',
447
+ r' \addto\extrasbasque{\bbl@deactivate{~}}',
448
+ r'\makeatother'])
449
+ if (languages[-1] == 'main=english'
450
+ and 'french' in self.otherlanguages.keys()):
451
+ self.setup += ['% Prevent side-effects if French hyphenation '
452
+ 'patterns are not loaded:',
453
+ r'\frenchbsetup{StandardLayout}',
454
+ r'\AtBeginDocument{\selectlanguage{%s}'
455
+ r'\noextrasfrench}' % self.language]
456
+ return '\n'.join(self.setup)
457
+
458
+ def language_name(self, language_code):
459
+ """Return TeX language name for `language_code`"""
460
+ for tag in utils.normalize_language_tag(language_code):
461
+ try:
462
+ return self.language_codes[tag]
463
+ except KeyError:
464
+ pass
465
+ if self.reporter is not None:
466
+ self.reporter.warning(self.warn_msg % language_code)
467
+ return ''
468
+
469
+ def get_language(self):
470
+ # Obsolete, kept for backwards compatibility with Sphinx
471
+ return self.language
472
+
473
+
474
+ # Building blocks for the latex preamble
475
+ # --------------------------------------
476
+
477
+ class SortableDict(dict): # NoQA: FURB189
478
+ """Dictionary with additional sorting methods
479
+
480
+ Deprecated. Will be removed in Docutils 0.24.
481
+ """
482
+
483
+ def __init__(self, *args, **kwargs):
484
+ warnings.warn('`writers.latex2e.SortableDict` is obsolete'
485
+ ' and will be removed in Docutils 0.24.',
486
+ DeprecationWarning, stacklevel=2)
487
+ super().__init__(*args, **kwargs)
488
+
489
+ def sortedkeys(self):
490
+ """Return sorted list of keys"""
491
+ return sorted(self.keys())
492
+
493
+ def sortedvalues(self):
494
+ """Return list of values sorted by keys"""
495
+ return [self[key] for key in self.sortedkeys()]
496
+
497
+
498
+ # PreambleCmds
499
+ # `````````````
500
+ # A container for LaTeX code snippets that can be
501
+ # inserted into the preamble if required in the document.
502
+ #
503
+ # .. The package 'makecmds' would enable shorter definitions using the
504
+ # \providelength and \provideenvironment commands.
505
+ # However, it is pretty non-standard (texlive-latex-extra).
506
+
507
+ class PreambleCmds:
508
+ """Building blocks for the latex preamble."""
509
+
510
+
511
+ # Requirements and Setup
512
+
513
+ # Not in docutils.sty because of the overhead for every font change:
514
+ PreambleCmds.ch = r"""
515
+ \ifdefined\DUchdimen % lengh unit "ch": width of a zero char
516
+ \else
517
+ \newlength{\DUchdimen}
518
+ \AtBeginDocument{\settowidth\DUchdimen{0}} % set after font setup,
519
+ % update with font changes (requires LaTeX > 2021-06-01, see lthooks-doc.pdf)
520
+ \AddToHook{cmd/selectfont/after}{\settowidth\DUchdimen{0}}
521
+ \fi"""
522
+
523
+ PreambleCmds.color = r"""\usepackage{color}"""
524
+
525
+ PreambleCmds.float = r"""\usepackage{float} % extended float configuration
526
+ \floatplacement{figure}{H} % place figures here definitely"""
527
+
528
+ PreambleCmds.linking = r"""%% hyperlinks:
529
+ \ifdefined\hypersetup
530
+ \else
531
+ \usepackage[%s]{hyperref}
532
+ \usepackage{bookmark}
533
+ \urlstyle{same} %% normal text font (alternatives: tt, rm, sf)
534
+ \fi"""
535
+
536
+ PreambleCmds.minitoc = r"""%% local table of contents
537
+ \usepackage{minitoc}"""
538
+
539
+ PreambleCmds.table = r"""\usepackage{longtable,ltcaption,array}
540
+ \setlength{\extrarowheight}{2pt}
541
+ \newlength{\DUtablewidth} % internal use in tables"""
542
+
543
+ PreambleCmds.table_columnwidth = (
544
+ r'\newcommand{\DUcolumnwidth}[1]'
545
+ r'{\dimexpr#1\DUtablewidth-2\tabcolsep\relax}')
546
+
547
+ PreambleCmds.textcomp = r"""\usepackage{textcomp} % text symbol macros"""
548
+ # TODO? Options [force,almostfull] prevent spurious error messages,
549
+ # see de.comp.text.tex/2005-12/msg01855
550
+
551
+ # backwards compatibility definitions
552
+
553
+ PreambleCmds.abstract_legacy = r"""
554
+ % abstract title
555
+ \providecommand*{\DUtitleabstract}[1]{\centerline{\textbf{#1}}}"""
556
+
557
+ # see https://sourceforge.net/p/docutils/bugs/339/
558
+ PreambleCmds.admonition_legacy = r"""
559
+ % admonition (specially marked topic)
560
+ \providecommand{\DUadmonition}[2][class-arg]{%
561
+ % try \DUadmonition#1{#2}:
562
+ \ifcsname DUadmonition#1\endcsname%
563
+ \csname DUadmonition#1\endcsname{#2}%
564
+ \else
565
+ \begin{center}
566
+ \fbox{\parbox{0.9\linewidth}{#2}}
567
+ \end{center}
568
+ \fi
569
+ }"""
570
+
571
+ PreambleCmds.error_legacy = r"""
572
+ % error admonition title
573
+ \providecommand*{\DUtitleerror}[1]{\DUtitle{\color{red}#1}}"""
574
+
575
+ PreambleCmds.title_legacy = r"""
576
+ % title for topics, admonitions, unsupported section levels, and sidebar
577
+ \providecommand*{\DUtitle}[2][class-arg]{%
578
+ % call \DUtitle#1{#2} if it exists:
579
+ \ifcsname DUtitle#1\endcsname%
580
+ \csname DUtitle#1\endcsname{#2}%
581
+ \else
582
+ \smallskip\noindent\textbf{#2}\smallskip%
583
+ \fi
584
+ }"""
585
+
586
+ PreambleCmds.toc_list = r"""
587
+ \providecommand*{\DUCLASScontents}{%
588
+ \renewenvironment{itemize}%
589
+ {\begin{list}{}{\setlength{\partopsep}{0pt}
590
+ \setlength{\parsep}{0pt}}
591
+ }%
592
+ {\end{list}}%
593
+ }"""
594
+
595
+ PreambleCmds.ttem = r"""
596
+ % character width in monospaced font
597
+ \newlength{\ttemwidth}
598
+ \settowidth{\ttemwidth}{\ttfamily M}"""
599
+
600
+ ## PreambleCmds.caption = r"""% configure caption layout
601
+ ## \usepackage{caption}
602
+ ## \captionsetup{singlelinecheck=false}% no exceptions for one-liners"""
603
+
604
+
605
+ # Definitions from docutils.sty::
606
+
607
+ def _read_block(fp):
608
+ block = [next(fp)] # first line (empty)
609
+ for line in fp:
610
+ if not line.strip():
611
+ break
612
+ block.append(line)
613
+ return ''.join(block).rstrip()
614
+
615
+
616
+ with open(LATEX_WRITER_DIR/'docutils.sty', encoding='utf-8') as fp:
617
+ for line in fp:
618
+ line = line.strip('% \n')
619
+ if not line.endswith('::'):
620
+ continue
621
+ block_name = line.rstrip(':')
622
+ if not block_name:
623
+ continue
624
+ definitions = _read_block(fp)
625
+ if block_name in ('color', 'float', 'table', 'textcomp'):
626
+ definitions = definitions.strip()
627
+ # print('Block: `%s`'% block_name)
628
+ # print(definitions)
629
+ setattr(PreambleCmds, block_name, definitions)
630
+
631
+
632
+ # LaTeX encoding maps
633
+ # -------------------
634
+ # ::
635
+
636
+ class CharMaps:
637
+ """LaTeX representations for active and Unicode characters."""
638
+
639
+ # characters that need escaping even in `alltt` environments:
640
+ alltt = {
641
+ ord('\\'): '\\textbackslash{}',
642
+ ord('{'): '\\{',
643
+ ord('}'): '\\}',
644
+ }
645
+ # characters that normally need escaping:
646
+ special = {
647
+ ord('#'): '\\#',
648
+ ord('$'): '\\$',
649
+ ord('%'): '\\%',
650
+ ord('&'): '\\&',
651
+ ord('~'): '\\textasciitilde{}',
652
+ ord('_'): '\\_',
653
+ ord('^'): '\\textasciicircum{}',
654
+ # straight double quotes are 'active' in many languages
655
+ ord('"'): '\\textquotedbl{}',
656
+ # Square brackets are ordinary chars and cannot be escaped with '\',
657
+ # so we put them in a group '{[}'. (Alternative: ensure that all
658
+ # macros with optional arguments are terminated with {} and text
659
+ # inside any optional argument is put in a group ``[{text}]``).
660
+ # Commands with optional args inside an optional arg must be put in a
661
+ # group, e.g. ``\item[{\hyperref[label]{text}}]``.
662
+ ord('['): '{[}',
663
+ ord(']'): '{]}',
664
+ # the soft hyphen is unknown in 8-bit text
665
+ # and not properly handled by XeTeX
666
+ 0x00AD: '\\-', # SOFT HYPHEN
667
+ }
668
+ # Unicode chars that are not recognized by LaTeX's utf8 encoding
669
+ unsupported_unicode = {
670
+ # TODO: ensure white space also at the beginning of a line?
671
+ # 0x00A0: '\\leavevmode\\nobreak\\vadjust{}~'
672
+ 0x2000: '\\enskip', # EN QUAD
673
+ 0x2001: '\\quad', # EM QUAD
674
+ 0x2002: '\\enskip', # EN SPACE
675
+ 0x2003: '\\quad', # EM SPACE
676
+ 0x2008: '\\,', # PUNCTUATION SPACE
677
+ 0x200b: '\\hspace{0pt}', # ZERO WIDTH SPACE
678
+ 0x202F: '\\,', # NARROW NO-BREAK SPACE
679
+ # 0x02d8: '\\\u{ }', # BREVE
680
+ 0x2011: '\\hbox{-}', # NON-BREAKING HYPHEN
681
+ 0x212b: '\\AA', # ANGSTROM SIGN
682
+ 0x21d4: '\\ensuremath{\\Leftrightarrow}', # LEFT RIGHT DOUBLE ARROW
683
+ 0x2260: '\\ensuremath{\\neq}', # NOT EQUAL TO
684
+ 0x2261: '\\ensuremath{\\equiv}', # IDENTICAL TO
685
+ 0x2264: '\\ensuremath{\\le}', # LESS-THAN OR EQUAL TO
686
+ 0x2265: '\\ensuremath{\\ge}', # GREATER-THAN OR EQUAL TO
687
+ # Docutils footnote symbols:
688
+ 0x2660: '\\ensuremath{\\spadesuit}',
689
+ 0x2663: '\\ensuremath{\\clubsuit}',
690
+ 0xfb00: 'ff', # LATIN SMALL LIGATURE FF
691
+ 0xfb01: 'fi', # LATIN SMALL LIGATURE FI
692
+ 0xfb02: 'fl', # LATIN SMALL LIGATURE FL
693
+ 0xfb03: 'ffi', # LATIN SMALL LIGATURE FFI
694
+ 0xfb04: 'ffl', # LATIN SMALL LIGATURE FFL
695
+ }
696
+ # Unicode chars that are recognized by LaTeX's utf8 encoding
697
+ utf8_supported_unicode = {
698
+ 0x00A0: '~', # NO-BREAK SPACE
699
+ 0x00AB: '\\guillemotleft{}', # LEFT-POINTING DOUBLE ANGLE QUOTATION
700
+ 0x00bb: '\\guillemotright{}', # RIGHT-POINTING DOUBLE ANGLE QUOTATION
701
+ 0x200C: '\\textcompwordmark{}', # ZERO WIDTH NON-JOINER
702
+ 0x2013: '\\textendash{}',
703
+ 0x2014: '\\textemdash{}',
704
+ 0x2018: '\\textquoteleft{}',
705
+ 0x2019: '\\textquoteright{}',
706
+ 0x201A: '\\quotesinglbase{}', # SINGLE LOW-9 QUOTATION MARK
707
+ 0x201C: '\\textquotedblleft{}',
708
+ 0x201D: '\\textquotedblright{}',
709
+ 0x201E: '\\quotedblbase{}', # DOUBLE LOW-9 QUOTATION MARK
710
+ 0x2030: '\\textperthousand{}', # PER MILLE SIGN
711
+ 0x2031: '\\textpertenthousand{}', # PER TEN THOUSAND SIGN
712
+ 0x2039: '\\guilsinglleft{}',
713
+ 0x203A: '\\guilsinglright{}',
714
+ 0x2423: '\\textvisiblespace{}', # OPEN BOX
715
+ 0x2020: '\\dag{}',
716
+ 0x2021: '\\ddag{}',
717
+ 0x2026: '\\dots{}',
718
+ 0x2122: '\\texttrademark{}',
719
+ }
720
+ # recognized with 'utf8', if textcomp is loaded
721
+ textcomp = {
722
+ # Latin-1 Supplement
723
+ 0x00a2: '\\textcent{}', # ¢ CENT SIGN
724
+ 0x00a4: '\\textcurrency{}', # ¤ CURRENCY SYMBOL
725
+ 0x00a5: '\\textyen{}', # ¥ YEN SIGN
726
+ 0x00a6: '\\textbrokenbar{}', # ¦ BROKEN BAR
727
+ 0x00a7: '\\textsection{}', # § SECTION SIGN
728
+ 0x00a8: '\\textasciidieresis{}', # ¨ DIAERESIS
729
+ 0x00a9: '\\textcopyright{}', # © COPYRIGHT SIGN
730
+ 0x00aa: '\\textordfeminine{}', # ª FEMININE ORDINAL INDICATOR
731
+ 0x00ac: '\\textlnot{}', # ¬ NOT SIGN
732
+ 0x00ae: '\\textregistered{}', # ® REGISTERED SIGN
733
+ 0x00af: '\\textasciimacron{}', # ¯ MACRON
734
+ 0x00b0: '\\textdegree{}', # ° DEGREE SIGN
735
+ 0x00b1: '\\textpm{}', # ± PLUS-MINUS SIGN
736
+ 0x00b2: '\\texttwosuperior{}', # ² SUPERSCRIPT TWO
737
+ 0x00b3: '\\textthreesuperior{}', # ³ SUPERSCRIPT THREE
738
+ 0x00b4: '\\textasciiacute{}', # ´ ACUTE ACCENT
739
+ 0x00b5: '\\textmu{}', # µ MICRO SIGN
740
+ 0x00b6: '\\textparagraph{}', # ¶ PILCROW SIGN # != \textpilcrow
741
+ 0x00b9: '\\textonesuperior{}', # ¹ SUPERSCRIPT ONE
742
+ 0x00ba: '\\textordmasculine{}', # º MASCULINE ORDINAL INDICATOR
743
+ 0x00bc: '\\textonequarter{}', # 1/4 FRACTION
744
+ 0x00bd: '\\textonehalf{}', # 1/2 FRACTION
745
+ 0x00be: '\\textthreequarters{}', # 3/4 FRACTION
746
+ 0x00d7: '\\texttimes{}', # × MULTIPLICATION SIGN
747
+ 0x00f7: '\\textdiv{}', # ÷ DIVISION SIGN
748
+ # others
749
+ 0x0192: '\\textflorin{}', # LATIN SMALL LETTER F WITH HOOK
750
+ 0x02b9: '\\textasciiacute{}', # MODIFIER LETTER PRIME
751
+ 0x02ba: '\\textacutedbl{}', # MODIFIER LETTER DOUBLE PRIME
752
+ 0x2016: '\\textbardbl{}', # DOUBLE VERTICAL LINE
753
+ 0x2022: '\\textbullet{}', # BULLET
754
+ 0x2032: '\\textasciiacute{}', # PRIME
755
+ 0x2033: '\\textacutedbl{}', # DOUBLE PRIME
756
+ 0x2035: '\\textasciigrave{}', # REVERSED PRIME
757
+ 0x2036: '\\textgravedbl{}', # REVERSED DOUBLE PRIME
758
+ 0x203b: '\\textreferencemark{}', # REFERENCE MARK
759
+ 0x203d: '\\textinterrobang{}', # INTERROBANG
760
+ 0x2044: '\\textfractionsolidus{}', # FRACTION SLASH
761
+ 0x2045: '\\textlquill{}', # LEFT SQUARE BRACKET WITH QUILL
762
+ 0x2046: '\\textrquill{}', # RIGHT SQUARE BRACKET WITH QUILL
763
+ 0x2052: '\\textdiscount{}', # COMMERCIAL MINUS SIGN
764
+ 0x20a1: '\\textcolonmonetary{}', # COLON SIGN
765
+ 0x20a3: '\\textfrenchfranc{}', # FRENCH FRANC SIGN
766
+ 0x20a4: '\\textlira{}', # LIRA SIGN
767
+ 0x20a6: '\\textnaira{}', # NAIRA SIGN
768
+ 0x20a9: '\\textwon{}', # WON SIGN
769
+ 0x20ab: '\\textdong{}', # DONG SIGN
770
+ 0x20ac: '\\texteuro{}', # EURO SIGN
771
+ 0x20b1: '\\textpeso{}', # PESO SIGN
772
+ 0x20b2: '\\textguarani{}', # GUARANI SIGN
773
+ 0x2103: '\\textcelsius{}', # DEGREE CELSIUS
774
+ 0x2116: '\\textnumero{}', # NUMERO SIGN
775
+ 0x2117: '\\textcircledP{}', # SOUND RECORDING COPYRIGHT
776
+ 0x211e: '\\textrecipe{}', # PRESCRIPTION TAKE
777
+ 0x2120: '\\textservicemark{}', # SERVICE MARK
778
+ 0x2122: '\\texttrademark{}', # TRADE MARK SIGN
779
+ 0x2126: '\\textohm{}', # OHM SIGN
780
+ 0x2127: '\\textmho{}', # INVERTED OHM SIGN
781
+ 0x212e: '\\textestimated{}', # ESTIMATED SYMBOL
782
+ 0x2190: '\\textleftarrow{}', # LEFTWARDS ARROW
783
+ 0x2191: '\\textuparrow{}', # UPWARDS ARROW
784
+ 0x2192: '\\textrightarrow{}', # RIGHTWARDS ARROW
785
+ 0x2193: '\\textdownarrow{}', # DOWNWARDS ARROW
786
+ 0x2212: '\\textminus{}', # MINUS SIGN
787
+ 0x2217: '\\textasteriskcentered{}', # ASTERISK OPERATOR
788
+ 0x221a: '\\textsurd{}', # SQUARE ROOT
789
+ 0x2422: '\\textblank{}', # BLANK SYMBOL
790
+ 0x25e6: '\\textopenbullet{}', # WHITE BULLET
791
+ 0x25ef: '\\textbigcircle{}', # LARGE CIRCLE
792
+ 0x266a: '\\textmusicalnote{}', # EIGHTH NOTE
793
+ 0x26ad: '\\textmarried{}', # MARRIAGE SYMBOL
794
+ 0x26ae: '\\textdivorced{}', # DIVORCE SYMBOL
795
+ 0x27e8: '\\textlangle{}', # MATHEMATICAL LEFT ANGLE BRACKET
796
+ 0x27e9: '\\textrangle{}', # MATHEMATICAL RIGHT ANGLE BRACKET
797
+ }
798
+ # Unicode chars that require a feature/package to render
799
+ pifont = {
800
+ 0x2665: '\\ding{170}', # black heartsuit
801
+ 0x2666: '\\ding{169}', # black diamondsuit
802
+ 0x2713: '\\ding{51}', # check mark
803
+ 0x2717: '\\ding{55}', # check mark
804
+ }
805
+ # TODO: greek alphabet ... ?
806
+ # see also LaTeX codec
807
+ # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252124
808
+ # and unimap.py from TeXML
809
+
810
+
811
+ class DocumentClass:
812
+ """Details of a LaTeX document class."""
813
+
814
+ def __init__(self, document_class, with_part=False) -> None:
815
+ self.document_class = document_class
816
+ self._with_part = with_part
817
+ self.sections = ['section', 'subsection', 'subsubsection',
818
+ 'paragraph', 'subparagraph']
819
+ if (self.document_class.endswith('book')
820
+ or self.document_class.endswith('report')
821
+ or self.document_class in ('ctexrep', 'memoir', 'mwbk',
822
+ 'mwrep', 'scrreprt')):
823
+ self.sections.insert(0, 'chapter')
824
+ if self._with_part:
825
+ self.sections.insert(0, 'part')
826
+
827
+ def section(self, level):
828
+ """Return the LaTeX section name for section `level`.
829
+
830
+ The name depends on the specific document class.
831
+ Level is 1,2,3..., as level 0 is the title.
832
+ """
833
+ if level <= len(self.sections):
834
+ return self.sections[level-1]
835
+ # unsupported levels
836
+ return 'DUtitle'
837
+
838
+ def latex_section_depth(self, depth: int) -> int:
839
+ """
840
+ Return LaTeX equivalent of Docutils section level `depth`.
841
+
842
+ Given the value of the ``:depth:`` option of the "contents" or
843
+ "sectnum" directive, return the corresponding value for the
844
+ LaTeX ``tocdepth`` or ``secnumdepth`` counters.
845
+
846
+ LaTeX section depth values:
847
+ :-1|0: part (optional, 0 with "article"-like document classes)
848
+ :0: chapter (missing in "article"-like document classes)
849
+ :1: section
850
+ :2: subsection
851
+ :3: subsubsection
852
+ :4: paragraph
853
+ :5: subparagraph
854
+ """
855
+ depth = min(depth, len(self.sections)) # limit to supported levels
856
+ if 'chapter' in self.sections:
857
+ depth -= 1
858
+ if self.sections[0] == 'part':
859
+ depth -= 1
860
+ return depth
861
+
862
+
863
+ class Table:
864
+ """Manage a table while traversing.
865
+
866
+ Table style might be
867
+
868
+ :standard: horizontal and vertical lines
869
+ :booktabs: only horizontal lines (requires "booktabs" LaTeX package)
870
+ :borderless: no borders around table cells
871
+ :nolines: alias for borderless
872
+
873
+ :colwidths-auto: column widths determined by LaTeX
874
+ """
875
+ def __init__(self, translator, latex_type) -> None:
876
+ self._translator = translator
877
+ self._latex_type = latex_type
878
+ self.legacy_column_widths = False
879
+
880
+ self.close()
881
+ self._colwidths = []
882
+ self._rowspan = []
883
+ self._in_thead = 0
884
+
885
+ def open(self) -> None:
886
+ self._open = True
887
+ self._col_specs = []
888
+ self.caption = []
889
+ self._attrs = {}
890
+ self._in_head = False # maybe context with search
891
+
892
+ def close(self) -> None:
893
+ self._open = False
894
+ self._col_specs = None
895
+ self.caption = []
896
+ self._attrs = {}
897
+ self.stubs = []
898
+ self.colwidths_auto = False
899
+
900
+ def is_open(self):
901
+ return self._open
902
+
903
+ def set_table_style(self, node, settings) -> None:
904
+ self.legacy_column_widths = settings.legacy_column_widths
905
+ if 'align' in node:
906
+ self.set('align', node['align'])
907
+ # TODO: elif 'align' in classes/settings.table-style:
908
+ # self.set('align', ...)
909
+ borders = [cls.replace('nolines', 'borderless')
910
+ for cls in (['standard']
911
+ + settings.table_style
912
+ + node['classes'])
913
+ if cls in ('standard', 'booktabs', 'borderless', 'nolines')]
914
+ self.borders = borders[-1]
915
+ self.colwidths_auto = (('colwidths-auto' in node['classes']
916
+ or 'colwidths-auto' in settings.table_style)
917
+ and 'colwidths-given' not in node['classes']
918
+ and 'width' not in node)
919
+
920
+ def get_latex_type(self):
921
+ if self._latex_type == 'longtable' and not self.caption:
922
+ # do not advance the "table" counter (requires "ltcaption" package)
923
+ return 'longtable*'
924
+ return self._latex_type
925
+
926
+ def set(self, attr, value) -> None:
927
+ self._attrs[attr] = value
928
+
929
+ def get(self, attr):
930
+ if attr in self._attrs:
931
+ return self._attrs[attr]
932
+ return None
933
+
934
+ def get_vertical_bar(self) -> str:
935
+ if self.borders == 'standard':
936
+ return '|'
937
+ return ''
938
+
939
+ def get_opening(self, width=r'\linewidth'):
940
+ opening = []
941
+ nr_of_cols = len(self._col_specs)
942
+ align_map = {'left': '[l]',
943
+ 'center': '[c]',
944
+ 'right': '[r]',
945
+ None: ''}
946
+ align = align_map.get(self.get('align'))
947
+ latex_type = self.get_latex_type()
948
+ if align and not latex_type.startswith("longtable"):
949
+ opening.append(r'\noindent\makebox[\linewidth]%s{%%' % align)
950
+ align = ''
951
+ if not self.colwidths_auto:
952
+ if self.borders == 'standard' and not self.legacy_column_widths:
953
+ opening.append(r'\setlength{\DUtablewidth}'
954
+ r'{\dimexpr%s-%i\arrayrulewidth\relax}%%'
955
+ % (width, nr_of_cols+1))
956
+ else:
957
+ opening.append(r'\setlength{\DUtablewidth}{%s}%%' % width)
958
+ opening.append(r'\begin{%s}%s' % (latex_type, align))
959
+ return '\n'.join(opening)
960
+
961
+ def get_closing(self):
962
+ closing = []
963
+ if self.borders == 'booktabs':
964
+ closing.append(r'\bottomrule')
965
+ # elif self.borders == 'standard':
966
+ # closing.append(r'\hline')
967
+ closing.append(r'\end{%s}' % self.get_latex_type())
968
+ if (self.get('align')
969
+ and not self.get_latex_type().startswith("longtable")):
970
+ closing.append('}')
971
+ return '\n'.join(closing)
972
+
973
+ def visit_colspec(self, node) -> None:
974
+ self._col_specs.append(node)
975
+ # "stubs" list is an attribute of the tgroup element:
976
+ self.stubs.append(node.attributes.get('stub'))
977
+
978
+ def get_colspecs(self, node):
979
+ """Return column specification for longtable.
980
+ """
981
+ bar = self.get_vertical_bar()
982
+ self._rowspan = [0] * len(self._col_specs)
983
+ if self.colwidths_auto:
984
+ self._colwidths = []
985
+ latex_colspecs = ['l'] * len(self._col_specs)
986
+ elif self.legacy_column_widths:
987
+ # use old algorithm for backwards compatibility
988
+ width = 80 # assumed standard line length
989
+ factor = 0.93 # do not make it full linewidth
990
+ # first see if we get too wide.
991
+ total_width = sum(node.propwidth()+1 for node in self._col_specs)
992
+ if total_width > width:
993
+ factor *= width / total_width
994
+ self._colwidths = [(factor * (node.propwidth()+1)/width) + 0.005
995
+ for node in self._col_specs]
996
+ latex_colspecs = ['p{%.3f\\DUtablewidth}' % colwidth
997
+ for colwidth in self._colwidths]
998
+ else:
999
+ # No of characters corresponding to table width = 100%
1000
+ # Characters/line with LaTeX article, A4, Times, default margins
1001
+ # depends on character: M: 40, A: 50, x: 70, i: 120.
1002
+ norm_length = 40
1003
+ # Allowance to prevent unpadded columns like
1004
+ # === ==
1005
+ # ABC DE
1006
+ # === ==
1007
+ # getting too narrow:
1008
+ if 'colwidths-given' not in node.parent.parent['classes']:
1009
+ allowance = 1
1010
+ else:
1011
+ allowance = 0 # "widths" option specified, use exact ratio
1012
+ self._colwidths = [(node.propwidth()+allowance)/norm_length
1013
+ for node in self._col_specs]
1014
+ total_width = sum(self._colwidths)
1015
+ # Limit to 100%, force 100% if table width is specified:
1016
+ if total_width > 1 or 'width' in node.parent.parent.attributes:
1017
+ self._colwidths = [colwidth/total_width
1018
+ for colwidth in self._colwidths]
1019
+ latex_colspecs = ['p{\\DUcolumnwidth{%.3f}}' % colwidth
1020
+ for colwidth in self._colwidths]
1021
+ return bar + bar.join(latex_colspecs) + bar
1022
+
1023
+ def get_column_width(self) -> str:
1024
+ """Return columnwidth for current cell (not multicell)."""
1025
+ try:
1026
+ if self.legacy_column_widths:
1027
+ return '%.2f\\DUtablewidth'%self._colwidths[self._cell_in_row]
1028
+ return '\\DUcolumnwidth{%.2f}'%self._colwidths[self._cell_in_row]
1029
+ except IndexError:
1030
+ return '*'
1031
+
1032
+ def get_multicolumn_width(self, start, len_) -> str:
1033
+ """Return sum of columnwidths for multicell."""
1034
+ try:
1035
+ multicol_width = sum(self._colwidths[start + co]
1036
+ for co in range(len_))
1037
+ if self.legacy_column_widths:
1038
+ return 'p{%.2f\\DUtablewidth}' % multicol_width
1039
+ return 'p{\\DUcolumnwidth{%.3f}}' % multicol_width
1040
+ except IndexError:
1041
+ return 'l'
1042
+
1043
+ def need_recurse(self):
1044
+ if self._latex_type == 'longtable':
1045
+ return 1 == self._translator.thead_depth()
1046
+ return 0
1047
+
1048
+ def visit_thead(self):
1049
+ self._in_thead += 1
1050
+ if self.borders == 'standard':
1051
+ return ['\\hline\n']
1052
+ elif self.borders == 'booktabs':
1053
+ return ['\\toprule\n']
1054
+ return []
1055
+
1056
+ def depart_thead(self):
1057
+ a = []
1058
+ ## if self.borders == 'standard':
1059
+ ## a.append('\\hline\n')
1060
+ if self.borders == 'booktabs':
1061
+ a.append('\\midrule\n')
1062
+ if self._latex_type == 'longtable':
1063
+ if 1 == self._translator.thead_depth():
1064
+ a.append('\\endfirsthead\n')
1065
+ else:
1066
+ n_c = len(self._col_specs)
1067
+ a.append('\\endhead\n')
1068
+ # footer on all but last page (if it fits):
1069
+ t_width = sum(node.propwidth()+2 for node in self._col_specs)
1070
+ if t_width > 30 or (t_width > 12 and not self.colwidths_auto):
1071
+ a.append(r'\multicolumn{%d}{%s}'
1072
+ % (n_c, self.get_multicolumn_width(0, n_c))
1073
+ + r'{\raggedleft\ldots continued on next page}\\'
1074
+ + '\n')
1075
+ a.append('\\endfoot\n\\endlastfoot\n')
1076
+ # for longtable one could add firsthead, foot and lastfoot
1077
+ self._in_thead -= 1
1078
+ return a
1079
+
1080
+ def visit_row(self) -> None:
1081
+ self._cell_in_row = 0
1082
+
1083
+ def depart_row(self):
1084
+ res = [' \\\\\n']
1085
+ self._cell_in_row = None # remove cell counter
1086
+ for i in range(len(self._rowspan)):
1087
+ if self._rowspan[i] > 0:
1088
+ self._rowspan[i] -= 1
1089
+
1090
+ if self.borders == 'standard':
1091
+ rowspans = [i+1 for i in range(len(self._rowspan))
1092
+ if self._rowspan[i] <= 0]
1093
+ if len(rowspans) == len(self._rowspan):
1094
+ res.append('\\hline\n')
1095
+ else:
1096
+ cline = ''
1097
+ rowspans.reverse()
1098
+ # TODO merge clines
1099
+ while True:
1100
+ try:
1101
+ c_start = rowspans.pop()
1102
+ except IndexError:
1103
+ break
1104
+ cline += '\\cline{%d-%d}\n' % (c_start, c_start)
1105
+ res.append(cline)
1106
+ return res
1107
+
1108
+ def set_rowspan(self, cell, value) -> None:
1109
+ try:
1110
+ self._rowspan[cell] = value
1111
+ except IndexError:
1112
+ pass
1113
+
1114
+ def get_rowspan(self, cell):
1115
+ try:
1116
+ return self._rowspan[cell]
1117
+ except IndexError:
1118
+ return 0
1119
+
1120
+ def get_entry_number(self):
1121
+ return self._cell_in_row
1122
+
1123
+ def visit_entry(self) -> None:
1124
+ self._cell_in_row += 1
1125
+
1126
+ def is_stub_column(self):
1127
+ if len(self.stubs) >= self._cell_in_row:
1128
+ return self.stubs[self._cell_in_row]
1129
+ return False
1130
+
1131
+
1132
+ class LaTeXTranslator(writers.DoctreeTranslator):
1133
+ """
1134
+ Generate code for 8-bit LaTeX from a Docutils document tree.
1135
+
1136
+ See the docstring of docutils.writers._html_base.HTMLTranslator for
1137
+ notes on and examples of safe subclassing.
1138
+ """
1139
+
1140
+ # When options are given to the documentclass, latex will pass them
1141
+ # to other packages, as done with babel.
1142
+ # Dummy settings might be taken from document settings
1143
+
1144
+ # Generate code for typesetting with 8-bit latex/pdflatex vs.
1145
+ # xelatex/lualatex engine. Overwritten by the XeTeX writer
1146
+ is_xetex = False
1147
+
1148
+ # Config setting defaults
1149
+ # -----------------------
1150
+
1151
+ # TODO: use mixins for different implementations.
1152
+ # list environment for docinfo. else tabularx
1153
+ ## use_optionlist_for_docinfo = False # TODO: NOT YET IN USE
1154
+
1155
+ # Use compound enumerations (1.A.1.)
1156
+ compound_enumerators = False
1157
+
1158
+ # If using compound enumerations, include section information.
1159
+ section_prefix_for_enumerators = False
1160
+
1161
+ # This is the character that separates the section ("." subsection ...)
1162
+ # prefix from the regular list enumerator.
1163
+ section_enumerator_separator = '-'
1164
+
1165
+ # Auxiliary variables
1166
+ # -------------------
1167
+
1168
+ has_latex_toc = False # is there a toc in the doc? (needed by minitoc)
1169
+ section_level = 0
1170
+
1171
+ # Flags to encode():
1172
+ # inside citation reference labels underscores dont need to be escaped
1173
+ inside_citation_reference_label = False
1174
+ verbatim = False # do not encode
1175
+ insert_non_breaking_blanks = False # replace blanks by "~"
1176
+ insert_newline = False # add latex newline commands
1177
+ literal = False # literal text (block or inline)
1178
+ alltt = False # inside `alltt` environment
1179
+
1180
+ # Nodes to be stored in the "titledata" part if "use_latex_docinfo" is true
1181
+ TITLEDATA_NODES = (nodes.address, nodes.author, nodes.authors,
1182
+ nodes.contact, nodes.date, nodes.organization)
1183
+
1184
+ def __init__(self, document, babel_class=Babel) -> None:
1185
+ super().__init__(document)
1186
+ # Reporter
1187
+ # ~~~~~~~~
1188
+ self.warn = self.document.reporter.warning
1189
+ self.error = self.document.reporter.error
1190
+
1191
+ # Settings
1192
+ # ~~~~~~~~
1193
+ settings = self.settings
1194
+ # warn of deprecated settings and changing defaults:
1195
+ if settings.use_latex_citations is None and not settings.use_bibtex:
1196
+ settings.use_latex_citations = False
1197
+ warnings.warn('The default for the setting "use_latex_citations" '
1198
+ 'will change to "True" in Docutils 1.0.',
1199
+ FutureWarning, stacklevel=7)
1200
+ if settings.legacy_column_widths is None:
1201
+ settings.legacy_column_widths = True
1202
+ warnings.warn('The default for the setting "legacy_column_widths" '
1203
+ 'will change to "False" in Docutils 1.0.)',
1204
+ FutureWarning, stacklevel=7)
1205
+ if settings.use_verbatim_when_possible is not None:
1206
+ warnings.warn(
1207
+ 'The configuration setting "use_verbatim_when_possible" '
1208
+ 'will be removed in Docutils 2.0. '
1209
+ 'Use "literal_block_env: verbatim".',
1210
+ FutureWarning, stacklevel=7)
1211
+
1212
+ self.latex_encoding = self.to_latex_encoding(settings.output_encoding)
1213
+ self.use_latex_toc = settings.use_latex_toc
1214
+ self.use_latex_docinfo = settings.use_latex_docinfo
1215
+ self.use_latex_citations = settings.use_latex_citations
1216
+ self.reference_label = settings.reference_label
1217
+ self.hyperlink_color = settings.hyperlink_color
1218
+ self.compound_enumerators = settings.compound_enumerators
1219
+ self.font_encoding = getattr(settings, 'font_encoding', '')
1220
+ self.section_prefix_for_enumerators = (
1221
+ settings.section_prefix_for_enumerators)
1222
+ self.section_enumerator_separator = (
1223
+ settings.section_enumerator_separator.replace('_', r'\_'))
1224
+ # literal blocks:
1225
+ self.literal_block_env = ''
1226
+ self.literal_block_options = ''
1227
+ if settings.literal_block_env:
1228
+ (_none,
1229
+ self.literal_block_env,
1230
+ self.literal_block_options,
1231
+ _none) = re.split(r'(\w+)(.*)', settings.literal_block_env)
1232
+ elif settings.use_verbatim_when_possible:
1233
+ self.literal_block_env = 'verbatim'
1234
+
1235
+ if settings.use_bibtex:
1236
+ self.use_latex_citations = True
1237
+ self.bibtex = settings.use_bibtex
1238
+ # language module for Docutils-generated text
1239
+ # (labels, bibliographic_fields, and author_separators)
1240
+ self.language_module = languages.get_language(settings.language_code,
1241
+ document.reporter)
1242
+ self.babel = babel_class(settings.language_code, document.reporter)
1243
+ self.author_separator = self.language_module.author_separators[0]
1244
+ d_options = [settings.documentoptions]
1245
+ if self.babel.language not in ('english', ''):
1246
+ d_options.append(self.babel.language)
1247
+ self.documentoptions = ','.join(filter(None, d_options))
1248
+ self.d_class = DocumentClass(settings.documentclass,
1249
+ settings.use_part_section)
1250
+ # graphic package options:
1251
+ if settings.graphicx_option == '':
1252
+ self.graphicx_package = r'\usepackage{graphicx}'
1253
+ else:
1254
+ self.graphicx_package = (r'\usepackage[%s]{graphicx}' %
1255
+ settings.graphicx_option)
1256
+ # footnotes: TODO: implement LaTeX footnotes
1257
+ self.docutils_footnotes = settings.docutils_footnotes
1258
+
1259
+ # Output collection stacks
1260
+ # ~~~~~~~~~~~~~~~~~~~~~~~~
1261
+
1262
+ # Document parts
1263
+ self.head_prefix = [f'\\documentclass[{self.documentoptions}]'
1264
+ f'{{{settings.documentclass}}}']
1265
+ self.requirements = {} # converted to a list in depart_document()
1266
+ self.latex_preamble = [settings.latex_preamble]
1267
+ self.fallbacks = {} # converted to a list in depart_document()
1268
+ self.pdfsetup = [] # PDF properties (hyperref package)
1269
+ self.title = []
1270
+ self.subtitle = []
1271
+ self.titledata = [] # \title, \author, \date
1272
+ ## self.body_prefix = ['\\begin{document}\n']
1273
+ self.body_pre_docinfo = [] # \maketitle
1274
+ self.docinfo = []
1275
+ self.dedication = []
1276
+ self.abstract = []
1277
+ self.body = []
1278
+ ## self.body_suffix = ['\\end{document}\n']
1279
+
1280
+ self.context = []
1281
+ """Heterogeneous stack.
1282
+
1283
+ Used by visit_* and depart_* functions in conjunction with the tree
1284
+ traversal. Make sure that the pops correspond to the pushes."""
1285
+
1286
+ # Title metadata:
1287
+ self.title_labels = []
1288
+ self.subtitle_labels = []
1289
+ # with "use_latex_docinfo", we also need
1290
+ self.author_stack = [['']] # first item reserved for author name
1291
+ self.date = []
1292
+
1293
+ # PDF properties:
1294
+ self.pdfauthor = []
1295
+ self.pdfinfo = []
1296
+ if settings.language_code != 'en':
1297
+ self.pdfinfo.append(' pdflang={%s},'%settings.language_code)
1298
+
1299
+ # Stack of section counters so that we don't have to use_latex_toc.
1300
+ # This will grow and shrink as processing occurs.
1301
+ # Initialized for potential first-level sections.
1302
+ self._section_number = [0]
1303
+
1304
+ # The current stack of enumerations so that we can expand
1305
+ # them into a compound enumeration.
1306
+ self._enumeration_counters = []
1307
+ # The maximum number of enumeration counters we've used.
1308
+ # If we go beyond this number, we need to create a new
1309
+ # counter; otherwise, just reuse an old one.
1310
+ self._max_enumeration_counters = 0
1311
+
1312
+ self._bibitems = []
1313
+
1314
+ # object for a table while processing.
1315
+ self.table_stack = []
1316
+ self.active_table = Table(self, 'longtable')
1317
+
1318
+ # Where to collect the output of visitor methods (default: body)
1319
+ self.out = self.body
1320
+ self.out_stack = [] # stack of output collectors
1321
+
1322
+ # Process settings
1323
+ # ~~~~~~~~~~~~~~~~
1324
+ # Encodings:
1325
+ # Docutils' output-encoding => TeX input encoding
1326
+ if self.latex_encoding not in ('ascii', 'unicode', 'utf8'):
1327
+ self.requirements['_inputenc'] = (r'\usepackage[%s]{inputenc}'
1328
+ % self.latex_encoding)
1329
+ # TeX font encoding
1330
+ if not self.is_xetex:
1331
+ if self.font_encoding:
1332
+ self.requirements['_fontenc'] = (r'\usepackage[%s]{fontenc}' %
1333
+ self.font_encoding)
1334
+ # ensure \textquotedbl is defined:
1335
+ for enc in self.font_encoding.split(','):
1336
+ enc = enc.strip()
1337
+ if enc == 'OT1':
1338
+ self.requirements['_textquotedblOT1'] = (
1339
+ r'\DeclareTextSymbol{\textquotedbl}{OT1}{`\"}')
1340
+ elif enc not in ('T1', 'T2A', 'T2B', 'T2C', 'T4', 'T5'):
1341
+ self.requirements['_textquotedbl'] = (
1342
+ r'\DeclareTextSymbolDefault{\textquotedbl}{T1}')
1343
+ # page layout with typearea (if there are relevant document options)
1344
+ if (not settings.documentclass.startswith('scr')
1345
+ and ('DIV' in self.documentoptions
1346
+ or 'BCOR' in self.documentoptions)):
1347
+ self.requirements['typearea'] = r'\usepackage{typearea}'
1348
+
1349
+ # Stylesheets
1350
+ # (the name `self.stylesheet` is singular because only one
1351
+ # stylesheet was supported before Docutils 0.6).
1352
+ stylesheet_list = utils.get_stylesheet_list(settings)
1353
+ self.fallback_stylesheet = 'docutils' in stylesheet_list
1354
+ if self.fallback_stylesheet:
1355
+ stylesheet_list.remove('docutils')
1356
+ if settings.legacy_class_functions:
1357
+ # docutils.sty is incompatible with legacy functions
1358
+ self.fallback_stylesheet = False
1359
+ else:
1360
+ # require a minimal version:
1361
+ self.fallbacks['_docutils.sty'] = (
1362
+ r'\usepackage{docutils}[2025-08-06]')
1363
+
1364
+ self.stylesheet = [self.stylesheet_call(path)
1365
+ for path in stylesheet_list]
1366
+
1367
+ # PDF setup
1368
+ # avoid warnings about empty anchors with \DUfootnotetext:
1369
+ self.hyperref_options = ['hyperfootnotes=false']
1370
+ # link color (default is "blue"):
1371
+ if self.hyperlink_color.lower() not in ('0', 'off', 'no', 'false', ''):
1372
+ self.hyperref_options.append('colorlinks=true,'
1373
+ f'linkcolor={self.hyperlink_color},'
1374
+ f'urlcolor={self.hyperlink_color}')
1375
+ if settings.hyperref_options:
1376
+ self.hyperref_options.append(settings.hyperref_options)
1377
+ # wrap and align (cf. PreambleCmds.linking):
1378
+ self.hyperref_options = ',\n '.join(self.hyperref_options)
1379
+
1380
+ # Auxiliary Methods
1381
+ # -----------------
1382
+
1383
+ def stylesheet_call(self, path):
1384
+ """Return code to reference or embed stylesheet file `path`."""
1385
+
1386
+ path = Path(path)
1387
+ # is it a package (no extension or *.sty) or "normal" tex code:
1388
+ is_package = path.suffix in ('.sty', '')
1389
+ # Embed content of style file:
1390
+ if self.settings.embed_stylesheet:
1391
+ if is_package:
1392
+ path = path.with_suffix('.sty') # ensure extension
1393
+ try:
1394
+ content = path.read_text(encoding='utf-8')
1395
+ except OSError as err:
1396
+ msg = f'Cannot embed stylesheet:\n {err}'.replace('\\\\', '/')
1397
+ self.document.reporter.error(msg)
1398
+ return '% ' + msg.replace('\n', '\n% ')
1399
+ else:
1400
+ self.settings.record_dependencies.add(path.as_posix())
1401
+ if is_package:
1402
+ # allow '@' in macro names:
1403
+ content = (f'\\makeatletter\n{content}\n\\makeatother')
1404
+ return (f'% embedded stylesheet: {path.as_posix()}\n'
1405
+ f'{content}')
1406
+ # Link to style file:
1407
+ if is_package:
1408
+ path = path.parent / path.stem # drop extension
1409
+ cmd = r'\usepackage{%s}'
1410
+ else:
1411
+ cmd = r'\input{%s}'
1412
+ if self.settings.stylesheet_path:
1413
+ # adapt path relative to output (cf. config.html#stylesheet-path)
1414
+ return cmd % utils.relative_path(self.settings.output_path, path)
1415
+ return cmd % path.as_posix()
1416
+
1417
+ def to_latex_encoding(self, docutils_encoding):
1418
+ """Translate docutils encoding name into LaTeX's.
1419
+
1420
+ Default method is remove "-" and "_" chars from docutils_encoding.
1421
+ """
1422
+ tr = {'iso-8859-1': 'latin1', # west european
1423
+ 'iso-8859-2': 'latin2', # east european
1424
+ 'iso-8859-3': 'latin3', # esperanto, maltese
1425
+ 'iso-8859-4': 'latin4', # north european
1426
+ 'iso-8859-5': 'iso88595', # cyrillic (ISO)
1427
+ 'iso-8859-9': 'latin5', # turkish
1428
+ 'iso-8859-15': 'latin9', # latin9, update to latin1.
1429
+ 'mac_cyrillic': 'maccyr', # cyrillic (on Mac)
1430
+ 'windows-1251': 'cp1251', # cyrillic (on Windows)
1431
+ 'koi8-r': 'koi8-r', # cyrillic (Russian)
1432
+ 'koi8-u': 'koi8-u', # cyrillic (Ukrainian)
1433
+ 'windows-1250': 'cp1250', #
1434
+ 'windows-1252': 'cp1252', #
1435
+ 'us-ascii': 'ascii', # ASCII (US)
1436
+ # unmatched encodings
1437
+ # '': 'applemac',
1438
+ # '': 'ansinew', # windows 3.1 ansi
1439
+ # '': 'ascii', # ASCII encoding for the range 32--127.
1440
+ # '': 'cp437', # dos latin us
1441
+ # '': 'cp850', # dos latin 1
1442
+ # '': 'cp852', # dos latin 2
1443
+ # '': 'decmulti',
1444
+ # '': 'latin10',
1445
+ # 'iso-8859-6': '' # arabic
1446
+ # 'iso-8859-7': '' # greek
1447
+ # 'iso-8859-8': '' # hebrew
1448
+ # 'iso-8859-10': '' # latin6, more complete iso-8859-4
1449
+ }
1450
+ encoding = docutils_encoding.lower() # normalize case
1451
+ encoding = encoding.split(':')[0] # strip the error handler
1452
+ if encoding in tr:
1453
+ return tr[encoding]
1454
+ # drop HYPHEN or LOW LINE from "latin_1", "utf-8" and similar
1455
+ return encoding.replace('_', '').replace('-', '')
1456
+
1457
+ def language_label(self, docutil_label):
1458
+ return self.language_module.labels[docutil_label]
1459
+
1460
+ def encode(self, text):
1461
+ """Return text with 'problematic' characters escaped.
1462
+
1463
+ * Escape the special printing characters ``# $ % & ~ _ ^ \\ { }``,
1464
+ square brackets ``[ ]``, double quotes and (in OT1) ``< | >``.
1465
+ * Translate non-supported Unicode characters.
1466
+ * Separate ``-`` (and more in literal text) to prevent input ligatures.
1467
+ """
1468
+ if self.verbatim:
1469
+ return text
1470
+ # Set up the translation table:
1471
+ table = CharMaps.alltt.copy()
1472
+ if not self.alltt:
1473
+ table.update(CharMaps.special)
1474
+ # keep the underscore in citation references
1475
+ if self.inside_citation_reference_label and not self.alltt:
1476
+ del table[ord('_')]
1477
+ # Workarounds for OT1 font-encoding
1478
+ if self.font_encoding in ['OT1', ''] and not self.is_xetex:
1479
+ # * out-of-order characters in cmtt
1480
+ if self.literal:
1481
+ # replace underscore by underlined blank,
1482
+ # because this has correct width.
1483
+ table[ord('_')] = '\\underline{~}'
1484
+ # the backslash doesn't work, so we use a mirrored slash.
1485
+ # \reflectbox is provided by graphicx:
1486
+ self.requirements['graphicx'] = self.graphicx_package
1487
+ table[ord('\\')] = '\\reflectbox{/}'
1488
+ # * ``< | >`` come out as different chars (except for cmtt):
1489
+ else:
1490
+ table[ord('|')] = '\\textbar{}'
1491
+ table[ord('<')] = '\\textless{}'
1492
+ table[ord('>')] = '\\textgreater{}'
1493
+ if self.insert_non_breaking_blanks:
1494
+ table[ord(' ')] = '~'
1495
+ # tab chars may occur in included files (literal or code)
1496
+ # quick-and-dirty replacement with spaces
1497
+ # (for better results use `--literal-block-env=lstlisting`)
1498
+ table[ord('\t')] = '~' * self.settings.tab_width
1499
+ # Unicode replacements for 8-bit tex engines (not required with XeTeX)
1500
+ if not self.is_xetex:
1501
+ if not self.latex_encoding.startswith('utf8'):
1502
+ table.update(CharMaps.unsupported_unicode)
1503
+ table.update(CharMaps.utf8_supported_unicode)
1504
+ table.update(CharMaps.textcomp)
1505
+ table.update(CharMaps.pifont)
1506
+ # Characters that require a feature/package to render
1507
+ for ch in text:
1508
+ cp = ord(ch)
1509
+ if cp in CharMaps.textcomp and not self.fallback_stylesheet:
1510
+ self.requirements['textcomp'] = PreambleCmds.textcomp
1511
+ elif cp in CharMaps.pifont:
1512
+ self.requirements['pifont'] = '\\usepackage{pifont}'
1513
+ # preamble-definitions for unsupported Unicode characters
1514
+ elif (self.latex_encoding == 'utf8'
1515
+ and cp in CharMaps.unsupported_unicode):
1516
+ self.requirements['_inputenc'+str(cp)] = (
1517
+ '\\DeclareUnicodeCharacter{%04X}{%s}'
1518
+ % (cp, CharMaps.unsupported_unicode[cp]))
1519
+ text = text.translate(table)
1520
+
1521
+ # Break up input ligatures e.g. '--' to '-{}-'.
1522
+ if not self.is_xetex: # Not required with xetex/luatex
1523
+ separate_chars = '-'
1524
+ # In monospace-font, we also separate ',,', '``' and "''" and some
1525
+ # other characters which can't occur in non-literal text.
1526
+ if self.literal:
1527
+ separate_chars += ',`\'"<>'
1528
+ for char in separate_chars * 2:
1529
+ # Do it twice ("* 2") because otherwise we would replace
1530
+ # '---' by '-{}--'.
1531
+ text = text.replace(char + char, char + '{}' + char)
1532
+
1533
+ # Literal line breaks (in address or literal blocks):
1534
+ if self.insert_newline:
1535
+ lines = text.split('\n')
1536
+ # Add a protected space to blank lines (except the last)
1537
+ # to avoid ``! LaTeX Error: There's no line here to end.``
1538
+ for i, line in enumerate(lines[:-1]):
1539
+ if not line.lstrip():
1540
+ lines[i] += '~'
1541
+ text = (r'\\' + '\n').join(lines)
1542
+ if self.literal and not self.insert_non_breaking_blanks:
1543
+ # preserve runs of spaces but allow wrapping
1544
+ text = text.replace(' ', ' ~')
1545
+ return text
1546
+
1547
+ def attval(self, text,
1548
+ whitespace=re.compile('[\n\r\t\v\f]')):
1549
+ """Cleanse, encode, and return attribute value text."""
1550
+ return self.encode(whitespace.sub(' ', text))
1551
+
1552
+ def is_inline(self, node):
1553
+ """Check whether a node represents an inline or block-level element"""
1554
+ return isinstance(node.parent, nodes.TextElement)
1555
+
1556
+ def append_hypertargets(self, node) -> None:
1557
+ """Append hypertargets for all ids of `node`"""
1558
+ # hypertarget places the anchor at the target's baseline,
1559
+ # so we raise it explicitly
1560
+ self.out.append('%\n'.join('\\raisebox{1em}{\\hypertarget{%s}{}}' %
1561
+ id for id in node['ids']))
1562
+
1563
+ def ids_to_labels(self, node, set_anchor=True, protect=False,
1564
+ newline=False, pre_nl=False) -> list[str]:
1565
+ """Return label definitions for all ids of `node`.
1566
+
1567
+ If `set_anchor` is True, an anchor is set with \\phantomsection.
1568
+ If `protect` is True, the \\label cmd is made robust.
1569
+ If `newline` is True, a newline is added if there are labels.
1570
+ If `pre_nl` is True, a newline is prepended if there are labels.
1571
+
1572
+ Provisional.
1573
+ """
1574
+ prefix = '\\protect' if protect else ''
1575
+ labels = [f'{prefix}\\label{{{id}}}' for id in node['ids']]
1576
+ if labels:
1577
+ if set_anchor:
1578
+ labels.insert(0, '\\phantomsection')
1579
+ if newline:
1580
+ labels.append('\n')
1581
+ if pre_nl:
1582
+ labels.insert(0, '\n')
1583
+ return labels
1584
+
1585
+ def set_align_from_classes(self, node) -> None:
1586
+ """Convert ``align-*`` class arguments into alignment args."""
1587
+ # separate:
1588
+ align = [cls for cls in node['classes'] if cls.startswith('align-')]
1589
+ if align:
1590
+ node['align'] = align[-1].removeprefix('align-')
1591
+ node['classes'] = [cls for cls in node['classes']
1592
+ if not cls.startswith('align-')]
1593
+
1594
+ def insert_align_declaration(self, node, default=None) -> None:
1595
+ align = node.get('align', default)
1596
+ if align == 'left':
1597
+ self.out.append('\\raggedright\n')
1598
+ elif align == 'center':
1599
+ self.out.append('\\centering\n')
1600
+ elif align == 'right':
1601
+ self.out.append('\\raggedleft\n')
1602
+
1603
+ def provide_fallback(self, feature, key=None) -> None:
1604
+ if key is None:
1605
+ key = feature
1606
+ if self.fallback_stylesheet:
1607
+ return # provided by the included style sheet
1608
+ self.fallbacks[key] = getattr(PreambleCmds, feature)
1609
+
1610
+ def duclass_open(self, node) -> None:
1611
+ """Open a group and insert declarations for class values."""
1612
+ if not isinstance(node.parent, nodes.compound):
1613
+ self.out.append('\n')
1614
+ for cls in node['classes']:
1615
+ if cls.startswith('language-'):
1616
+ language = self.babel.language_name(cls[9:])
1617
+ if language:
1618
+ self.babel.otherlanguages[language] = True
1619
+ self.out.append('\\begin{selectlanguage}{%s}\n' % language)
1620
+ elif (isinstance(node, nodes.table)
1621
+ and cls in Writer.table_style_values + ['colwidths-given']):
1622
+ pass
1623
+ else:
1624
+ self.provide_fallback('duclass', 'DUclass')
1625
+ self.out.append('\\begin{DUclass}{%s}\n' % cls)
1626
+
1627
+ def duclass_close(self, node) -> None:
1628
+ """Close a group of class declarations."""
1629
+ for cls in reversed(node['classes']):
1630
+ if cls.startswith('language-'):
1631
+ language = self.babel.language_name(cls[9:])
1632
+ if language:
1633
+ self.out.append('\\end{selectlanguage}\n')
1634
+ elif (isinstance(node, nodes.table)
1635
+ and cls in Writer.table_style_values + ['colwidths-given']):
1636
+ pass
1637
+ else:
1638
+ self.provide_fallback('duclass', 'DUclass')
1639
+ self.out.append('\\end{DUclass}\n')
1640
+
1641
+ def push_output_collector(self, new_out: list) -> None:
1642
+ self.out_stack.append(self.out)
1643
+ self.out = new_out
1644
+
1645
+ def pop_output_collector(self) -> list:
1646
+ old_out = self.out
1647
+ self.out = self.out_stack.pop()
1648
+ return old_out
1649
+
1650
+ def term_postfix(self, node):
1651
+ """
1652
+ Return LaTeX code required between term or field name and content.
1653
+
1654
+ In a LaTeX "description" environment (used for definition
1655
+ lists and non-docinfo field lists), a ``\\leavevmode``
1656
+ between an item's label and content ensures the correct
1657
+ placement of certain block constructs.
1658
+ """
1659
+ for child in node:
1660
+ if not isinstance(child, (nodes.Invisible, nodes.footnote,
1661
+ nodes.citation)):
1662
+ break
1663
+ else:
1664
+ return ''
1665
+ if isinstance(child, (nodes.container, nodes.compound)):
1666
+ return self.term_postfix(child)
1667
+ if isinstance(child, nodes.image):
1668
+ return '\\leavevmode\n' # Images get an additional newline.
1669
+ if not isinstance(child, (nodes.paragraph, nodes.math_block)):
1670
+ return '\\leavevmode'
1671
+ return ''
1672
+
1673
+ # Visitor methods
1674
+ # ---------------
1675
+
1676
+ def visit_Text(self, node) -> None:
1677
+ self.out.append(self.encode(node.astext()))
1678
+
1679
+ def depart_Text(self, node) -> None:
1680
+ pass
1681
+
1682
+ def visit_abbreviation(self, node) -> None:
1683
+ node['classes'].insert(0, 'abbreviation')
1684
+ self.visit_inline(node)
1685
+
1686
+ def depart_abbreviation(self, node) -> None:
1687
+ self.depart_inline(node)
1688
+
1689
+ def visit_acronym(self, node) -> None:
1690
+ node['classes'].insert(0, 'acronym')
1691
+ self.visit_inline(node)
1692
+
1693
+ def depart_acronym(self, node) -> None:
1694
+ self.depart_inline(node)
1695
+
1696
+ def visit_address(self, node) -> None:
1697
+ self.insert_newline = True # preserve newlines
1698
+ self.visit_docinfo_item(node)
1699
+
1700
+ def depart_address(self, node) -> None:
1701
+ self.depart_docinfo_item(node)
1702
+ self.insert_newline = False
1703
+
1704
+ def visit_admonition(self, node) -> None:
1705
+ # strip the generic 'admonition' from the list of classes
1706
+ node['classes'] = [cls for cls in node['classes']
1707
+ if cls != 'admonition']
1708
+ if self.settings.legacy_class_functions:
1709
+ self.fallbacks['admonition'] = PreambleCmds.admonition_legacy
1710
+ if 'error' in node['classes']:
1711
+ self.fallbacks['error'] = PreambleCmds.error_legacy
1712
+ self.out.append('\n\\DUadmonition[%s]{'%','.join(node['classes']))
1713
+ return
1714
+ self.provide_fallback('admonition')
1715
+ if 'error' in node['classes']:
1716
+ self.provide_fallback('error')
1717
+ if not isinstance(node, nodes.system_message):
1718
+ self.out += self.ids_to_labels(node, pre_nl=True)
1719
+ self.duclass_open(node)
1720
+ self.out.append('\\begin{DUadmonition}')
1721
+
1722
+ def depart_admonition(self, node) -> None:
1723
+ if self.settings.legacy_class_functions:
1724
+ self.out.append('}\n')
1725
+ return
1726
+ self.out.append('\\end{DUadmonition}\n')
1727
+ self.duclass_close(node)
1728
+
1729
+ def visit_author(self, node) -> None:
1730
+ self.pdfauthor.append(self.attval(node.astext()))
1731
+ if isinstance(node.parent, nodes.authors):
1732
+ # ensure output is one item per <author> element (see depart…)
1733
+ self.push_output_collector([])
1734
+ else:
1735
+ self.visit_docinfo_item(node)
1736
+
1737
+ def depart_author(self, node) -> None:
1738
+ if isinstance(node.parent, nodes.authors):
1739
+ author_name = self.pop_output_collector()
1740
+ self.out.append(''.join(author_name))
1741
+ else:
1742
+ self.depart_docinfo_item(node)
1743
+
1744
+ def visit_authors(self, node) -> None:
1745
+ self.visit_docinfo_item(node)
1746
+
1747
+ def depart_authors(self, node) -> None:
1748
+ self.depart_docinfo_item(node)
1749
+
1750
+ def visit_block_quote(self, node) -> None:
1751
+ self.out += self.ids_to_labels(node, pre_nl=True)
1752
+ self.duclass_open(node)
1753
+ self.out.append('\\begin{quote}')
1754
+
1755
+ def depart_block_quote(self, node) -> None:
1756
+ self.out.append('\\end{quote}\n')
1757
+ self.duclass_close(node)
1758
+
1759
+ def visit_bullet_list(self, node) -> None:
1760
+ self.out += self.ids_to_labels(node, pre_nl=True)
1761
+ self.duclass_open(node)
1762
+ self.out.append('\\begin{itemize}')
1763
+
1764
+ def depart_bullet_list(self, node) -> None:
1765
+ self.out.append('\\end{itemize}\n')
1766
+ self.duclass_close(node)
1767
+
1768
+ def visit_superscript(self, node) -> None:
1769
+ self.out.append(r'\textsuperscript{')
1770
+ self.visit_inline(node)
1771
+
1772
+ def depart_superscript(self, node) -> None:
1773
+ self.depart_inline(node)
1774
+ self.out.append('}')
1775
+
1776
+ def visit_subscript(self, node) -> None:
1777
+ self.out.append(r'\textsubscript{')
1778
+ self.visit_inline(node)
1779
+
1780
+ def depart_subscript(self, node) -> None:
1781
+ self.depart_inline(node)
1782
+ self.out.append('}')
1783
+
1784
+ def visit_caption(self, node) -> None:
1785
+ self.out.append('\\caption{')
1786
+ self.visit_inline(node)
1787
+
1788
+ def depart_caption(self, node) -> None:
1789
+ self.depart_inline(node)
1790
+ self.out.append('}\n')
1791
+
1792
+ def visit_title_reference(self, node) -> None:
1793
+ self.provide_fallback('titlereference')
1794
+ self.out.append(r'\DUroletitlereference{')
1795
+ self.visit_inline(node)
1796
+
1797
+ def depart_title_reference(self, node) -> None:
1798
+ self.depart_inline(node)
1799
+ self.out.append('}')
1800
+
1801
+ def visit_citation(self, node) -> None:
1802
+ if self.use_latex_citations:
1803
+ self.push_output_collector([])
1804
+ else:
1805
+ self.out.append(r'\begin{figure}[b]')
1806
+ self.append_hypertargets(node)
1807
+
1808
+ def depart_citation(self, node) -> None:
1809
+ if self.use_latex_citations:
1810
+ # TODO: normalize label
1811
+ label = self.out[0]
1812
+ text = ''.join(self.out[1:])
1813
+ self._bibitems.append([label, text])
1814
+ self.pop_output_collector()
1815
+ else:
1816
+ self.out.append('\\end{figure}\n')
1817
+
1818
+ def visit_citation_reference(self, node) -> None:
1819
+ if self.bibtex:
1820
+ self._bibitems.append([node.astext()])
1821
+ if self.use_latex_citations:
1822
+ if not self.inside_citation_reference_label:
1823
+ self.out.append(r'\cite{')
1824
+ self.inside_citation_reference_label = True
1825
+ else:
1826
+ assert self.out[-1] in (' ', '\n'), \
1827
+ 'unexpected non-whitespace while in reference label'
1828
+ del self.out[-1]
1829
+ else:
1830
+ href = ''
1831
+ if 'refid' in node:
1832
+ href = node['refid']
1833
+ elif 'refname' in node:
1834
+ href = self.document.nameids[node['refname']]
1835
+ self.out.append('\\hyperlink{%s}{[' % href)
1836
+
1837
+ def depart_citation_reference(self, node) -> None:
1838
+ # TODO: normalize labels
1839
+ if self.use_latex_citations:
1840
+ followup_citation = False
1841
+ # check for a following citation separated by a space or newline
1842
+ sibling = node.next_node(descend=False, siblings=True)
1843
+ if (isinstance(sibling, nodes.Text)
1844
+ and sibling.astext() in (' ', '\n')):
1845
+ sibling2 = sibling.next_node(descend=False, siblings=True)
1846
+ if isinstance(sibling2, nodes.citation_reference):
1847
+ followup_citation = True
1848
+ if followup_citation:
1849
+ self.out.append(',')
1850
+ else:
1851
+ self.out.append('}')
1852
+ self.inside_citation_reference_label = False
1853
+ else:
1854
+ self.out.append(']}')
1855
+
1856
+ def visit_classifier(self, node) -> None:
1857
+ self.out.append('(\\textbf{')
1858
+
1859
+ def depart_classifier(self, node) -> None:
1860
+ self.out.append('})')
1861
+ if node.next_node(nodes.term, descend=False, siblings=True):
1862
+ self.out.append('\n')
1863
+
1864
+ def visit_colspec(self, node) -> None:
1865
+ self.active_table.visit_colspec(node)
1866
+
1867
+ def depart_colspec(self, node) -> None:
1868
+ pass
1869
+
1870
+ def visit_comment(self, node):
1871
+ if not isinstance(node.parent, nodes.compound):
1872
+ self.out.append('\n')
1873
+ # Precede every line with a comment sign, wrap in newlines
1874
+ self.out.append('%% %s\n' % node.astext().replace('\n', '\n% '))
1875
+ raise nodes.SkipNode
1876
+
1877
+ def depart_comment(self, node) -> None:
1878
+ pass
1879
+
1880
+ def visit_compound(self, node) -> None:
1881
+ if isinstance(node.parent, nodes.compound):
1882
+ self.out.append('\n')
1883
+ self.out += self.ids_to_labels(node, pre_nl=True)
1884
+ node['classes'].insert(0, 'compound')
1885
+ self.duclass_open(node)
1886
+
1887
+ def depart_compound(self, node) -> None:
1888
+ self.duclass_close(node)
1889
+
1890
+ def visit_contact(self, node) -> None:
1891
+ self.visit_docinfo_item(node)
1892
+
1893
+ def depart_contact(self, node) -> None:
1894
+ self.depart_docinfo_item(node)
1895
+
1896
+ def visit_container(self, node) -> None:
1897
+ self.out += self.ids_to_labels(node, pre_nl=True)
1898
+ self.duclass_open(node)
1899
+
1900
+ def depart_container(self, node) -> None:
1901
+ self.duclass_close(node)
1902
+
1903
+ def visit_copyright(self, node) -> None:
1904
+ self.visit_docinfo_item(node)
1905
+
1906
+ def depart_copyright(self, node) -> None:
1907
+ self.depart_docinfo_item(node)
1908
+
1909
+ def visit_date(self, node) -> None:
1910
+ self.visit_docinfo_item(node)
1911
+
1912
+ def depart_date(self, node) -> None:
1913
+ self.depart_docinfo_item(node)
1914
+
1915
+ def visit_decoration(self, node) -> None:
1916
+ # header and footer
1917
+ pass
1918
+
1919
+ def depart_decoration(self, node) -> None:
1920
+ pass
1921
+
1922
+ def visit_definition(self, node) -> None:
1923
+ pass
1924
+
1925
+ def depart_definition(self, node) -> None:
1926
+ pass
1927
+
1928
+ def visit_definition_list(self, node) -> None:
1929
+ self.out += self.ids_to_labels(node, pre_nl=True)
1930
+ self.duclass_open(node)
1931
+ self.out.append('\\begin{description}\n')
1932
+
1933
+ def depart_definition_list(self, node) -> None:
1934
+ self.out.append('\\end{description}\n')
1935
+ self.duclass_close(node)
1936
+
1937
+ def visit_definition_list_item(self, node) -> None:
1938
+ self.out += self.ids_to_labels(node, newline=True)
1939
+
1940
+ def depart_definition_list_item(self, node) -> None:
1941
+ if node.next_node(descend=False, siblings=True) is not None:
1942
+ self.out.append('\n') # TODO: just pass?
1943
+
1944
+ def visit_description(self, node) -> None:
1945
+ self.out.append(' ')
1946
+
1947
+ def depart_description(self, node) -> None:
1948
+ pass
1949
+
1950
+ def visit_docinfo(self, node) -> None:
1951
+ self.push_output_collector(self.docinfo)
1952
+
1953
+ def depart_docinfo(self, node) -> None:
1954
+ self.pop_output_collector()
1955
+ # Some itmes (e.g. author) end up at other places
1956
+ if self.docinfo:
1957
+ # tabularx: automatic width of columns, no page breaks allowed.
1958
+ self.requirements['tabularx'] = r'\usepackage{tabularx}'
1959
+ self.provide_fallback('providelength', '_providelength')
1960
+ self.provide_fallback('docinfo')
1961
+ #
1962
+ self.docinfo.insert(0, '\n% Docinfo\n'
1963
+ '\\begin{center}\n'
1964
+ '\\begin{tabularx}{\\DUdocinfowidth}{lX}\n')
1965
+ self.docinfo.append('\\end{tabularx}\n'
1966
+ '\\end{center}\n')
1967
+
1968
+ def visit_docinfo_item(self, node, name=None) -> None:
1969
+ # auxiliary method, called by the visitors of "bibliographic elements"
1970
+ if name is not None:
1971
+ warnings.warn('visit_docinfo_item(): argument "name" is obsolete'
1972
+ ' and will be removed in Docutils 0.24',
1973
+ DeprecationWarning, stacklevel=2)
1974
+ if self.use_latex_docinfo and isinstance(node, self.TITLEDATA_NODES):
1975
+ self.push_output_collector([]) # see depart_docinfo_item()
1976
+ else:
1977
+ label = self.language_label(node.tagname)
1978
+ self.out.append('\\textbf{%s}: &' % label)
1979
+ if isinstance(node, nodes.address):
1980
+ self.out.append(' {\\raggedright\n')
1981
+ elif len(label) + len(node.astext()) > 64:
1982
+ self.out.append('\n ')
1983
+ else:
1984
+ self.out.append(' ')
1985
+ if isinstance(node, nodes.authors):
1986
+ self.push_output_collector([]) # collect author names
1987
+
1988
+ def depart_docinfo_item(self, node) -> None:
1989
+ if self.use_latex_docinfo and isinstance(node, self.TITLEDATA_NODES):
1990
+ # Prepare data for use in `self.make_title()`
1991
+ if isinstance(node, nodes.authors):
1992
+ # join author names with "\and" or,
1993
+ # if there is shared author info, with "\quad"
1994
+ # (cf. https://tex.stackexchange.com/a/11656/288060)
1995
+ s = r' \and '
1996
+ for nn in node.findall(include_self=False, descend=False,
1997
+ siblings=True):
1998
+ if isinstance(nn, (nodes.author, nodes.authors)):
1999
+ break
2000
+ if isinstance(nn, (nodes.address, nodes.contact,
2001
+ nodes.organization)):
2002
+ s = r' \quad '
2003
+ else:
2004
+ s = ''
2005
+ text = s.join(self.pop_output_collector())
2006
+
2007
+ if isinstance(node, nodes.date):
2008
+ self.date.append(text)
2009
+ elif isinstance(node, (nodes.author, nodes.authors)):
2010
+ # Insert author name(s) as first item of an "author info" list,
2011
+ # starting a new list if author name already set:
2012
+ if self.author_stack[-1][0]:
2013
+ self.author_stack.append([text])
2014
+ else:
2015
+ self.author_stack[-1][0] = text
2016
+ else:
2017
+ # Append affiliation & contact info to current "author info".
2018
+ self.author_stack[-1].append(text)
2019
+ else:
2020
+ if isinstance(node, nodes.address):
2021
+ self.out.append('}')
2022
+ elif isinstance(node, nodes.authors):
2023
+ author_names = self.pop_output_collector()
2024
+ # get last "author separator" that is not in any author name
2025
+ for sep in reversed(self.language_module.author_separators):
2026
+ if not any(sep in name for name in author_names):
2027
+ break
2028
+ self.out.append((sep+' ').join(author_names))
2029
+ self.out.append(' \\\\\n')
2030
+
2031
+ def visit_doctest_block(self, node) -> None:
2032
+ self.visit_literal_block(node)
2033
+
2034
+ def depart_doctest_block(self, node) -> None:
2035
+ self.depart_literal_block(node)
2036
+
2037
+ def visit_document(self, node) -> None:
2038
+ # titled document?
2039
+ if self.use_latex_docinfo or isinstance(node.next_node(), nodes.title):
2040
+ protect = (self.settings.documentclass == 'memoir')
2041
+ self.title_labels += self.ids_to_labels(node, set_anchor=False,
2042
+ protect=protect)
2043
+
2044
+ def depart_document(self, node) -> None:
2045
+ # Complete "parts" with information gained from walkabout
2046
+ # * language setup
2047
+ if (self.babel.otherlanguages
2048
+ or self.babel.language not in ('', 'english')):
2049
+ self.requirements['babel'] = self.babel()
2050
+ # * PDF properties
2051
+ self.pdfsetup.append(PreambleCmds.linking % self.hyperref_options)
2052
+ if self.document.get('title', ''):
2053
+ self.pdfinfo.insert(0, ' pdftitle={%s},' %
2054
+ self.encode(self.document.get('title', '')))
2055
+ if self.pdfauthor:
2056
+ authors = (self.author_separator + ' ').join(self.pdfauthor)
2057
+ self.pdfinfo.append(' pdfauthor={%s}' % authors)
2058
+ if self.pdfinfo:
2059
+ self.pdfsetup += [r'\hypersetup{'] + self.pdfinfo + ['}']
2060
+ # * title (including author(s) and date if using "latex_docinfo")
2061
+ if self.title or self.date or self.author_stack != [['']]:
2062
+ self.make_title() # see below
2063
+ # * bibliography
2064
+ if self._bibitems:
2065
+ self.append_bibliogaphy() # see below
2066
+ # * make sure to generate a toc file if needed for local contents:
2067
+ if 'minitoc' in self.requirements and not self.has_latex_toc:
2068
+ self.out.append('\n\\faketableofcontents % for local ToCs\n')
2069
+ # * conditional requirements (before style sheet)
2070
+ self.requirements = [self.requirements[key]
2071
+ for key in sorted(self.requirements.keys())]
2072
+ # * coditional fallback definitions (after style sheet)
2073
+ self.fallbacks = [self.fallbacks[key]
2074
+ for key in sorted(self.fallbacks.keys())]
2075
+
2076
+ def make_title(self) -> None:
2077
+ # Auxiliary function called by `self.depart_document()`.
2078
+ #
2079
+ # The document title is stored in the "titledata" document part.
2080
+ # Date and author info is included with "use_latex_docinfo".
2081
+ # However, we need the ``\title``, ``\author``, and ``\date``
2082
+ # macros even if empty, to prevent errors and/or automatic
2083
+ # display of the current date by ``\maketitle``.
2084
+
2085
+ # \title
2086
+ title_arg = [''.join(self.title)] # ensure len == 1
2087
+ if self.title:
2088
+ title_arg += self.title_labels
2089
+ if self.subtitle:
2090
+ title_arg += [r'\\',
2091
+ r'\DUdocumentsubtitle{%s}' % ''.join(self.subtitle),
2092
+ ] + self.subtitle_labels
2093
+ self.titledata.append(r'\title{%s}' % '%\n '.join(title_arg))
2094
+ # \author
2095
+ # author name(s) and optional affiliation and contact info
2096
+ # cf. https://tex.stackexchange.com/a/377030/288060.
2097
+ authors = ['\\\\\n'.join(filter(None, author_entry))
2098
+ for author_entry in self.author_stack]
2099
+ self.titledata.append(r'\author{%s}' % ' \\and\n'.join(authors))
2100
+ # \date
2101
+ self.titledata.append(r'\date{%s}' % ', '.join(self.date))
2102
+ # \maketitle
2103
+ # Must be in the document body. Append to "body_pre_docinfo" part
2104
+ # so templates may use the "titledata" part in the document preamble.
2105
+ self.body_pre_docinfo.append('\\maketitle\n')
2106
+
2107
+ def append_bibliogaphy(self) -> None:
2108
+ # Add bibliography at end of document.
2109
+ # TODO insertion point should be configurable.
2110
+ # Auxiliary function called by `depart_document`.
2111
+ if self.bibtex:
2112
+ self.out.append('\n\\bibliographystyle{%s}\n' % self.bibtex[0])
2113
+ self.out.append('\\bibliography{%s}\n' % ','.join(self.bibtex[1:]))
2114
+ elif self.use_latex_citations:
2115
+ # TODO: insert citations at point of definition.
2116
+ widest_label = ''
2117
+ for bibitem in self._bibitems:
2118
+ if len(widest_label) < len(bibitem[0]):
2119
+ widest_label = bibitem[0]
2120
+ self.out.append('\n\\begin{thebibliography}{%s}\n' %
2121
+ widest_label)
2122
+ for bibitem in self._bibitems:
2123
+ # cite_key: underscores must not be escaped
2124
+ cite_key = bibitem[0].replace(r'\_', '_')
2125
+ self.out.append('\\bibitem[%s]{%s}{%s}\n' %
2126
+ (bibitem[0], cite_key, bibitem[1]))
2127
+ self.out.append('\\end{thebibliography}\n')
2128
+
2129
+ def visit_emphasis(self, node) -> None:
2130
+ self.out.append('\\emph{')
2131
+ self.visit_inline(node)
2132
+
2133
+ def depart_emphasis(self, node) -> None:
2134
+ self.depart_inline(node)
2135
+ self.out.append('}')
2136
+
2137
+ # Append column delimiters and advance column counter,
2138
+ # if the current cell is a multi-row continuation."""
2139
+ def insert_additional_table_colum_delimiters(self) -> None:
2140
+ while self.active_table.get_rowspan(
2141
+ self.active_table.get_entry_number()):
2142
+ self.out.append(' & ')
2143
+ self.active_table.visit_entry() # increment cell count
2144
+
2145
+ def visit_entry(self, node):
2146
+ # cell separation
2147
+ if self.active_table.get_entry_number() == 0:
2148
+ self.insert_additional_table_colum_delimiters()
2149
+ else:
2150
+ self.out.append(' & ')
2151
+
2152
+ # multirow, multicolumn
2153
+ if 'morerows' in node and 'morecols' in node:
2154
+ raise NotImplementedError('Cells that span multiple rows *and* '
2155
+ 'columns currently not supported '
2156
+ 'by the LaTeX writer')
2157
+ # TODO: should be possible with LaTeX, see e.g.
2158
+ # http://texblog.org/2012/12/21/multi-column-and-multi-row-cells-in-latex-tables/
2159
+ # multirow in LaTeX simply will enlarge the cell over several rows
2160
+ # (the following n if n is positive, the former if negative).
2161
+ if 'morerows' in node:
2162
+ self.requirements['multirow'] = r'\usepackage{multirow}'
2163
+ mrows = node['morerows'] + 1
2164
+ self.active_table.set_rowspan(
2165
+ self.active_table.get_entry_number(), mrows)
2166
+ self.out.append('\\multirow{%d}{%s}{' %
2167
+ (mrows, self.active_table.get_column_width()))
2168
+ self.context.append('}')
2169
+ elif 'morecols' in node:
2170
+ # the vertical bar before column is missing if it is the first
2171
+ # column. the one after always.
2172
+ if self.active_table.get_entry_number() == 0:
2173
+ bar1 = self.active_table.get_vertical_bar()
2174
+ else:
2175
+ bar1 = ''
2176
+ mcols = node['morecols'] + 1
2177
+ self.out.append('\\multicolumn{%d}{%s%s%s}{' %
2178
+ (mcols,
2179
+ bar1,
2180
+ self.active_table.get_multicolumn_width(
2181
+ self.active_table.get_entry_number(), mcols),
2182
+ self.active_table.get_vertical_bar()))
2183
+ self.context.append('}')
2184
+ else:
2185
+ self.context.append('')
2186
+
2187
+ # bold header/stub-column
2188
+ if len(node) and (isinstance(node.parent.parent, nodes.thead)
2189
+ or self.active_table.is_stub_column()):
2190
+ self.out.append('\\textbf{')
2191
+ self.context.append('}')
2192
+ else:
2193
+ self.context.append('')
2194
+
2195
+ # if line ends with '{', mask line break
2196
+ if (not self.active_table.colwidths_auto
2197
+ and self.out[-1].endswith("{")
2198
+ and node.astext()):
2199
+ self.out.append("%")
2200
+
2201
+ self.active_table.visit_entry() # increment cell count
2202
+
2203
+ def depart_entry(self, node) -> None:
2204
+ self.out.append(self.context.pop()) # header / not header
2205
+ self.out.append(self.context.pop()) # multirow/column
2206
+ # insert extra "&"s, if following rows are spanned from above:
2207
+ self.insert_additional_table_colum_delimiters()
2208
+
2209
+ def visit_row(self, node) -> None:
2210
+ self.active_table.visit_row()
2211
+
2212
+ def depart_row(self, node) -> None:
2213
+ self.out.extend(self.active_table.depart_row())
2214
+
2215
+ def visit_enumerated_list(self, node) -> None:
2216
+ # enumeration styles:
2217
+ types = {'': '',
2218
+ 'arabic': 'arabic',
2219
+ 'loweralpha': 'alph',
2220
+ 'upperalpha': 'Alph',
2221
+ 'lowerroman': 'roman',
2222
+ 'upperroman': 'Roman'}
2223
+ # default LaTeX enumeration labels:
2224
+ default_labels = [
2225
+ # (präfix, enumtype, suffix)
2226
+ ('', 'arabic', '.'), # 1.
2227
+ ('(', 'alph', ')'), # (a)
2228
+ ('', 'roman', '.'), # i.
2229
+ ('', 'Alph', '.')] # A.
2230
+
2231
+ prefix = ''
2232
+ if self.compound_enumerators:
2233
+ if (self.section_prefix_for_enumerators and self.section_level
2234
+ and not self._enumeration_counters):
2235
+ prefix = '.'.join(str(n) for n in
2236
+ self._section_number[:self.section_level]
2237
+ ) + self.section_enumerator_separator
2238
+ if self._enumeration_counters:
2239
+ prefix += self._enumeration_counters[-1]
2240
+ prefix += node.get('prefix', '')
2241
+ enumtype = types[node.get('enumtype', 'arabic')]
2242
+ suffix = node.get('suffix', '.')
2243
+
2244
+ enum_level = len(self._enumeration_counters)+1
2245
+ counter_name = 'enum' + RomanNumeral(enum_level).to_lowercase()
2246
+ label = r'%s\%s{%s}%s' % (prefix, enumtype, counter_name, suffix)
2247
+ self._enumeration_counters.append(label)
2248
+
2249
+ self.out += self.ids_to_labels(node, pre_nl=True)
2250
+ self.duclass_open(node)
2251
+ if enum_level <= 4:
2252
+ self.out.append('\\begin{enumerate}')
2253
+ if (prefix, enumtype, suffix) != default_labels[enum_level-1]:
2254
+ self.out.append('\n\\renewcommand{\\label%s}{%s}' %
2255
+ (counter_name, label))
2256
+ else:
2257
+ self.fallbacks[counter_name] = '\\newcounter{%s}' % counter_name
2258
+ self.out.append('\\begin{list}')
2259
+ self.out.append('{%s}' % label)
2260
+ self.out.append('{\\usecounter{%s}}' % counter_name)
2261
+ if 'start' in node:
2262
+ self.out.append('\n\\setcounter{%s}{%d}' %
2263
+ (counter_name, node['start']-1))
2264
+
2265
+ def depart_enumerated_list(self, node) -> None:
2266
+ if len(self._enumeration_counters) <= 4:
2267
+ self.out.append('\\end{enumerate}\n')
2268
+ else:
2269
+ self.out.append('\\end{list}\n')
2270
+ self.duclass_close(node)
2271
+ self._enumeration_counters.pop()
2272
+
2273
+ def visit_field(self, node) -> None:
2274
+ self.out += self.ids_to_labels(node, pre_nl=True)
2275
+ # output is done in field_body, field_name
2276
+
2277
+ def depart_field(self, node) -> None:
2278
+ pass
2279
+
2280
+ def visit_field_body(self, node) -> None:
2281
+ if not isinstance(node.parent.parent, nodes.docinfo):
2282
+ self.out.append(self.term_postfix(node))
2283
+
2284
+ def depart_field_body(self, node) -> None:
2285
+ if self.out is self.docinfo:
2286
+ self.out.append(r'\\'+'\n')
2287
+
2288
+ def visit_field_list(self, node) -> None:
2289
+ self.out += self.ids_to_labels(node, pre_nl=True)
2290
+ self.duclass_open(node)
2291
+ if self.out is not self.docinfo:
2292
+ self.provide_fallback('fieldlist')
2293
+ self.out.append('\\begin{DUfieldlist}')
2294
+
2295
+ def depart_field_list(self, node) -> None:
2296
+ if self.out is not self.docinfo:
2297
+ self.out.append('\\end{DUfieldlist}\n')
2298
+ self.duclass_close(node)
2299
+
2300
+ def visit_field_name(self, node) -> None:
2301
+ if self.out is self.docinfo:
2302
+ self.out.append('\\textbf{')
2303
+ else:
2304
+ # Commands with optional args inside an optional arg must be put
2305
+ # in a group, e.g. ``\item[{\hyperref[label]{text}}]``.
2306
+ self.out.append('\n\\item[{')
2307
+
2308
+ def depart_field_name(self, node) -> None:
2309
+ if self.out is self.docinfo:
2310
+ self.out.append('}: &')
2311
+ else:
2312
+ self.out.append(':}]')
2313
+
2314
+ def visit_figure(self, node) -> None:
2315
+ self.requirements['float'] = PreambleCmds.float
2316
+ self.out += self.ids_to_labels(node, pre_nl=True)
2317
+ self.duclass_open(node)
2318
+ # The 'align' attribute sets the "outer alignment",
2319
+ # for "inner alignment" use LaTeX default alignment (similar to HTML)
2320
+ alignment = node.attributes.get('align', 'center')
2321
+ if alignment != 'center':
2322
+ # The LaTeX "figure" environment always uses the full linewidth,
2323
+ # so "outer alignment" is ignored. Just write a comment.
2324
+ # TODO: use the wrapfigure environment?
2325
+ self.out.append('\\begin{figure} %% align = "%s"' % alignment)
2326
+ else:
2327
+ self.out.append('\\begin{figure}')
2328
+
2329
+ def depart_figure(self, node) -> None:
2330
+ self.out.append('\\end{figure}\n')
2331
+ self.duclass_close(node)
2332
+
2333
+ def visit_footer(self, node) -> None:
2334
+ self.push_output_collector([])
2335
+ self.out.append(r'\newcommand{\DUfooter}{')
2336
+
2337
+ def depart_footer(self, node) -> None:
2338
+ self.out.append('}')
2339
+ self.requirements['~footer'] = ''.join(self.out)
2340
+ self.pop_output_collector()
2341
+
2342
+ def visit_footnote(self, node) -> None:
2343
+ try:
2344
+ backref = node['backrefs'][0]
2345
+ except IndexError:
2346
+ backref = node['ids'][0] # no backref, use self-ref instead
2347
+ if self.docutils_footnotes:
2348
+ self.provide_fallback('footnotes')
2349
+ num = node[0].astext()
2350
+ if self.settings.footnote_references == 'brackets':
2351
+ num = '[%s]' % num
2352
+ self.out.append('%%\n\\DUfootnotetext{%s}{%s}{%s}{' %
2353
+ (node['ids'][0], backref, self.encode(num)))
2354
+ # prevent spurious whitespace if footnote starts with paragraph:
2355
+ if len(node) > 1 and isinstance(node[1], nodes.paragraph):
2356
+ self.out.append('%')
2357
+ # TODO: "real" LaTeX \footnote{}s (see visit_footnotes_reference())
2358
+
2359
+ def depart_footnote(self, node) -> None:
2360
+ self.out.append('}\n')
2361
+
2362
+ def visit_footnote_reference(self, node) -> None:
2363
+ href = ''
2364
+ if 'refid' in node:
2365
+ href = node['refid']
2366
+ elif 'refname' in node:
2367
+ href = self.document.nameids[node['refname']]
2368
+ # if not self.docutils_footnotes:
2369
+ # # TODO: insert footnote content at (or near) this place
2370
+ # # see also docs/dev/todo.rst
2371
+ # try:
2372
+ # referenced_node = self.document.ids[node['refid']]
2373
+ # except (AttributeError, KeyError):
2374
+ # self.document.reporter.error(
2375
+ # 'unresolved footnote-reference %s' % node)
2376
+ # print('footnote-ref to %s' % referenced_node)
2377
+ format = self.settings.footnote_references
2378
+ if format == 'brackets':
2379
+ self.append_hypertargets(node)
2380
+ self.out.append('\\hyperlink{%s}{[' % href)
2381
+ self.context.append(']}')
2382
+ else:
2383
+ self.provide_fallback('footnotes')
2384
+ self.out.append(r'\DUfootnotemark{%s}{%s}{' %
2385
+ (node['ids'][0], href))
2386
+ self.context.append('}')
2387
+
2388
+ def depart_footnote_reference(self, node) -> None:
2389
+ self.out.append(self.context.pop())
2390
+
2391
+ # footnote/citation label
2392
+ def label_delim(self, node, bracket, superscript):
2393
+ if isinstance(node.parent, nodes.footnote):
2394
+ raise nodes.SkipNode
2395
+ else:
2396
+ assert isinstance(node.parent, nodes.citation)
2397
+ if not self.use_latex_citations:
2398
+ self.out.append(bracket)
2399
+
2400
+ def visit_label(self, node) -> None:
2401
+ """footnote or citation label: in brackets or as superscript"""
2402
+ self.label_delim(node, '[', '\\textsuperscript{')
2403
+
2404
+ def depart_label(self, node) -> None:
2405
+ self.label_delim(node, ']', '}')
2406
+
2407
+ # elements generated by the framework e.g. section numbers.
2408
+ def visit_generated(self, node) -> None:
2409
+ pass
2410
+
2411
+ def depart_generated(self, node) -> None:
2412
+ pass
2413
+
2414
+ def visit_header(self, node) -> None:
2415
+ self.push_output_collector([])
2416
+ self.out.append(r'\newcommand{\DUheader}{')
2417
+
2418
+ def depart_header(self, node) -> None:
2419
+ self.out.append('}')
2420
+ self.requirements['~header'] = ''.join(self.out)
2421
+ self.pop_output_collector()
2422
+
2423
+ def to_latex_length(self, length_str, node=None) -> str:
2424
+ """Convert "measure" `length_str` to LaTeX length specification.
2425
+
2426
+ Note: the default length unit will change from "bp"
2427
+ (Postscript point) to "px" in Docutils 1.0.
2428
+ """
2429
+ value, unit = nodes.parse_measure(length_str)
2430
+ if unit in ('em', 'ex', 'cm', 'mm', 'in', 'pc', 'px',
2431
+ 'bp', 'cc', 'dd', 'sp', 'mu'): # TeX unit == CSS unit
2432
+ return length_str
2433
+ if unit in ('', 'pt'): # no unit or "Postscript points"
2434
+ return f'{value}bp' # LaTeX uses symbol "bp"
2435
+ if unit == 'Q':
2436
+ return f'{value/4}mm'
2437
+ if unit == '%': # percentage: relate to current line width
2438
+ return f'{value/100:g}\\linewidth'
2439
+ if unit == 'vw': # viewport width: relate to page width
2440
+ return f'{value/100:g}\\paperwidth'
2441
+ if unit == 'vh': # viewport height: relate to page height
2442
+ return f'{value/100:g}\\paperheight'
2443
+ # emulate with macro modelled on pdfLaTeX's \pdfpxdimen
2444
+ if not hasattr(PreambleCmds, unit):
2445
+ self.warn(f'Unit "{unit}" not supported by LaTeX.\n'
2446
+ f' Define lenght "\\DU{unit}dimen" in preamble,'
2447
+ ' raw LaTeX, or custom stylesheet.',
2448
+ base_node=node)
2449
+ elif unit == 'ch':
2450
+ self.fallbacks['ch'] = PreambleCmds.ch
2451
+ else:
2452
+ self.provide_fallback('providelength', '_providelength')
2453
+ self.provide_fallback(unit)
2454
+ return f'{value}\\DU{unit}dimen'
2455
+
2456
+ def visit_image(self, node) -> None:
2457
+ # <image> can be inline element, body element, or nested in a <figure>
2458
+ # in all three cases the <image> may also be nested in a <reference>
2459
+ # TODO: "classes" attribute currently ignored!
2460
+ self.requirements['graphicx'] = self.graphicx_package
2461
+ attrs = node.attributes
2462
+ # convert image URI to filesystem path, do not adjust relative path:
2463
+ imagepath = self.uri2path(attrs['uri'], output_path='')
2464
+ # alignment defaults:
2465
+ if 'align' not in attrs:
2466
+ # Set default align of image in a figure to 'center'
2467
+ if (isinstance(node.parent, nodes.figure)
2468
+ or isinstance(node.parent, nodes.reference)
2469
+ and isinstance(node.parent.parent, nodes.figure)):
2470
+ attrs['align'] = 'center'
2471
+ self.set_align_from_classes(node)
2472
+ # pre- and postfix (prefix inserted in reverse order)
2473
+ pre = []
2474
+ post = []
2475
+ include_graphics_options = []
2476
+ if isinstance(node.parent, nodes.reference):
2477
+ pre.append(self.out.pop()) # move \href behind alignment code
2478
+ align_codes = {
2479
+ # inline images: by default latex aligns the bottom.
2480
+ 'bottom': ('', ''),
2481
+ 'middle': (r'\raisebox{-0.5\height}{', '}'),
2482
+ 'top': (r'\raisebox{-\height}{', '}'),
2483
+ # block level images:
2484
+ 'center': (r'\noindent\makebox[\linewidth][c]{', '}'),
2485
+ 'left': (r'\noindent{', r'\hfill}'),
2486
+ 'right': (r'\noindent{\hfill', '}'),
2487
+ }
2488
+ if 'align' in attrs:
2489
+ # TODO: warn or ignore non-applicable alignment settings?
2490
+ try:
2491
+ align_code = align_codes[attrs['align']]
2492
+ pre.append(align_code[0])
2493
+ post.append(align_code[1])
2494
+ except KeyError:
2495
+ pass # TODO: warn?
2496
+ if 'height' in attrs:
2497
+ include_graphics_options.append(
2498
+ f"height={self.to_latex_length(attrs['height'], node)}")
2499
+ if 'scale' in attrs:
2500
+ include_graphics_options.append(f"scale={attrs['scale']/100:g}")
2501
+ if 'width' in attrs:
2502
+ include_graphics_options.append(
2503
+ f"width={self.to_latex_length(attrs['width'], node)}")
2504
+ pre.append(''.join(self.ids_to_labels(node, newline=True)))
2505
+ if not (self.is_inline(node)
2506
+ or isinstance(node.parent, nodes.compound)):
2507
+ pre.append('\n')
2508
+ if not self.is_inline(node):
2509
+ post.append('\n')
2510
+ pre.reverse()
2511
+ # now insert image code
2512
+ self.out.extend(pre)
2513
+ if imagepath.suffix == '.svg' and 'svg' in self.settings.stylesheet:
2514
+ cmd = 'includesvg'
2515
+ else:
2516
+ cmd = 'includegraphics'
2517
+ options = ''
2518
+ if include_graphics_options:
2519
+ options = f"[{','.join(include_graphics_options)}]"
2520
+ self.out.append(f'\\{cmd}{options}{{{imagepath.as_posix()}}}')
2521
+ self.out.extend(post)
2522
+
2523
+ def depart_image(self, node) -> None:
2524
+ pass
2525
+
2526
+ def visit_inline(self, node) -> None:
2527
+ # This function is also called by the visiting functions for
2528
+ # specific inline elements, <caption>, and <paragraph>.
2529
+
2530
+ # Handle "ids" attribute:
2531
+ # do we need a \phantomsection?
2532
+ anchor_nodes = (nodes.caption, nodes.subtitle, nodes.title)
2533
+ set_anchor = not (isinstance(node.parent, anchor_nodes)
2534
+ or isinstance(node, anchor_nodes))
2535
+ add_newline = isinstance(node, nodes.paragraph)
2536
+ self.out += self.ids_to_labels(node, set_anchor, newline=add_newline)
2537
+ # Handle "classes" attribute:
2538
+ for cls in node['classes']:
2539
+ if cls.startswith('language-'):
2540
+ language = self.babel.language_name(cls[9:])
2541
+ if language:
2542
+ self.babel.otherlanguages[language] = True
2543
+ self.out.append(r'\foreignlanguage{%s}{' % language)
2544
+ else:
2545
+ self.provide_fallback('inline')
2546
+ self.out.append(r'\DUrole{%s}{' % cls)
2547
+
2548
+ def depart_inline(self, node) -> None:
2549
+ self.out.append('}' * len(node['classes']))
2550
+
2551
+ def visit_legend(self, node) -> None:
2552
+ self.provide_fallback('legend')
2553
+ self.out.append('\\begin{DUlegend}')
2554
+
2555
+ def depart_legend(self, node) -> None:
2556
+ self.out.append('\\end{DUlegend}\n')
2557
+
2558
+ def visit_line(self, node) -> None:
2559
+ self.out.append(r'\item[] ')
2560
+
2561
+ def depart_line(self, node) -> None:
2562
+ self.out.append('\n')
2563
+
2564
+ def visit_line_block(self, node) -> None:
2565
+ self.provide_fallback('providelength', '_providelength')
2566
+ self.provide_fallback('lineblock')
2567
+ self.set_align_from_classes(node)
2568
+ if isinstance(node.parent, nodes.line_block):
2569
+ self.out.append('\\item[]\n'
2570
+ '\\begin{DUlineblock}{\\DUlineblockindent}\n')
2571
+ # In rST, nested line-blocks cannot be given class arguments
2572
+ else:
2573
+ self.out += self.ids_to_labels(node, pre_nl=True)
2574
+ self.duclass_open(node)
2575
+ self.out.append('\\begin{DUlineblock}{0em}\n')
2576
+ self.insert_align_declaration(node)
2577
+
2578
+ def depart_line_block(self, node) -> None:
2579
+ self.out.append('\\end{DUlineblock}\n')
2580
+ self.duclass_close(node)
2581
+
2582
+ def visit_list_item(self, node) -> None:
2583
+ self.out += self.ids_to_labels(node, pre_nl=True)
2584
+ self.out.append('\n\\item ')
2585
+
2586
+ def depart_list_item(self, node) -> None:
2587
+ pass
2588
+
2589
+ def visit_literal(self, node) -> None:
2590
+ self.literal = True
2591
+ if ('code' in node['classes']
2592
+ and self.settings.syntax_highlight != 'none'):
2593
+ self.requirements['color'] = PreambleCmds.color
2594
+ self.provide_fallback('highlight_rules', 'code')
2595
+ self.out.append('\\texttt{')
2596
+ self.visit_inline(node)
2597
+
2598
+ def depart_literal(self, node) -> None:
2599
+ self.literal = False
2600
+ self.depart_inline(node)
2601
+ self.out.append('}')
2602
+
2603
+ # Literal blocks are used for '::'-prefixed literal-indented
2604
+ # blocks of text, where the inline markup is not recognized,
2605
+ # but are also the product of the "parsed-literal" directive,
2606
+ # where the markup is respected.
2607
+ #
2608
+ # In both cases, we want to use a typewriter/monospaced typeface.
2609
+ # For "real" literal-blocks, we can use \verbatim, while for all
2610
+ # the others we must use \ttfamily and \raggedright.
2611
+ #
2612
+ # We can distinguish between the two kinds by the number of
2613
+ # siblings that compose this node: if it is composed by a
2614
+ # single element, it's either
2615
+ # * a real one,
2616
+ # * a parsed-literal that does not contain any markup, or
2617
+ # * a parsed-literal containing just one markup construct.
2618
+ def is_plaintext(self, node):
2619
+ """Check whether a node can be typeset verbatim"""
2620
+ return (len(node) == 1) and isinstance(node[0], nodes.Text)
2621
+
2622
+ def visit_literal_block(self, node) -> None:
2623
+ """Render a literal block.
2624
+
2625
+ Corresponding rST elements: literal block, parsed-literal, code.
2626
+ """
2627
+ packages = {'lstlisting': '\\usepackage{listings}\n'
2628
+ '\\lstset{xleftmargin=\\leftmargin}',
2629
+ 'listing': r'\usepackage{moreverb}',
2630
+ 'Verbatim': r'\usepackage{fancyvrb}',
2631
+ 'verbatimtab': r'\usepackage{moreverb}',
2632
+ }
2633
+
2634
+ literal_env = self.literal_block_env
2635
+
2636
+ # Check, if it is possible to use a literal-block environment
2637
+ _plaintext = self.is_plaintext(node)
2638
+ _in_table = self.active_table.is_open()
2639
+ # TODO: fails if normal text precedes the literal block.
2640
+ # Check parent node instead?
2641
+ _autowidth_table = _in_table and self.active_table.colwidths_auto
2642
+ _no_env_nodes = (nodes.footnote, nodes.sidebar)
2643
+ if self.settings.legacy_class_functions:
2644
+ _no_env_nodes += (nodes.admonition, nodes.system_message)
2645
+ _use_env = _plaintext and not isinstance(node.parent, _no_env_nodes)
2646
+ _use_listings = (literal_env == 'lstlisting') and _use_env
2647
+
2648
+ # Labels and classes:
2649
+ self.out += self.ids_to_labels(node, pre_nl=True)
2650
+ self.duclass_open(node)
2651
+ # Highlight code?
2652
+ if (not _plaintext
2653
+ and 'code' in node['classes']
2654
+ and self.settings.syntax_highlight != 'none'):
2655
+ self.requirements['color'] = PreambleCmds.color
2656
+ self.provide_fallback('highlight_rules', 'code')
2657
+ # Wrap?
2658
+ if _in_table and _use_env and not _autowidth_table:
2659
+ # Wrap in minipage to prevent extra vertical space
2660
+ # with alltt and verbatim-like environments:
2661
+ self.fallbacks['ttem'] = PreambleCmds.ttem
2662
+ self.out.append(
2663
+ '\\begin{minipage}{%d\\ttemwidth}\n' %
2664
+ (max(len(line) for line in node.astext().split('\n'))))
2665
+ self.context.append('\n\\end{minipage}\n')
2666
+ elif not _in_table and not _use_listings:
2667
+ # Wrap in quote to set off vertically and indent
2668
+ self.out.append('\\begin{quote}\n')
2669
+ self.context.append('\n\\end{quote}\n')
2670
+ else:
2671
+ self.context.append('\n')
2672
+
2673
+ # Use verbatim-like environment, if defined and possible
2674
+ # (in an auto-width table, only listings works):
2675
+ if literal_env and _use_env and (not _autowidth_table
2676
+ or _use_listings):
2677
+ try:
2678
+ self.requirements['literal_block'] = packages[literal_env]
2679
+ except KeyError:
2680
+ pass
2681
+ self.verbatim = True
2682
+ if _in_table and _use_listings:
2683
+ self.out.append('\\lstset{xleftmargin=0pt}\n')
2684
+ self.out.append('\\begin{%s}%s\n' %
2685
+ (literal_env, self.literal_block_options))
2686
+ self.context.append('\n\\end{%s}' % literal_env)
2687
+ elif _use_env and not _autowidth_table:
2688
+ self.alltt = True
2689
+ self.requirements['alltt'] = r'\usepackage{alltt}'
2690
+ self.out.append('\\begin{alltt}\n')
2691
+ self.context.append('\n\\end{alltt}')
2692
+ else:
2693
+ self.literal = True
2694
+ self.insert_newline = True
2695
+ self.insert_non_breaking_blanks = True
2696
+ # \raggedright ensures leading blanks are respected but
2697
+ # leads to additional leading vspace if the first line
2698
+ # of the block is overfull :-(
2699
+ self.out.append('\\ttfamily\\raggedright\n')
2700
+ self.context.append('')
2701
+
2702
+ def depart_literal_block(self, node) -> None:
2703
+ self.insert_non_breaking_blanks = False
2704
+ self.insert_newline = False
2705
+ self.literal = False
2706
+ self.verbatim = False
2707
+ self.alltt = False
2708
+ self.out.append(self.context.pop())
2709
+ self.out.append(self.context.pop())
2710
+ self.duclass_close(node)
2711
+
2712
+ def visit_meta(self, node) -> None:
2713
+ if 'name' not in node or 'content' not in node:
2714
+ raise nodes.SkipNode # HTML specific or empty metadata
2715
+ # TODO: Filter nodes with additional fields ("lang", "http-equiv", …)?
2716
+ # They are HTML-specific and may override equally named keys.
2717
+ # Only if name already present? See also ODT writer.
2718
+ name = node['name']
2719
+ content = self.encode(node['content'])
2720
+ if name in ('author', 'keywords', 'producer', 'subject', 'title'):
2721
+ # fields with dedicated hyperref options:
2722
+ self.pdfinfo.append(' pdf%s={%s},'%(name, content))
2723
+ elif name == 'creator':
2724
+ self.pdfinfo.append(' addtopdfcreator={%s},'%content)
2725
+ else:
2726
+ # generic interface (case sensitive!)
2727
+ self.pdfinfo.append(' pdfinfo={%s={%s}},'%(name, content))
2728
+
2729
+ def depart_meta(self, node) -> None:
2730
+ pass
2731
+
2732
+ def visit_math(self, node, math_env='$') -> None:
2733
+ """
2734
+ Provisional: the `math_env` argument will be dropped in Docutils 2.0.
2735
+ """
2736
+ self.requirements['amsmath'] = r'\usepackage{amsmath}'
2737
+ self.visit_inline(node)
2738
+ math_code = node.astext().translate(unichar2tex.uni2tex_table)
2739
+ if self.alltt:
2740
+ self.out += ['\\(', math_code, '\\)']
2741
+ else:
2742
+ self.out += ['$', math_code, '$']
2743
+ self.depart_inline(node)
2744
+ raise nodes.SkipNode # content already processed
2745
+
2746
+ def depart_math(self, node) -> None:
2747
+ pass # never reached
2748
+
2749
+ def visit_math_block(self, node) -> None:
2750
+ self.requirements['amsmath'] = r'\usepackage{amsmath}'
2751
+ math_env = pick_math_environment(node.astext())
2752
+ self.out.append('%\n')
2753
+ if node['ids'] and math_env.endswith('*'): # non-numbered equation
2754
+ self.out.append('\\phantomsection\n')
2755
+ for cls in node['classes']:
2756
+ self.provide_fallback('inline')
2757
+ self.out.append(f'\\DUrole{{{cls}}}{{%\n')
2758
+ self.out += [f'\\begin{{{math_env}}}\n',
2759
+ node.astext().translate(unichar2tex.uni2tex_table),
2760
+ '\n',
2761
+ *self.ids_to_labels(node, set_anchor=False, newline=True),
2762
+ f'\\end{{{math_env}}}']
2763
+ if node['classes']:
2764
+ self.out.append('\n' + '}' * len(node['classes']))
2765
+ raise nodes.SkipNode # content already processed
2766
+
2767
+ def depart_math_block(self, node) -> None:
2768
+ pass # never reached
2769
+
2770
+ def visit_option(self, node) -> None:
2771
+ if self.context[-1]:
2772
+ # this is not the first option
2773
+ self.out.append(', ')
2774
+
2775
+ def depart_option(self, node) -> None:
2776
+ # flag that the first option is done.
2777
+ self.context[-1] += 1
2778
+
2779
+ def visit_option_argument(self, node) -> None:
2780
+ """Append the delimiter between an option and its argument to body."""
2781
+ self.out.append(node.get('delimiter', ' '))
2782
+
2783
+ def depart_option_argument(self, node) -> None:
2784
+ pass
2785
+
2786
+ def visit_option_group(self, node) -> None:
2787
+ self.out.append('\\item[')
2788
+ # flag for first option
2789
+ self.context.append(0)
2790
+
2791
+ def depart_option_group(self, node) -> None:
2792
+ self.context.pop() # the flag
2793
+ self.out.append('] ')
2794
+
2795
+ def visit_option_list(self, node) -> None:
2796
+ self.provide_fallback('providelength', '_providelength')
2797
+ self.provide_fallback('optionlist')
2798
+ self.out += self.ids_to_labels(node, pre_nl=True)
2799
+ self.duclass_open(node)
2800
+ self.out.append('\\begin{DUoptionlist}\n')
2801
+
2802
+ def depart_option_list(self, node) -> None:
2803
+ self.out.append('\\end{DUoptionlist}\n')
2804
+ self.duclass_close(node)
2805
+
2806
+ def visit_option_list_item(self, node) -> None:
2807
+ self.out += self.ids_to_labels(node, newline=True)
2808
+
2809
+ def depart_option_list_item(self, node) -> None:
2810
+ pass
2811
+
2812
+ def visit_option_string(self, node) -> None:
2813
+ ## self.out.append(self.starttag(node, 'span', '', CLASS='option'))
2814
+ pass
2815
+
2816
+ def depart_option_string(self, node) -> None:
2817
+ ## self.out.append('</span>')
2818
+ pass
2819
+
2820
+ def visit_organization(self, node) -> None:
2821
+ self.visit_docinfo_item(node)
2822
+
2823
+ def depart_organization(self, node) -> None:
2824
+ self.depart_docinfo_item(node)
2825
+
2826
+ def visit_paragraph(self, node) -> None:
2827
+ # insert blank line, unless
2828
+ # * the paragraph is first in a list item, compound, or container
2829
+ # * follows a non-paragraph node in a compound,
2830
+ # * is in a table with auto-width columns
2831
+ index = node.parent.index(node)
2832
+ if index == 0 and isinstance(node.parent,
2833
+ (nodes.list_item, nodes.description,
2834
+ nodes.compound, nodes.container)):
2835
+ pass
2836
+ elif (index > 0
2837
+ and isinstance(node.parent, nodes.compound)
2838
+ and not isinstance(node.parent[index - 1],
2839
+ (nodes.paragraph, nodes.compound))):
2840
+ pass
2841
+ elif self.active_table.colwidths_auto:
2842
+ if index == 1: # second paragraph
2843
+ self.warn('LaTeX merges paragraphs in tables '
2844
+ 'with auto-sized columns!', base_node=node)
2845
+ if index > 0:
2846
+ self.out.append('\n')
2847
+ else:
2848
+ self.out.append('\n')
2849
+ self.visit_inline(node)
2850
+
2851
+ def depart_paragraph(self, node) -> None:
2852
+ self.depart_inline(node)
2853
+ if not self.active_table.colwidths_auto:
2854
+ self.out.append('\n')
2855
+
2856
+ def visit_problematic(self, node) -> None:
2857
+ self.requirements['color'] = PreambleCmds.color
2858
+ self.out.append('%\n')
2859
+ self.append_hypertargets(node)
2860
+ self.out.append(r'\hyperlink{%s}{\textbf{\color{red}' % node['refid'])
2861
+
2862
+ def depart_problematic(self, node) -> None:
2863
+ self.out.append('}}')
2864
+
2865
+ def visit_raw(self, node):
2866
+ if 'latex' not in node.get('format', '').split():
2867
+ raise nodes.SkipNode
2868
+ if not (self.is_inline(node)
2869
+ or isinstance(node.parent, nodes.compound)):
2870
+ self.out.append('\n')
2871
+ self.visit_inline(node)
2872
+ # append "as-is" skipping any LaTeX-encoding
2873
+ self.verbatim = True
2874
+
2875
+ def depart_raw(self, node) -> None:
2876
+ self.verbatim = False
2877
+ self.depart_inline(node)
2878
+ if not self.is_inline(node):
2879
+ self.out.append('\n')
2880
+
2881
+ def has_unbalanced_braces(self, string):
2882
+ """Test whether there are unmatched '{' or '}' characters."""
2883
+ level = 0
2884
+ for ch in string:
2885
+ if ch == '{':
2886
+ level += 1
2887
+ if ch == '}':
2888
+ level -= 1
2889
+ if level < 0:
2890
+ return True
2891
+ return level != 0
2892
+
2893
+ def visit_reference(self, node):
2894
+ # We need to escape #, \, and % if we use the URL in a command.
2895
+ special_chars = {ord('#'): '\\#',
2896
+ ord('%'): '\\%',
2897
+ ord('\\'): '\\\\',
2898
+ }
2899
+ if not self.is_inline(node):
2900
+ self.out.append('\n')
2901
+ # external reference (URL)
2902
+ if 'refuri' in node:
2903
+ href = str(node['refuri']).translate(special_chars)
2904
+ # problematic chars double caret and unbalanced braces:
2905
+ if '^^' in href or self.has_unbalanced_braces(href):
2906
+ self.error(
2907
+ f'External link "{href}" not supported by LaTeX.\n'
2908
+ ' (Must not contain "^^" or unbalanced braces.)')
2909
+ if node['refuri'] == node.astext():
2910
+ self.out.append(r'\url{%s}' % href)
2911
+ raise nodes.SkipNode
2912
+ self.out.append(r'\href{%s}{' % href)
2913
+ return
2914
+ # internal reference
2915
+ if 'refid' in node:
2916
+ href = node['refid']
2917
+ elif 'refname' in node:
2918
+ href = self.document.nameids[node['refname']]
2919
+ else:
2920
+ raise AssertionError('Unknown reference.')
2921
+ if self.reference_label:
2922
+ self.out.append('\\%s{%s}' %
2923
+ (self.reference_label, href.replace('#', '')))
2924
+ raise nodes.SkipNode
2925
+ self.out.append('\\hyperref[%s]{' % href)
2926
+
2927
+ def depart_reference(self, node) -> None:
2928
+ self.out.append('}')
2929
+ if not self.is_inline(node):
2930
+ self.out.append('\n')
2931
+
2932
+ def visit_revision(self, node) -> None:
2933
+ self.visit_docinfo_item(node)
2934
+
2935
+ def depart_revision(self, node) -> None:
2936
+ self.depart_docinfo_item(node)
2937
+
2938
+ def visit_rubric(self, node) -> None:
2939
+ self.provide_fallback('rubric')
2940
+ # class wrapper would interfere with ``\section*"`` type commands
2941
+ # (spacing/indent of first paragraph)
2942
+ self.out += self.ids_to_labels(node, pre_nl=True)
2943
+ self.duclass_open(node)
2944
+ self.out.append('\\DUrubric{')
2945
+
2946
+ def depart_rubric(self, node) -> None:
2947
+ self.out.append('}\n')
2948
+ self.duclass_close(node)
2949
+
2950
+ def visit_section(self, node) -> None:
2951
+ # Update counter-prefix for compound enumerators
2952
+ self.section_level += 1
2953
+ # initialize counter for potential subsections
2954
+ self._section_number.append(0)
2955
+ # counter for this section's level (initialized by parent section)
2956
+ self._section_number[self.section_level - 1] += 1
2957
+
2958
+ # Section numbering configuration
2959
+ if 'sectnum' in self.requirements:
2960
+ return # already done
2961
+ # sectnum_depth values:
2962
+ # 0 no section numbering or section numbering by Docutils
2963
+ # >0 value of "sectnum"'s :depth: option (1 = top level section)
2964
+ # None "sectnum" directive without depth arg -> keep default
2965
+ if self.settings.sectnum_xform: # section numbering by Docutils
2966
+ sectnum_depth = 0 # suppress LaTeX section numbers
2967
+ else:
2968
+ sectnum_depth = getattr(self.settings, 'sectnum_depth', 0)
2969
+ if isinstance(sectnum_depth, str):
2970
+ sectnum_depth = 0 # ignore values from config files
2971
+ sectnum_start = getattr(self.settings, 'sectnum_start', 1)
2972
+ if isinstance(sectnum_start, str):
2973
+ sectnum_start = 1 # ignore values from config files
2974
+ if sectnum_start != 1:
2975
+ self.requirements['sectnum_start'] = r'\setcounter{%s}{%d}' % (
2976
+ self.d_class.sections[0], sectnum_start-1)
2977
+ # TODO: currently ignored (configure in a stylesheet):
2978
+ # settings.sectnum_prefix
2979
+ # settings.sectnum_suffix
2980
+ if sectnum_depth is not None:
2981
+ self.requirements['sectnum'] = r'\setcounter{secnumdepth}{%d}' % (
2982
+ self.d_class.latex_section_depth(sectnum_depth))
2983
+
2984
+ def depart_section(self, node) -> None:
2985
+ # Remove counter for potential subsections:
2986
+ self._section_number.pop()
2987
+ self.section_level -= 1
2988
+
2989
+ def visit_sidebar(self, node) -> None:
2990
+ self.out += self.ids_to_labels(node, pre_nl=True)
2991
+ self.duclass_open(node)
2992
+ self.requirements['color'] = PreambleCmds.color
2993
+ self.provide_fallback('sidebar')
2994
+ self.out.append('\\DUsidebar{')
2995
+
2996
+ def depart_sidebar(self, node) -> None:
2997
+ self.out.append('}\n')
2998
+ self.duclass_close(node)
2999
+
3000
+ attribution_formats = {'dash': ('—', ''), # EM DASH
3001
+ 'parentheses': ('(', ')'),
3002
+ 'parens': ('(', ')'),
3003
+ 'none': ('', '')}
3004
+
3005
+ def visit_attribution(self, node) -> None:
3006
+ prefix, suffix = self.attribution_formats[self.settings.attribution]
3007
+ self.out.append('\\nopagebreak\n')
3008
+ self.out += self.ids_to_labels(node, pre_nl=True)
3009
+ self.duclass_open(node)
3010
+ self.out.append(f'\\raggedleft {prefix}')
3011
+ self.context.append(suffix)
3012
+
3013
+ def depart_attribution(self, node) -> None:
3014
+ self.out.append(self.context.pop() + '\n')
3015
+ self.duclass_close(node)
3016
+
3017
+ def visit_status(self, node) -> None:
3018
+ self.visit_docinfo_item(node)
3019
+
3020
+ def depart_status(self, node) -> None:
3021
+ self.depart_docinfo_item(node)
3022
+
3023
+ def visit_strong(self, node) -> None:
3024
+ self.out.append('\\textbf{')
3025
+ self.visit_inline(node)
3026
+
3027
+ def depart_strong(self, node) -> None:
3028
+ self.depart_inline(node)
3029
+ self.out.append('}')
3030
+
3031
+ def visit_substitution_definition(self, node):
3032
+ raise nodes.SkipNode
3033
+
3034
+ def visit_substitution_reference(self, node) -> None:
3035
+ self.unimplemented_visit(node)
3036
+
3037
+ def visit_subtitle(self, node) -> None:
3038
+ if isinstance(node.parent, nodes.document):
3039
+ self.push_output_collector(self.subtitle)
3040
+ self.provide_fallback('documentsubtitle')
3041
+ protect = (self.settings.documentclass == 'memoir')
3042
+ self.subtitle_labels += self.ids_to_labels(node, set_anchor=False,
3043
+ protect=protect)
3044
+ # section subtitle: "starred" (no number, not in ToC)
3045
+ elif isinstance(node.parent, nodes.section):
3046
+ self.out.append(r'\%s*{' %
3047
+ self.d_class.section(self.section_level + 1))
3048
+ else:
3049
+ self.provide_fallback('subtitle')
3050
+ self.out.append('\n\\DUsubtitle{')
3051
+
3052
+ def depart_subtitle(self, node) -> None:
3053
+ if isinstance(node.parent, nodes.document):
3054
+ self.pop_output_collector()
3055
+ else:
3056
+ self.out.append('}\n')
3057
+
3058
+ def visit_system_message(self, node) -> None:
3059
+ self.requirements['color'] = PreambleCmds.color
3060
+ self.provide_fallback('title')
3061
+ if self.settings.legacy_class_functions:
3062
+ self.fallbacks['title'] = PreambleCmds.title_legacy
3063
+ node['classes'] = ['system-message']
3064
+ self.out.append('\n')
3065
+ self.append_hypertargets(node)
3066
+ self.visit_admonition(node)
3067
+ if self.settings.legacy_class_functions:
3068
+ self.out.append('\n\\DUtitle[system-message]'
3069
+ '{\\color{red}System Message}\n')
3070
+ else:
3071
+ self.out.append('\n\\DUtitle{\\color{red}System Message}\n')
3072
+ try:
3073
+ line = f", line~{node['line']}"
3074
+ except KeyError:
3075
+ line = ''
3076
+ self.out.append(f"\n{node['type']}/{node['level']} in "
3077
+ f"\\texttt{{{self.encode(node['source'])}}}{line}\n")
3078
+ if len(node['backrefs']) == 1:
3079
+ self.out.append(f"\n\\hyperlink{{{node['backrefs'][0]}}}{{")
3080
+ self.context.append('}\n')
3081
+ else:
3082
+ backrefs = [f'\\hyperlink{{{href}}}{{{i+1}}}\n'
3083
+ for (i, href) in enumerate(node['backrefs'])]
3084
+ self.context.append('backrefs: ' + ' '.join(backrefs))
3085
+
3086
+ def depart_system_message(self, node) -> None:
3087
+ self.out.append(self.context.pop())
3088
+ self.depart_admonition(node)
3089
+
3090
+ def visit_table(self, node) -> None:
3091
+ self.requirements['table'] = PreambleCmds.table
3092
+ if not self.settings.legacy_column_widths:
3093
+ self.requirements['table1'] = PreambleCmds.table_columnwidth
3094
+ if self.active_table.is_open():
3095
+ self.table_stack.append(self.active_table)
3096
+ # nesting longtable does not work (e.g. 2007-04-18)
3097
+ self.active_table = Table(self, 'tabular')
3098
+ # A longtable moves before \paragraph and \subparagraph
3099
+ # section titles if it immediately follows them:
3100
+ if (self.active_table._latex_type == 'longtable'
3101
+ and isinstance(node.parent, nodes.section)
3102
+ and node.parent.index(node) == 1
3103
+ and 'paragraph' in self.d_class.section(self.section_level)):
3104
+ self.out.append('\\leavevmode')
3105
+ self.active_table.open()
3106
+ self.active_table.set_table_style(node, self.settings)
3107
+ if self.active_table.borders == 'booktabs':
3108
+ self.requirements['booktabs'] = r'\usepackage{booktabs}'
3109
+ self.push_output_collector([])
3110
+
3111
+ def depart_table(self, node) -> None:
3112
+ # complete and write the table
3113
+ content = self.pop_output_collector()
3114
+ try:
3115
+ width = self.to_latex_length(node['width'], node)
3116
+ except KeyError:
3117
+ width = r'\linewidth'
3118
+ # Insert hyperlabel and anchor before the table
3119
+ # if it has no caption/title.
3120
+ # See visit_thead() for tables with caption.
3121
+ if not self.active_table.caption:
3122
+ set_anchor = (len(self.table_stack) != 1)
3123
+ self.out += self.ids_to_labels(node, set_anchor, pre_nl=True)
3124
+ self.duclass_open(node)
3125
+ # TODO: Don't use a longtable or add \noindent before
3126
+ # the next paragraph, when in a "compound paragraph".
3127
+ # Start a new line or a new paragraph?
3128
+ # if (isinstance(node.parent, nodes.compound)
3129
+ # and self._latex_type != 'longtable')?
3130
+ self.out.append(self.active_table.get_opening(width))
3131
+ self.out += content
3132
+ self.out.append(self.active_table.get_closing() + '\n')
3133
+ self.active_table.close()
3134
+ if len(self.table_stack) > 0:
3135
+ self.active_table = self.table_stack.pop()
3136
+ self.duclass_close(node)
3137
+
3138
+ def visit_target(self, node) -> None:
3139
+ # Skip indirect targets:
3140
+ if ('refuri' in node # external hyperlink
3141
+ or 'refid' in node # resolved internal link
3142
+ or 'refname' in node): # unresolved internal link
3143
+ ## self.out.append('%% %s\n' % node) # for debugging
3144
+ return
3145
+ if self.is_inline(node):
3146
+ self.out.append('%')
3147
+ self.out.append('\n')
3148
+ self.visit_inline(node)
3149
+
3150
+ def depart_target(self, node) -> None:
3151
+ self.depart_inline(node)
3152
+
3153
+ def visit_tbody(self, node) -> None:
3154
+ # BUG write preamble if not yet done (colspecs not [])
3155
+ # for tables without heads.
3156
+ if not self.active_table.get('preamble written'):
3157
+ self.visit_thead(node)
3158
+ self.depart_thead(None)
3159
+
3160
+ def depart_tbody(self, node) -> None:
3161
+ pass
3162
+
3163
+ def visit_term(self, node) -> None:
3164
+ """definition list term"""
3165
+ # Commands with optional args inside an optional arg must be put
3166
+ # in a group, e.g. ``\item[{\hyperref[label]{text}}]``.
3167
+ self.out.append('\\item[{')
3168
+
3169
+ def depart_term(self, node) -> None:
3170
+ self.out.append('}] ')
3171
+ # Do we need a \leavevmode (line break if the field body begins
3172
+ # with a list or environment)?
3173
+ next_node = node.next_node(descend=False, siblings=True)
3174
+ if isinstance(next_node, nodes.term):
3175
+ self.out.append('\n')
3176
+ elif not isinstance(next_node, nodes.classifier):
3177
+ self.out.append(self.term_postfix(next_node))
3178
+
3179
+ def visit_tgroup(self, node) -> None:
3180
+ pass
3181
+
3182
+ def depart_tgroup(self, node) -> None:
3183
+ pass
3184
+
3185
+ _thead_depth = 0
3186
+
3187
+ def thead_depth(self):
3188
+ return self._thead_depth
3189
+
3190
+ def visit_thead(self, node) -> None:
3191
+ self._thead_depth += 1
3192
+ if 1 == self.thead_depth():
3193
+ self.out.append('{%s}\n' % self.active_table.get_colspecs(node))
3194
+ self.active_table.set('preamble written', 1)
3195
+ if self.active_table.caption:
3196
+ if self._thead_depth == 1:
3197
+ pre = [r'\caption{']
3198
+ post = self.ids_to_labels(node.parent.parent, False) + [r'}\\']
3199
+ else:
3200
+ pre = [r'\caption[]{']
3201
+ post = [r' (... continued)}\\']
3202
+ self.out.extend(pre + self.active_table.caption + post + ['\n'])
3203
+ self.out.extend(self.active_table.visit_thead())
3204
+
3205
+ def depart_thead(self, node) -> None:
3206
+ if node is not None:
3207
+ self.out.extend(self.active_table.depart_thead())
3208
+ if self.active_table.need_recurse():
3209
+ node.walkabout(self)
3210
+ self._thead_depth -= 1
3211
+
3212
+ def visit_title(self, node) -> None:
3213
+ """Append section and other titles."""
3214
+ # Document title
3215
+ if isinstance(node.parent, nodes.document):
3216
+ self.push_output_collector(self.title)
3217
+ self.context.append('')
3218
+ # Topic titles (topic, admonition, sidebar)
3219
+ elif (isinstance(node.parent, nodes.topic)
3220
+ or isinstance(node.parent, nodes.admonition)
3221
+ or isinstance(node.parent, nodes.sidebar)):
3222
+ classes = node.parent['classes'] or [node.parent.tagname]
3223
+ if self.settings.legacy_class_functions:
3224
+ self.fallbacks['title'] = PreambleCmds.title_legacy
3225
+ self.out.append('\n\\DUtitle[%s]{' % ','.join(classes))
3226
+ else:
3227
+ self.provide_fallback('title')
3228
+ self.out.append('\n\\DUtitle{')
3229
+ self.context.append('}\n')
3230
+ # Table caption
3231
+ elif isinstance(node.parent, nodes.table):
3232
+ self.push_output_collector(self.active_table.caption)
3233
+ self.context.append('')
3234
+ # Section title
3235
+ else:
3236
+ level = self.section_level
3237
+ section_name = self.d_class.section(level)
3238
+ self.out.append('\n\n')
3239
+ if level > len(self.d_class.sections):
3240
+ # section level not supported by LaTeX
3241
+ if self.settings.legacy_class_functions:
3242
+ self.fallbacks['title'] = PreambleCmds.title_legacy
3243
+ section_name += '[section%s]' % RomanNumeral(level)
3244
+ else:
3245
+ self.provide_fallback('title')
3246
+ self.provide_fallback('duclass', 'DUclass')
3247
+ self.out.append('\\begin{DUclass}{section%s}\n'
3248
+ % RomanNumeral(level))
3249
+
3250
+ # System messages heading in red:
3251
+ if 'system-messages' in node.parent['classes']:
3252
+ self.requirements['color'] = PreambleCmds.color
3253
+ section_title = self.encode(node.astext())
3254
+ self.out.append(r'\%s[%s]{\color{red}' % (
3255
+ section_name, section_title))
3256
+ else:
3257
+ self.out.append(r'\%s{' % section_name)
3258
+
3259
+ # label and ToC entry:
3260
+ bookmark = ['']
3261
+ # add sections with unsupported level to toc and pdfbookmarks?
3262
+ ## if level > len(self.d_class.sections):
3263
+ ## section_title = self.encode(node.astext())
3264
+ ## bookmark.append(r'\addcontentsline{toc}{%s}{%s}' %
3265
+ ## (section_name, section_title))
3266
+ bookmark += self.ids_to_labels(node.parent, set_anchor=False)
3267
+ self.context.append('%\n '.join(bookmark) + '%\n}\n')
3268
+ if (level > len(self.d_class.sections)
3269
+ and not self.settings.legacy_class_functions):
3270
+ self.context[-1] += '\\end{DUclass}\n'
3271
+ # MAYBE postfix paragraph and subparagraph with \leavevmode to
3272
+ # ensure floats stay in the section and text starts on a new line.
3273
+
3274
+ def depart_title(self, node) -> None:
3275
+ self.out.append(self.context.pop())
3276
+ if isinstance(node.parent, (nodes.table, nodes.document)):
3277
+ self.pop_output_collector()
3278
+
3279
+ def visit_contents(self, node):
3280
+ """Write the table of contents.
3281
+
3282
+ Called from visit_topic() for "contents" topics.
3283
+ """
3284
+ # requirements/setup for local ToC with package "minitoc",
3285
+ if self.use_latex_toc and 'local' in node['classes']:
3286
+ section_name = self.d_class.section(self.section_level)
3287
+ # minitoc only supports "part" and toplevel sections
3288
+ minitoc_names = {'part': 'part',
3289
+ 'chapter': 'mini',
3290
+ 'section': 'sect'}
3291
+ if 'chapter' in self.d_class.sections:
3292
+ del minitoc_names['section']
3293
+ try:
3294
+ mtc_name = minitoc_names[section_name]
3295
+ except KeyError:
3296
+ self.warn('Skipping local ToC at "%s" level.\n'
3297
+ ' Feature not supported with option "use-latex-toc"'
3298
+ % section_name, base_node=node)
3299
+ raise nodes.SkipNode
3300
+
3301
+ # labels and PDF bookmark (sidebar entry)
3302
+ self.out.append('\n') # start new paragraph
3303
+ if len(node['names']) > 1: # don't add labels just for the auto-id
3304
+ self.out += self.ids_to_labels(node, newline=True)
3305
+ if (isinstance(node.next_node(), nodes.title)
3306
+ and 'local' not in node['classes']
3307
+ and self.settings.documentclass != 'memoir'):
3308
+ self.out.append('\\pdfbookmark[%d]{%s}{%s}\n' %
3309
+ (self.section_level+1,
3310
+ node.next_node().astext(),
3311
+ node.get('ids', ['contents'])[0]))
3312
+
3313
+ # Docutils generated contents list (no page numbers)
3314
+ if not self.use_latex_toc:
3315
+ self.fallbacks['toc-list'] = PreambleCmds.toc_list
3316
+ self.duclass_open(node)
3317
+ return
3318
+
3319
+ # ToC by LaTeX
3320
+ try:
3321
+ details = node.next_node(nodes.pending).details
3322
+ except AttributeError:
3323
+ self.warn('Setting "use_latex_toc" is True but "contents" details '
3324
+ 'are missing. Directive option values may be lost.')
3325
+ details = {}
3326
+ depth = details.get('depth', 0)
3327
+ maxdepth = len(self.d_class.sections)
3328
+ if isinstance(node.next_node(), nodes.title):
3329
+ title = self.encode(node[0].astext())
3330
+ else:
3331
+ title = ''
3332
+ if 'local' in node['classes']:
3333
+ # use the "minitoc" package
3334
+ self.requirements['minitoc'] = PreambleCmds.minitoc
3335
+ self.requirements['minitoc-'+mtc_name] = r'\do%stoc'%mtc_name
3336
+ self.requirements['minitoc-%s-depth' % mtc_name] = (
3337
+ r'\mtcsetdepth{%stoc}{%d}' % (mtc_name, maxdepth))
3338
+ # "depth" option: Docutils stores a relative depth while
3339
+ # minitoc expects an absolute depth!:
3340
+ offset = {'sect': 1, 'mini': 0, 'part': 0}
3341
+ if 'chapter' in self.d_class.sections:
3342
+ offset['part'] = -1
3343
+ if depth:
3344
+ self.out.append('\\setcounter{%stocdepth}{%d}' %
3345
+ (mtc_name, depth + offset[mtc_name]))
3346
+ # title:
3347
+ self.out.append('\\mtcsettitle{%stoc}{%s}\n' % (mtc_name, title))
3348
+ # the toc-generating command:
3349
+ self.out.append('\\%stoc\n' % mtc_name)
3350
+ else:
3351
+ if depth:
3352
+ self.out.append('\\setcounter{tocdepth}{%d}\n'
3353
+ % self.d_class.latex_section_depth(depth))
3354
+ if title != 'Contents':
3355
+ self.out.append('\\renewcommand{\\contentsname}{%s}\n' % title)
3356
+ self.out.append('\\tableofcontents\n')
3357
+ self.has_latex_toc = True
3358
+ # ignore rest of node content
3359
+ raise nodes.SkipNode
3360
+
3361
+ def visit_topic(self, node) -> None:
3362
+ # Topic nodes can be generic topic, abstract, dedication, or ToC.
3363
+ # table of contents:
3364
+ if 'contents' in node['classes']:
3365
+ self.visit_contents(node)
3366
+ elif ('abstract' in node['classes']
3367
+ and self.settings.use_latex_abstract):
3368
+ self.push_output_collector(self.abstract)
3369
+ self.out.append('\\begin{abstract}')
3370
+ if isinstance(node.next_node(), nodes.title):
3371
+ node.pop(0) # LaTeX provides its own title
3372
+ else:
3373
+ # special topics:
3374
+ if 'abstract' in node['classes']:
3375
+ self.provide_fallback('abstract')
3376
+ if self.settings.legacy_class_functions:
3377
+ self.fallbacks['abstract'] = PreambleCmds.abstract_legacy
3378
+ self.push_output_collector(self.abstract)
3379
+ elif 'dedication' in node['classes']:
3380
+ self.provide_fallback('dedication')
3381
+ self.push_output_collector(self.dedication)
3382
+ else:
3383
+ node['classes'].insert(0, 'topic')
3384
+ self.visit_block_quote(node)
3385
+
3386
+ def depart_topic(self, node) -> None:
3387
+ if ('abstract' in node['classes']
3388
+ and self.settings.use_latex_abstract):
3389
+ self.out.append('\\end{abstract}\n')
3390
+ elif 'contents' in node['classes']:
3391
+ self.duclass_close(node)
3392
+ else:
3393
+ self.depart_block_quote(node)
3394
+ if ('abstract' in node['classes']
3395
+ or 'dedication' in node['classes']):
3396
+ self.pop_output_collector()
3397
+
3398
+ def visit_transition(self, node) -> None:
3399
+ self.provide_fallback('transition')
3400
+ self.out.append('\n%' + '_' * 75 + '\n')
3401
+ self.out.append('\\DUtransition\n')
3402
+
3403
+ def depart_transition(self, node) -> None:
3404
+ pass
3405
+
3406
+ def visit_version(self, node) -> None:
3407
+ self.visit_docinfo_item(node)
3408
+
3409
+ def depart_version(self, node) -> None:
3410
+ self.depart_docinfo_item(node)
3411
+
3412
+ def unimplemented_visit(self, node):
3413
+ raise NotImplementedError('visiting unimplemented node type: %s' %
3414
+ node.__class__.__name__)
3415
+
3416
+ # def unknown_visit(self, node):
3417
+ # def default_visit(self, node):
3418
+
3419
+ # vim: set ts=4 et ai :