@bastani/atomic 0.8.26-alpha.5 → 0.8.26-alpha.7

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.
Files changed (264) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +7 -4
  3. package/dist/builtin/intercom/CHANGELOG.md +12 -0
  4. package/dist/builtin/intercom/package.json +2 -2
  5. package/dist/builtin/mcp/CHANGELOG.md +12 -0
  6. package/dist/builtin/mcp/package.json +3 -3
  7. package/dist/builtin/subagents/CHANGELOG.md +12 -0
  8. package/dist/builtin/subagents/agents/codebase-online-researcher.md +9 -9
  9. package/dist/builtin/subagents/agents/debugger.md +6 -6
  10. package/dist/builtin/subagents/package.json +4 -4
  11. package/dist/builtin/subagents/prompts/parallel-handoff-plan.md +1 -1
  12. package/dist/builtin/subagents/skills/browser/EXAMPLES.md +151 -0
  13. package/dist/builtin/subagents/skills/browser/LICENSE.txt +21 -0
  14. package/dist/builtin/subagents/skills/browser/REFERENCE.md +451 -0
  15. package/dist/builtin/subagents/skills/browser/SKILL.md +170 -0
  16. package/dist/builtin/subagents/skills/subagent/SKILL.md +4 -4
  17. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +48 -10
  18. package/dist/builtin/subagents/src/runs/foreground/execution.ts +30 -9
  19. package/dist/builtin/subagents/src/runs/shared/final-drain.ts +34 -0
  20. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +416 -7
  21. package/dist/builtin/web-access/CHANGELOG.md +12 -0
  22. package/dist/builtin/web-access/package.json +2 -2
  23. package/dist/builtin/workflows/CHANGELOG.md +17 -0
  24. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +4 -1
  25. package/dist/builtin/workflows/builtin/goal.ts +127 -99
  26. package/dist/builtin/workflows/builtin/open-claude-design.ts +224 -147
  27. package/dist/builtin/workflows/builtin/ralph.ts +160 -197
  28. package/dist/builtin/workflows/package.json +2 -2
  29. package/dist/builtin/workflows/skills/research-codebase/SKILL.md +1 -1
  30. package/dist/builtin/workflows/src/extension/index.ts +10 -2
  31. package/dist/builtin/workflows/src/extension/runtime.ts +35 -3
  32. package/dist/builtin/workflows/src/runs/background/status.ts +52 -6
  33. package/dist/builtin/workflows/src/runs/foreground/executor.ts +441 -15
  34. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +69 -8
  35. package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +402 -8
  36. package/dist/builtin/workflows/src/shared/persistence-restore.ts +182 -6
  37. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +76 -6
  38. package/dist/builtin/workflows/src/shared/stage-prompt.ts +33 -2
  39. package/dist/builtin/workflows/src/shared/store-types.ts +31 -0
  40. package/dist/builtin/workflows/src/shared/store.ts +99 -11
  41. package/dist/builtin/workflows/src/shared/workflow-failures.ts +758 -132
  42. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +9 -0
  43. package/dist/core/agent-session.d.ts +28 -1
  44. package/dist/core/agent-session.d.ts.map +1 -1
  45. package/dist/core/agent-session.js +110 -28
  46. package/dist/core/agent-session.js.map +1 -1
  47. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  48. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  49. package/dist/core/compaction/branch-summarization.js +6 -3
  50. package/dist/core/compaction/branch-summarization.js.map +1 -1
  51. package/dist/core/compaction/compaction.d.ts.map +1 -1
  52. package/dist/core/compaction/compaction.js +23 -10
  53. package/dist/core/compaction/compaction.js.map +1 -1
  54. package/dist/core/compaction/context-compaction.d.ts +61 -0
  55. package/dist/core/compaction/context-compaction.d.ts.map +1 -0
  56. package/dist/core/compaction/context-compaction.js +602 -0
  57. package/dist/core/compaction/context-compaction.js.map +1 -0
  58. package/dist/core/compaction/index.d.ts +1 -0
  59. package/dist/core/compaction/index.d.ts.map +1 -1
  60. package/dist/core/compaction/index.js +1 -0
  61. package/dist/core/compaction/index.js.map +1 -1
  62. package/dist/core/index.d.ts +1 -1
  63. package/dist/core/index.d.ts.map +1 -1
  64. package/dist/core/index.js.map +1 -1
  65. package/dist/core/session-manager.d.ts +41 -1
  66. package/dist/core/session-manager.d.ts.map +1 -1
  67. package/dist/core/session-manager.js +146 -7
  68. package/dist/core/session-manager.js.map +1 -1
  69. package/dist/core/slash-commands.d.ts.map +1 -1
  70. package/dist/core/slash-commands.js +1 -0
  71. package/dist/core/slash-commands.js.map +1 -1
  72. package/dist/core/tools/ask-user-question/tool/format-answer.d.ts +5 -5
  73. package/dist/core/tools/ask-user-question/tool/format-answer.d.ts.map +1 -1
  74. package/dist/core/tools/ask-user-question/tool/format-answer.js +5 -5
  75. package/dist/core/tools/ask-user-question/tool/format-answer.js.map +1 -1
  76. package/dist/core/tools/ask-user-question/tool/response-envelope.d.ts +16 -3
  77. package/dist/core/tools/ask-user-question/tool/response-envelope.d.ts.map +1 -1
  78. package/dist/core/tools/ask-user-question/tool/response-envelope.js +21 -3
  79. package/dist/core/tools/ask-user-question/tool/response-envelope.js.map +1 -1
  80. package/dist/index.d.ts +3 -3
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +2 -2
  83. package/dist/index.js.map +1 -1
  84. package/dist/modes/index.d.ts +1 -1
  85. package/dist/modes/index.d.ts.map +1 -1
  86. package/dist/modes/index.js.map +1 -1
  87. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  88. package/dist/modes/interactive/components/chat-session-host.js +17 -0
  89. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  90. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  91. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.js +74 -0
  93. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  94. package/dist/modes/rpc/rpc-client.d.ts +12 -7
  95. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  96. package/dist/modes/rpc/rpc-client.js +8 -1
  97. package/dist/modes/rpc/rpc-client.js.map +1 -1
  98. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  99. package/dist/modes/rpc/rpc-mode.js +4 -0
  100. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  101. package/dist/modes/rpc/rpc-types.d.ts +13 -2
  102. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  103. package/dist/modes/rpc/rpc-types.js.map +1 -1
  104. package/docs/compaction.md +42 -23
  105. package/docs/custom-provider.md +11 -9
  106. package/docs/extensions.md +35 -35
  107. package/docs/index.md +1 -8
  108. package/docs/json.md +14 -11
  109. package/docs/packages.md +2 -0
  110. package/docs/providers.md +4 -1
  111. package/docs/quickstart.md +5 -12
  112. package/docs/rpc.md +44 -8
  113. package/docs/sdk.md +1 -8
  114. package/docs/session-format.md +25 -12
  115. package/docs/sessions.md +2 -1
  116. package/docs/skills.md +1 -15
  117. package/docs/termux.md +9 -10
  118. package/docs/themes.md +2 -2
  119. package/docs/tmux.md +3 -3
  120. package/docs/tui.md +19 -32
  121. package/docs/usage.md +2 -0
  122. package/docs/workflows.md +44 -2
  123. package/package.json +4 -12
  124. package/dist/builtin/subagents/skills/browser-use/SKILL.md +0 -234
  125. package/dist/builtin/subagents/skills/browser-use/references/cdp-python.md +0 -76
  126. package/dist/builtin/subagents/skills/browser-use/references/multi-session.md +0 -92
  127. package/node_modules/@earendil-works/pi-tui/README.md +0 -779
  128. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +0 -54
  129. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +0 -1
  130. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +0 -632
  131. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +0 -1
  132. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts +0 -22
  133. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +0 -1
  134. package/node_modules/@earendil-works/pi-tui/dist/components/box.js +0 -104
  135. package/node_modules/@earendil-works/pi-tui/dist/components/box.js.map +0 -1
  136. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts +0 -22
  137. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +0 -1
  138. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js +0 -35
  139. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js.map +0 -1
  140. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +0 -249
  141. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +0 -1
  142. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +0 -1857
  143. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +0 -1
  144. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts +0 -28
  145. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +0 -1
  146. package/node_modules/@earendil-works/pi-tui/dist/components/image.js +0 -89
  147. package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +0 -1
  148. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts +0 -37
  149. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +0 -1
  150. package/node_modules/@earendil-works/pi-tui/dist/components/input.js +0 -378
  151. package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +0 -1
  152. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts +0 -31
  153. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +0 -1
  154. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js +0 -69
  155. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +0 -1
  156. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +0 -96
  157. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +0 -1
  158. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +0 -644
  159. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +0 -1
  160. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +0 -50
  161. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +0 -1
  162. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +0 -159
  163. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +0 -1
  164. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts +0 -50
  165. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +0 -1
  166. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js +0 -185
  167. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +0 -1
  168. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts +0 -12
  169. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +0 -1
  170. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js +0 -23
  171. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +0 -1
  172. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts +0 -19
  173. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +0 -1
  174. package/node_modules/@earendil-works/pi-tui/dist/components/text.js +0 -89
  175. package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +0 -1
  176. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts +0 -13
  177. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +0 -1
  178. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js +0 -51
  179. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +0 -1
  180. package/node_modules/@earendil-works/pi-tui/dist/editor-component.d.ts +0 -39
  181. package/node_modules/@earendil-works/pi-tui/dist/editor-component.d.ts.map +0 -1
  182. package/node_modules/@earendil-works/pi-tui/dist/editor-component.js +0 -2
  183. package/node_modules/@earendil-works/pi-tui/dist/editor-component.js.map +0 -1
  184. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts +0 -16
  185. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts.map +0 -1
  186. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js +0 -110
  187. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js.map +0 -1
  188. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +0 -23
  189. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +0 -1
  190. package/node_modules/@earendil-works/pi-tui/dist/index.js +0 -32
  191. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +0 -1
  192. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts +0 -193
  193. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +0 -1
  194. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +0 -174
  195. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +0 -1
  196. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts +0 -184
  197. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +0 -1
  198. package/node_modules/@earendil-works/pi-tui/dist/keys.js +0 -1173
  199. package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +0 -1
  200. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts +0 -28
  201. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +0 -1
  202. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js +0 -44
  203. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js.map +0 -1
  204. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts +0 -3
  205. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +0 -1
  206. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js +0 -53
  207. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +0 -1
  208. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts +0 -50
  209. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +0 -1
  210. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +0 -361
  211. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +0 -1
  212. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +0 -90
  213. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +0 -1
  214. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +0 -366
  215. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +0 -1
  216. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +0 -113
  217. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +0 -1
  218. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +0 -472
  219. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +0 -1
  220. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +0 -227
  221. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +0 -1
  222. package/node_modules/@earendil-works/pi-tui/dist/tui.js +0 -1106
  223. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +0 -1
  224. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts +0 -17
  225. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +0 -1
  226. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js +0 -25
  227. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js.map +0 -1
  228. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts +0 -84
  229. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +0 -1
  230. package/node_modules/@earendil-works/pi-tui/dist/utils.js +0 -1029
  231. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +0 -1
  232. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts +0 -25
  233. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +0 -1
  234. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js +0 -96
  235. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +0 -1
  236. package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  237. package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  238. package/node_modules/@earendil-works/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  239. package/node_modules/@earendil-works/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  240. package/node_modules/@earendil-works/pi-tui/package.json +0 -47
  241. package/node_modules/get-east-asian-width/index.d.ts +0 -60
  242. package/node_modules/get-east-asian-width/index.js +0 -30
  243. package/node_modules/get-east-asian-width/license +0 -9
  244. package/node_modules/get-east-asian-width/lookup-data.js +0 -21
  245. package/node_modules/get-east-asian-width/lookup.js +0 -138
  246. package/node_modules/get-east-asian-width/package.json +0 -71
  247. package/node_modules/get-east-asian-width/readme.md +0 -65
  248. package/node_modules/get-east-asian-width/utilities.js +0 -24
  249. package/node_modules/marked/LICENSE.md +0 -44
  250. package/node_modules/marked/README.md +0 -106
  251. package/node_modules/marked/bin/main.js +0 -282
  252. package/node_modules/marked/bin/marked.js +0 -15
  253. package/node_modules/marked/lib/marked.cjs +0 -2211
  254. package/node_modules/marked/lib/marked.cjs.map +0 -7
  255. package/node_modules/marked/lib/marked.d.cts +0 -728
  256. package/node_modules/marked/lib/marked.d.ts +0 -728
  257. package/node_modules/marked/lib/marked.esm.js +0 -2189
  258. package/node_modules/marked/lib/marked.esm.js.map +0 -7
  259. package/node_modules/marked/lib/marked.umd.js +0 -2213
  260. package/node_modules/marked/lib/marked.umd.js.map +0 -7
  261. package/node_modules/marked/man/marked.1 +0 -111
  262. package/node_modules/marked/man/marked.1.md +0 -92
  263. package/node_modules/marked/marked.min.js +0 -69
  264. package/node_modules/marked/package.json +0 -111
