emdp 1.0.0

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 (199) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/dist/cjs/cli.js +36 -0
  4. package/dist/cjs/gfm.js +26 -0
  5. package/dist/cjs/index.js +26 -0
  6. package/dist/cjs/parser/block-parser.js +644 -0
  7. package/dist/cjs/parser/blocks/blockquote.js +28 -0
  8. package/dist/cjs/parser/blocks/code-block-fenced.js +58 -0
  9. package/dist/cjs/parser/blocks/code-block-indented.js +47 -0
  10. package/dist/cjs/parser/blocks/heading-atx.js +29 -0
  11. package/dist/cjs/parser/blocks/heading-setext.js +24 -0
  12. package/dist/cjs/parser/blocks/html-block.js +83 -0
  13. package/dist/cjs/parser/blocks/link-reference.js +109 -0
  14. package/dist/cjs/parser/blocks/list.js +155 -0
  15. package/dist/cjs/parser/blocks/paragraph.js +20 -0
  16. package/dist/cjs/parser/blocks/table.js +163 -0
  17. package/dist/cjs/parser/blocks/task-list.js +66 -0
  18. package/dist/cjs/parser/blocks/thematic-break.js +17 -0
  19. package/dist/cjs/parser/entities.js +2133 -0
  20. package/dist/cjs/parser/gfm/block-parser.js +773 -0
  21. package/dist/cjs/parser/gfm/index.js +125 -0
  22. package/dist/cjs/parser/gfm/inline-parser.js +813 -0
  23. package/dist/cjs/parser/gfm/renderer.js +513 -0
  24. package/dist/cjs/parser/index.js +104 -0
  25. package/dist/cjs/parser/inline-parser.js +564 -0
  26. package/dist/cjs/parser/inlines/autolink-extended.js +364 -0
  27. package/dist/cjs/parser/inlines/autolink.js +44 -0
  28. package/dist/cjs/parser/inlines/code-span.js +48 -0
  29. package/dist/cjs/parser/inlines/emphasis.js +64 -0
  30. package/dist/cjs/parser/inlines/entity.js +25 -0
  31. package/dist/cjs/parser/inlines/escape.js +25 -0
  32. package/dist/cjs/parser/inlines/footnote.js +41 -0
  33. package/dist/cjs/parser/inlines/hard-break.js +45 -0
  34. package/dist/cjs/parser/inlines/image.js +9 -0
  35. package/dist/cjs/parser/inlines/link.js +166 -0
  36. package/dist/cjs/parser/inlines/soft-break.js +18 -0
  37. package/dist/cjs/parser/inlines/strikethrough.js +48 -0
  38. package/dist/cjs/parser/inlines/text.js +20 -0
  39. package/dist/cjs/parser/renderer.js +345 -0
  40. package/dist/cjs/parser/types.js +5 -0
  41. package/dist/cjs/parser/utils.js +277 -0
  42. package/dist/cli.d.ts +6 -0
  43. package/dist/cli.js +36 -0
  44. package/dist/esm/cli.js +34 -0
  45. package/dist/esm/gfm.js +5 -0
  46. package/dist/esm/index.js +5 -0
  47. package/dist/esm/package.json +3 -0
  48. package/dist/esm/parser/block-parser.js +640 -0
  49. package/dist/esm/parser/blocks/blockquote.js +22 -0
  50. package/dist/esm/parser/blocks/code-block-fenced.js +52 -0
  51. package/dist/esm/parser/blocks/code-block-indented.js +42 -0
  52. package/dist/esm/parser/blocks/heading-atx.js +24 -0
  53. package/dist/esm/parser/blocks/heading-setext.js +19 -0
  54. package/dist/esm/parser/blocks/html-block.js +77 -0
  55. package/dist/esm/parser/blocks/link-reference.js +105 -0
  56. package/dist/esm/parser/blocks/list.js +145 -0
  57. package/dist/esm/parser/blocks/paragraph.js +15 -0
  58. package/dist/esm/parser/blocks/table.js +152 -0
  59. package/dist/esm/parser/blocks/task-list.js +61 -0
  60. package/dist/esm/parser/blocks/thematic-break.js +13 -0
  61. package/dist/esm/parser/entities.js +2130 -0
  62. package/dist/esm/parser/gfm/block-parser.js +769 -0
  63. package/dist/esm/parser/gfm/index.js +115 -0
  64. package/dist/esm/parser/gfm/inline-parser.js +809 -0
  65. package/dist/esm/parser/gfm/renderer.js +509 -0
  66. package/dist/esm/parser/index.js +80 -0
  67. package/dist/esm/parser/inline-parser.js +560 -0
  68. package/dist/esm/parser/inlines/autolink-extended.js +357 -0
  69. package/dist/esm/parser/inlines/autolink.js +40 -0
  70. package/dist/esm/parser/inlines/code-span.js +44 -0
  71. package/dist/esm/parser/inlines/emphasis.js +59 -0
  72. package/dist/esm/parser/inlines/entity.js +21 -0
  73. package/dist/esm/parser/inlines/escape.js +21 -0
  74. package/dist/esm/parser/inlines/footnote.js +38 -0
  75. package/dist/esm/parser/inlines/hard-break.js +41 -0
  76. package/dist/esm/parser/inlines/image.js +4 -0
  77. package/dist/esm/parser/inlines/link.js +156 -0
  78. package/dist/esm/parser/inlines/soft-break.js +14 -0
  79. package/dist/esm/parser/inlines/strikethrough.js +42 -0
  80. package/dist/esm/parser/inlines/text.js +16 -0
  81. package/dist/esm/parser/renderer.js +341 -0
  82. package/dist/esm/parser/types.js +4 -0
  83. package/dist/esm/parser/utils.js +254 -0
  84. package/dist/gfm.d.ts +6 -0
  85. package/dist/gfm.js +26 -0
  86. package/dist/index.d.ts +5 -0
  87. package/dist/index.js +26 -0
  88. package/dist/parser/block-parser.d.ts +25 -0
  89. package/dist/parser/block-parser.js +644 -0
  90. package/dist/parser/blocks/blockquote.d.ts +8 -0
  91. package/dist/parser/blocks/blockquote.js +28 -0
  92. package/dist/parser/blocks/code-block-fenced.d.ts +14 -0
  93. package/dist/parser/blocks/code-block-fenced.js +58 -0
  94. package/dist/parser/blocks/code-block-indented.d.ts +7 -0
  95. package/dist/parser/blocks/code-block-indented.js +47 -0
  96. package/dist/parser/blocks/heading-atx.d.ts +10 -0
  97. package/dist/parser/blocks/heading-atx.js +29 -0
  98. package/dist/parser/blocks/heading-setext.d.ts +8 -0
  99. package/dist/parser/blocks/heading-setext.js +24 -0
  100. package/dist/parser/blocks/html-block.d.ts +9 -0
  101. package/dist/parser/blocks/html-block.js +83 -0
  102. package/dist/parser/blocks/link-reference.d.ts +11 -0
  103. package/dist/parser/blocks/link-reference.js +109 -0
  104. package/dist/parser/blocks/list.d.ts +25 -0
  105. package/dist/parser/blocks/list.js +155 -0
  106. package/dist/parser/blocks/paragraph.d.ts +7 -0
  107. package/dist/parser/blocks/paragraph.js +20 -0
  108. package/dist/parser/blocks/table.d.ts +13 -0
  109. package/dist/parser/blocks/table.js +163 -0
  110. package/dist/parser/blocks/task-list.d.ts +10 -0
  111. package/dist/parser/blocks/task-list.js +66 -0
  112. package/dist/parser/blocks/thematic-break.d.ts +6 -0
  113. package/dist/parser/blocks/thematic-break.js +17 -0
  114. package/dist/parser/entities.d.ts +4 -0
  115. package/dist/parser/entities.js +2133 -0
  116. package/dist/parser/gfm/block-parser.d.ts +32 -0
  117. package/dist/parser/gfm/block-parser.js +773 -0
  118. package/dist/parser/gfm/index.d.ts +31 -0
  119. package/dist/parser/gfm/index.js +125 -0
  120. package/dist/parser/gfm/inline-parser.d.ts +25 -0
  121. package/dist/parser/gfm/inline-parser.js +813 -0
  122. package/dist/parser/gfm/renderer.d.ts +43 -0
  123. package/dist/parser/gfm/renderer.js +513 -0
  124. package/dist/parser/index.d.ts +33 -0
  125. package/dist/parser/index.js +104 -0
  126. package/dist/parser/inline-parser.d.ts +16 -0
  127. package/dist/parser/inline-parser.js +564 -0
  128. package/dist/parser/inlines/autolink-extended.d.ts +24 -0
  129. package/dist/parser/inlines/autolink-extended.js +364 -0
  130. package/dist/parser/inlines/autolink.d.ts +9 -0
  131. package/dist/parser/inlines/autolink.js +44 -0
  132. package/dist/parser/inlines/code-span.d.ts +9 -0
  133. package/dist/parser/inlines/code-span.js +48 -0
  134. package/dist/parser/inlines/emphasis.d.ts +14 -0
  135. package/dist/parser/inlines/emphasis.js +64 -0
  136. package/dist/parser/inlines/entity.d.ts +8 -0
  137. package/dist/parser/inlines/entity.js +25 -0
  138. package/dist/parser/inlines/escape.d.ts +8 -0
  139. package/dist/parser/inlines/escape.js +25 -0
  140. package/dist/parser/inlines/footnote.d.ts +9 -0
  141. package/dist/parser/inlines/footnote.js +41 -0
  142. package/dist/parser/inlines/hard-break.d.ts +9 -0
  143. package/dist/parser/inlines/hard-break.js +45 -0
  144. package/dist/parser/inlines/image.d.ts +4 -0
  145. package/dist/parser/inlines/image.js +9 -0
  146. package/dist/parser/inlines/link.d.ts +33 -0
  147. package/dist/parser/inlines/link.js +166 -0
  148. package/dist/parser/inlines/soft-break.d.ts +9 -0
  149. package/dist/parser/inlines/soft-break.js +18 -0
  150. package/dist/parser/inlines/strikethrough.d.ts +16 -0
  151. package/dist/parser/inlines/strikethrough.js +48 -0
  152. package/dist/parser/inlines/text.d.ts +6 -0
  153. package/dist/parser/inlines/text.js +20 -0
  154. package/dist/parser/renderer.d.ts +33 -0
  155. package/dist/parser/renderer.js +345 -0
  156. package/dist/parser/types.d.ts +152 -0
  157. package/dist/parser/types.js +5 -0
  158. package/dist/parser/utils.d.ts +32 -0
  159. package/dist/parser/utils.js +277 -0
  160. package/dist/types/cli.d.ts +6 -0
  161. package/dist/types/gfm.d.ts +6 -0
  162. package/dist/types/index.d.ts +5 -0
  163. package/dist/types/parser/block-parser.d.ts +25 -0
  164. package/dist/types/parser/blocks/blockquote.d.ts +8 -0
  165. package/dist/types/parser/blocks/code-block-fenced.d.ts +14 -0
  166. package/dist/types/parser/blocks/code-block-indented.d.ts +7 -0
  167. package/dist/types/parser/blocks/heading-atx.d.ts +10 -0
  168. package/dist/types/parser/blocks/heading-setext.d.ts +8 -0
  169. package/dist/types/parser/blocks/html-block.d.ts +9 -0
  170. package/dist/types/parser/blocks/link-reference.d.ts +11 -0
  171. package/dist/types/parser/blocks/list.d.ts +25 -0
  172. package/dist/types/parser/blocks/paragraph.d.ts +7 -0
  173. package/dist/types/parser/blocks/table.d.ts +13 -0
  174. package/dist/types/parser/blocks/task-list.d.ts +10 -0
  175. package/dist/types/parser/blocks/thematic-break.d.ts +6 -0
  176. package/dist/types/parser/entities.d.ts +4 -0
  177. package/dist/types/parser/gfm/block-parser.d.ts +32 -0
  178. package/dist/types/parser/gfm/index.d.ts +31 -0
  179. package/dist/types/parser/gfm/inline-parser.d.ts +25 -0
  180. package/dist/types/parser/gfm/renderer.d.ts +43 -0
  181. package/dist/types/parser/index.d.ts +33 -0
  182. package/dist/types/parser/inline-parser.d.ts +16 -0
  183. package/dist/types/parser/inlines/autolink-extended.d.ts +24 -0
  184. package/dist/types/parser/inlines/autolink.d.ts +9 -0
  185. package/dist/types/parser/inlines/code-span.d.ts +9 -0
  186. package/dist/types/parser/inlines/emphasis.d.ts +14 -0
  187. package/dist/types/parser/inlines/entity.d.ts +8 -0
  188. package/dist/types/parser/inlines/escape.d.ts +8 -0
  189. package/dist/types/parser/inlines/footnote.d.ts +9 -0
  190. package/dist/types/parser/inlines/hard-break.d.ts +9 -0
  191. package/dist/types/parser/inlines/image.d.ts +4 -0
  192. package/dist/types/parser/inlines/link.d.ts +33 -0
  193. package/dist/types/parser/inlines/soft-break.d.ts +9 -0
  194. package/dist/types/parser/inlines/strikethrough.d.ts +16 -0
  195. package/dist/types/parser/inlines/text.d.ts +6 -0
  196. package/dist/types/parser/renderer.d.ts +33 -0
  197. package/dist/types/parser/types.d.ts +152 -0
  198. package/dist/types/parser/utils.d.ts +32 -0
  199. package/package.json +54 -0
