@tinta-lang/syntax 0.0.0-stage → 0.1.16

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 (245) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -2
  3. package/THIRD_PARTY_NOTICES.txt +13651 -0
  4. package/dist/directive.d.ts +40 -0
  5. package/dist/editing.d.ts +46 -0
  6. package/dist/enrichment.d.ts +5 -0
  7. package/dist/expression.d.ts +26 -0
  8. package/dist/image-destinations.d.ts +3 -0
  9. package/dist/index.d.ts +8 -0
  10. package/dist/index.js +10118 -0
  11. package/dist/parser.d.ts +40 -0
  12. package/dist/registry.d.ts +144 -0
  13. package/dist/source.d.ts +28 -0
  14. package/package.json +289 -3
  15. package/parser-provenance.json +1419 -0
  16. package/patches/README.md +5 -0
  17. package/patches/micromark.patch +84 -0
  18. package/vendor/@noble/hashes/LICENSE +21 -0
  19. package/vendor/@noble/hashes/_md.js +209 -0
  20. package/vendor/@noble/hashes/_u64.js +77 -0
  21. package/vendor/@noble/hashes/package.json +91 -0
  22. package/vendor/@noble/hashes/sha2.js +446 -0
  23. package/vendor/@noble/hashes/utils.js +687 -0
  24. package/vendor/character-entities/index.js +2132 -0
  25. package/vendor/character-entities/license +22 -0
  26. package/vendor/character-entities/package.json +78 -0
  27. package/vendor/decode-named-character-reference/index.js +19 -0
  28. package/vendor/decode-named-character-reference/license +22 -0
  29. package/vendor/decode-named-character-reference/package.json +90 -0
  30. package/vendor/devlop/lib/default.js +9 -0
  31. package/vendor/devlop/license +22 -0
  32. package/vendor/devlop/package.json +80 -0
  33. package/vendor/longest-streak/index.js +36 -0
  34. package/vendor/longest-streak/license +22 -0
  35. package/vendor/longest-streak/package.json +73 -0
  36. package/vendor/markdown-table/index.js +393 -0
  37. package/vendor/markdown-table/license +22 -0
  38. package/vendor/markdown-table/package.json +77 -0
  39. package/vendor/mdast-util-from-markdown/index.js +2 -0
  40. package/vendor/mdast-util-from-markdown/lib/index.js +1270 -0
  41. package/vendor/mdast-util-from-markdown/license +22 -0
  42. package/vendor/mdast-util-from-markdown/package.json +98 -0
  43. package/vendor/mdast-util-gfm-strikethrough/index.js +5 -0
  44. package/vendor/mdast-util-gfm-strikethrough/lib/index.js +133 -0
  45. package/vendor/mdast-util-gfm-strikethrough/license +22 -0
  46. package/vendor/mdast-util-gfm-strikethrough/package.json +84 -0
  47. package/vendor/mdast-util-gfm-table/index.js +2 -0
  48. package/vendor/mdast-util-gfm-table/lib/index.js +300 -0
  49. package/vendor/mdast-util-gfm-table/license +22 -0
  50. package/vendor/mdast-util-gfm-table/package.json +101 -0
  51. package/vendor/mdast-util-gfm-task-list-item/index.js +4 -0
  52. package/vendor/mdast-util-gfm-task-list-item/lib/index.js +141 -0
  53. package/vendor/mdast-util-gfm-task-list-item/license +22 -0
  54. package/vendor/mdast-util-gfm-task-list-item/package.json +90 -0
  55. package/vendor/mdast-util-phrasing/index.js +1 -0
  56. package/vendor/mdast-util-phrasing/lib/index.js +45 -0
  57. package/vendor/mdast-util-phrasing/license +23 -0
  58. package/vendor/mdast-util-phrasing/package.json +78 -0
  59. package/vendor/mdast-util-to-markdown/index.js +3 -0
  60. package/vendor/mdast-util-to-markdown/lib/configure.js +98 -0
  61. package/vendor/mdast-util-to-markdown/lib/handle/blockquote.js +40 -0
  62. package/vendor/mdast-util-to-markdown/lib/handle/break.js +41 -0
  63. package/vendor/mdast-util-to-markdown/lib/handle/code.js +86 -0
  64. package/vendor/mdast-util-to-markdown/lib/handle/definition.js +83 -0
  65. package/vendor/mdast-util-to-markdown/lib/handle/emphasis.js +67 -0
  66. package/vendor/mdast-util-to-markdown/lib/handle/heading.js +84 -0
  67. package/vendor/mdast-util-to-markdown/lib/handle/html.js +27 -0
  68. package/vendor/mdast-util-to-markdown/lib/handle/image-reference.js +78 -0
  69. package/vendor/mdast-util-to-markdown/lib/handle/image.js +92 -0
  70. package/vendor/mdast-util-to-markdown/lib/handle/index.js +45 -0
  71. package/vendor/mdast-util-to-markdown/lib/handle/inline-code.js +86 -0
  72. package/vendor/mdast-util-to-markdown/lib/handle/link-reference.js +78 -0
  73. package/vendor/mdast-util-to-markdown/lib/handle/link.js +129 -0
  74. package/vendor/mdast-util-to-markdown/lib/handle/list-item.js +73 -0
  75. package/vendor/mdast-util-to-markdown/lib/handle/list.js +107 -0
  76. package/vendor/mdast-util-to-markdown/lib/handle/paragraph.js +27 -0
  77. package/vendor/mdast-util-to-markdown/lib/handle/root.js +34 -0
  78. package/vendor/mdast-util-to-markdown/lib/handle/strong.js +67 -0
  79. package/vendor/mdast-util-to-markdown/lib/handle/text.js +30 -0
  80. package/vendor/mdast-util-to-markdown/lib/handle/thematic-break.js +27 -0
  81. package/vendor/mdast-util-to-markdown/lib/index.js +213 -0
  82. package/vendor/mdast-util-to-markdown/lib/join.js +56 -0
  83. package/vendor/mdast-util-to-markdown/lib/unsafe.js +160 -0
  84. package/vendor/mdast-util-to-markdown/lib/util/association.js +33 -0
  85. package/vendor/mdast-util-to-markdown/lib/util/character.js +32 -0
  86. package/vendor/mdast-util-to-markdown/lib/util/check-bullet-ordered.js +25 -0
  87. package/vendor/mdast-util-to-markdown/lib/util/check-bullet-other.js +42 -0
  88. package/vendor/mdast-util-to-markdown/lib/util/check-bullet.js +25 -0
  89. package/vendor/mdast-util-to-markdown/lib/util/check-emphasis.js +25 -0
  90. package/vendor/mdast-util-to-markdown/lib/util/check-fence.js +25 -0
  91. package/vendor/mdast-util-to-markdown/lib/util/check-list-item-indent.js +25 -0
  92. package/vendor/mdast-util-to-markdown/lib/util/check-quote.js +25 -0
  93. package/vendor/mdast-util-to-markdown/lib/util/check-rule-repetition.js +25 -0
  94. package/vendor/mdast-util-to-markdown/lib/util/check-rule.js +25 -0
  95. package/vendor/mdast-util-to-markdown/lib/util/check-strong.js +25 -0
  96. package/vendor/mdast-util-to-markdown/lib/util/compile-pattern.js +30 -0
  97. package/vendor/mdast-util-to-markdown/lib/util/container-flow.js +93 -0
  98. package/vendor/mdast-util-to-markdown/lib/util/container-phrasing.js +704 -0
  99. package/vendor/mdast-util-to-markdown/lib/util/encode-character-reference.js +11 -0
  100. package/vendor/mdast-util-to-markdown/lib/util/encode-info.js +82 -0
  101. package/vendor/mdast-util-to-markdown/lib/util/format-code-as-indented.js +27 -0
  102. package/vendor/mdast-util-to-markdown/lib/util/format-heading-as-setext.js +39 -0
  103. package/vendor/mdast-util-to-markdown/lib/util/format-link-as-autolink.js +39 -0
  104. package/vendor/mdast-util-to-markdown/lib/util/html-kind.js +63 -0
  105. package/vendor/mdast-util-to-markdown/lib/util/indent-lines.js +40 -0
  106. package/vendor/mdast-util-to-markdown/lib/util/pattern-in-scope.js +52 -0
  107. package/vendor/mdast-util-to-markdown/lib/util/safe.js +263 -0
  108. package/vendor/mdast-util-to-markdown/lib/util/track.js +55 -0
  109. package/vendor/mdast-util-to-markdown/license +22 -0
  110. package/vendor/mdast-util-to-markdown/package.json +88 -0
  111. package/vendor/mdast-util-to-string/index.js +5 -0
  112. package/vendor/mdast-util-to-string/lib/index.js +108 -0
  113. package/vendor/mdast-util-to-string/license +22 -0
  114. package/vendor/mdast-util-to-string/package.json +78 -0
  115. package/vendor/micromark/index.js +60 -0
  116. package/vendor/micromark/lib/compile.js +1068 -0
  117. package/vendor/micromark/lib/constructs.js +85 -0
  118. package/vendor/micromark/lib/create-tokenizer.js +615 -0
  119. package/vendor/micromark/lib/initialize/content.js +79 -0
  120. package/vendor/micromark/lib/initialize/document.js +370 -0
  121. package/vendor/micromark/lib/initialize/flow.js +58 -0
  122. package/vendor/micromark/lib/initialize/text.js +216 -0
  123. package/vendor/micromark/lib/parse.js +56 -0
  124. package/vendor/micromark/lib/postprocess.js +18 -0
  125. package/vendor/micromark/lib/preprocess.js +112 -0
  126. package/vendor/micromark/license +22 -0
  127. package/vendor/micromark/package.json +87 -0
  128. package/vendor/micromark-core-commonmark/index.js +22 -0
  129. package/vendor/micromark-core-commonmark/lib/attention.js +231 -0
  130. package/vendor/micromark-core-commonmark/lib/autolink.js +233 -0
  131. package/vendor/micromark-core-commonmark/lib/blank-line.js +61 -0
  132. package/vendor/micromark-core-commonmark/lib/block-quote.js +143 -0
  133. package/vendor/micromark-core-commonmark/lib/character-escape.js +64 -0
  134. package/vendor/micromark-core-commonmark/lib/character-reference.js +149 -0
  135. package/vendor/micromark-core-commonmark/lib/code-fenced.js +422 -0
  136. package/vendor/micromark-core-commonmark/lib/code-indented.js +159 -0
  137. package/vendor/micromark-core-commonmark/lib/code-text.js +225 -0
  138. package/vendor/micromark-core-commonmark/lib/content.js +163 -0
  139. package/vendor/micromark-core-commonmark/lib/definition.js +254 -0
  140. package/vendor/micromark-core-commonmark/lib/hard-break-escape.js +60 -0
  141. package/vendor/micromark-core-commonmark/lib/heading-atx.js +191 -0
  142. package/vendor/micromark-core-commonmark/lib/html-flow.js +827 -0
  143. package/vendor/micromark-core-commonmark/lib/html-text.js +678 -0
  144. package/vendor/micromark-core-commonmark/lib/label-end.js +561 -0
  145. package/vendor/micromark-core-commonmark/lib/label-start-image.js +110 -0
  146. package/vendor/micromark-core-commonmark/lib/label-start-link.js +63 -0
  147. package/vendor/micromark-core-commonmark/lib/line-ending.js +33 -0
  148. package/vendor/micromark-core-commonmark/lib/list.js +213 -0
  149. package/vendor/micromark-core-commonmark/lib/partial-non-lazy-continuation.js +61 -0
  150. package/vendor/micromark-core-commonmark/lib/setext-underline.js +187 -0
  151. package/vendor/micromark-core-commonmark/lib/thematic-break.js +102 -0
  152. package/vendor/micromark-core-commonmark/license +22 -0
  153. package/vendor/micromark-core-commonmark/package.json +62 -0
  154. package/vendor/micromark-extension-gfm-strikethrough/index.js +3 -0
  155. package/vendor/micromark-extension-gfm-strikethrough/lib/html.js +26 -0
  156. package/vendor/micromark-extension-gfm-strikethrough/lib/syntax.js +142 -0
  157. package/vendor/micromark-extension-gfm-strikethrough/license +22 -0
  158. package/vendor/micromark-extension-gfm-strikethrough/package.json +129 -0
  159. package/vendor/micromark-extension-gfm-table/index.js +2 -0
  160. package/vendor/micromark-extension-gfm-table/lib/edit-map.js +222 -0
  161. package/vendor/micromark-extension-gfm-table/lib/html.js +135 -0
  162. package/vendor/micromark-extension-gfm-table/lib/infer.js +52 -0
  163. package/vendor/micromark-extension-gfm-table/lib/syntax.js +846 -0
  164. package/vendor/micromark-extension-gfm-table/license +22 -0
  165. package/vendor/micromark-extension-gfm-table/package.json +86 -0
  166. package/vendor/micromark-extension-gfm-task-list-item/index.js +2 -0
  167. package/vendor/micromark-extension-gfm-task-list-item/lib/html.js +29 -0
  168. package/vendor/micromark-extension-gfm-task-list-item/lib/syntax.js +158 -0
  169. package/vendor/micromark-extension-gfm-task-list-item/license +22 -0
  170. package/vendor/micromark-extension-gfm-task-list-item/package.json +131 -0
  171. package/vendor/micromark-factory-destination/index.js +206 -0
  172. package/vendor/micromark-factory-destination/license +22 -0
  173. package/vendor/micromark-factory-destination/package.json +57 -0
  174. package/vendor/micromark-factory-label/index.js +148 -0
  175. package/vendor/micromark-factory-label/license +22 -0
  176. package/vendor/micromark-factory-label/package.json +60 -0
  177. package/vendor/micromark-factory-space/index.js +116 -0
  178. package/vendor/micromark-factory-space/license +22 -0
  179. package/vendor/micromark-factory-space/package.json +46 -0
  180. package/vendor/micromark-factory-title/index.js +158 -0
  181. package/vendor/micromark-factory-title/license +22 -0
  182. package/vendor/micromark-factory-title/package.json +58 -0
  183. package/vendor/micromark-factory-whitespace/index.js +44 -0
  184. package/vendor/micromark-factory-whitespace/license +22 -0
  185. package/vendor/micromark-factory-whitespace/package.json +57 -0
  186. package/vendor/micromark-util-character/index.js +246 -0
  187. package/vendor/micromark-util-character/license +22 -0
  188. package/vendor/micromark-util-character/package.json +57 -0
  189. package/vendor/micromark-util-chunked/index.js +81 -0
  190. package/vendor/micromark-util-chunked/license +22 -0
  191. package/vendor/micromark-util-chunked/package.json +57 -0
  192. package/vendor/micromark-util-classify-character/index.js +27 -0
  193. package/vendor/micromark-util-classify-character/license +22 -0
  194. package/vendor/micromark-util-classify-character/package.json +59 -0
  195. package/vendor/micromark-util-combine-extensions/index.js +143 -0
  196. package/vendor/micromark-util-combine-extensions/license +22 -0
  197. package/vendor/micromark-util-combine-extensions/package.json +52 -0
  198. package/vendor/micromark-util-decode-numeric-character-reference/index.js +32 -0
  199. package/vendor/micromark-util-decode-numeric-character-reference/license +22 -0
  200. package/vendor/micromark-util-decode-numeric-character-reference/package.json +59 -0
  201. package/vendor/micromark-util-decode-string/index.js +45 -0
  202. package/vendor/micromark-util-decode-string/license +22 -0
  203. package/vendor/micromark-util-decode-string/package.json +63 -0
  204. package/vendor/micromark-util-edit-map/index.js +225 -0
  205. package/vendor/micromark-util-edit-map/license +22 -0
  206. package/vendor/micromark-util-edit-map/package.json +48 -0
  207. package/vendor/micromark-util-encode/index.js +33 -0
  208. package/vendor/micromark-util-encode/license +22 -0
  209. package/vendor/micromark-util-encode/package.json +47 -0
  210. package/vendor/micromark-util-html-tag-name/index.js +93 -0
  211. package/vendor/micromark-util-html-tag-name/license +22 -0
  212. package/vendor/micromark-util-html-tag-name/package.json +47 -0
  213. package/vendor/micromark-util-normalize-identifier/index.js +33 -0
  214. package/vendor/micromark-util-normalize-identifier/license +22 -0
  215. package/vendor/micromark-util-normalize-identifier/package.json +58 -0
  216. package/vendor/micromark-util-resolve-all/index.js +32 -0
  217. package/vendor/micromark-util-resolve-all/license +22 -0
  218. package/vendor/micromark-util-resolve-all/package.json +48 -0
  219. package/vendor/micromark-util-sanitize-uri/index.js +107 -0
  220. package/vendor/micromark-util-sanitize-uri/license +22 -0
  221. package/vendor/micromark-util-sanitize-uri/package.json +59 -0
  222. package/vendor/micromark-util-subtokenize/index.js +228 -0
  223. package/vendor/micromark-util-subtokenize/lib/splice-buffer.js +251 -0
  224. package/vendor/micromark-util-subtokenize/license +22 -0
  225. package/vendor/micromark-util-subtokenize/package.json +60 -0
  226. package/vendor/unist-util-is/index.js +7 -0
  227. package/vendor/unist-util-is/lib/index.js +296 -0
  228. package/vendor/unist-util-is/license +22 -0
  229. package/vendor/unist-util-is/package.json +103 -0
  230. package/vendor/unist-util-stringify-position/index.js +1 -0
  231. package/vendor/unist-util-stringify-position/lib/index.js +84 -0
  232. package/vendor/unist-util-stringify-position/license +22 -0
  233. package/vendor/unist-util-stringify-position/package.json +80 -0
  234. package/vendor/unist-util-visit/index.js +2 -0
  235. package/vendor/unist-util-visit/lib/index.js +312 -0
  236. package/vendor/unist-util-visit/license +22 -0
  237. package/vendor/unist-util-visit/package.json +108 -0
  238. package/vendor/unist-util-visit-parents/index.js +2 -0
  239. package/vendor/unist-util-visit-parents/lib/color.js +7 -0
  240. package/vendor/unist-util-visit-parents/lib/index.js +399 -0
  241. package/vendor/unist-util-visit-parents/license +22 -0
  242. package/vendor/unist-util-visit-parents/package.json +106 -0
  243. package/vendor/zwitch/index.js +118 -0
  244. package/vendor/zwitch/license +22 -0
  245. package/vendor/zwitch/package.json +72 -0