@@ -1,2189 +0,0 @@
1
- /**
2
- * marked v15.0.12 - a markdown parser
3
- * Copyright (c) 2011-2025, Christopher Jeffrey. (MIT Licensed)
4
- * https://github.com/markedjs/marked
5
- */
6
-
7
- /**
8
- * DO NOT EDIT THIS FILE
9
- * The code in this file is generated from files in ./src/
10
- */
11
-
12
-
13
- // src/defaults.ts
14
- function _getDefaults() {
15
- return {
16
- async: false,
17
- breaks: false,
18
- extensions: null,
19
- gfm: true,
20
- hooks: null,
21
- pedantic: false,
22
- renderer: null,
23
- silent: false,
24
- tokenizer: null,
25
- walkTokens: null
26
- };
27
- }
28
- var _defaults = _getDefaults();
29
- function changeDefaults(newDefaults) {
30
- _defaults = newDefaults;
31
- }
32
-
33
- // src/rules.ts
34
- var noopTest = { exec: () => null };
35
- function edit(regex, opt = "") {
36
- let source = typeof regex === "string" ? regex : regex.source;
37
- const obj = {
38
- replace: (name, val) => {
39
- let valSource = typeof val === "string" ? val : val.source;
40
- valSource = valSource.replace(other.caret, "$1");
41
- source = source.replace(name, valSource);
42
- return obj;
43
- },
44
- getRegex: () => {
45
- return new RegExp(source, opt);
46
- }
47
- };
48
- return obj;
49
- }
50
- var other = {
51
- codeRemoveIndent: /^(?: {1,4}| {0,3}\t)/gm,
52
- outputLinkReplace: /\\([\[\]])/g,
53
- indentCodeCompensation: /^(\s+)(?:```)/,
54
- beginningSpace: /^\s+/,
55
- endingHash: /#$/,
56
- startingSpaceChar: /^ /,
57
- endingSpaceChar: / $/,
58
- nonSpaceChar: /[^ ]/,
59
- newLineCharGlobal: /\n/g,
60
- tabCharGlobal: /\t/g,
61
- multipleSpaceGlobal: /\s+/g,
62
- blankLine: /^[ \t]*$/,
63
- doubleBlankLine: /\n[ \t]*\n[ \t]*$/,
64
- blockquoteStart: /^ {0,3}>/,
65
- blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g,
66
- blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm,
67
- listReplaceTabs: /^\t+/,
68
- listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,
69
- listIsTask: /^\[[ xX]\] /,
70
- listReplaceTask: /^\[[ xX]\] +/,
71
- anyLine: /\n.*\n/,
72
- hrefBrackets: /^<(.*)>$/,
73
- tableDelimiter: /[:|]/,
74
- tableAlignChars: /^\||\| *$/g,
75
- tableRowBlankLine: /\n[ \t]*$/,
76
- tableAlignRight: /^ *-+: *$/,
77
- tableAlignCenter: /^ *:-+: *$/,
78
- tableAlignLeft: /^ *:-+ *$/,
79
- startATag: /^<a /i,
80
- endATag: /^<\/a>/i,
81
- startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i,
82
- endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i,
83
- startAngleBracket: /^</,
84
- endAngleBracket: />$/,
85
- pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/,
86
- unicodeAlphaNumeric: /[\p{L}\p{N}]/u,
87
- escapeTest: /[&<>"']/,
88
- escapeReplace: /[&<>"']/g,
89
- escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,
90
- escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,
91
- unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,
92
- caret: /(^|[^\[])\^/g,
93
- percentDecode: /%25/g,
94
- findPipe: /\|/g,
95
- splitPipe: / \|/,
96
- slashPipe: /\\\|/g,
97
- carriageReturn: /\r\n|\r/g,
98
- spaceLine: /^ +$/gm,
99
- notSpaceStart: /^\S*/,
100
- endingNewline: /\n$/,
101
- listItemRegex: (bull) => new RegExp(`^( {0,3}${bull})((?:[ ][^\\n]*)?(?:\\n|$))`),
102
- nextBulletRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),
103
- hrRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),
104
- fencesBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`),
105
- headingBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`),
106
- htmlBeginRegex: (indent) => new RegExp(`^ {0,${Math.min(3, indent - 1)}}<(?:[a-z].*>|!--)`, "i")
107
- };
108
- var newline = /^(?:[ \t]*(?:\n|$))+/;
109
- var blockCode = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/;
110
- var fences = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/;
111
- var hr = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;
112
- var heading = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;
113
- var bullet = /(?:[*+-]|\d{1,9}[.)])/;
114
- var lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/;
115
- var lheading = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex();
116
- var lheadingGfm = edit(lheadingCore).replace(/bull/g, bullet).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex();
117
- var _paragraph = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/;
118
- var blockText = /^[^\n]+/;
119
- var _blockLabel = /(?!\s*\])(?:\\.|[^\[\]\\])+/;
120
- var def = edit(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", _blockLabel).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();
121
- var list = edit(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, bullet).getRegex();
122
- var _tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";
123
- var _comment = /<!--(?:-?>|[\s\S]*?(?:-->|$))/;
124
- var html = edit(
125
- "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))",
126
- "i"
127
- ).replace("comment", _comment).replace("tag", _tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
128
- var paragraph = edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex();
129
- var blockquote = edit(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", paragraph).getRegex();
130
- var blockNormal = {
131
- blockquote,
132
- code: blockCode,
133
- def,
134
- fences,
135
- heading,
136
- hr,
137
- html,
138
- lheading,
139
- list,
140
- newline,
141
- paragraph,
142
- table: noopTest,
143
- text: blockText
144
- };
145
- var gfmTable = edit(
146
- "^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
147
- ).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex();
148
- var blockGfm = {
149
- ...blockNormal,
150
- lheading: lheadingGfm,
151
- table: gfmTable,
152
- paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", gfmTable).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", _tag).getRegex()
153
- };
154
- var blockPedantic = {
155
- ...blockNormal,
156
- html: edit(
157
- `^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`
158
- ).replace("comment", _comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
159
- def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
160
- heading: /^(#{1,6})(.*)(?:\n+|$)/,
161
- fences: noopTest,
162
- // fences not supported
163
- lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,
164
- paragraph: edit(_paragraph).replace("hr", hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", lheading).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex()
165
- };
166
- var escape = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;
167
- var inlineCode = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;
168
- var br = /^( {2,}|\\)\n(?!\s*$)/;
169
- var inlineText = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/;
170
- var _punctuation = /[\p{P}\p{S}]/u;
171
- var _punctuationOrSpace = /[\s\p{P}\p{S}]/u;
172
- var _notPunctuationOrSpace = /[^\s\p{P}\p{S}]/u;
173
- var punctuation = edit(/^((?![*_])punctSpace)/, "u").replace(/punctSpace/g, _punctuationOrSpace).getRegex();
174
- var _punctuationGfmStrongEm = /(?!~)[\p{P}\p{S}]/u;
175
- var _punctuationOrSpaceGfmStrongEm = /(?!~)[\s\p{P}\p{S}]/u;
176
- var _notPunctuationOrSpaceGfmStrongEm = /(?:[^\s\p{P}\p{S}]|~)/u;
177
- var blockSkip = /\[[^[\]]*?\]\((?:\\.|[^\\\(\)]|\((?:\\.|[^\\\(\)])*\))*\)|`[^`]*?`|<[^<>]*?>/g;
178
- var emStrongLDelimCore = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/;
179
- var emStrongLDelim = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuation).getRegex();
180
- var emStrongLDelimGfm = edit(emStrongLDelimCore, "u").replace(/punct/g, _punctuationGfmStrongEm).getRegex();
181
- var emStrongRDelimAstCore = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)";
182
- var emStrongRDelimAst = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex();
183
- var emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, "gu").replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm).replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm).replace(/punct/g, _punctuationGfmStrongEm).getRegex();
184
- var emStrongRDelimUnd = edit(
185
- "^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)",
186
- "gu"
187
- ).replace(/notPunctSpace/g, _notPunctuationOrSpace).replace(/punctSpace/g, _punctuationOrSpace).replace(/punct/g, _punctuation).getRegex();
188
- var anyPunctuation = edit(/\\(punct)/, "gu").replace(/punct/g, _punctuation).getRegex();
189
- var autolink = edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();
190
- var _inlineComment = edit(_comment).replace("(?:-->|$)", "-->").getRegex();
191
- var tag = edit(
192
- "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>"
193
- ).replace("comment", _inlineComment).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();
194
- var _inlineLabel = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
195
- var link = edit(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", _inlineLabel).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();
196
- var reflink = edit(/^!?\[(label)\]\[(ref)\]/).replace("label", _inlineLabel).replace("ref", _blockLabel).getRegex();
197
- var nolink = edit(/^!?\[(ref)\](?:\[\])?/).replace("ref", _blockLabel).getRegex();
198
- var reflinkSearch = edit("reflink|nolink(?!\\()", "g").replace("reflink", reflink).replace("nolink", nolink).getRegex();
199
- var inlineNormal = {
200
- _backpedal: noopTest,
201
- // only used for GFM url
202
- anyPunctuation,
203
- autolink,
204
- blockSkip,
205
- br,
206
- code: inlineCode,
207
- del: noopTest,
208
- emStrongLDelim,
209
- emStrongRDelimAst,
210
- emStrongRDelimUnd,
211
- escape,
212
- link,
213
- nolink,
214
- punctuation,
215
- reflink,
216
- reflinkSearch,
217
- tag,
218
- text: inlineText,
219
- url: noopTest
220
- };
221
- var inlinePedantic = {
222
- ...inlineNormal,
223
- link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", _inlineLabel).getRegex(),
224
- reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", _inlineLabel).getRegex()
225
- };
226
- var inlineGfm = {
227
- ...inlineNormal,
228
- emStrongRDelimAst: emStrongRDelimAstGfm,
229
- emStrongLDelim: emStrongLDelimGfm,
230
- url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, "i").replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),
231
- _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,
232
- del: /^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,
233
- text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
234
- };
235
- var inlineBreaks = {
236
- ...inlineGfm,
237
- br: edit(br).replace("{2,}", "*").getRegex(),
238
- text: edit(inlineGfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
239
- };
240
- var block = {
241
- normal: blockNormal,
242
- gfm: blockGfm,
243
- pedantic: blockPedantic
244
- };
245
- var inline = {
246
- normal: inlineNormal,
247
- gfm: inlineGfm,
248
- breaks: inlineBreaks,
249
- pedantic: inlinePedantic
250
- };
251
-
252
- // src/helpers.ts
253
- var escapeReplacements = {
254
- "&": "&amp;",
255
- "<": "&lt;",
256
- ">": "&gt;",
257
- '"': "&quot;",
258
- "'": "&#39;"
259
- };
260
- var getEscapeReplacement = (ch) => escapeReplacements[ch];
261
- function escape2(html2, encode) {
262
- if (encode) {
263
- if (other.escapeTest.test(html2)) {
264
- return html2.replace(other.escapeReplace, getEscapeReplacement);
265
- }
266
- } else {
267
- if (other.escapeTestNoEncode.test(html2)) {
268
- return html2.replace(other.escapeReplaceNoEncode, getEscapeReplacement);
269
- }
270
- }
271
- return html2;
272
- }
273
- function cleanUrl(href) {
274
- try {
275
- href = encodeURI(href).replace(other.percentDecode, "%");
276
- } catch {
277
- return null;
278
- }
279
- return href;
280
- }
281
- function splitCells(tableRow, count) {
282
- const row = tableRow.replace(other.findPipe, (match, offset, str) => {
283
- let escaped = false;
284
- let curr = offset;
285
- while (--curr >= 0 && str[curr] === "\\") escaped = !escaped;
286
- if (escaped) {
287
- return "|";
288
- } else {
289
- return " |";
290
- }
291
- }), cells = row.split(other.splitPipe);
292
- let i = 0;
293
- if (!cells[0].trim()) {
294
- cells.shift();
295
- }
296
- if (cells.length > 0 && !cells.at(-1)?.trim()) {
297
- cells.pop();
298
- }
299
- if (count) {
300
- if (cells.length > count) {
301
- cells.splice(count);
302
- } else {
303
- while (cells.length < count) cells.push("");
304
- }
305
- }
306
- for (; i < cells.length; i++) {
307
- cells[i] = cells[i].trim().replace(other.slashPipe, "|");
308
- }
309
- return cells;
310
- }
311
- function rtrim(str, c, invert) {
312
- const l = str.length;
313
- if (l === 0) {
314
- return "";
315
- }
316
- let suffLen = 0;
317
- while (suffLen < l) {
318
- const currChar = str.charAt(l - suffLen - 1);
319
- if (currChar === c && !invert) {
320
- suffLen++;
321
- } else if (currChar !== c && invert) {
322
- suffLen++;
323
- } else {
324
- break;
325
- }
326
- }
327
- return str.slice(0, l - suffLen);
328
- }
329
- function findClosingBracket(str, b) {
330
- if (str.indexOf(b[1]) === -1) {
331
- return -1;
332
- }
333
- let level = 0;
334
- for (let i = 0; i < str.length; i++) {
335
- if (str[i] === "\\") {
336
- i++;
337
- } else if (str[i] === b[0]) {
338
- level++;
339
- } else if (str[i] === b[1]) {
340
- level--;
341
- if (level < 0) {
342
- return i;
343
- }
344
- }
345
- }
346
- if (level > 0) {
347
- return -2;
348
- }
349
- return -1;
350
- }
351
-
352
- // src/Tokenizer.ts
353
- function outputLink(cap, link2, raw, lexer2, rules) {
354
- const href = link2.href;
355
- const title = link2.title || null;
356
- const text = cap[1].replace(rules.other.outputLinkReplace, "$1");
357
- lexer2.state.inLink = true;
358
- const token = {
359
- type: cap[0].charAt(0) === "!" ? "image" : "link",
360
- raw,
361
- href,
362
- title,
363
- text,
364
- tokens: lexer2.inlineTokens(text)
365
- };
366
- lexer2.state.inLink = false;
367
- return token;
368
- }
369
- function indentCodeCompensation(raw, text, rules) {
370
- const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);
371
- if (matchIndentToCode === null) {
372
- return text;
373
- }
374
- const indentToCode = matchIndentToCode[1];
375
- return text.split("\n").map((node) => {
376
- const matchIndentInNode = node.match(rules.other.beginningSpace);
377
- if (matchIndentInNode === null) {
378
- return node;
379
- }
380
- const [indentInNode] = matchIndentInNode;
381
- if (indentInNode.length >= indentToCode.length) {
382
- return node.slice(indentToCode.length);
383
- }
384
- return node;
385
- }).join("\n");
386
- }
387
- var _Tokenizer = class {
388
- options;
389
- rules;
390
- // set by the lexer
391
- lexer;
392
- // set by the lexer
393
- constructor(options2) {
394
- this.options = options2 || _defaults;
395
- }
396
- space(src) {
397
- const cap = this.rules.block.newline.exec(src);
398
- if (cap && cap[0].length > 0) {
399
- return {
400
- type: "space",
401
- raw: cap[0]
402
- };
403
- }
404
- }
405
- code(src) {
406
- const cap = this.rules.block.code.exec(src);
407
- if (cap) {
408
- const text = cap[0].replace(this.rules.other.codeRemoveIndent, "");
409
- return {
410
- type: "code",
411
- raw: cap[0],
412
- codeBlockStyle: "indented",
413
- text: !this.options.pedantic ? rtrim(text, "\n") : text
414
- };
415
- }
416
- }
417
- fences(src) {
418
- const cap = this.rules.block.fences.exec(src);
419
- if (cap) {
420
- const raw = cap[0];
421
- const text = indentCodeCompensation(raw, cap[3] || "", this.rules);
422
- return {
423
- type: "code",
424
- raw,
425
- lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : cap[2],
426
- text
427
- };
428
- }
429
- }
430
- heading(src) {
431
- const cap = this.rules.block.heading.exec(src);
432
- if (cap) {
433
- let text = cap[2].trim();
434
- if (this.rules.other.endingHash.test(text)) {
435
- const trimmed = rtrim(text, "#");
436
- if (this.options.pedantic) {
437
- text = trimmed.trim();
438
- } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {
439
- text = trimmed.trim();
440
- }
441
- }
442
- return {
443
- type: "heading",
444
- raw: cap[0],
445
- depth: cap[1].length,
446
- text,
447
- tokens: this.lexer.inline(text)
448
- };
449
- }
450
- }
451
- hr(src) {
452
- const cap = this.rules.block.hr.exec(src);
453
- if (cap) {
454
- return {
455
- type: "hr",
456
- raw: rtrim(cap[0], "\n")
457
- };
458
- }
459
- }
460
- blockquote(src) {
461
- const cap = this.rules.block.blockquote.exec(src);
462
- if (cap) {
463
- let lines = rtrim(cap[0], "\n").split("\n");
464
- let raw = "";
465
- let text = "";
466
- const tokens = [];
467
- while (lines.length > 0) {
468
- let inBlockquote = false;
469
- const currentLines = [];
470
- let i;
471
- for (i = 0; i < lines.length; i++) {
472
- if (this.rules.other.blockquoteStart.test(lines[i])) {
473
- currentLines.push(lines[i]);
474
- inBlockquote = true;
475
- } else if (!inBlockquote) {
476
- currentLines.push(lines[i]);
477
- } else {
478
- break;
479
- }
480
- }
481
- lines = lines.slice(i);
482
- const currentRaw = currentLines.join("\n");
483
- const currentText = currentRaw.replace(this.rules.other.blockquoteSetextReplace, "\n $1").replace(this.rules.other.blockquoteSetextReplace2, "");
484
- raw = raw ? `${raw}
485
- ${currentRaw}` : currentRaw;
486
- text = text ? `${text}
487
- ${currentText}` : currentText;
488
- const top = this.lexer.state.top;
489
- this.lexer.state.top = true;
490
- this.lexer.blockTokens(currentText, tokens, true);
491
- this.lexer.state.top = top;
492
- if (lines.length === 0) {
493
- break;
494
- }
495
- const lastToken = tokens.at(-1);
496
- if (lastToken?.type === "code") {
497
- break;
498
- } else if (lastToken?.type === "blockquote") {
499
- const oldToken = lastToken;
500
- const newText = oldToken.raw + "\n" + lines.join("\n");
501
- const newToken = this.blockquote(newText);
502
- tokens[tokens.length - 1] = newToken;
503
- raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw;
504
- text = text.substring(0, text.length - oldToken.text.length) + newToken.text;
505
- break;
506
- } else if (lastToken?.type === "list") {
507
- const oldToken = lastToken;
508
- const newText = oldToken.raw + "\n" + lines.join("\n");
509
- const newToken = this.list(newText);
510
- tokens[tokens.length - 1] = newToken;
511
- raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;
512
- text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;
513
- lines = newText.substring(tokens.at(-1).raw.length).split("\n");
514
- continue;
515
- }
516
- }
517
- return {
518
- type: "blockquote",
519
- raw,
520
- tokens,
521
- text
522
- };
523
- }
524
- }
525
- list(src) {
526
- let cap = this.rules.block.list.exec(src);
527
- if (cap) {
528
- let bull = cap[1].trim();
529
- const isordered = bull.length > 1;
530
- const list2 = {
531
- type: "list",
532
- raw: "",
533
- ordered: isordered,
534
- start: isordered ? +bull.slice(0, -1) : "",
535
- loose: false,
536
- items: []
537
- };
538
- bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`;
539
- if (this.options.pedantic) {
540
- bull = isordered ? bull : "[*+-]";
541
- }
542
- const itemRegex = this.rules.other.listItemRegex(bull);
543
- let endsWithBlankLine = false;
544
- while (src) {
545
- let endEarly = false;
546
- let raw = "";
547
- let itemContents = "";
548
- if (!(cap = itemRegex.exec(src))) {
549
- break;
550
- }
551
- if (this.rules.block.hr.test(src)) {
552
- break;
553
- }
554
- raw = cap[0];
555
- src = src.substring(raw.length);
556
- let line = cap[2].split("\n", 1)[0].replace(this.rules.other.listReplaceTabs, (t) => " ".repeat(3 * t.length));
557
- let nextLine = src.split("\n", 1)[0];
558
- let blankLine = !line.trim();
559
- let indent = 0;
560
- if (this.options.pedantic) {
561
- indent = 2;
562
- itemContents = line.trimStart();
563
- } else if (blankLine) {
564
- indent = cap[1].length + 1;
565
- } else {
566
- indent = cap[2].search(this.rules.other.nonSpaceChar);
567
- indent = indent > 4 ? 1 : indent;
568
- itemContents = line.slice(indent);
569
- indent += cap[1].length;
570
- }
571
- if (blankLine && this.rules.other.blankLine.test(nextLine)) {
572
- raw += nextLine + "\n";
573
- src = src.substring(nextLine.length + 1);
574
- endEarly = true;
575
- }
576
- if (!endEarly) {
577
- const nextBulletRegex = this.rules.other.nextBulletRegex(indent);
578
- const hrRegex = this.rules.other.hrRegex(indent);
579
- const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);
580
- const headingBeginRegex = this.rules.other.headingBeginRegex(indent);
581
- const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);
582
- while (src) {
583
- const rawLine = src.split("\n", 1)[0];
584
- let nextLineWithoutTabs;
585
- nextLine = rawLine;
586
- if (this.options.pedantic) {
587
- nextLine = nextLine.replace(this.rules.other.listReplaceNesting, " ");
588
- nextLineWithoutTabs = nextLine;
589
- } else {
590
- nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, " ");
591
- }
592
- if (fencesBeginRegex.test(nextLine)) {
593
- break;
594
- }
595
- if (headingBeginRegex.test(nextLine)) {
596
- break;
597
- }
598
- if (htmlBeginRegex.test(nextLine)) {
599
- break;
600
- }
601
- if (nextBulletRegex.test(nextLine)) {
602
- break;
603
- }
604
- if (hrRegex.test(nextLine)) {
605
- break;
606
- }
607
- if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) {
608
- itemContents += "\n" + nextLineWithoutTabs.slice(indent);
609
- } else {
610
- if (blankLine) {
611
- break;
612
- }
613
- if (line.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4) {
614
- break;
615
- }
616
- if (fencesBeginRegex.test(line)) {
617
- break;
618
- }
619
- if (headingBeginRegex.test(line)) {
620
- break;
621
- }
622
- if (hrRegex.test(line)) {
623
- break;
624
- }
625
- itemContents += "\n" + nextLine;
626
- }
627
- if (!blankLine && !nextLine.trim()) {
628
- blankLine = true;
629
- }
630
- raw += rawLine + "\n";
631
- src = src.substring(rawLine.length + 1);
632
- line = nextLineWithoutTabs.slice(indent);
633
- }
634
- }
635
- if (!list2.loose) {
636
- if (endsWithBlankLine) {
637
- list2.loose = true;
638
- } else if (this.rules.other.doubleBlankLine.test(raw)) {
639
- endsWithBlankLine = true;
640
- }
641
- }
642
- let istask = null;
643
- let ischecked;
644
- if (this.options.gfm) {
645
- istask = this.rules.other.listIsTask.exec(itemContents);
646
- if (istask) {
647
- ischecked = istask[0] !== "[ ] ";
648
- itemContents = itemContents.replace(this.rules.other.listReplaceTask, "");
649
- }
650
- }
651
- list2.items.push({
652
- type: "list_item",
653
- raw,
654
- task: !!istask,
655
- checked: ischecked,
656
- loose: false,
657
- text: itemContents,
658
- tokens: []
659
- });
660
- list2.raw += raw;
661
- }
662
- const lastItem = list2.items.at(-1);
663
- if (lastItem) {
664
- lastItem.raw = lastItem.raw.trimEnd();
665
- lastItem.text = lastItem.text.trimEnd();
666
- } else {
667
- return;
668
- }
669
- list2.raw = list2.raw.trimEnd();
670
- for (let i = 0; i < list2.items.length; i++) {
671
- this.lexer.state.top = false;
672
- list2.items[i].tokens = this.lexer.blockTokens(list2.items[i].text, []);
673
- if (!list2.loose) {
674
- const spacers = list2.items[i].tokens.filter((t) => t.type === "space");
675
- const hasMultipleLineBreaks = spacers.length > 0 && spacers.some((t) => this.rules.other.anyLine.test(t.raw));
676
- list2.loose = hasMultipleLineBreaks;
677
- }
678
- }
679
- if (list2.loose) {
680
- for (let i = 0; i < list2.items.length; i++) {
681
- list2.items[i].loose = true;
682
- }
683
- }
684
- return list2;
685
- }
686
- }
687
- html(src) {
688
- const cap = this.rules.block.html.exec(src);
689
- if (cap) {
690
- const token = {
691
- type: "html",
692
- block: true,
693
- raw: cap[0],
694
- pre: cap[1] === "pre" || cap[1] === "script" || cap[1] === "style",
695
- text: cap[0]
696
- };
697
- return token;
698
- }
699
- }
700
- def(src) {
701
- const cap = this.rules.block.def.exec(src);
702
- if (cap) {
703
- const tag2 = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " ");
704
- const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "";
705
- const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : cap[3];
706
- return {
707
- type: "def",
708
- tag: tag2,
709
- raw: cap[0],
710
- href,
711
- title
712
- };
713
- }
714
- }
715
- table(src) {
716
- const cap = this.rules.block.table.exec(src);
717
- if (!cap) {
718
- return;
719
- }
720
- if (!this.rules.other.tableDelimiter.test(cap[2])) {
721
- return;
722
- }
723
- const headers = splitCells(cap[1]);
724
- const aligns = cap[2].replace(this.rules.other.tableAlignChars, "").split("|");
725
- const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, "").split("\n") : [];
726
- const item = {
727
- type: "table",
728
- raw: cap[0],
729
- header: [],
730
- align: [],
731
- rows: []
732
- };
733
- if (headers.length !== aligns.length) {
734
- return;
735
- }
736
- for (const align of aligns) {
737
- if (this.rules.other.tableAlignRight.test(align)) {
738
- item.align.push("right");
739
- } else if (this.rules.other.tableAlignCenter.test(align)) {
740
- item.align.push("center");
741
- } else if (this.rules.other.tableAlignLeft.test(align)) {
742
- item.align.push("left");
743
- } else {
744
- item.align.push(null);
745
- }
746
- }
747
- for (let i = 0; i < headers.length; i++) {
748
- item.header.push({
749
- text: headers[i],
750
- tokens: this.lexer.inline(headers[i]),
751
- header: true,
752
- align: item.align[i]
753
- });
754
- }
755
- for (const row of rows) {
756
- item.rows.push(splitCells(row, item.header.length).map((cell, i) => {
757
- return {
758
- text: cell,
759
- tokens: this.lexer.inline(cell),
760
- header: false,
761
- align: item.align[i]
762
- };
763
- }));
764
- }
765
- return item;
766
- }
767
- lheading(src) {
768
- const cap = this.rules.block.lheading.exec(src);
769
- if (cap) {
770
- return {
771
- type: "heading",
772
- raw: cap[0],
773
- depth: cap[2].charAt(0) === "=" ? 1 : 2,
774
- text: cap[1],
775
- tokens: this.lexer.inline(cap[1])
776
- };
777
- }
778
- }
779
- paragraph(src) {
780
- const cap = this.rules.block.paragraph.exec(src);
781
- if (cap) {
782
- const text = cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1];
783
- return {
784
- type: "paragraph",
785
- raw: cap[0],
786
- text,
787
- tokens: this.lexer.inline(text)
788
- };
789
- }
790
- }
791
- text(src) {
792
- const cap = this.rules.block.text.exec(src);
793
- if (cap) {
794
- return {
795
- type: "text",
796
- raw: cap[0],
797
- text: cap[0],
798
- tokens: this.lexer.inline(cap[0])
799
- };
800
- }
801
- }
802
- escape(src) {
803
- const cap = this.rules.inline.escape.exec(src);
804
- if (cap) {
805
- return {
806
- type: "escape",
807
- raw: cap[0],
808
- text: cap[1]
809
- };
810
- }
811
- }
812
- tag(src) {
813
- const cap = this.rules.inline.tag.exec(src);
814
- if (cap) {
815
- if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {
816
- this.lexer.state.inLink = true;
817
- } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {
818
- this.lexer.state.inLink = false;
819
- }
820
- if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {
821
- this.lexer.state.inRawBlock = true;
822
- } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {
823
- this.lexer.state.inRawBlock = false;
824
- }
825
- return {
826
- type: "html",
827
- raw: cap[0],
828
- inLink: this.lexer.state.inLink,
829
- inRawBlock: this.lexer.state.inRawBlock,
830
- block: false,
831
- text: cap[0]
832
- };
833
- }
834
- }
835
- link(src) {
836
- const cap = this.rules.inline.link.exec(src);
837
- if (cap) {
838
- const trimmedUrl = cap[2].trim();
839
- if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {
840
- if (!this.rules.other.endAngleBracket.test(trimmedUrl)) {
841
- return;
842
- }
843
- const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\");
844
- if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
845
- return;
846
- }
847
- } else {
848
- const lastParenIndex = findClosingBracket(cap[2], "()");
849
- if (lastParenIndex === -2) {
850
- return;
851
- }
852
- if (lastParenIndex > -1) {
853
- const start = cap[0].indexOf("!") === 0 ? 5 : 4;
854
- const linkLen = start + cap[1].length + lastParenIndex;
855
- cap[2] = cap[2].substring(0, lastParenIndex);
856
- cap[0] = cap[0].substring(0, linkLen).trim();
857
- cap[3] = "";
858
- }
859
- }
860
- let href = cap[2];
861
- let title = "";
862
- if (this.options.pedantic) {
863
- const link2 = this.rules.other.pedanticHrefTitle.exec(href);
864
- if (link2) {
865
- href = link2[1];
866
- title = link2[3];
867
- }
868
- } else {
869
- title = cap[3] ? cap[3].slice(1, -1) : "";
870
- }
871
- href = href.trim();
872
- if (this.rules.other.startAngleBracket.test(href)) {
873
- if (this.options.pedantic && !this.rules.other.endAngleBracket.test(trimmedUrl)) {
874
- href = href.slice(1);
875
- } else {
876
- href = href.slice(1, -1);
877
- }
878
- }
879
- return outputLink(cap, {
880
- href: href ? href.replace(this.rules.inline.anyPunctuation, "$1") : href,
881
- title: title ? title.replace(this.rules.inline.anyPunctuation, "$1") : title
882
- }, cap[0], this.lexer, this.rules);
883
- }
884
- }
885
- reflink(src, links) {
886
- let cap;
887
- if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
888
- const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, " ");
889
- const link2 = links[linkString.toLowerCase()];
890
- if (!link2) {
891
- const text = cap[0].charAt(0);
892
- return {
893
- type: "text",
894
- raw: text,
895
- text
896
- };
897
- }
898
- return outputLink(cap, link2, cap[0], this.lexer, this.rules);
899
- }
900
- }
901
- emStrong(src, maskedSrc, prevChar = "") {
902
- let match = this.rules.inline.emStrongLDelim.exec(src);
903
- if (!match) return;
904
- if (match[3] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;
905
- const nextChar = match[1] || match[2] || "";
906
- if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {
907
- const lLength = [...match[0]].length - 1;
908
- let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;
909
- const endReg = match[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;
910
- endReg.lastIndex = 0;
911
- maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
912
- while ((match = endReg.exec(maskedSrc)) != null) {
913
- rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
914
- if (!rDelim) continue;
915
- rLength = [...rDelim].length;
916
- if (match[3] || match[4]) {
917
- delimTotal += rLength;
918
- continue;
919
- } else if (match[5] || match[6]) {
920
- if (lLength % 3 && !((lLength + rLength) % 3)) {
921
- midDelimTotal += rLength;
922
- continue;
923
- }
924
- }
925
- delimTotal -= rLength;
926
- if (delimTotal > 0) continue;
927
- rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);
928
- const lastCharLength = [...match[0]][0].length;
929
- const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);
930
- if (Math.min(lLength, rLength) % 2) {
931
- const text2 = raw.slice(1, -1);
932
- return {
933
- type: "em",
934
- raw,
935
- text: text2,
936
- tokens: this.lexer.inlineTokens(text2)
937
- };
938
- }
939
- const text = raw.slice(2, -2);
940
- return {
941
- type: "strong",
942
- raw,
943
- text,
944
- tokens: this.lexer.inlineTokens(text)
945
- };
946
- }
947
- }
948
- }
949
- codespan(src) {
950
- const cap = this.rules.inline.code.exec(src);
951
- if (cap) {
952
- let text = cap[2].replace(this.rules.other.newLineCharGlobal, " ");
953
- const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);
954
- const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);
955
- if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
956
- text = text.substring(1, text.length - 1);
957
- }
958
- return {
959
- type: "codespan",
960
- raw: cap[0],
961
- text
962
- };
963
- }
964
- }
965
- br(src) {
966
- const cap = this.rules.inline.br.exec(src);
967
- if (cap) {
968
- return {
969
- type: "br",
970
- raw: cap[0]
971
- };
972
- }
973
- }
974
- del(src) {
975
- const cap = this.rules.inline.del.exec(src);
976
- if (cap) {
977
- return {
978
- type: "del",
979
- raw: cap[0],
980
- text: cap[2],
981
- tokens: this.lexer.inlineTokens(cap[2])
982
- };
983
- }
984
- }
985
- autolink(src) {
986
- const cap = this.rules.inline.autolink.exec(src);
987
- if (cap) {
988
- let text, href;
989
- if (cap[2] === "@") {
990
- text = cap[1];
991
- href = "mailto:" + text;
992
- } else {
993
- text = cap[1];
994
- href = text;
995
- }
996
- return {
997
- type: "link",
998
- raw: cap[0],
999
- text,
1000
- href,
1001
- tokens: [
1002
- {
1003
- type: "text",
1004
- raw: text,
1005
- text
1006
- }
1007
- ]
1008
- };
1009
- }
1010
- }
1011
- url(src) {
1012
- let cap;
1013
- if (cap = this.rules.inline.url.exec(src)) {
1014
- let text, href;
1015
- if (cap[2] === "@") {
1016
- text = cap[0];
1017
- href = "mailto:" + text;
1018
- } else {
1019
- let prevCapZero;
1020
- do {
1021
- prevCapZero = cap[0];
1022
- cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? "";
1023
- } while (prevCapZero !== cap[0]);
1024
- text = cap[0];
1025
- if (cap[1] === "www.") {
1026
- href = "http://" + cap[0];
1027
- } else {
1028
- href = cap[0];
1029
- }
1030
- }
1031
- return {
1032
- type: "link",
1033
- raw: cap[0],
1034
- text,
1035
- href,
1036
- tokens: [
1037
- {
1038
- type: "text",
1039
- raw: text,
1040
- text
1041
- }
1042
- ]
1043
- };
1044
- }
1045
- }
1046
- inlineText(src) {
1047
- const cap = this.rules.inline.text.exec(src);
1048
- if (cap) {
1049
- const escaped = this.lexer.state.inRawBlock;
1050
- return {
1051
- type: "text",
1052
- raw: cap[0],
1053
- text: cap[0],
1054
- escaped
1055
- };
1056
- }
1057
- }
1058
- };
1059
-
1060
- // src/Lexer.ts
1061
- var _Lexer = class __Lexer {
1062
- tokens;
1063
- options;
1064
- state;
1065
- tokenizer;
1066
- inlineQueue;
1067
- constructor(options2) {
1068
- this.tokens = [];
1069
- this.tokens.links = /* @__PURE__ */ Object.create(null);
1070
- this.options = options2 || _defaults;
1071
- this.options.tokenizer = this.options.tokenizer || new _Tokenizer();
1072
- this.tokenizer = this.options.tokenizer;
1073
- this.tokenizer.options = this.options;
1074
- this.tokenizer.lexer = this;
1075
- this.inlineQueue = [];
1076
- this.state = {
1077
- inLink: false,
1078
- inRawBlock: false,
1079
- top: true
1080
- };
1081
- const rules = {
1082
- other,
1083
- block: block.normal,
1084
- inline: inline.normal
1085
- };
1086
- if (this.options.pedantic) {
1087
- rules.block = block.pedantic;
1088
- rules.inline = inline.pedantic;
1089
- } else if (this.options.gfm) {
1090
- rules.block = block.gfm;
1091
- if (this.options.breaks) {
1092
- rules.inline = inline.breaks;
1093
- } else {
1094
- rules.inline = inline.gfm;
1095
- }
1096
- }
1097
- this.tokenizer.rules = rules;
1098
- }
1099
- /**
1100
- * Expose Rules
1101
- */
1102
- static get rules() {
1103
- return {
1104
- block,
1105
- inline
1106
- };
1107
- }
1108
- /**
1109
- * Static Lex Method
1110
- */
1111
- static lex(src, options2) {
1112
- const lexer2 = new __Lexer(options2);
1113
- return lexer2.lex(src);
1114
- }
1115
- /**
1116
- * Static Lex Inline Method
1117
- */
1118
- static lexInline(src, options2) {
1119
- const lexer2 = new __Lexer(options2);
1120
- return lexer2.inlineTokens(src);
1121
- }
1122
- /**
1123
- * Preprocessing
1124
- */
1125
- lex(src) {
1126
- src = src.replace(other.carriageReturn, "\n");
1127
- this.blockTokens(src, this.tokens);
1128
- for (let i = 0; i < this.inlineQueue.length; i++) {
1129
- const next = this.inlineQueue[i];
1130
- this.inlineTokens(next.src, next.tokens);
1131
- }
1132
- this.inlineQueue = [];
1133
- return this.tokens;
1134
- }
1135
- blockTokens(src, tokens = [], lastParagraphClipped = false) {
1136
- if (this.options.pedantic) {
1137
- src = src.replace(other.tabCharGlobal, " ").replace(other.spaceLine, "");
1138
- }
1139
- while (src) {
1140
- let token;
1141
- if (this.options.extensions?.block?.some((extTokenizer) => {
1142
- if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
1143
- src = src.substring(token.raw.length);
1144
- tokens.push(token);
1145
- return true;
1146
- }
1147
- return false;
1148
- })) {
1149
- continue;
1150
- }
1151
- if (token = this.tokenizer.space(src)) {
1152
- src = src.substring(token.raw.length);
1153
- const lastToken = tokens.at(-1);
1154
- if (token.raw.length === 1 && lastToken !== void 0) {
1155
- lastToken.raw += "\n";
1156
- } else {
1157
- tokens.push(token);
1158
- }
1159
- continue;
1160
- }
1161
- if (token = this.tokenizer.code(src)) {
1162
- src = src.substring(token.raw.length);
1163
- const lastToken = tokens.at(-1);
1164
- if (lastToken?.type === "paragraph" || lastToken?.type === "text") {
1165
- lastToken.raw += "\n" + token.raw;
1166
- lastToken.text += "\n" + token.text;
1167
- this.inlineQueue.at(-1).src = lastToken.text;
1168
- } else {
1169
- tokens.push(token);
1170
- }
1171
- continue;
1172
- }
1173
- if (token = this.tokenizer.fences(src)) {
1174
- src = src.substring(token.raw.length);
1175
- tokens.push(token);
1176
- continue;
1177
- }
1178
- if (token = this.tokenizer.heading(src)) {
1179
- src = src.substring(token.raw.length);
1180
- tokens.push(token);
1181
- continue;
1182
- }
1183
- if (token = this.tokenizer.hr(src)) {
1184
- src = src.substring(token.raw.length);
1185
- tokens.push(token);
1186
- continue;
1187
- }
1188
- if (token = this.tokenizer.blockquote(src)) {
1189
- src = src.substring(token.raw.length);
1190
- tokens.push(token);
1191
- continue;
1192
- }
1193
- if (token = this.tokenizer.list(src)) {
1194
- src = src.substring(token.raw.length);
1195
- tokens.push(token);
1196
- continue;
1197
- }
1198
- if (token = this.tokenizer.html(src)) {
1199
- src = src.substring(token.raw.length);
1200
- tokens.push(token);
1201
- continue;
1202
- }
1203
- if (token = this.tokenizer.def(src)) {
1204
- src = src.substring(token.raw.length);
1205
- const lastToken = tokens.at(-1);
1206
- if (lastToken?.type === "paragraph" || lastToken?.type === "text") {
1207
- lastToken.raw += "\n" + token.raw;
1208
- lastToken.text += "\n" + token.raw;
1209
- this.inlineQueue.at(-1).src = lastToken.text;
1210
- } else if (!this.tokens.links[token.tag]) {
1211
- this.tokens.links[token.tag] = {
1212
- href: token.href,
1213
- title: token.title
1214
- };
1215
- }
1216
- continue;
1217
- }
1218
- if (token = this.tokenizer.table(src)) {
1219
- src = src.substring(token.raw.length);
1220
- tokens.push(token);
1221
- continue;
1222
- }
1223
- if (token = this.tokenizer.lheading(src)) {
1224
- src = src.substring(token.raw.length);
1225
- tokens.push(token);
1226
- continue;
1227
- }
1228
- let cutSrc = src;
1229
- if (this.options.extensions?.startBlock) {
1230
- let startIndex = Infinity;
1231
- const tempSrc = src.slice(1);
1232
- let tempStart;
1233
- this.options.extensions.startBlock.forEach((getStartIndex) => {
1234
- tempStart = getStartIndex.call({ lexer: this }, tempSrc);
1235
- if (typeof tempStart === "number" && tempStart >= 0) {
1236
- startIndex = Math.min(startIndex, tempStart);
1237
- }
1238
- });
1239
- if (startIndex < Infinity && startIndex >= 0) {
1240
- cutSrc = src.substring(0, startIndex + 1);
1241
- }
1242
- }
1243
- if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {
1244
- const lastToken = tokens.at(-1);
1245
- if (lastParagraphClipped && lastToken?.type === "paragraph") {
1246
- lastToken.raw += "\n" + token.raw;
1247
- lastToken.text += "\n" + token.text;
1248
- this.inlineQueue.pop();
1249
- this.inlineQueue.at(-1).src = lastToken.text;
1250
- } else {
1251
- tokens.push(token);
1252
- }
1253
- lastParagraphClipped = cutSrc.length !== src.length;
1254
- src = src.substring(token.raw.length);
1255
- continue;
1256
- }
1257
- if (token = this.tokenizer.text(src)) {
1258
- src = src.substring(token.raw.length);
1259
- const lastToken = tokens.at(-1);
1260
- if (lastToken?.type === "text") {
1261
- lastToken.raw += "\n" + token.raw;
1262
- lastToken.text += "\n" + token.text;
1263
- this.inlineQueue.pop();
1264
- this.inlineQueue.at(-1).src = lastToken.text;
1265
- } else {
1266
- tokens.push(token);
1267
- }
1268
- continue;
1269
- }
1270
- if (src) {
1271
- const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
1272
- if (this.options.silent) {
1273
- console.error(errMsg);
1274
- break;
1275
- } else {
1276
- throw new Error(errMsg);
1277
- }
1278
- }
1279
- }
1280
- this.state.top = true;
1281
- return tokens;
1282
- }
1283
- inline(src, tokens = []) {
1284
- this.inlineQueue.push({ src, tokens });
1285
- return tokens;
1286
- }
1287
- /**
1288
- * Lexing/Compiling
1289
- */
1290
- inlineTokens(src, tokens = []) {
1291
- let maskedSrc = src;
1292
- let match = null;
1293
- if (this.tokens.links) {
1294
- const links = Object.keys(this.tokens.links);
1295
- if (links.length > 0) {
1296
- while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
1297
- if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) {
1298
- maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
1299
- }
1300
- }
1301
- }
1302
- }
1303
- while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {
1304
- maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);
1305
- }
1306
- while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
1307
- maskedSrc = maskedSrc.slice(0, match.index) + "[" + "a".repeat(match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
1308
- }
1309
- let keepPrevChar = false;
1310
- let prevChar = "";
1311
- while (src) {
1312
- if (!keepPrevChar) {
1313
- prevChar = "";
1314
- }
1315
- keepPrevChar = false;
1316
- let token;
1317
- if (this.options.extensions?.inline?.some((extTokenizer) => {
1318
- if (token = extTokenizer.call({ lexer: this }, src, tokens)) {
1319
- src = src.substring(token.raw.length);
1320
- tokens.push(token);
1321
- return true;
1322
- }
1323
- return false;
1324
- })) {
1325
- continue;
1326
- }
1327
- if (token = this.tokenizer.escape(src)) {
1328
- src = src.substring(token.raw.length);
1329
- tokens.push(token);
1330
- continue;
1331
- }
1332
- if (token = this.tokenizer.tag(src)) {
1333
- src = src.substring(token.raw.length);
1334
- tokens.push(token);
1335
- continue;
1336
- }
1337
- if (token = this.tokenizer.link(src)) {
1338
- src = src.substring(token.raw.length);
1339
- tokens.push(token);
1340
- continue;
1341
- }
1342
- if (token = this.tokenizer.reflink(src, this.tokens.links)) {
1343
- src = src.substring(token.raw.length);
1344
- const lastToken = tokens.at(-1);
1345
- if (token.type === "text" && lastToken?.type === "text") {
1346
- lastToken.raw += token.raw;
1347
- lastToken.text += token.text;
1348
- } else {
1349
- tokens.push(token);
1350
- }
1351
- continue;
1352
- }
1353
- if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
1354
- src = src.substring(token.raw.length);
1355
- tokens.push(token);
1356
- continue;
1357
- }
1358
- if (token = this.tokenizer.codespan(src)) {
1359
- src = src.substring(token.raw.length);
1360
- tokens.push(token);
1361
- continue;
1362
- }
1363
- if (token = this.tokenizer.br(src)) {
1364
- src = src.substring(token.raw.length);
1365
- tokens.push(token);
1366
- continue;
1367
- }
1368
- if (token = this.tokenizer.del(src)) {
1369
- src = src.substring(token.raw.length);
1370
- tokens.push(token);
1371
- continue;
1372
- }
1373
- if (token = this.tokenizer.autolink(src)) {
1374
- src = src.substring(token.raw.length);
1375
- tokens.push(token);
1376
- continue;
1377
- }
1378
- if (!this.state.inLink && (token = this.tokenizer.url(src))) {
1379
- src = src.substring(token.raw.length);
1380
- tokens.push(token);
1381
- continue;
1382
- }
1383
- let cutSrc = src;
1384
- if (this.options.extensions?.startInline) {
1385
- let startIndex = Infinity;
1386
- const tempSrc = src.slice(1);
1387
- let tempStart;
1388
- this.options.extensions.startInline.forEach((getStartIndex) => {
1389
- tempStart = getStartIndex.call({ lexer: this }, tempSrc);
1390
- if (typeof tempStart === "number" && tempStart >= 0) {
1391
- startIndex = Math.min(startIndex, tempStart);
1392
- }
1393
- });
1394
- if (startIndex < Infinity && startIndex >= 0) {
1395
- cutSrc = src.substring(0, startIndex + 1);
1396
- }
1397
- }
1398
- if (token = this.tokenizer.inlineText(cutSrc)) {
1399
- src = src.substring(token.raw.length);
1400
- if (token.raw.slice(-1) !== "_") {
1401
- prevChar = token.raw.slice(-1);
1402
- }
1403
- keepPrevChar = true;
1404
- const lastToken = tokens.at(-1);
1405
- if (lastToken?.type === "text") {
1406
- lastToken.raw += token.raw;
1407
- lastToken.text += token.text;
1408
- } else {
1409
- tokens.push(token);
1410
- }
1411
- continue;
1412
- }
1413
- if (src) {
1414
- const errMsg = "Infinite loop on byte: " + src.charCodeAt(0);
1415
- if (this.options.silent) {
1416
- console.error(errMsg);
1417
- break;
1418
- } else {
1419
- throw new Error(errMsg);
1420
- }
1421
- }
1422
- }
1423
- return tokens;
1424
- }
1425
- };
1426
-
1427
- // src/Renderer.ts
1428
- var _Renderer = class {
1429
- options;
1430
- parser;
1431
- // set by the parser
1432
- constructor(options2) {
1433
- this.options = options2 || _defaults;
1434
- }
1435
- space(token) {
1436
- return "";
1437
- }
1438
- code({ text, lang, escaped }) {
1439
- const langString = (lang || "").match(other.notSpaceStart)?.[0];
1440
- const code = text.replace(other.endingNewline, "") + "\n";
1441
- if (!langString) {
1442
- return "<pre><code>" + (escaped ? code : escape2(code, true)) + "</code></pre>\n";
1443
- }
1444
- return '<pre><code class="language-' + escape2(langString) + '">' + (escaped ? code : escape2(code, true)) + "</code></pre>\n";
1445
- }
1446
- blockquote({ tokens }) {
1447
- const body = this.parser.parse(tokens);
1448
- return `<blockquote>
1449
- ${body}</blockquote>
1450
- `;
1451
- }
1452
- html({ text }) {
1453
- return text;
1454
- }
1455
- heading({ tokens, depth }) {
1456
- return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>
1457
- `;
1458
- }
1459
- hr(token) {
1460
- return "<hr>\n";
1461
- }
1462
- list(token) {
1463
- const ordered = token.ordered;
1464
- const start = token.start;
1465
- let body = "";
1466
- for (let j = 0; j < token.items.length; j++) {
1467
- const item = token.items[j];
1468
- body += this.listitem(item);
1469
- }
1470
- const type = ordered ? "ol" : "ul";
1471
- const startAttr = ordered && start !== 1 ? ' start="' + start + '"' : "";
1472
- return "<" + type + startAttr + ">\n" + body + "</" + type + ">\n";
1473
- }
1474
- listitem(item) {
1475
- let itemBody = "";
1476
- if (item.task) {
1477
- const checkbox = this.checkbox({ checked: !!item.checked });
1478
- if (item.loose) {
1479
- if (item.tokens[0]?.type === "paragraph") {
1480
- item.tokens[0].text = checkbox + " " + item.tokens[0].text;
1481
- if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === "text") {
1482
- item.tokens[0].tokens[0].text = checkbox + " " + escape2(item.tokens[0].tokens[0].text);
1483
- item.tokens[0].tokens[0].escaped = true;
1484
- }
1485
- } else {
1486
- item.tokens.unshift({
1487
- type: "text",
1488
- raw: checkbox + " ",
1489
- text: checkbox + " ",
1490
- escaped: true
1491
- });
1492
- }
1493
- } else {
1494
- itemBody += checkbox + " ";
1495
- }
1496
- }
1497
- itemBody += this.parser.parse(item.tokens, !!item.loose);
1498
- return `<li>${itemBody}</li>
1499
- `;
1500
- }
1501
- checkbox({ checked }) {
1502
- return "<input " + (checked ? 'checked="" ' : "") + 'disabled="" type="checkbox">';
1503
- }
1504
- paragraph({ tokens }) {
1505
- return `<p>${this.parser.parseInline(tokens)}</p>
1506
- `;
1507
- }
1508
- table(token) {
1509
- let header = "";
1510
- let cell = "";
1511
- for (let j = 0; j < token.header.length; j++) {
1512
- cell += this.tablecell(token.header[j]);
1513
- }
1514
- header += this.tablerow({ text: cell });
1515
- let body = "";
1516
- for (let j = 0; j < token.rows.length; j++) {
1517
- const row = token.rows[j];
1518
- cell = "";
1519
- for (let k = 0; k < row.length; k++) {
1520
- cell += this.tablecell(row[k]);
1521
- }
1522
- body += this.tablerow({ text: cell });
1523
- }
1524
- if (body) body = `<tbody>${body}</tbody>`;
1525
- return "<table>\n<thead>\n" + header + "</thead>\n" + body + "</table>\n";
1526
- }
1527
- tablerow({ text }) {
1528
- return `<tr>
1529
- ${text}</tr>
1530
- `;
1531
- }
1532
- tablecell(token) {
1533
- const content = this.parser.parseInline(token.tokens);
1534
- const type = token.header ? "th" : "td";
1535
- const tag2 = token.align ? `<${type} align="${token.align}">` : `<${type}>`;
1536
- return tag2 + content + `</${type}>
1537
- `;
1538
- }
1539
- /**
1540
- * span level renderer
1541
- */
1542
- strong({ tokens }) {
1543
- return `<strong>${this.parser.parseInline(tokens)}</strong>`;
1544
- }
1545
- em({ tokens }) {
1546
- return `<em>${this.parser.parseInline(tokens)}</em>`;
1547
- }
1548
- codespan({ text }) {
1549
- return `<code>${escape2(text, true)}</code>`;
1550
- }
1551
- br(token) {
1552
- return "<br>";
1553
- }
1554
- del({ tokens }) {
1555
- return `<del>${this.parser.parseInline(tokens)}</del>`;
1556
- }
1557
- link({ href, title, tokens }) {
1558
- const text = this.parser.parseInline(tokens);
1559
- const cleanHref = cleanUrl(href);
1560
- if (cleanHref === null) {
1561
- return text;
1562
- }
1563
- href = cleanHref;
1564
- let out = '<a href="' + href + '"';
1565
- if (title) {
1566
- out += ' title="' + escape2(title) + '"';
1567
- }
1568
- out += ">" + text + "</a>";
1569
- return out;
1570
- }
1571
- image({ href, title, text, tokens }) {
1572
- if (tokens) {
1573
- text = this.parser.parseInline(tokens, this.parser.textRenderer);
1574
- }
1575
- const cleanHref = cleanUrl(href);
1576
- if (cleanHref === null) {
1577
- return escape2(text);
1578
- }
1579
- href = cleanHref;
1580
- let out = `<img src="${href}" alt="${text}"`;
1581
- if (title) {
1582
- out += ` title="${escape2(title)}"`;
1583
- }
1584
- out += ">";
1585
- return out;
1586
- }
1587
- text(token) {
1588
- return "tokens" in token && token.tokens ? this.parser.parseInline(token.tokens) : "escaped" in token && token.escaped ? token.text : escape2(token.text);
1589
- }
1590
- };
1591
-
1592
- // src/TextRenderer.ts
1593
- var _TextRenderer = class {
1594
- // no need for block level renderers
1595
- strong({ text }) {
1596
- return text;
1597
- }
1598
- em({ text }) {
1599
- return text;
1600
- }
1601
- codespan({ text }) {
1602
- return text;
1603
- }
1604
- del({ text }) {
1605
- return text;
1606
- }
1607
- html({ text }) {
1608
- return text;
1609
- }
1610
- text({ text }) {
1611
- return text;
1612
- }
1613
- link({ text }) {
1614
- return "" + text;
1615
- }
1616
- image({ text }) {
1617
- return "" + text;
1618
- }
1619
- br() {
1620
- return "";
1621
- }
1622
- };
1623
-
1624
- // src/Parser.ts
1625
- var _Parser = class __Parser {
1626
- options;
1627
- renderer;
1628
- textRenderer;
1629
- constructor(options2) {
1630
- this.options = options2 || _defaults;
1631
- this.options.renderer = this.options.renderer || new _Renderer();
1632
- this.renderer = this.options.renderer;
1633
- this.renderer.options = this.options;
1634
- this.renderer.parser = this;
1635
- this.textRenderer = new _TextRenderer();
1636
- }
1637
- /**
1638
- * Static Parse Method
1639
- */
1640
- static parse(tokens, options2) {
1641
- const parser2 = new __Parser(options2);
1642
- return parser2.parse(tokens);
1643
- }
1644
- /**
1645
- * Static Parse Inline Method
1646
- */
1647
- static parseInline(tokens, options2) {
1648
- const parser2 = new __Parser(options2);
1649
- return parser2.parseInline(tokens);
1650
- }
1651
- /**
1652
- * Parse Loop
1653
- */
1654
- parse(tokens, top = true) {
1655
- let out = "";
1656
- for (let i = 0; i < tokens.length; i++) {
1657
- const anyToken = tokens[i];
1658
- if (this.options.extensions?.renderers?.[anyToken.type]) {
1659
- const genericToken = anyToken;
1660
- const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);
1661
- if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(genericToken.type)) {
1662
- out += ret || "";
1663
- continue;
1664
- }
1665
- }
1666
- const token = anyToken;
1667
- switch (token.type) {
1668
- case "space": {
1669
- out += this.renderer.space(token);
1670
- continue;
1671
- }
1672
- case "hr": {
1673
- out += this.renderer.hr(token);
1674
- continue;
1675
- }
1676
- case "heading": {
1677
- out += this.renderer.heading(token);
1678
- continue;
1679
- }
1680
- case "code": {
1681
- out += this.renderer.code(token);
1682
- continue;
1683
- }
1684
- case "table": {
1685
- out += this.renderer.table(token);
1686
- continue;
1687
- }
1688
- case "blockquote": {
1689
- out += this.renderer.blockquote(token);
1690
- continue;
1691
- }
1692
- case "list": {
1693
- out += this.renderer.list(token);
1694
- continue;
1695
- }
1696
- case "html": {
1697
- out += this.renderer.html(token);
1698
- continue;
1699
- }
1700
- case "paragraph": {
1701
- out += this.renderer.paragraph(token);
1702
- continue;
1703
- }
1704
- case "text": {
1705
- let textToken = token;
1706
- let body = this.renderer.text(textToken);
1707
- while (i + 1 < tokens.length && tokens[i + 1].type === "text") {
1708
- textToken = tokens[++i];
1709
- body += "\n" + this.renderer.text(textToken);
1710
- }
1711
- if (top) {
1712
- out += this.renderer.paragraph({
1713
- type: "paragraph",
1714
- raw: body,
1715
- text: body,
1716
- tokens: [{ type: "text", raw: body, text: body, escaped: true }]
1717
- });
1718
- } else {
1719
- out += body;
1720
- }
1721
- continue;
1722
- }
1723
- default: {
1724
- const errMsg = 'Token with "' + token.type + '" type was not found.';
1725
- if (this.options.silent) {
1726
- console.error(errMsg);
1727
- return "";
1728
- } else {
1729
- throw new Error(errMsg);
1730
- }
1731
- }
1732
- }
1733
- }
1734
- return out;
1735
- }
1736
- /**
1737
- * Parse Inline Tokens
1738
- */
1739
- parseInline(tokens, renderer = this.renderer) {
1740
- let out = "";
1741
- for (let i = 0; i < tokens.length; i++) {
1742
- const anyToken = tokens[i];
1743
- if (this.options.extensions?.renderers?.[anyToken.type]) {
1744
- const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);
1745
- if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(anyToken.type)) {
1746
- out += ret || "";
1747
- continue;
1748
- }
1749
- }
1750
- const token = anyToken;
1751
- switch (token.type) {
1752
- case "escape": {
1753
- out += renderer.text(token);
1754
- break;
1755
- }
1756
- case "html": {
1757
- out += renderer.html(token);
1758
- break;
1759
- }
1760
- case "link": {
1761
- out += renderer.link(token);
1762
- break;
1763
- }
1764
- case "image": {
1765
- out += renderer.image(token);
1766
- break;
1767
- }
1768
- case "strong": {
1769
- out += renderer.strong(token);
1770
- break;
1771
- }
1772
- case "em": {
1773
- out += renderer.em(token);
1774
- break;
1775
- }
1776
- case "codespan": {
1777
- out += renderer.codespan(token);
1778
- break;
1779
- }
1780
- case "br": {
1781
- out += renderer.br(token);
1782
- break;
1783
- }
1784
- case "del": {
1785
- out += renderer.del(token);
1786
- break;
1787
- }
1788
- case "text": {
1789
- out += renderer.text(token);
1790
- break;
1791
- }
1792
- default: {
1793
- const errMsg = 'Token with "' + token.type + '" type was not found.';
1794
- if (this.options.silent) {
1795
- console.error(errMsg);
1796
- return "";
1797
- } else {
1798
- throw new Error(errMsg);
1799
- }
1800
- }
1801
- }
1802
- }
1803
- return out;
1804
- }
1805
- };
1806
-
1807
- // src/Hooks.ts
1808
- var _Hooks = class {
1809
- options;
1810
- block;
1811
- constructor(options2) {
1812
- this.options = options2 || _defaults;
1813
- }
1814
- static passThroughHooks = /* @__PURE__ */ new Set([
1815
- "preprocess",
1816
- "postprocess",
1817
- "processAllTokens"
1818
- ]);
1819
- /**
1820
- * Process markdown before marked
1821
- */
1822
- preprocess(markdown) {
1823
- return markdown;
1824
- }
1825
- /**
1826
- * Process HTML after marked is finished
1827
- */
1828
- postprocess(html2) {
1829
- return html2;
1830
- }
1831
- /**
1832
- * Process all tokens before walk tokens
1833
- */
1834
- processAllTokens(tokens) {
1835
- return tokens;
1836
- }
1837
- /**
1838
- * Provide function to tokenize markdown
1839
- */
1840
- provideLexer() {
1841
- return this.block ? _Lexer.lex : _Lexer.lexInline;
1842
- }
1843
- /**
1844
- * Provide function to parse tokens
1845
- */
1846
- provideParser() {
1847
- return this.block ? _Parser.parse : _Parser.parseInline;
1848
- }
1849
- };
1850
-
1851
- // src/Instance.ts
1852
- var Marked = class {
1853
- defaults = _getDefaults();
1854
- options = this.setOptions;
1855
- parse = this.parseMarkdown(true);
1856
- parseInline = this.parseMarkdown(false);
1857
- Parser = _Parser;
1858
- Renderer = _Renderer;
1859
- TextRenderer = _TextRenderer;
1860
- Lexer = _Lexer;
1861
- Tokenizer = _Tokenizer;
1862
- Hooks = _Hooks;
1863
- constructor(...args) {
1864
- this.use(...args);
1865
- }
1866
- /**
1867
- * Run callback for every token
1868
- */
1869
- walkTokens(tokens, callback) {
1870
- let values = [];
1871
- for (const token of tokens) {
1872
- values = values.concat(callback.call(this, token));
1873
- switch (token.type) {
1874
- case "table": {
1875
- const tableToken = token;
1876
- for (const cell of tableToken.header) {
1877
- values = values.concat(this.walkTokens(cell.tokens, callback));
1878
- }
1879
- for (const row of tableToken.rows) {
1880
- for (const cell of row) {
1881
- values = values.concat(this.walkTokens(cell.tokens, callback));
1882
- }
1883
- }
1884
- break;
1885
- }
1886
- case "list": {
1887
- const listToken = token;
1888
- values = values.concat(this.walkTokens(listToken.items, callback));
1889
- break;
1890
- }
1891
- default: {
1892
- const genericToken = token;
1893
- if (this.defaults.extensions?.childTokens?.[genericToken.type]) {
1894
- this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {
1895
- const tokens2 = genericToken[childTokens].flat(Infinity);
1896
- values = values.concat(this.walkTokens(tokens2, callback));
1897
- });
1898
- } else if (genericToken.tokens) {
1899
- values = values.concat(this.walkTokens(genericToken.tokens, callback));
1900
- }
1901
- }
1902
- }
1903
- }
1904
- return values;
1905
- }
1906
- use(...args) {
1907
- const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };
1908
- args.forEach((pack) => {
1909
- const opts = { ...pack };
1910
- opts.async = this.defaults.async || opts.async || false;
1911
- if (pack.extensions) {
1912
- pack.extensions.forEach((ext) => {
1913
- if (!ext.name) {
1914
- throw new Error("extension name required");
1915
- }
1916
- if ("renderer" in ext) {
1917
- const prevRenderer = extensions.renderers[ext.name];
1918
- if (prevRenderer) {
1919
- extensions.renderers[ext.name] = function(...args2) {
1920
- let ret = ext.renderer.apply(this, args2);
1921
- if (ret === false) {
1922
- ret = prevRenderer.apply(this, args2);
1923
- }
1924
- return ret;
1925
- };
1926
- } else {
1927
- extensions.renderers[ext.name] = ext.renderer;
1928
- }
1929
- }
1930
- if ("tokenizer" in ext) {
1931
- if (!ext.level || ext.level !== "block" && ext.level !== "inline") {
1932
- throw new Error("extension level must be 'block' or 'inline'");
1933
- }
1934
- const extLevel = extensions[ext.level];
1935
- if (extLevel) {
1936
- extLevel.unshift(ext.tokenizer);
1937
- } else {
1938
- extensions[ext.level] = [ext.tokenizer];
1939
- }
1940
- if (ext.start) {
1941
- if (ext.level === "block") {
1942
- if (extensions.startBlock) {
1943
- extensions.startBlock.push(ext.start);
1944
- } else {
1945
- extensions.startBlock = [ext.start];
1946
- }
1947
- } else if (ext.level === "inline") {
1948
- if (extensions.startInline) {
1949
- extensions.startInline.push(ext.start);
1950
- } else {
1951
- extensions.startInline = [ext.start];
1952
- }
1953
- }
1954
- }
1955
- }
1956
- if ("childTokens" in ext && ext.childTokens) {
1957
- extensions.childTokens[ext.name] = ext.childTokens;
1958
- }
1959
- });
1960
- opts.extensions = extensions;
1961
- }
1962
- if (pack.renderer) {
1963
- const renderer = this.defaults.renderer || new _Renderer(this.defaults);
1964
- for (const prop in pack.renderer) {
1965
- if (!(prop in renderer)) {
1966
- throw new Error(`renderer '${prop}' does not exist`);
1967
- }
1968
- if (["options", "parser"].includes(prop)) {
1969
- continue;
1970
- }
1971
- const rendererProp = prop;
1972
- const rendererFunc = pack.renderer[rendererProp];
1973
- const prevRenderer = renderer[rendererProp];
1974
- renderer[rendererProp] = (...args2) => {
1975
- let ret = rendererFunc.apply(renderer, args2);
1976
- if (ret === false) {
1977
- ret = prevRenderer.apply(renderer, args2);
1978
- }
1979
- return ret || "";
1980
- };
1981
- }
1982
- opts.renderer = renderer;
1983
- }
1984
- if (pack.tokenizer) {
1985
- const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);
1986
- for (const prop in pack.tokenizer) {
1987
- if (!(prop in tokenizer)) {
1988
- throw new Error(`tokenizer '${prop}' does not exist`);
1989
- }
1990
- if (["options", "rules", "lexer"].includes(prop)) {
1991
- continue;
1992
- }
1993
- const tokenizerProp = prop;
1994
- const tokenizerFunc = pack.tokenizer[tokenizerProp];
1995
- const prevTokenizer = tokenizer[tokenizerProp];
1996
- tokenizer[tokenizerProp] = (...args2) => {
1997
- let ret = tokenizerFunc.apply(tokenizer, args2);
1998
- if (ret === false) {
1999
- ret = prevTokenizer.apply(tokenizer, args2);
2000
- }
2001
- return ret;
2002
- };
2003
- }
2004
- opts.tokenizer = tokenizer;
2005
- }
2006
- if (pack.hooks) {
2007
- const hooks = this.defaults.hooks || new _Hooks();
2008
- for (const prop in pack.hooks) {
2009
- if (!(prop in hooks)) {
2010
- throw new Error(`hook '${prop}' does not exist`);
2011
- }
2012
- if (["options", "block"].includes(prop)) {
2013
- continue;
2014
- }
2015
- const hooksProp = prop;
2016
- const hooksFunc = pack.hooks[hooksProp];
2017
- const prevHook = hooks[hooksProp];
2018
- if (_Hooks.passThroughHooks.has(prop)) {
2019
- hooks[hooksProp] = (arg) => {
2020
- if (this.defaults.async) {
2021
- return Promise.resolve(hooksFunc.call(hooks, arg)).then((ret2) => {
2022
- return prevHook.call(hooks, ret2);
2023
- });
2024
- }
2025
- const ret = hooksFunc.call(hooks, arg);
2026
- return prevHook.call(hooks, ret);
2027
- };
2028
- } else {
2029
- hooks[hooksProp] = (...args2) => {
2030
- let ret = hooksFunc.apply(hooks, args2);
2031
- if (ret === false) {
2032
- ret = prevHook.apply(hooks, args2);
2033
- }
2034
- return ret;
2035
- };
2036
- }
2037
- }
2038
- opts.hooks = hooks;
2039
- }
2040
- if (pack.walkTokens) {
2041
- const walkTokens2 = this.defaults.walkTokens;
2042
- const packWalktokens = pack.walkTokens;
2043
- opts.walkTokens = function(token) {
2044
- let values = [];
2045
- values.push(packWalktokens.call(this, token));
2046
- if (walkTokens2) {
2047
- values = values.concat(walkTokens2.call(this, token));
2048
- }
2049
- return values;
2050
- };
2051
- }
2052
- this.defaults = { ...this.defaults, ...opts };
2053
- });
2054
- return this;
2055
- }
2056
- setOptions(opt) {
2057
- this.defaults = { ...this.defaults, ...opt };
2058
- return this;
2059
- }
2060
- lexer(src, options2) {
2061
- return _Lexer.lex(src, options2 ?? this.defaults);
2062
- }
2063
- parser(tokens, options2) {
2064
- return _Parser.parse(tokens, options2 ?? this.defaults);
2065
- }
2066
- parseMarkdown(blockType) {
2067
- const parse2 = (src, options2) => {
2068
- const origOpt = { ...options2 };
2069
- const opt = { ...this.defaults, ...origOpt };
2070
- const throwError = this.onError(!!opt.silent, !!opt.async);
2071
- if (this.defaults.async === true && origOpt.async === false) {
2072
- return throwError(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));
2073
- }
2074
- if (typeof src === "undefined" || src === null) {
2075
- return throwError(new Error("marked(): input parameter is undefined or null"));
2076
- }
2077
- if (typeof src !== "string") {
2078
- return throwError(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"));
2079
- }
2080
- if (opt.hooks) {
2081
- opt.hooks.options = opt;
2082
- opt.hooks.block = blockType;
2083
- }
2084
- const lexer2 = opt.hooks ? opt.hooks.provideLexer() : blockType ? _Lexer.lex : _Lexer.lexInline;
2085
- const parser2 = opt.hooks ? opt.hooks.provideParser() : blockType ? _Parser.parse : _Parser.parseInline;
2086
- if (opt.async) {
2087
- return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then((src2) => lexer2(src2, opt)).then((tokens) => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens).then((tokens) => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens).then((tokens) => parser2(tokens, opt)).then((html2) => opt.hooks ? opt.hooks.postprocess(html2) : html2).catch(throwError);
2088
- }
2089
- try {
2090
- if (opt.hooks) {
2091
- src = opt.hooks.preprocess(src);
2092
- }
2093
- let tokens = lexer2(src, opt);
2094
- if (opt.hooks) {
2095
- tokens = opt.hooks.processAllTokens(tokens);
2096
- }
2097
- if (opt.walkTokens) {
2098
- this.walkTokens(tokens, opt.walkTokens);
2099
- }
2100
- let html2 = parser2(tokens, opt);
2101
- if (opt.hooks) {
2102
- html2 = opt.hooks.postprocess(html2);
2103
- }
2104
- return html2;
2105
- } catch (e) {
2106
- return throwError(e);
2107
- }
2108
- };
2109
- return parse2;
2110
- }
2111
- onError(silent, async) {
2112
- return (e) => {
2113
- e.message += "\nPlease report this to https://github.com/markedjs/marked.";
2114
- if (silent) {
2115
- const msg = "<p>An error occurred:</p><pre>" + escape2(e.message + "", true) + "</pre>";
2116
- if (async) {
2117
- return Promise.resolve(msg);
2118
- }
2119
- return msg;
2120
- }
2121
- if (async) {
2122
- return Promise.reject(e);
2123
- }
2124
- throw e;
2125
- };
2126
- }
2127
- };
2128
-
2129
- // src/marked.ts
2130
- var markedInstance = new Marked();
2131
- function marked(src, opt) {
2132
- return markedInstance.parse(src, opt);
2133
- }
2134
- marked.options = marked.setOptions = function(options2) {
2135
- markedInstance.setOptions(options2);
2136
- marked.defaults = markedInstance.defaults;
2137
- changeDefaults(marked.defaults);
2138
- return marked;
2139
- };
2140
- marked.getDefaults = _getDefaults;
2141
- marked.defaults = _defaults;
2142
- marked.use = function(...args) {
2143
- markedInstance.use(...args);
2144
- marked.defaults = markedInstance.defaults;
2145
- changeDefaults(marked.defaults);
2146
- return marked;
2147
- };
2148
- marked.walkTokens = function(tokens, callback) {
2149
- return markedInstance.walkTokens(tokens, callback);
2150
- };
2151
- marked.parseInline = markedInstance.parseInline;
2152
- marked.Parser = _Parser;
2153
- marked.parser = _Parser.parse;
2154
- marked.Renderer = _Renderer;
2155
- marked.TextRenderer = _TextRenderer;
2156
- marked.Lexer = _Lexer;
2157
- marked.lexer = _Lexer.lex;
2158
- marked.Tokenizer = _Tokenizer;
2159
- marked.Hooks = _Hooks;
2160
- marked.parse = marked;
2161
- var options = marked.options;
2162
- var setOptions = marked.setOptions;
2163
- var use = marked.use;
2164
- var walkTokens = marked.walkTokens;
2165
- var parseInline = marked.parseInline;
2166
- var parse = marked;
2167
- var parser = _Parser.parse;
2168
- var lexer = _Lexer.lex;
2169
- export {
2170
- _Hooks as Hooks,
2171
- _Lexer as Lexer,
2172
- Marked,
2173
- _Parser as Parser,
2174
- _Renderer as Renderer,
2175
- _TextRenderer as TextRenderer,
2176
- _Tokenizer as Tokenizer,
2177
- _defaults as defaults,
2178
- _getDefaults as getDefaults,
2179
- lexer,
2180
- marked,
2181
- options,
2182
- parse,
2183
- parseInline,
2184
- parser,
2185
- setOptions,
2186
- use,
2187
- walkTokens
2188
- };
2189
- //# sourceMappingURL=marked.esm.js.map