@@ -0,0 +1,813 @@
1
+ "use strict";
2
+ /**
3
+ * GFM inline parser that extends CommonMark with strikethrough and extended autolinks.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GFMInlineParser = void 0;
7
+ const escape_js_1 = require("../inlines/escape.js");
8
+ const entity_js_1 = require("../inlines/entity.js");
9
+ const code_span_js_1 = require("../inlines/code-span.js");
10
+ const emphasis_js_1 = require("../inlines/emphasis.js");
11
+ const autolink_js_1 = require("../inlines/autolink.js");
12
+ const link_js_1 = require("../inlines/link.js");
13
+ const text_js_1 = require("../inlines/text.js");
14
+ const utils_js_1 = require("../utils.js");
15
+ const utils_js_2 = require("../utils.js");
16
+ const strikethrough_js_1 = require("../inlines/strikethrough.js");
17
+ const autolink_extended_js_1 = require("../inlines/autolink-extended.js");
18
+ const footnote_js_1 = require("../inlines/footnote.js");
19
+ class GFMInlineParser {
20
+ linkReferences = new Map();
21
+ footnoteDefinitions = new Map();
22
+ enableAutolink;
23
+ enableStrikethrough;
24
+ enableFootnotes;
25
+ enableTagfilter;
26
+ constructor(extensions) {
27
+ this.enableAutolink = !extensions || extensions.has('autolink');
28
+ this.enableStrikethrough = !extensions || extensions.has('strikethrough');
29
+ this.enableFootnotes = !extensions || extensions.has('footnotes');
30
+ this.enableTagfilter = !extensions || extensions.has('tagfilter');
31
+ }
32
+ setLinkReferences(refs) {
33
+ this.linkReferences = refs;
34
+ }
35
+ setFootnoteDefinitions(defs) {
36
+ this.footnoteDefinitions = defs;
37
+ }
38
+ parse(text) {
39
+ const nodes = [];
40
+ let delimiterStack = null;
41
+ let bracketStack = null;
42
+ let pos = 0;
43
+ let textBuffer = '';
44
+ const flushText = () => {
45
+ if (textBuffer.length > 0) {
46
+ nodes.push((0, text_js_1.createTextNode)(textBuffer));
47
+ textBuffer = '';
48
+ }
49
+ };
50
+ const pushDelimiter = (run, node) => {
51
+ const d = {
52
+ run,
53
+ node,
54
+ active: true,
55
+ prev: delimiterStack,
56
+ next: null,
57
+ };
58
+ if (delimiterStack) {
59
+ delimiterStack.next = d;
60
+ }
61
+ delimiterStack = d;
62
+ };
63
+ while (pos < text.length) {
64
+ const char = text[pos];
65
+ const charBefore = pos > 0 ? text[pos - 1] : undefined;
66
+ if (this.enableAutolink) {
67
+ const extendedAutolink = (0, autolink_extended_js_1.parseExtendedAutolink)(text, pos, charBefore);
68
+ if (extendedAutolink) {
69
+ flushText();
70
+ nodes.push(extendedAutolink.node);
71
+ pos += extendedAutolink.length;
72
+ continue;
73
+ }
74
+ }
75
+ const escapeResult = (0, escape_js_1.parseEscape)(text, pos);
76
+ if (escapeResult) {
77
+ if (escapeResult.char === '\n') {
78
+ textBuffer = textBuffer.replace(/ *$/, '');
79
+ flushText();
80
+ nodes.push({ type: 'hardbreak' });
81
+ pos += escapeResult.length;
82
+ while (pos < text.length && text[pos] === ' ') {
83
+ pos++;
84
+ }
85
+ }
86
+ else if (escapeResult.char === '*' || escapeResult.char === '_' || escapeResult.char === '~') {
87
+ flushText();
88
+ nodes.push((0, text_js_1.createTextNode)(escapeResult.char, true));
89
+ pos += escapeResult.length;
90
+ }
91
+ else if (escapeResult.char === '"' || escapeResult.char === "'" ||
92
+ escapeResult.char === '-' || escapeResult.char === '.') {
93
+ flushText();
94
+ const node = (0, text_js_1.createTextNode)(escapeResult.char);
95
+ node.noSmart = true;
96
+ nodes.push(node);
97
+ pos += escapeResult.length;
98
+ }
99
+ else {
100
+ textBuffer += escapeResult.char;
101
+ pos += escapeResult.length;
102
+ }
103
+ continue;
104
+ }
105
+ const entityResult = (0, entity_js_1.parseEntity)(text, pos);
106
+ if (entityResult) {
107
+ textBuffer += entityResult.char;
108
+ pos += entityResult.length;
109
+ continue;
110
+ }
111
+ if (char === '`') {
112
+ const codeSpanResult = (0, code_span_js_1.parseCodeSpan)(text, pos);
113
+ if (codeSpanResult) {
114
+ flushText();
115
+ nodes.push(codeSpanResult.node);
116
+ pos += codeSpanResult.length;
117
+ continue;
118
+ }
119
+ else {
120
+ textBuffer += char;
121
+ pos++;
122
+ while (pos < text.length && text[pos] === '`') {
123
+ textBuffer += text[pos];
124
+ pos++;
125
+ }
126
+ continue;
127
+ }
128
+ }
129
+ if (char === '<') {
130
+ const autolinkResult = (0, autolink_js_1.parseAutolink)(text, pos);
131
+ if (autolinkResult) {
132
+ flushText();
133
+ nodes.push(autolinkResult.node);
134
+ pos += autolinkResult.length;
135
+ continue;
136
+ }
137
+ const openingTagMatch = text.slice(pos).match(/^<[a-zA-Z][a-zA-Z0-9-]*(?:\s+[a-zA-Z_:][a-zA-Z0-9_.:-]*(?:\s*=\s*(?:[^\s"'=<>`]+|'[^']*'|"[^"]*"))?)*\s*\/?>/);
138
+ if (openingTagMatch) {
139
+ const tagNameMatch = openingTagMatch[0].match(/^<\s*([a-zA-Z][a-zA-Z0-9-]*)/);
140
+ if (this.enableTagfilter && tagNameMatch && (0, utils_js_2.isTagFilterTag)(tagNameMatch[1])) {
141
+ flushText();
142
+ nodes.push({
143
+ type: 'html_inline',
144
+ literal: openingTagMatch[0].replace(/^</, '&lt;'),
145
+ });
146
+ pos += openingTagMatch[0].length;
147
+ continue;
148
+ }
149
+ flushText();
150
+ nodes.push({ type: 'html_inline', literal: openingTagMatch[0] });
151
+ pos += openingTagMatch[0].length;
152
+ continue;
153
+ }
154
+ const closingTagMatch = text.slice(pos).match(/^<\/[a-zA-Z][a-zA-Z0-9-]*\s*>/);
155
+ if (closingTagMatch) {
156
+ const tagNameMatch = closingTagMatch[0].match(/^<\/\s*([a-zA-Z][a-zA-Z0-9-]*)/);
157
+ if (this.enableTagfilter && tagNameMatch && (0, utils_js_2.isTagFilterTag)(tagNameMatch[1])) {
158
+ flushText();
159
+ nodes.push({
160
+ type: 'html_inline',
161
+ literal: closingTagMatch[0].replace(/^</, '&lt;'),
162
+ });
163
+ pos += closingTagMatch[0].length;
164
+ continue;
165
+ }
166
+ flushText();
167
+ nodes.push({ type: 'html_inline', literal: closingTagMatch[0] });
168
+ pos += closingTagMatch[0].length;
169
+ continue;
170
+ }
171
+ const shortCommentMatch = text.slice(pos).match(/^<!---?>/);
172
+ if (shortCommentMatch) {
173
+ flushText();
174
+ nodes.push({ type: 'html_inline', literal: '<!---->' });
175
+ pos += shortCommentMatch[0].length;
176
+ continue;
177
+ }
178
+ const commentMatch = text.slice(pos).match(/^<!--(?!>)(?!-?>)[\s\S]*?-->/);
179
+ if (commentMatch) {
180
+ flushText();
181
+ nodes.push({ type: 'html_inline', literal: commentMatch[0] });
182
+ pos += commentMatch[0].length;
183
+ continue;
184
+ }
185
+ const piMatch = text.slice(pos).match(/^<\?[\s\S]*?\?>/);
186
+ if (piMatch) {
187
+ flushText();
188
+ nodes.push({ type: 'html_inline', literal: piMatch[0] });
189
+ pos += piMatch[0].length;
190
+ continue;
191
+ }
192
+ const cdataMatch = text.slice(pos).match(/^<!\[CDATA\[[\s\S]*?\]\]>/);
193
+ if (cdataMatch) {
194
+ flushText();
195
+ nodes.push({ type: 'html_inline', literal: cdataMatch[0] });
196
+ pos += cdataMatch[0].length;
197
+ continue;
198
+ }
199
+ const declMatch = text.slice(pos).match(/^<![a-zA-Z][\s\S]*?>/);
200
+ if (declMatch) {
201
+ flushText();
202
+ nodes.push({ type: 'html_inline', literal: declMatch[0] });
203
+ pos += declMatch[0].length;
204
+ continue;
205
+ }
206
+ }
207
+ if (char === ' ') {
208
+ let spaceCount = 0;
209
+ let j = pos;
210
+ while (j < text.length && text[j] === ' ') {
211
+ spaceCount++;
212
+ j++;
213
+ }
214
+ if (text[j] === '\n' && spaceCount >= 2) {
215
+ textBuffer = textBuffer.replace(/ *$/, '');
216
+ flushText();
217
+ nodes.push({ type: 'hardbreak' });
218
+ pos = j + 1;
219
+ while (pos < text.length && text[pos] === ' ') {
220
+ pos++;
221
+ }
222
+ continue;
223
+ }
224
+ }
225
+ if (char === '\n') {
226
+ textBuffer = textBuffer.replace(/ *$/, '');
227
+ flushText();
228
+ nodes.push({ type: 'softbreak' });
229
+ pos++;
230
+ while (pos < text.length && text[pos] === ' ') {
231
+ pos++;
232
+ }
233
+ continue;
234
+ }
235
+ if (char === '~' && this.enableStrikethrough) {
236
+ let tildeCount = 0;
237
+ let j = pos;
238
+ while (j < text.length && text[j] === '~') {
239
+ tildeCount++;
240
+ j++;
241
+ }
242
+ if (tildeCount <= 2) {
243
+ const strikeRun = (0, strikethrough_js_1.parseStrikethroughDelimiter)(text, pos);
244
+ if (strikeRun && (strikeRun.canOpen || strikeRun.canClose)) {
245
+ flushText();
246
+ const node = (0, text_js_1.createTextNode)(text.slice(pos, pos + strikeRun.length));
247
+ nodes.push(node);
248
+ pos += strikeRun.length;
249
+ continue;
250
+ }
251
+ }
252
+ else {
253
+ textBuffer += text.slice(pos, j);
254
+ pos = j;
255
+ continue;
256
+ }
257
+ }
258
+ if (char === '!' && text[pos + 1] === '[' && text[pos + 2] === '^') {
259
+ textBuffer += '!';
260
+ pos++;
261
+ continue;
262
+ }
263
+ if (this.enableFootnotes && char === '[' && text[pos + 1] === '^') {
264
+ const footnoteLabel = (0, footnote_js_1.parseFootnoteLabel)(text, pos);
265
+ if (footnoteLabel) {
266
+ const def = this.footnoteDefinitions.get(footnoteLabel.normalized);
267
+ flushText();
268
+ if (def) {
269
+ nodes.push({
270
+ type: 'footnote_ref',
271
+ label: def.label,
272
+ key: footnoteLabel.normalized,
273
+ });
274
+ }
275
+ else {
276
+ nodes.push((0, text_js_1.createTextNode)(text.slice(pos, pos + footnoteLabel.length), true));
277
+ }
278
+ pos += footnoteLabel.length;
279
+ continue;
280
+ }
281
+ }
282
+ if (char === '*' || char === '_') {
283
+ flushText();
284
+ const run = (0, emphasis_js_1.parseDelimiterRun)(text, pos);
285
+ if (run) {
286
+ const node = (0, text_js_1.createTextNode)(text.slice(pos, pos + run.length));
287
+ node.delimiterOrigLength = run.length;
288
+ nodes.push(node);
289
+ if (run.canOpen || run.canClose) {
290
+ pushDelimiter(run, node);
291
+ }
292
+ pos += run.length;
293
+ continue;
294
+ }
295
+ }
296
+ if (char === '!' && text[pos + 1] === '[') {
297
+ flushText();
298
+ const node = (0, text_js_1.createTextNode)('![');
299
+ nodes.push(node);
300
+ const bracket = {
301
+ type: 'image',
302
+ node,
303
+ nodeIndex: nodes.length - 1,
304
+ active: true,
305
+ prev: bracketStack,
306
+ bracketAfter: false,
307
+ delimiterBefore: delimiterStack,
308
+ textPos: pos + 2,
309
+ };
310
+ if (bracketStack)
311
+ bracketStack.bracketAfter = true;
312
+ bracketStack = bracket;
313
+ pos += 2;
314
+ continue;
315
+ }
316
+ if (char === '[') {
317
+ flushText();
318
+ const node = (0, text_js_1.createTextNode)('[');
319
+ nodes.push(node);
320
+ const bracket = {
321
+ type: 'link',
322
+ node,
323
+ nodeIndex: nodes.length - 1,
324
+ active: true,
325
+ prev: bracketStack,
326
+ bracketAfter: false,
327
+ delimiterBefore: delimiterStack,
328
+ textPos: pos + 1,
329
+ };
330
+ if (bracketStack)
331
+ bracketStack.bracketAfter = true;
332
+ bracketStack = bracket;
333
+ pos += 1;
334
+ continue;
335
+ }
336
+ if (char === ']' && bracketStack) {
337
+ flushText();
338
+ let opener = bracketStack;
339
+ if (!opener) {
340
+ textBuffer += ']';
341
+ pos++;
342
+ continue;
343
+ }
344
+ if (!opener.active) {
345
+ bracketStack = opener.prev;
346
+ textBuffer += ']';
347
+ pos++;
348
+ continue;
349
+ }
350
+ let matched = false;
351
+ let destination = '';
352
+ let title = '';
353
+ let consumed = 1;
354
+ if (text[pos + 1] === '(') {
355
+ const linkResult = (0, link_js_1.parseInlineLink)(text, pos + 1);
356
+ if (linkResult) {
357
+ matched = true;
358
+ destination = linkResult.destination;
359
+ title = linkResult.title;
360
+ consumed = 1 + linkResult.length;
361
+ }
362
+ }
363
+ if (!matched && text[pos + 1] === '[') {
364
+ const labelResult = (0, link_js_1.parseLinkLabel)(text, pos + 1);
365
+ if (labelResult && labelResult.label) {
366
+ if (this.linkReferences.has(labelResult.label)) {
367
+ matched = true;
368
+ const ref = this.linkReferences.get(labelResult.label);
369
+ destination = ref.destination;
370
+ title = ref.title;
371
+ consumed = 1 + labelResult.length;
372
+ }
373
+ }
374
+ else if (labelResult && labelResult.label === '') {
375
+ const innerText = this.extractTextFromNodes(nodes.slice(opener.nodeIndex + 1));
376
+ const label = (0, utils_js_1.normalizeLabel)(innerText);
377
+ if (this.linkReferences.has(label)) {
378
+ matched = true;
379
+ const ref = this.linkReferences.get(label);
380
+ destination = ref.destination;
381
+ title = ref.title;
382
+ consumed = 1 + labelResult.length;
383
+ }
384
+ }
385
+ }
386
+ if (!matched && text[pos + 1] !== '[') {
387
+ const rawLabel = text.slice(opener.textPos, pos);
388
+ const label = (0, utils_js_1.normalizeLabel)(this.normalizeLabelForMatching(rawLabel));
389
+ if (label && this.linkReferences.has(label)) {
390
+ matched = true;
391
+ const ref = this.linkReferences.get(label);
392
+ destination = ref.destination;
393
+ title = ref.title;
394
+ }
395
+ }
396
+ if (matched) {
397
+ const innerNodes = nodes.splice(opener.nodeIndex + 1);
398
+ nodes.pop();
399
+ this.processEmphasisAndStrikethrough(innerNodes, opener.delimiterBefore);
400
+ if (opener.type === 'image') {
401
+ const alt = this.extractTextFromNodes(innerNodes);
402
+ nodes.push((0, link_js_1.createImageNode)(destination, title, alt));
403
+ }
404
+ else {
405
+ const linkNode = (0, link_js_1.createLinkNode)(destination, title);
406
+ linkNode.children = innerNodes;
407
+ nodes.push(linkNode);
408
+ }
409
+ if (opener.type === 'link') {
410
+ let b = opener.prev;
411
+ while (b) {
412
+ if (b.type === 'link')
413
+ b.active = false;
414
+ b = b.prev;
415
+ }
416
+ }
417
+ bracketStack = opener.prev;
418
+ pos += consumed;
419
+ }
420
+ else {
421
+ bracketStack = opener.prev;
422
+ textBuffer += ']';
423
+ pos++;
424
+ }
425
+ continue;
426
+ }
427
+ textBuffer += char;
428
+ pos++;
429
+ }
430
+ flushText();
431
+ this.processEmphasisAndStrikethrough(nodes, null);
432
+ this.flattenNestedEmphasis(nodes);
433
+ return nodes;
434
+ }
435
+ extractTextFromNodes(nodes) {
436
+ let result = '';
437
+ for (const node of nodes) {
438
+ if (node.type === 'text') {
439
+ result += node.literal;
440
+ }
441
+ else if (node.type === 'code_span') {
442
+ result += node.literal;
443
+ }
444
+ else if (node.type === 'image') {
445
+ result += node.alt;
446
+ }
447
+ else if (node.type === 'softbreak' || node.type === 'hardbreak') {
448
+ result += ' ';
449
+ }
450
+ else if ('children' in node && Array.isArray(node.children)) {
451
+ result += this.extractTextFromNodes(node.children);
452
+ }
453
+ }
454
+ return result;
455
+ }
456
+ normalizeLabelForMatching(rawLabel) {
457
+ let result = '';
458
+ let i = 0;
459
+ while (i < rawLabel.length) {
460
+ if (rawLabel[i] === '\\' && i + 1 < rawLabel.length) {
461
+ const next = rawLabel[i + 1];
462
+ if (next === '[' || next === ']' || next === '\\') {
463
+ result += next;
464
+ i += 2;
465
+ continue;
466
+ }
467
+ }
468
+ result += rawLabel[i];
469
+ i++;
470
+ }
471
+ return result;
472
+ }
473
+ processEmphasisAndStrikethrough(nodes, stackBottom) {
474
+ this.processEmphasis(nodes, stackBottom);
475
+ if (this.enableStrikethrough) {
476
+ this.processStrikethrough(nodes);
477
+ }
478
+ }
479
+ processStrikethrough(nodes) {
480
+ const delimiters = [];
481
+ for (let i = 0; i < nodes.length; i++) {
482
+ const node = nodes[i];
483
+ if (node.type === 'text' && node.literal.length > 0 && !node.noDelim) {
484
+ if (node.literal.match(/^~{1,2}$/)) {
485
+ const beforeNode = i > 0 ? nodes[i - 1] : null;
486
+ const afterNode = i < nodes.length - 1 ? nodes[i + 1] : null;
487
+ let charBefore = '\n';
488
+ let charAfter = '\n';
489
+ if (beforeNode) {
490
+ if (beforeNode.type === 'text') {
491
+ charBefore = this.getLastChar(beforeNode.literal);
492
+ }
493
+ else if (beforeNode.type !== 'softbreak' && beforeNode.type !== 'hardbreak') {
494
+ charBefore = 'a';
495
+ }
496
+ }
497
+ if (afterNode) {
498
+ if (afterNode.type === 'text') {
499
+ charAfter = this.getFirstChar(afterNode.literal);
500
+ }
501
+ else if (afterNode.type !== 'softbreak' && afterNode.type !== 'hardbreak') {
502
+ charAfter = 'a';
503
+ }
504
+ }
505
+ const isWhitespace = (c) => /\s/.test(c) || c === '\n';
506
+ const beforeIsWhitespace = isWhitespace(charBefore);
507
+ const afterIsWhitespace = isWhitespace(charAfter);
508
+ const canOpen = !afterIsWhitespace;
509
+ const canClose = !beforeIsWhitespace;
510
+ if (canOpen || canClose) {
511
+ delimiters.push({
512
+ run: {
513
+ char: '~',
514
+ length: node.literal.length,
515
+ canOpen,
516
+ canClose,
517
+ position: 0,
518
+ origLength: node.literal.length,
519
+ },
520
+ node: node,
521
+ active: true,
522
+ nodeIndex: i,
523
+ });
524
+ }
525
+ }
526
+ }
527
+ }
528
+ if (delimiters.length < 2)
529
+ return;
530
+ let closerIdx = 0;
531
+ while (closerIdx < delimiters.length) {
532
+ const closer = delimiters[closerIdx];
533
+ if (!closer.run.canClose || !closer.active) {
534
+ closerIdx++;
535
+ continue;
536
+ }
537
+ let openerIdx = closerIdx - 1;
538
+ let openerFound = false;
539
+ while (openerIdx >= 0) {
540
+ const opener = delimiters[openerIdx];
541
+ if (opener.active && opener.run.canOpen &&
542
+ (0, strikethrough_js_1.canStrikethroughDelimitersMatch)(opener.run, closer.run)) {
543
+ openerFound = true;
544
+ break;
545
+ }
546
+ openerIdx--;
547
+ }
548
+ if (!openerFound) {
549
+ closerIdx++;
550
+ continue;
551
+ }
552
+ const opener = delimiters[openerIdx];
553
+ const openerNodeIdx = nodes.indexOf(opener.node);
554
+ const closerNodeIdx = nodes.indexOf(closer.node);
555
+ if (openerNodeIdx === -1 || closerNodeIdx === -1) {
556
+ closerIdx++;
557
+ continue;
558
+ }
559
+ const contentNodes = nodes.slice(openerNodeIdx + 1, closerNodeIdx);
560
+ const strikeNode = (0, strikethrough_js_1.createStrikethroughNode)(contentNodes);
561
+ nodes.splice(openerNodeIdx, closerNodeIdx - openerNodeIdx + 1, strikeNode);
562
+ for (let i = openerIdx + 1; i < closerIdx; i++) {
563
+ delimiters[i].active = false;
564
+ }
565
+ opener.active = false;
566
+ closer.active = false;
567
+ delimiters.length = 0;
568
+ for (let i = 0; i < nodes.length; i++) {
569
+ const node = nodes[i];
570
+ if (node.type === 'text' && node.literal.length > 0 && !node.noDelim) {
571
+ if (node.literal.match(/^~{1,2}$/)) {
572
+ const beforeNode = i > 0 ? nodes[i - 1] : null;
573
+ const afterNode = i < nodes.length - 1 ? nodes[i + 1] : null;
574
+ let charBefore = '\n';
575
+ let charAfter = '\n';
576
+ if (beforeNode) {
577
+ if (beforeNode.type === 'text')
578
+ charBefore = this.getLastChar(beforeNode.literal);
579
+ else if (beforeNode.type !== 'softbreak' && beforeNode.type !== 'hardbreak')
580
+ charBefore = 'a';
581
+ }
582
+ if (afterNode) {
583
+ if (afterNode.type === 'text')
584
+ charAfter = this.getFirstChar(afterNode.literal);
585
+ else if (afterNode.type !== 'softbreak' && afterNode.type !== 'hardbreak')
586
+ charAfter = 'a';
587
+ }
588
+ const isWhitespace = (c) => /\s/.test(c) || c === '\n';
589
+ const canOpen = !isWhitespace(charAfter);
590
+ const canClose = !isWhitespace(charBefore);
591
+ if (canOpen || canClose) {
592
+ delimiters.push({
593
+ run: {
594
+ char: '~',
595
+ length: node.literal.length,
596
+ canOpen,
597
+ canClose,
598
+ position: 0,
599
+ origLength: node.literal.length,
600
+ },
601
+ node: node,
602
+ active: true,
603
+ nodeIndex: i,
604
+ });
605
+ }
606
+ }
607
+ }
608
+ }
609
+ closerIdx = 0;
610
+ }
611
+ for (let i = nodes.length - 1; i >= 0; i--) {
612
+ const node = nodes[i];
613
+ if (node.type === 'text' && node.literal === '') {
614
+ nodes.splice(i, 1);
615
+ }
616
+ }
617
+ }
618
+ processEmphasis(nodes, stackBottom) {
619
+ const nodeDelims = [];
620
+ for (let i = 0; i < nodes.length; i++) {
621
+ const node = nodes[i];
622
+ if (node.type === 'text' && node.literal.length > 0 && !node.noDelim) {
623
+ const firstChar = node.literal[0];
624
+ if ((firstChar === '*' || firstChar === '_') && node.literal.match(/^[*_]+$/)) {
625
+ const beforeNode = i > 0 ? nodes[i - 1] : null;
626
+ const afterNode = i < nodes.length - 1 ? nodes[i + 1] : null;
627
+ let charBefore = '\n';
628
+ if (beforeNode) {
629
+ if (beforeNode.type === 'text') {
630
+ charBefore = this.getLastChar(beforeNode.literal);
631
+ }
632
+ else if (beforeNode.type === 'softbreak' || beforeNode.type === 'hardbreak') {
633
+ charBefore = '\n';
634
+ }
635
+ else {
636
+ charBefore = 'a';
637
+ }
638
+ }
639
+ let charAfter = '\n';
640
+ if (afterNode) {
641
+ if (afterNode.type === 'text') {
642
+ charAfter = this.getFirstChar(afterNode.literal);
643
+ }
644
+ else if (afterNode.type === 'softbreak' || afterNode.type === 'hardbreak') {
645
+ charAfter = '\n';
646
+ }
647
+ else {
648
+ charAfter = 'a';
649
+ }
650
+ }
651
+ const run = this.computeDelimiterRun(node.literal, charBefore, charAfter);
652
+ node.delimiterOrigLength = node.delimiterOrigLength ?? node.literal.length;
653
+ run.origLength = node.delimiterOrigLength;
654
+ if (run.canOpen || run.canClose) {
655
+ nodeDelims.push({ node, index: i, run });
656
+ }
657
+ }
658
+ }
659
+ }
660
+ if (nodeDelims.length === 0)
661
+ return;
662
+ const openerBottomByChar = { '*': -1, '_': -1 };
663
+ let closerIdx = 0;
664
+ while (closerIdx < nodeDelims.length) {
665
+ const closer = nodeDelims[closerIdx];
666
+ if (!closer.run.canClose) {
667
+ closerIdx++;
668
+ continue;
669
+ }
670
+ let openerIdx = closerIdx - 1;
671
+ let openerFound = false;
672
+ while (openerIdx >= 0 && openerIdx > openerBottomByChar[closer.run.char]) {
673
+ const opener = nodeDelims[openerIdx];
674
+ if (opener.run.canOpen && opener.run.char === closer.run.char &&
675
+ (0, emphasis_js_1.canDelimitersMatch)(opener.run, closer.run)) {
676
+ openerFound = true;
677
+ break;
678
+ }
679
+ openerIdx--;
680
+ }
681
+ if (!openerFound) {
682
+ if (!closer.run.canOpen) {
683
+ openerBottomByChar[closer.run.char] = closerIdx - 1;
684
+ }
685
+ closerIdx++;
686
+ continue;
687
+ }
688
+ const opener = nodeDelims[openerIdx];
689
+ const strong = opener.run.length >= 2 && closer.run.length >= 2;
690
+ const numDelims = strong ? 2 : 1;
691
+ opener.node.literal = opener.node.literal.slice(0, -numDelims);
692
+ closer.node.literal = closer.node.literal.slice(numDelims);
693
+ opener.run.length -= numDelims;
694
+ closer.run.length -= numDelims;
695
+ const openerNodeIdx = nodes.indexOf(opener.node);
696
+ const closerNodeIdx = nodes.indexOf(closer.node);
697
+ const contentNodes = nodes.slice(openerNodeIdx + 1, closerNodeIdx);
698
+ const emphNode = strong
699
+ ? { type: 'strong', children: contentNodes }
700
+ : { type: 'emphasis', children: contentNodes };
701
+ nodes.splice(openerNodeIdx + 1, closerNodeIdx - openerNodeIdx - 1, emphNode);
702
+ for (let i = openerIdx + 1; i < closerIdx; i++) {
703
+ nodeDelims[i].run.length = 0;
704
+ }
705
+ if (opener.run.length === 0) {
706
+ const idx = nodes.indexOf(opener.node);
707
+ if (idx !== -1 && opener.node.literal === '') {
708
+ nodes.splice(idx, 1);
709
+ }
710
+ }
711
+ if (closer.run.length === 0) {
712
+ const idx = nodes.indexOf(closer.node);
713
+ if (idx !== -1 && closer.node.literal === '') {
714
+ nodes.splice(idx, 1);
715
+ }
716
+ }
717
+ nodeDelims.length = 0;
718
+ for (let i = 0; i < nodes.length; i++) {
719
+ const node = nodes[i];
720
+ if (node.type === 'text' && node.literal.length > 0 && !node.noDelim) {
721
+ const firstChar = node.literal[0];
722
+ if ((firstChar === '*' || firstChar === '_') && node.literal.match(/^[*_]+$/)) {
723
+ const beforeNode = i > 0 ? nodes[i - 1] : null;
724
+ const afterNode = i < nodes.length - 1 ? nodes[i + 1] : null;
725
+ let charBefore = '\n';
726
+ let charAfter = '\n';
727
+ if (beforeNode) {
728
+ if (beforeNode.type === 'text')
729
+ charBefore = this.getLastChar(beforeNode.literal);
730
+ else if (beforeNode.type !== 'softbreak' && beforeNode.type !== 'hardbreak')
731
+ charBefore = 'a';
732
+ }
733
+ if (afterNode) {
734
+ if (afterNode.type === 'text')
735
+ charAfter = this.getFirstChar(afterNode.literal);
736
+ else if (afterNode.type !== 'softbreak' && afterNode.type !== 'hardbreak')
737
+ charAfter = 'a';
738
+ }
739
+ const run = this.computeDelimiterRun(node.literal, charBefore, charAfter);
740
+ node.delimiterOrigLength = node.delimiterOrigLength ?? node.literal.length;
741
+ run.origLength = node.delimiterOrigLength;
742
+ if (run.canOpen || run.canClose) {
743
+ nodeDelims.push({ node, index: i, run });
744
+ }
745
+ }
746
+ }
747
+ }
748
+ closerIdx = 0;
749
+ }
750
+ for (let i = nodes.length - 1; i >= 0; i--) {
751
+ const node = nodes[i];
752
+ if (node.type === 'text' && node.literal === '') {
753
+ nodes.splice(i, 1);
754
+ }
755
+ }
756
+ }
757
+ flattenNestedEmphasis(nodes) {
758
+ for (const node of nodes) {
759
+ if ('children' in node && Array.isArray(node.children)) {
760
+ this.flattenNestedEmphasis(node.children);
761
+ if (node.type === 'strong') {
762
+ const flattened = [];
763
+ for (const child of node.children) {
764
+ if (child.type === node.type) {
765
+ flattened.push(...child.children);
766
+ }
767
+ else {
768
+ flattened.push(child);
769
+ }
770
+ }
771
+ node.children = flattened;
772
+ }
773
+ }
774
+ }
775
+ }
776
+ computeDelimiterRun(literal, charBefore, charAfter) {
777
+ const char = literal[0];
778
+ const length = literal.length;
779
+ const isWhitespace = (c) => /\s/.test(c) || c === '\n';
780
+ const isPunctuation = (c) => /[\p{P}\p{S}]/u.test(c);
781
+ const beforeIsWhitespace = isWhitespace(charBefore);
782
+ const afterIsWhitespace = isWhitespace(charAfter);
783
+ const beforeIsPunctuation = isPunctuation(charBefore);
784
+ const afterIsPunctuation = isPunctuation(charAfter);
785
+ const leftFlanking = !afterIsWhitespace &&
786
+ (!afterIsPunctuation || beforeIsWhitespace || beforeIsPunctuation);
787
+ const rightFlanking = !beforeIsWhitespace &&
788
+ (!beforeIsPunctuation || afterIsWhitespace || afterIsPunctuation);
789
+ let canOpen;
790
+ let canClose;
791
+ if (char === '*') {
792
+ canOpen = leftFlanking;
793
+ canClose = rightFlanking;
794
+ }
795
+ else {
796
+ canOpen = leftFlanking && (!rightFlanking || beforeIsPunctuation);
797
+ canClose = rightFlanking && (!leftFlanking || afterIsPunctuation);
798
+ }
799
+ return { char, length, canOpen, canClose, position: 0, origLength: length };
800
+ }
801
+ getFirstChar(text) {
802
+ if (!text)
803
+ return '\n';
804
+ return Array.from(text)[0] ?? '\n';
805
+ }
806
+ getLastChar(text) {
807
+ if (!text)
808
+ return '\n';
809
+ const chars = Array.from(text);
810
+ return chars.length > 0 ? chars[chars.length - 1] : '\n';
811
+ }
812
+ }
813
+ exports.GFMInlineParser = GFMInlineParser;