@@ -0,0 +1,1068 @@
1
+ /**
2
+ * While micromark is a lexer/tokenizer, the common case of going from markdown
3
+ * to html is currently built in as this module, even though the parts can be
4
+ * used separately to build ASTs, CSTs, or many other output formats.
5
+ *
6
+ * Having an HTML compiler built in is useful because it allows us to check for
7
+ * compliancy to CommonMark, the de facto norm of markdown, specified in roughly
8
+ * 600 input/output cases.
9
+ *
10
+ * This module has an interface that accepts lists of events instead of the
11
+ * whole at once, however, because markdown can’t be truly streaming, we buffer
12
+ * events before processing and outputting the final result.
13
+ */
14
+
15
+ /**
16
+ * @import {
17
+ * CompileContext,
18
+ * CompileData,
19
+ * CompileOptions,
20
+ * Compile,
21
+ * Definition,
22
+ * Event,
23
+ * Handle,
24
+ * HtmlExtension,
25
+ * LineEnding,
26
+ * NormalizedHtmlExtension,
27
+ * Token
28
+ * } from 'micromark-util-types'
29
+ */
30
+
31
+ /**
32
+ * @typedef Media
33
+ * @property {boolean | undefined} [image]
34
+ * @property {string | undefined} [labelId]
35
+ * @property {string | undefined} [label]
36
+ * @property {string | undefined} [referenceId]
37
+ * @property {string | undefined} [destination]
38
+ * @property {string | undefined} [title]
39
+ */
40
+
41
+ import { decodeNamedCharacterReference } from 'decode-named-character-reference';
42
+ import { push } from 'micromark-util-chunked';
43
+ import { combineHtmlExtensions } from 'micromark-util-combine-extensions';
44
+ import { decodeNumericCharacterReference } from 'micromark-util-decode-numeric-character-reference';
45
+ import { encode as _encode } from 'micromark-util-encode';
46
+ import { normalizeIdentifier } from 'micromark-util-normalize-identifier';
47
+ import { sanitizeUri } from 'micromark-util-sanitize-uri';
48
+ const hasOwnProperty = {}.hasOwnProperty;
49
+
50
+ /**
51
+ * These two are allowlists of safe protocols for full URLs in respectively the
52
+ * `href` (on `<a>`) and `src` (on `<img>`) attributes.
53
+ * They are based on what is allowed on GitHub,
54
+ * <https://github.com/syntax-tree/hast-util-sanitize/blob/9275b21/lib/github.json#L31>
55
+ */
56
+ const protocolHref = /^(https?|ircs?|mailto|xmpp)$/i;
57
+ const protocolSource = /^https?$/i;
58
+
59
+ /**
60
+ * @param {CompileOptions | null | undefined} [options]
61
+ * @returns {Compile}
62
+ */
63
+ export function compile(options) {
64
+ const settings = options || {};
65
+
66
+ /**
67
+ * Tags is needed because according to markdown, links and emphasis and
68
+ * whatnot can exist in images, however, as HTML doesn’t allow content in
69
+ * images, the tags are ignored in the `alt` attribute, but the content
70
+ * remains.
71
+ *
72
+ * @type {boolean | undefined}
73
+ */
74
+ let tags = true;
75
+
76
+ /**
77
+ * An object to track identifiers to media (URLs and titles) defined with
78
+ * definitions.
79
+ *
80
+ * @type {Record<string, Definition>}
81
+ */
82
+ const definitions = {};
83
+
84
+ /**
85
+ * A lot of the handlers need to capture some of the output data, modify it
86
+ * somehow, and then deal with it.
87
+ * We do that by tracking a stack of buffers, that can be opened (with
88
+ * `buffer`) and closed (with `resume`) to access them.
89
+ *
90
+ * @type {Array<Array<string>>}
91
+ */
92
+ const buffers = [[]];
93
+
94
+ /**
95
+ * As we can have links in images and the other way around, where the deepest
96
+ * ones are closed first, we need to track which one we’re in.
97
+ *
98
+ * @type {Array<Media>}
99
+ */
100
+ const mediaStack = [];
101
+
102
+ /**
103
+ * Same as `mediaStack` for tightness, which is specific to lists.
104
+ * We need to track if we’re currently in a tight or loose container.
105
+ *
106
+ * @type {Array<boolean>}
107
+ */
108
+ const tightStack = [];
109
+
110
+ /** @type {HtmlExtension} */
111
+ const defaultHandlers = {
112
+ enter: {
113
+ blockQuote: onenterblockquote,
114
+ codeFenced: onentercodefenced,
115
+ codeFencedFenceInfo: buffer,
116
+ codeFencedFenceMeta: buffer,
117
+ codeIndented: onentercodeindented,
118
+ codeText: onentercodetext,
119
+ content: onentercontent,
120
+ definition: onenterdefinition,
121
+ definitionDestinationString: onenterdefinitiondestinationstring,
122
+ definitionLabelString: buffer,
123
+ definitionTitleString: buffer,
124
+ emphasis: onenteremphasis,
125
+ htmlFlow: onenterhtmlflow,
126
+ htmlText: onenterhtml,
127
+ image: onenterimage,
128
+ label: buffer,
129
+ link: onenterlink,
130
+ listItemMarker: onenterlistitemmarker,
131
+ listItemValue: onenterlistitemvalue,
132
+ listOrdered: onenterlistordered,
133
+ listUnordered: onenterlistunordered,
134
+ paragraph: onenterparagraph,
135
+ reference: buffer,
136
+ resource: onenterresource,
137
+ resourceDestinationString: onenterresourcedestinationstring,
138
+ resourceTitleString: buffer,
139
+ setextHeading: onentersetextheading,
140
+ strong: onenterstrong
141
+ },
142
+ exit: {
143
+ atxHeading: onexitatxheading,
144
+ atxHeadingSequence: onexitatxheadingsequence,
145
+ autolinkEmail: onexitautolinkemail,
146
+ autolinkProtocol: onexitautolinkprotocol,
147
+ blockQuote: onexitblockquote,
148
+ characterEscapeValue: onexitdata,
149
+ characterReferenceMarkerHexadecimal: onexitcharacterreferencemarker,
150
+ characterReferenceMarkerNumeric: onexitcharacterreferencemarker,
151
+ characterReferenceValue: onexitcharacterreferencevalue,
152
+ codeFenced: onexitflowcode,
153
+ codeFencedFence: onexitcodefencedfence,
154
+ codeFencedFenceInfo: onexitcodefencedfenceinfo,
155
+ codeFencedFenceMeta: onresumedrop,
156
+ codeFlowValue: onexitcodeflowvalue,
157
+ codeIndented: onexitflowcode,
158
+ codeText: onexitcodetext,
159
+ codeTextData: onexitdata,
160
+ data: onexitdata,
161
+ definition: onexitdefinition,
162
+ definitionDestinationString: onexitdefinitiondestinationstring,
163
+ definitionLabelString: onexitdefinitionlabelstring,
164
+ definitionTitleString: onexitdefinitiontitlestring,
165
+ emphasis: onexitemphasis,
166
+ hardBreakEscape: onexithardbreak,
167
+ hardBreakTrailing: onexithardbreak,
168
+ htmlFlow: onexithtml,
169
+ htmlFlowData: onexitdata,
170
+ htmlText: onexithtml,
171
+ htmlTextData: onexitdata,
172
+ image: onexitmedia,
173
+ label: onexitlabel,
174
+ labelText: onexitlabeltext,
175
+ lineEnding: onexitlineending,
176
+ link: onexitmedia,
177
+ listOrdered: onexitlistordered,
178
+ listUnordered: onexitlistunordered,
179
+ paragraph: onexitparagraph,
180
+ reference: onresumedrop,
181
+ referenceString: onexitreferencestring,
182
+ resource: onresumedrop,
183
+ resourceDestinationString: onexitresourcedestinationstring,
184
+ resourceTitleString: onexitresourcetitlestring,
185
+ setextHeading: onexitsetextheading,
186
+ setextHeadingLineSequence: onexitsetextheadinglinesequence,
187
+ setextHeadingText: onexitsetextheadingtext,
188
+ strong: onexitstrong,
189
+ thematicBreak: onexitthematicbreak
190
+ }
191
+ };
192
+
193
+ /**
194
+ * Combine the HTML extensions with the default handlers.
195
+ * An HTML extension is an object whose fields are either `enter` or `exit`
196
+ * (reflecting whether a token is entered or exited).
197
+ * The values at such objects are names of tokens mapping to handlers.
198
+ * Handlers are called, respectively when a token is opener or closed, with
199
+ * that token, and a context as `this`.
200
+ */
201
+ const handlers = /** @type {NormalizedHtmlExtension} */
202
+ combineHtmlExtensions([defaultHandlers, ...(settings.htmlExtensions || [])]);
203
+
204
+ /**
205
+ * Handlers do often need to keep track of some state.
206
+ * That state is provided here as a key-value store (an object).
207
+ *
208
+ * @type {CompileData}
209
+ */
210
+ const data = {
211
+ definitions,
212
+ tightStack
213
+ };
214
+
215
+ /**
216
+ * The context for handlers references a couple of useful functions.
217
+ * In handlers from extensions, those can be accessed at `this`.
218
+ * For the handlers here, they can be accessed directly.
219
+ *
220
+ * @type {Omit<CompileContext, 'sliceSerialize'>}
221
+ */
222
+ const context = {
223
+ buffer,
224
+ encode,
225
+ getData,
226
+ lineEndingIfNeeded,
227
+ options: settings,
228
+ raw,
229
+ resume,
230
+ setData,
231
+ tag
232
+ };
233
+
234
+ /**
235
+ * Generally, micromark copies line endings (`'\r'`, `'\n'`, `'\r\n'`) in the
236
+ * markdown document over to the compiled HTML.
237
+ * In some cases, such as `> a`, CommonMark requires that extra line endings
238
+ * are added: `<blockquote>\n<p>a</p>\n</blockquote>`.
239
+ * This variable hold the default line ending when given (or `undefined`),
240
+ * and in the latter case will be updated to the first found line ending if
241
+ * there is one.
242
+ */
243
+ let lineEndingStyle = settings.defaultLineEnding;
244
+
245
+ // Return the function that handles a slice of events.
246
+ return compile;
247
+
248
+ /**
249
+ * Deal w/ a slice of events.
250
+ * Return either the empty string if there’s nothing of note to return, or the
251
+ * result when done.
252
+ *
253
+ * @param {ReadonlyArray<Event>} events
254
+ * @returns {string}
255
+ */
256
+ function compile(events) {
257
+ let index = -1;
258
+ let start = 0;
259
+ /** @type {Array<number>} */
260
+ const listStack = [];
261
+ // As definitions can come after references, we need to figure out the media
262
+ // (urls and titles) defined by them before handling the references.
263
+ // So, we do sort of what HTML does: put metadata at the start (in head), and
264
+ // then put content after (`body`).
265
+ /** @type {Array<Event>} */
266
+ let head = [];
267
+ /** @type {Array<Event>} */
268
+ let body = [];
269
+ while (++index < events.length) {
270
+ // Figure out the line ending style used in the document.
271
+ if (!lineEndingStyle && (events[index][1].type === "lineEnding" || events[index][1].type === "lineEndingBlank")) {
272
+ lineEndingStyle = /** @type {LineEnding} */
273
+ events[index][2].sliceSerialize(events[index][1]);
274
+ }
275
+
276
+ // Preprocess lists to infer whether the list is loose or not.
277
+ if (events[index][1].type === "listOrdered" || events[index][1].type === "listUnordered") {
278
+ if (events[index][0] === 'enter') {
279
+ listStack.push(index);
280
+ } else {
281
+ prepareList(events.slice(listStack.pop(), index));
282
+ }
283
+ }
284
+
285
+ // Move definitions to the front.
286
+ if (events[index][1].type === "definition") {
287
+ if (events[index][0] === 'enter') {
288
+ body = push(body, events.slice(start, index));
289
+ start = index;
290
+ } else {
291
+ head = push(head, events.slice(start, index + 1));
292
+ start = index + 1;
293
+ }
294
+ }
295
+ }
296
+ head = push(head, body);
297
+ head = push(head, events.slice(start));
298
+ index = -1;
299
+ const result = head;
300
+
301
+ // Handle the start of the document, if defined.
302
+ if (handlers.enter.null) {
303
+ handlers.enter.null.call(context);
304
+ }
305
+
306
+ // Handle all events.
307
+ while (++index < events.length) {
308
+ const handles = handlers[result[index][0]];
309
+ const kind = result[index][1].type;
310
+ const handle = handles[kind];
311
+ if (hasOwnProperty.call(handles, kind) && handle) {
312
+ handle.call({
313
+ sliceSerialize: result[index][2].sliceSerialize,
314
+ ...context
315
+ }, result[index][1]);
316
+ }
317
+ }
318
+
319
+ // Handle the end of the document, if defined.
320
+ if (handlers.exit.null) {
321
+ handlers.exit.null.call(context);
322
+ }
323
+ return buffers[0].join('');
324
+ }
325
+
326
+ /**
327
+ * Figure out whether lists are loose or not.
328
+ *
329
+ * @param {ReadonlyArray<Event>} slice
330
+ * @returns {undefined}
331
+ */
332
+ function prepareList(slice) {
333
+ const length = slice.length;
334
+ let index = 0; // Skip open.
335
+ let containerBalance = 0;
336
+ let loose = false;
337
+ /** @type {boolean | undefined} */
338
+ let atMarker;
339
+ while (++index < length) {
340
+ const event = slice[index];
341
+ if (event[1]._container) {
342
+ atMarker = undefined;
343
+ if (event[0] === 'enter') {
344
+ containerBalance++;
345
+ } else {
346
+ containerBalance--;
347
+ }
348
+ } else {
349
+ switch (event[1].type) {
350
+ case "listItemPrefix":
351
+ {
352
+ if (event[0] === 'exit') {
353
+ atMarker = true;
354
+ }
355
+ break;
356
+ }
357
+ case "linePrefix":
358
+ {
359
+ // Ignore
360
+
361
+ break;
362
+ }
363
+ case "lineEndingBlank":
364
+ {
365
+ if (event[0] === 'enter' && !containerBalance) {
366
+ if (atMarker) {
367
+ atMarker = undefined;
368
+ } else {
369
+ loose = true;
370
+ }
371
+ }
372
+ break;
373
+ }
374
+ default:
375
+ {
376
+ atMarker = undefined;
377
+ }
378
+ }
379
+ }
380
+ }
381
+ slice[0][1]._loose = loose;
382
+ }
383
+
384
+ /**
385
+ * @type {CompileContext['setData']}
386
+ */
387
+ function setData(key, value) {
388
+ // @ts-expect-error: assume `value` is omitted (`undefined` is passed) only
389
+ // if allowed.
390
+ data[key] = value;
391
+ }
392
+
393
+ /**
394
+ * @type {CompileContext['getData']}
395
+ */
396
+ function getData(key) {
397
+ return data[key];
398
+ }
399
+
400
+ /** @type {CompileContext['buffer']} */
401
+ function buffer() {
402
+ buffers.push([]);
403
+ }
404
+
405
+ /** @type {CompileContext['resume']} */
406
+ function resume() {
407
+ const buf = buffers.pop();
408
+ return buf.join('');
409
+ }
410
+
411
+ /** @type {CompileContext['tag']} */
412
+ function tag(value) {
413
+ if (!tags) {
414
+ return;
415
+ }
416
+ setData('lastWasTag', true);
417
+ buffers[buffers.length - 1].push(value);
418
+ }
419
+
420
+ /** @type {CompileContext['raw']} */
421
+ function raw(value) {
422
+ setData('lastWasTag');
423
+ buffers[buffers.length - 1].push(value);
424
+ }
425
+
426
+ /**
427
+ * Output an extra line ending.
428
+ *
429
+ * @returns {undefined}
430
+ */
431
+ function lineEnding() {
432
+ raw(lineEndingStyle || '\n');
433
+ }
434
+
435
+ /** @type {CompileContext['lineEndingIfNeeded']} */
436
+ function lineEndingIfNeeded() {
437
+ const buffer = buffers[buffers.length - 1];
438
+ const slice = buffer[buffer.length - 1];
439
+ const previous = slice ? slice.charCodeAt(slice.length - 1) : null;
440
+ if (previous === 10 || previous === 13 || previous === null) {
441
+ return;
442
+ }
443
+ lineEnding();
444
+ }
445
+
446
+ /** @type {CompileContext['encode']} */
447
+ function encode(value) {
448
+ return getData('ignoreEncode') ? value : _encode(value);
449
+ }
450
+
451
+ //
452
+ // Handlers.
453
+ //
454
+
455
+ /**
456
+ * @returns {undefined}
457
+ */
458
+ function onresumedrop() {
459
+ resume();
460
+ }
461
+
462
+ /**
463
+ * @this {CompileContext}
464
+ * @type {Handle}
465
+ */
466
+ function onenterlistordered(token) {
467
+ tightStack.push(!token._loose);
468
+ lineEndingIfNeeded();
469
+ tag('<ol');
470
+ setData('expectFirstItem', true);
471
+ }
472
+
473
+ /**
474
+ * @this {CompileContext}
475
+ * @type {Handle}
476
+ */
477
+ function onenterlistunordered(token) {
478
+ tightStack.push(!token._loose);
479
+ lineEndingIfNeeded();
480
+ tag('<ul');
481
+ setData('expectFirstItem', true);
482
+ }
483
+
484
+ /**
485
+ * @this {CompileContext}
486
+ * @type {Handle}
487
+ */
488
+ function onenterlistitemvalue(token) {
489
+ if (getData('expectFirstItem')) {
490
+ const value = Number.parseInt(this.sliceSerialize(token), 10);
491
+ if (value !== 1) {
492
+ tag(' start="' + encode(String(value)) + '"');
493
+ }
494
+ }
495
+ }
496
+
497
+ /**
498
+ * @returns {undefined}
499
+ */
500
+ function onenterlistitemmarker() {
501
+ if (getData('expectFirstItem')) {
502
+ tag('>');
503
+ } else {
504
+ onexitlistitem();
505
+ }
506
+ lineEndingIfNeeded();
507
+ tag('<li>');
508
+ setData('expectFirstItem');
509
+ // “Hack” to prevent a line ending from showing up if the item is empty.
510
+ setData('lastWasTag');
511
+ }
512
+
513
+ /**
514
+ * @returns {undefined}
515
+ */
516
+ function onexitlistordered() {
517
+ onexitlistitem();
518
+ tightStack.pop();
519
+ lineEnding();
520
+ tag('</ol>');
521
+ }
522
+
523
+ /**
524
+ * @returns {undefined}
525
+ */
526
+ function onexitlistunordered() {
527
+ onexitlistitem();
528
+ tightStack.pop();
529
+ lineEnding();
530
+ tag('</ul>');
531
+ }
532
+
533
+ /**
534
+ * @returns {undefined}
535
+ */
536
+ function onexitlistitem() {
537
+ if (getData('lastWasTag') && !getData('slurpAllLineEndings')) {
538
+ lineEndingIfNeeded();
539
+ }
540
+ tag('</li>');
541
+ setData('slurpAllLineEndings');
542
+ }
543
+
544
+ /**
545
+ * @this {CompileContext}
546
+ * @type {Handle}
547
+ */
548
+ function onenterblockquote() {
549
+ tightStack.push(false);
550
+ lineEndingIfNeeded();
551
+ tag('<blockquote>');
552
+ }
553
+
554
+ /**
555
+ * @this {CompileContext}
556
+ * @type {Handle}
557
+ */
558
+ function onexitblockquote() {
559
+ tightStack.pop();
560
+ lineEndingIfNeeded();
561
+ tag('</blockquote>');
562
+ setData('slurpAllLineEndings');
563
+ }
564
+
565
+ /**
566
+ * @this {CompileContext}
567
+ * @type {Handle}
568
+ */
569
+ function onenterparagraph() {
570
+ if (!tightStack[tightStack.length - 1]) {
571
+ lineEndingIfNeeded();
572
+ tag('<p>');
573
+ }
574
+ setData('slurpAllLineEndings');
575
+ }
576
+
577
+ /**
578
+ * @this {CompileContext}
579
+ * @type {Handle}
580
+ */
581
+ function onexitparagraph() {
582
+ if (tightStack[tightStack.length - 1]) {
583
+ setData('slurpAllLineEndings', true);
584
+ } else {
585
+ tag('</p>');
586
+ }
587
+ }
588
+
589
+ /**
590
+ * @this {CompileContext}
591
+ * @type {Handle}
592
+ */
593
+ function onentercodefenced() {
594
+ lineEndingIfNeeded();
595
+ tag('<pre><code');
596
+ setData('fencesCount', 0);
597
+ }
598
+
599
+ /**
600
+ * @this {CompileContext}
601
+ * @type {Handle}
602
+ */
603
+ function onexitcodefencedfenceinfo() {
604
+ const value = resume();
605
+ tag(' class="language-' + value + '"');
606
+ }
607
+
608
+ /**
609
+ * @this {CompileContext}
610
+ * @type {Handle}
611
+ */
612
+ function onexitcodefencedfence() {
613
+ const count = getData('fencesCount') || 0;
614
+ if (!count) {
615
+ tag('>');
616
+ setData('slurpOneLineEnding', true);
617
+ }
618
+ setData('fencesCount', count + 1);
619
+ }
620
+
621
+ /**
622
+ * @this {CompileContext}
623
+ * @type {Handle}
624
+ */
625
+ function onentercodeindented() {
626
+ lineEndingIfNeeded();
627
+ tag('<pre><code>');
628
+ }
629
+
630
+ /**
631
+ * @this {CompileContext}
632
+ * @type {Handle}
633
+ */
634
+ function onexitflowcode() {
635
+ const count = getData('fencesCount');
636
+
637
+ // One special case is if we are inside a container, and the fenced code was
638
+ // not closed (meaning it runs to the end).
639
+ // In that case, the following line ending, is considered *outside* the
640
+ // fenced code and block quote by micromark, but CM wants to treat that
641
+ // ending as part of the code.
642
+ if (count !== undefined && count < 2 && data.tightStack.length > 0 && !getData('lastWasTag')) {
643
+ lineEnding();
644
+ }
645
+
646
+ // But in most cases, it’s simpler: when we’ve seen some data, emit an extra
647
+ // line ending when needed.
648
+ if (getData('flowCodeSeenData')) {
649
+ lineEndingIfNeeded();
650
+ }
651
+ tag('</code></pre>');
652
+ if (count !== undefined && count < 2) {
653
+ lineEndingIfNeeded();
654
+ }
655
+ setData('flowCodeSeenData');
656
+ setData('fencesCount');
657
+ setData('slurpOneLineEnding');
658
+ }
659
+
660
+ /**
661
+ * @this {CompileContext}
662
+ * @type {Handle}
663
+ */
664
+ function onenterimage() {
665
+ mediaStack.push({
666
+ image: true
667
+ });
668
+ tags = undefined; // Disallow tags.
669
+ }
670
+
671
+ /**
672
+ * @this {CompileContext}
673
+ * @type {Handle}
674
+ */
675
+ function onenterlink() {
676
+ mediaStack.push({});
677
+ }
678
+
679
+ /**
680
+ * @this {CompileContext}
681
+ * @type {Handle}
682
+ */
683
+ function onexitlabeltext(token) {
684
+ mediaStack[mediaStack.length - 1].labelId = this.sliceSerialize(token);
685
+ }
686
+
687
+ /**
688
+ * @this {CompileContext}
689
+ * @type {Handle}
690
+ */
691
+ function onexitlabel() {
692
+ mediaStack[mediaStack.length - 1].label = resume();
693
+ }
694
+
695
+ /**
696
+ * @this {CompileContext}
697
+ * @type {Handle}
698
+ */
699
+ function onexitreferencestring(token) {
700
+ mediaStack[mediaStack.length - 1].referenceId = this.sliceSerialize(token);
701
+ }
702
+
703
+ /**
704
+ * @this {CompileContext}
705
+ * @type {Handle}
706
+ */
707
+ function onenterresource() {
708
+ buffer(); // We can have line endings in the resource, ignore them.
709
+ mediaStack[mediaStack.length - 1].destination = '';
710
+ }
711
+
712
+ /**
713
+ * @this {CompileContext}
714
+ * @type {Handle}
715
+ */
716
+ function onenterresourcedestinationstring() {
717
+ buffer();
718
+ // Ignore encoding the result, as we’ll first percent encode the url and
719
+ // encode manually after.
720
+ setData('ignoreEncode', true);
721
+ }
722
+
723
+ /**
724
+ * @this {CompileContext}
725
+ * @type {Handle}
726
+ */
727
+ function onexitresourcedestinationstring() {
728
+ mediaStack[mediaStack.length - 1].destination = resume();
729
+ setData('ignoreEncode');
730
+ }
731
+
732
+ /**
733
+ * @this {CompileContext}
734
+ * @type {Handle}
735
+ */
736
+ function onexitresourcetitlestring() {
737
+ mediaStack[mediaStack.length - 1].title = resume();
738
+ }
739
+
740
+ /**
741
+ * @this {CompileContext}
742
+ * @type {Handle}
743
+ */
744
+ function onexitmedia() {
745
+ let index = mediaStack.length - 1; // Skip current.
746
+ const media = mediaStack[index];
747
+ const id = media.referenceId || media.labelId;
748
+ const context = media.destination === undefined ? definitions[normalizeIdentifier(id)] : media;
749
+ tags = true;
750
+ while (index--) {
751
+ if (mediaStack[index].image) {
752
+ tags = undefined;
753
+ break;
754
+ }
755
+ }
756
+ if (media.image) {
757
+ tag('<img src="' + sanitizeUri(context.destination, settings.allowDangerousProtocol ? undefined : protocolSource) + '" alt="');
758
+ raw(media.label);
759
+ tag('"');
760
+ } else {
761
+ tag('<a href="' + sanitizeUri(context.destination, settings.allowDangerousProtocol ? undefined : protocolHref) + '"');
762
+ }
763
+ tag(context.title ? ' title="' + context.title + '"' : '');
764
+ if (media.image) {
765
+ tag(' />');
766
+ } else {
767
+ tag('>');
768
+ raw(media.label);
769
+ tag('</a>');
770
+ }
771
+ mediaStack.pop();
772
+ }
773
+
774
+ /**
775
+ * @this {CompileContext}
776
+ * @type {Handle}
777
+ */
778
+ function onenterdefinition() {
779
+ buffer();
780
+ mediaStack.push({});
781
+ }
782
+
783
+ /**
784
+ * @this {CompileContext}
785
+ * @type {Handle}
786
+ */
787
+ function onexitdefinitionlabelstring(token) {
788
+ // Discard label, use the source content instead.
789
+ resume();
790
+ mediaStack[mediaStack.length - 1].labelId = this.sliceSerialize(token);
791
+ }
792
+
793
+ /**
794
+ * @this {CompileContext}
795
+ * @type {Handle}
796
+ */
797
+ function onenterdefinitiondestinationstring() {
798
+ buffer();
799
+ setData('ignoreEncode', true);
800
+ }
801
+
802
+ /**
803
+ * @this {CompileContext}
804
+ * @type {Handle}
805
+ */
806
+ function onexitdefinitiondestinationstring() {
807
+ mediaStack[mediaStack.length - 1].destination = resume();
808
+ setData('ignoreEncode');
809
+ }
810
+
811
+ /**
812
+ * @this {CompileContext}
813
+ * @type {Handle}
814
+ */
815
+ function onexitdefinitiontitlestring() {
816
+ mediaStack[mediaStack.length - 1].title = resume();
817
+ }
818
+
819
+ /**
820
+ * @this {CompileContext}
821
+ * @type {Handle}
822
+ */
823
+ function onexitdefinition() {
824
+ const media = mediaStack[mediaStack.length - 1];
825
+ const id = normalizeIdentifier(media.labelId);
826
+ resume();
827
+ if (!hasOwnProperty.call(definitions, id)) {
828
+ definitions[id] = mediaStack[mediaStack.length - 1];
829
+ }
830
+ mediaStack.pop();
831
+ }
832
+
833
+ /**
834
+ * @this {CompileContext}
835
+ * @type {Handle}
836
+ */
837
+ function onentercontent() {
838
+ setData('slurpAllLineEndings', true);
839
+ }
840
+
841
+ /**
842
+ * @this {CompileContext}
843
+ * @type {Handle}
844
+ */
845
+ function onexitatxheadingsequence(token) {
846
+ // Exit for further sequences.
847
+ if (getData('headingRank')) {
848
+ return;
849
+ }
850
+ setData('headingRank', this.sliceSerialize(token).length);
851
+ lineEndingIfNeeded();
852
+ tag('<h' + getData('headingRank') + '>');
853
+ }
854
+
855
+ /**
856
+ * @this {CompileContext}
857
+ * @type {Handle}
858
+ */
859
+ function onentersetextheading() {
860
+ buffer();
861
+ setData('slurpAllLineEndings');
862
+ }
863
+
864
+ /**
865
+ * @this {CompileContext}
866
+ * @type {Handle}
867
+ */
868
+ function onexitsetextheadingtext() {
869
+ setData('slurpAllLineEndings', true);
870
+ }
871
+
872
+ /**
873
+ * @this {CompileContext}
874
+ * @type {Handle}
875
+ */
876
+ function onexitatxheading() {
877
+ tag('</h' + getData('headingRank') + '>');
878
+ setData('headingRank');
879
+ }
880
+
881
+ /**
882
+ * @this {CompileContext}
883
+ * @type {Handle}
884
+ */
885
+ function onexitsetextheadinglinesequence(token) {
886
+ setData('headingRank', this.sliceSerialize(token).charCodeAt(0) === 61 ? 1 : 2);
887
+ }
888
+
889
+ /**
890
+ * @this {CompileContext}
891
+ * @type {Handle}
892
+ */
893
+ function onexitsetextheading() {
894
+ const value = resume();
895
+ lineEndingIfNeeded();
896
+ tag('<h' + getData('headingRank') + '>');
897
+ raw(value);
898
+ tag('</h' + getData('headingRank') + '>');
899
+ setData('slurpAllLineEndings');
900
+ setData('headingRank');
901
+ }
902
+
903
+ /**
904
+ * @this {CompileContext}
905
+ * @type {Handle}
906
+ */
907
+ function onexitdata(token) {
908
+ raw(encode(this.sliceSerialize(token)));
909
+ }
910
+
911
+ /**
912
+ * @this {CompileContext}
913
+ * @type {Handle}
914
+ */
915
+ function onexitlineending(token) {
916
+ if (getData('slurpAllLineEndings')) {
917
+ return;
918
+ }
919
+ if (getData('slurpOneLineEnding')) {
920
+ setData('slurpOneLineEnding');
921
+ return;
922
+ }
923
+ if (getData('inCodeText')) {
924
+ raw(' ');
925
+ return;
926
+ }
927
+ raw(encode(this.sliceSerialize(token)));
928
+ }
929
+
930
+ /**
931
+ * @this {CompileContext}
932
+ * @type {Handle}
933
+ */
934
+ function onexitcodeflowvalue(token) {
935
+ raw(encode(this.sliceSerialize(token)));
936
+ setData('flowCodeSeenData', true);
937
+ }
938
+
939
+ /**
940
+ * @this {CompileContext}
941
+ * @type {Handle}
942
+ */
943
+ function onexithardbreak() {
944
+ tag('<br />');
945
+ }
946
+
947
+ /**
948
+ * @returns {undefined}
949
+ */
950
+ function onenterhtmlflow() {
951
+ lineEndingIfNeeded();
952
+ onenterhtml();
953
+ }
954
+
955
+ /**
956
+ * @returns {undefined}
957
+ */
958
+ function onexithtml() {
959
+ setData('ignoreEncode');
960
+ }
961
+
962
+ /**
963
+ * @returns {undefined}
964
+ */
965
+ function onenterhtml() {
966
+ if (settings.allowDangerousHtml) {
967
+ setData('ignoreEncode', true);
968
+ }
969
+ }
970
+
971
+ /**
972
+ * @returns {undefined}
973
+ */
974
+ function onenteremphasis() {
975
+ tag('<em>');
976
+ }
977
+
978
+ /**
979
+ * @returns {undefined}
980
+ */
981
+ function onenterstrong() {
982
+ tag('<strong>');
983
+ }
984
+
985
+ /**
986
+ * @returns {undefined}
987
+ */
988
+ function onentercodetext() {
989
+ setData('inCodeText', true);
990
+ tag('<code>');
991
+ }
992
+
993
+ /**
994
+ * @returns {undefined}
995
+ */
996
+ function onexitcodetext() {
997
+ setData('inCodeText');
998
+ tag('</code>');
999
+ }
1000
+
1001
+ /**
1002
+ * @returns {undefined}
1003
+ */
1004
+ function onexitemphasis() {
1005
+ tag('</em>');
1006
+ }
1007
+
1008
+ /**
1009
+ * @returns {undefined}
1010
+ */
1011
+ function onexitstrong() {
1012
+ tag('</strong>');
1013
+ }
1014
+
1015
+ /**
1016
+ * @returns {undefined}
1017
+ */
1018
+ function onexitthematicbreak() {
1019
+ lineEndingIfNeeded();
1020
+ tag('<hr />');
1021
+ }
1022
+
1023
+ /**
1024
+ * @this {CompileContext}
1025
+ * @param {Token} token
1026
+ * @returns {undefined}
1027
+ */
1028
+ function onexitcharacterreferencemarker(token) {
1029
+ setData('characterReferenceType', token.type);
1030
+ }
1031
+
1032
+ /**
1033
+ * @this {CompileContext}
1034
+ * @type {Handle}
1035
+ */
1036
+ function onexitcharacterreferencevalue(token) {
1037
+ const value = this.sliceSerialize(token);
1038
+ const decoded = getData('characterReferenceType') ? decodeNumericCharacterReference(value, getData('characterReferenceType') === "characterReferenceMarkerNumeric" ? 10 : 16) : decodeNamedCharacterReference(value);
1039
+
1040
+ // `decodeNamedCharacterReference` can return `false` for invalid named
1041
+ // character references,
1042
+ // but everything we’ve tokenized is valid.
1043
+ raw(encode(/** @type {string} */decoded));
1044
+ setData('characterReferenceType');
1045
+ }
1046
+
1047
+ /**
1048
+ * @this {CompileContext}
1049
+ * @type {Handle}
1050
+ */
1051
+ function onexitautolinkprotocol(token) {
1052
+ const uri = this.sliceSerialize(token);
1053
+ tag('<a href="' + sanitizeUri(uri, settings.allowDangerousProtocol ? undefined : protocolHref) + '">');
1054
+ raw(encode(uri));
1055
+ tag('</a>');
1056
+ }
1057
+
1058
+ /**
1059
+ * @this {CompileContext}
1060
+ * @type {Handle}
1061
+ */
1062
+ function onexitautolinkemail(token) {
1063
+ const uri = this.sliceSerialize(token);
1064
+ tag('<a href="' + sanitizeUri('mailto:' + uri) + '">');
1065
+ raw(encode(uri));
1066
+ tag('</a>');
1067
+ }
1068
+ }