@vectojs/markdown 0.4.0 → 0.5.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.
- package/README.md +35 -2
- package/dist/Markdown.d.ts +39 -7
- package/dist/MarkdownWorkerSource.d.ts +1 -1
- package/dist/StreamController.d.ts +40 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +566 -54
- package/dist/index.mjs +570 -55
- package/package.json +5 -3
package/dist/index.mjs
CHANGED
|
@@ -4,9 +4,397 @@ import {
|
|
|
4
4
|
Entity,
|
|
5
5
|
GlyphRasterAtlas,
|
|
6
6
|
prepareContentGrid,
|
|
7
|
-
SVGEntity
|
|
7
|
+
SVGEntity,
|
|
8
|
+
beginVectoUserTiming,
|
|
9
|
+
endVectoUserTiming,
|
|
10
|
+
VECTO_USER_TIMING
|
|
8
11
|
} from "@vectojs/core";
|
|
9
12
|
import { marked } from "marked";
|
|
13
|
+
|
|
14
|
+
// src/StreamController.ts
|
|
15
|
+
var DEFAULT_MAX_BUFFERED_CHARS = 64 * 1024;
|
|
16
|
+
var MAX_FRAME_DELTA_MS = 100;
|
|
17
|
+
var MIN_SCAN_CODE_UNITS = 64;
|
|
18
|
+
function positiveFinite(value, label) {
|
|
19
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
20
|
+
throw new RangeError(`${label} must be a positive finite number`);
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
function abortError() {
|
|
25
|
+
const error = new Error("Stream aborted");
|
|
26
|
+
error.name = "AbortError";
|
|
27
|
+
return error;
|
|
28
|
+
}
|
|
29
|
+
var StreamControllerImpl = class {
|
|
30
|
+
constructor(host, options) {
|
|
31
|
+
this.host = host;
|
|
32
|
+
this.maxBufferedChars = positiveFinite(
|
|
33
|
+
options.maxBufferedChars ?? DEFAULT_MAX_BUFFERED_CHARS,
|
|
34
|
+
"maxBufferedChars"
|
|
35
|
+
);
|
|
36
|
+
this.graphemesPerSecond = options.pacing ? positiveFinite(options.pacing.graphemesPerSecond, "pacing.graphemesPerSecond") : null;
|
|
37
|
+
this.segmenter = this.graphemesPerSecond === null ? null : new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
38
|
+
this.signal = options.signal;
|
|
39
|
+
this.onSignalAbort = () => this.abort(this.signal?.reason);
|
|
40
|
+
if (this.signal?.aborted) this.abort(this.signal.reason);
|
|
41
|
+
else this.signal?.addEventListener("abort", this.onSignalAbort, { once: true });
|
|
42
|
+
}
|
|
43
|
+
host;
|
|
44
|
+
maxBufferedChars;
|
|
45
|
+
graphemesPerSecond;
|
|
46
|
+
segmenter;
|
|
47
|
+
signal;
|
|
48
|
+
onSignalAbort;
|
|
49
|
+
chunks = [];
|
|
50
|
+
headIndex = 0;
|
|
51
|
+
headOffset = 0;
|
|
52
|
+
acceptedChars = 0;
|
|
53
|
+
blocked = null;
|
|
54
|
+
currentState = "open";
|
|
55
|
+
terminalReason = null;
|
|
56
|
+
rafId = null;
|
|
57
|
+
lastFrameAt = null;
|
|
58
|
+
graphemeCredit = 0;
|
|
59
|
+
released = false;
|
|
60
|
+
closePromise = null;
|
|
61
|
+
resolveClose = null;
|
|
62
|
+
rejectClose = null;
|
|
63
|
+
get state() {
|
|
64
|
+
return this.currentState;
|
|
65
|
+
}
|
|
66
|
+
get bufferedChars() {
|
|
67
|
+
return this.acceptedChars + (this.blocked?.chunk.length ?? 0);
|
|
68
|
+
}
|
|
69
|
+
write(chunk) {
|
|
70
|
+
if (this.currentState !== "open" || this.closePromise) {
|
|
71
|
+
return Promise.reject(this.reasonForWrite());
|
|
72
|
+
}
|
|
73
|
+
if (chunk.length === 0) return Promise.resolve();
|
|
74
|
+
if (this.blocked) {
|
|
75
|
+
return Promise.reject(new Error("StreamController already has a blocked write"));
|
|
76
|
+
}
|
|
77
|
+
if (this.canAdmit(chunk)) {
|
|
78
|
+
this.admit(chunk);
|
|
79
|
+
try {
|
|
80
|
+
this.schedule();
|
|
81
|
+
return Promise.resolve();
|
|
82
|
+
} catch (error) {
|
|
83
|
+
return Promise.reject(error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
const blocked = { chunk, resolve, reject };
|
|
88
|
+
this.blocked = blocked;
|
|
89
|
+
try {
|
|
90
|
+
this.schedule();
|
|
91
|
+
} catch (error) {
|
|
92
|
+
if (this.blocked === blocked) this.blocked = null;
|
|
93
|
+
reject(error);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
flush() {
|
|
98
|
+
if (this.currentState === "closed") return;
|
|
99
|
+
if (this.currentState === "aborted") throw this.terminalReason;
|
|
100
|
+
this.cancelFrame();
|
|
101
|
+
this.commitAllSubmitted();
|
|
102
|
+
this.resetPacingIfIdle();
|
|
103
|
+
}
|
|
104
|
+
close() {
|
|
105
|
+
if (this.currentState === "closed") return Promise.resolve();
|
|
106
|
+
if (this.currentState === "aborted") return Promise.reject(this.terminalReason);
|
|
107
|
+
if (this.closePromise) return this.closePromise;
|
|
108
|
+
let resolveClose;
|
|
109
|
+
let rejectClose;
|
|
110
|
+
const closePromise = new Promise((resolve, reject) => {
|
|
111
|
+
resolveClose = resolve;
|
|
112
|
+
rejectClose = reject;
|
|
113
|
+
});
|
|
114
|
+
this.closePromise = closePromise;
|
|
115
|
+
this.resolveClose = resolveClose;
|
|
116
|
+
this.rejectClose = rejectClose;
|
|
117
|
+
this.cancelFrame();
|
|
118
|
+
try {
|
|
119
|
+
this.commitAllSubmitted();
|
|
120
|
+
} catch (error) {
|
|
121
|
+
this.rejectPendingClose(error);
|
|
122
|
+
return closePromise;
|
|
123
|
+
}
|
|
124
|
+
if (this.currentState !== "open") {
|
|
125
|
+
this.rejectPendingClose(this.terminalReason);
|
|
126
|
+
return closePromise;
|
|
127
|
+
}
|
|
128
|
+
this.currentState = "closed";
|
|
129
|
+
this.cleanup();
|
|
130
|
+
this.resolveClose?.();
|
|
131
|
+
this.resolveClose = null;
|
|
132
|
+
this.rejectClose = null;
|
|
133
|
+
return closePromise;
|
|
134
|
+
}
|
|
135
|
+
abort(reason) {
|
|
136
|
+
if (this.currentState !== "open") return;
|
|
137
|
+
this.fail(reason === void 0 ? abortError() : reason);
|
|
138
|
+
}
|
|
139
|
+
destroy() {
|
|
140
|
+
this.abort();
|
|
141
|
+
}
|
|
142
|
+
onFrame = (timestamp) => {
|
|
143
|
+
this.rafId = null;
|
|
144
|
+
if (this.currentState !== "open") return;
|
|
145
|
+
let keepScheduling = true;
|
|
146
|
+
try {
|
|
147
|
+
if (this.graphemesPerSecond === null) this.commitAccepted();
|
|
148
|
+
else keepScheduling = this.commitPaced(timestamp);
|
|
149
|
+
} catch {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (this.currentState !== "open") return;
|
|
153
|
+
this.admitBlockedIfPossible();
|
|
154
|
+
this.resetPacingIfIdle();
|
|
155
|
+
if (!keepScheduling) return;
|
|
156
|
+
try {
|
|
157
|
+
this.schedule();
|
|
158
|
+
} catch {
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
reasonForWrite() {
|
|
162
|
+
if (this.currentState === "aborted") return this.terminalReason;
|
|
163
|
+
if (this.currentState === "closed") return new Error("StreamController is closed");
|
|
164
|
+
return new Error("StreamController is closing");
|
|
165
|
+
}
|
|
166
|
+
canAdmit(chunk) {
|
|
167
|
+
return this.acceptedChars + chunk.length <= this.maxBufferedChars || this.acceptedChars === 0 && chunk.length > this.maxBufferedChars;
|
|
168
|
+
}
|
|
169
|
+
admit(chunk) {
|
|
170
|
+
this.chunks.push(chunk);
|
|
171
|
+
this.acceptedChars += chunk.length;
|
|
172
|
+
}
|
|
173
|
+
admitBlockedIfPossible() {
|
|
174
|
+
const blocked = this.blocked;
|
|
175
|
+
if (!blocked || !this.canAdmit(blocked.chunk)) return;
|
|
176
|
+
this.blocked = null;
|
|
177
|
+
this.admit(blocked.chunk);
|
|
178
|
+
blocked.resolve();
|
|
179
|
+
}
|
|
180
|
+
schedule() {
|
|
181
|
+
if (this.currentState !== "open" || this.acceptedChars === 0 || this.rafId !== null) return;
|
|
182
|
+
if (typeof requestAnimationFrame !== "function") {
|
|
183
|
+
this.flush();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.rafId = requestAnimationFrame(this.onFrame);
|
|
187
|
+
}
|
|
188
|
+
cancelFrame() {
|
|
189
|
+
if (this.rafId === null) return;
|
|
190
|
+
if (typeof cancelAnimationFrame === "function") cancelAnimationFrame(this.rafId);
|
|
191
|
+
this.rafId = null;
|
|
192
|
+
}
|
|
193
|
+
commitAccepted() {
|
|
194
|
+
if (this.acceptedChars === 0) return;
|
|
195
|
+
const text = this.takeAcceptedText();
|
|
196
|
+
try {
|
|
197
|
+
this.host.append(text);
|
|
198
|
+
} catch (error) {
|
|
199
|
+
this.fail(error);
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** Return true while another frame can make progress without more producer input. */
|
|
204
|
+
commitPaced(timestamp) {
|
|
205
|
+
if (this.lastFrameAt === null) {
|
|
206
|
+
this.lastFrameAt = timestamp;
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
const delta = Math.min(MAX_FRAME_DELTA_MS, Math.max(0, timestamp - this.lastFrameAt));
|
|
210
|
+
this.lastFrameAt = timestamp;
|
|
211
|
+
this.graphemeCredit += delta * this.graphemesPerSecond / 1e3;
|
|
212
|
+
const available = Math.floor(this.graphemeCredit);
|
|
213
|
+
if (available < 1) return true;
|
|
214
|
+
const selected = this.selectGraphemePrefix(available);
|
|
215
|
+
if (selected.count === 0) {
|
|
216
|
+
this.lastFrameAt = null;
|
|
217
|
+
this.graphemeCredit = 0;
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
const completedBlocked = this.consumeSubmittedChars(selected.codeUnits);
|
|
221
|
+
try {
|
|
222
|
+
this.host.append(selected.text);
|
|
223
|
+
completedBlocked?.resolve();
|
|
224
|
+
} catch (error) {
|
|
225
|
+
completedBlocked?.reject(error);
|
|
226
|
+
this.fail(error);
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
229
|
+
this.graphemeCredit -= selected.count;
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
selectGraphemePrefix(maxCount) {
|
|
233
|
+
const submittedChars = this.acceptedChars + (this.blocked?.chunk.length ?? 0);
|
|
234
|
+
let scanLength = Math.min(submittedChars, Math.max(MIN_SCAN_CODE_UNITS, maxCount * 2));
|
|
235
|
+
while (scanLength > 0) {
|
|
236
|
+
let sample = this.peekSubmittedChars(scanLength);
|
|
237
|
+
if (scanLength < submittedChars && /[\uD800-\uDBFF]$/.test(sample)) {
|
|
238
|
+
scanLength++;
|
|
239
|
+
sample = this.peekSubmittedChars(scanLength);
|
|
240
|
+
}
|
|
241
|
+
const segments = [...this.segmenter.segment(sample)];
|
|
242
|
+
const hasUnscannedText = scanLength < submittedChars;
|
|
243
|
+
if (hasUnscannedText && segments.length <= maxCount) {
|
|
244
|
+
scanLength = Math.min(submittedChars, scanLength * 2);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const count = hasUnscannedText ? maxCount : Math.min(maxCount, Math.max(0, segments.length - 1));
|
|
248
|
+
if (count > 0) {
|
|
249
|
+
const last = segments[count - 1];
|
|
250
|
+
const codeUnits = last.index + last.segment.length;
|
|
251
|
+
return { text: sample.slice(0, codeUnits), count, codeUnits };
|
|
252
|
+
}
|
|
253
|
+
if (this.blocked || this.acceptedChars > this.maxBufferedChars) {
|
|
254
|
+
return this.forceCodePointPrefix(sample);
|
|
255
|
+
}
|
|
256
|
+
return { text: "", count: 0, codeUnits: 0 };
|
|
257
|
+
}
|
|
258
|
+
return { text: "", count: 0, codeUnits: 0 };
|
|
259
|
+
}
|
|
260
|
+
forceCodePointPrefix(sample) {
|
|
261
|
+
const first = sample.charCodeAt(0);
|
|
262
|
+
const second = sample.charCodeAt(1);
|
|
263
|
+
const codeUnits = first >= 55296 && first <= 56319 && second >= 56320 && second <= 57343 ? 2 : 1;
|
|
264
|
+
return { text: sample.slice(0, codeUnits), count: 1, codeUnits };
|
|
265
|
+
}
|
|
266
|
+
peekSubmittedChars(limit) {
|
|
267
|
+
const parts = this.peekAcceptedParts(Math.min(limit, this.acceptedChars));
|
|
268
|
+
const acceptedLength = Math.min(limit, this.acceptedChars);
|
|
269
|
+
const blockedLength = limit - acceptedLength;
|
|
270
|
+
if (blockedLength > 0 && this.blocked) {
|
|
271
|
+
parts.push(this.blocked.chunk.slice(0, blockedLength));
|
|
272
|
+
}
|
|
273
|
+
return parts.length === 1 ? parts[0] : parts.join("");
|
|
274
|
+
}
|
|
275
|
+
peekAcceptedParts(limit) {
|
|
276
|
+
if (limit <= 0) return [];
|
|
277
|
+
const parts = [];
|
|
278
|
+
let remaining = limit;
|
|
279
|
+
for (let index = this.headIndex; index < this.chunks.length && remaining > 0; index++) {
|
|
280
|
+
const chunk = this.chunks[index];
|
|
281
|
+
const start = index === this.headIndex ? this.headOffset : 0;
|
|
282
|
+
const available = chunk.length - start;
|
|
283
|
+
if (available <= remaining) {
|
|
284
|
+
parts.push(start === 0 ? chunk : chunk.slice(start));
|
|
285
|
+
remaining -= available;
|
|
286
|
+
} else {
|
|
287
|
+
parts.push(chunk.slice(start, start + remaining));
|
|
288
|
+
remaining = 0;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return parts;
|
|
292
|
+
}
|
|
293
|
+
consumeSubmittedChars(count) {
|
|
294
|
+
const acceptedCount = Math.min(count, this.acceptedChars);
|
|
295
|
+
this.consumeAcceptedChars(acceptedCount);
|
|
296
|
+
const blockedCount = count - acceptedCount;
|
|
297
|
+
if (blockedCount === 0) return null;
|
|
298
|
+
const blocked = this.blocked;
|
|
299
|
+
if (!blocked) throw new Error("StreamController queue accounting diverged");
|
|
300
|
+
if (blockedCount >= blocked.chunk.length) {
|
|
301
|
+
this.blocked = null;
|
|
302
|
+
return blocked;
|
|
303
|
+
}
|
|
304
|
+
blocked.chunk = blocked.chunk.slice(blockedCount);
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
consumeAcceptedChars(count) {
|
|
308
|
+
if (count < 0 || count > this.acceptedChars) {
|
|
309
|
+
throw new Error("StreamController queue accounting diverged");
|
|
310
|
+
}
|
|
311
|
+
this.acceptedChars -= count;
|
|
312
|
+
let remaining = count;
|
|
313
|
+
while (remaining > 0) {
|
|
314
|
+
const chunk = this.chunks[this.headIndex];
|
|
315
|
+
const available = chunk.length - this.headOffset;
|
|
316
|
+
if (remaining < available) {
|
|
317
|
+
this.headOffset += remaining;
|
|
318
|
+
remaining = 0;
|
|
319
|
+
} else {
|
|
320
|
+
remaining -= available;
|
|
321
|
+
this.headIndex++;
|
|
322
|
+
this.headOffset = 0;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (this.acceptedChars === 0) {
|
|
326
|
+
this.chunks = [];
|
|
327
|
+
this.headIndex = 0;
|
|
328
|
+
this.headOffset = 0;
|
|
329
|
+
} else if (this.headIndex >= 64 && this.headIndex * 2 >= this.chunks.length) {
|
|
330
|
+
this.chunks.splice(0, this.headIndex);
|
|
331
|
+
this.headIndex = 0;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
takeAcceptedText() {
|
|
335
|
+
const parts = this.takeAcceptedParts();
|
|
336
|
+
return parts.length === 1 ? parts[0] : parts.join("");
|
|
337
|
+
}
|
|
338
|
+
takeAcceptedParts() {
|
|
339
|
+
const parts = this.peekAcceptedParts(this.acceptedChars);
|
|
340
|
+
this.chunks = [];
|
|
341
|
+
this.headIndex = 0;
|
|
342
|
+
this.headOffset = 0;
|
|
343
|
+
this.acceptedChars = 0;
|
|
344
|
+
return parts;
|
|
345
|
+
}
|
|
346
|
+
commitAllSubmitted() {
|
|
347
|
+
const blocked = this.blocked;
|
|
348
|
+
this.blocked = null;
|
|
349
|
+
const parts = this.takeAcceptedParts();
|
|
350
|
+
if (blocked) parts.push(blocked.chunk);
|
|
351
|
+
if (parts.length === 0) return;
|
|
352
|
+
try {
|
|
353
|
+
this.host.append(parts.length === 1 ? parts[0] : parts.join(""));
|
|
354
|
+
blocked?.resolve();
|
|
355
|
+
} catch (error) {
|
|
356
|
+
blocked?.reject(error);
|
|
357
|
+
this.fail(error);
|
|
358
|
+
throw error;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
rejectPendingClose(reason) {
|
|
362
|
+
this.rejectClose?.(reason);
|
|
363
|
+
this.resolveClose = null;
|
|
364
|
+
this.rejectClose = null;
|
|
365
|
+
}
|
|
366
|
+
fail(reason) {
|
|
367
|
+
if (this.currentState !== "open") return;
|
|
368
|
+
this.currentState = "aborted";
|
|
369
|
+
this.terminalReason = reason;
|
|
370
|
+
this.cancelFrame();
|
|
371
|
+
this.chunks = [];
|
|
372
|
+
this.headIndex = 0;
|
|
373
|
+
this.headOffset = 0;
|
|
374
|
+
this.acceptedChars = 0;
|
|
375
|
+
const blocked = this.blocked;
|
|
376
|
+
this.blocked = null;
|
|
377
|
+
blocked?.reject(reason);
|
|
378
|
+
this.rejectPendingClose(reason);
|
|
379
|
+
this.cleanup();
|
|
380
|
+
}
|
|
381
|
+
cleanup() {
|
|
382
|
+
this.signal?.removeEventListener("abort", this.onSignalAbort);
|
|
383
|
+
if (this.released) return;
|
|
384
|
+
this.released = true;
|
|
385
|
+
this.host.release(this);
|
|
386
|
+
}
|
|
387
|
+
resetPacingIfIdle() {
|
|
388
|
+
if (this.acceptedChars !== 0 || this.blocked) return;
|
|
389
|
+
this.lastFrameAt = null;
|
|
390
|
+
this.graphemeCredit = 0;
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
function createStreamController(host, options = {}) {
|
|
394
|
+
return new StreamControllerImpl(host, options);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// src/Markdown.ts
|
|
10
398
|
import { mathjax } from "mathjax-full/js/mathjax.js";
|
|
11
399
|
import { TeX } from "mathjax-full/js/input/tex.js";
|
|
12
400
|
import { SVG } from "mathjax-full/js/output/svg.js";
|
|
@@ -16,10 +404,19 @@ import { AllPackages } from "mathjax-full/js/input/tex/AllPackages.js";
|
|
|
16
404
|
import { measureText, RichText, Stack, Table, Text, Image, UIComponent } from "@vectojs/ui";
|
|
17
405
|
|
|
18
406
|
// src/MarkdownWorkerSource.ts
|
|
19
|
-
var WORKER_SOURCE_STRING = '"use strict";(()=>{function N(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=N();function oe(r){T=r}var R={exec:()=>null};function A(r){let e=[];return t=>{let s=Math.max(0,Math.min(3,t-1)),n=e[s];return n||(n=r(s),e[s]=n),n}}function k(r,e=""){let t=typeof r=="string"?r:r.source,s={replace:(n,i)=>{let a=typeof i=="string"?i:i.source;return a=a.replace(b.caret,"$1"),t=t.replace(n,a),s},getRegex:()=>new RegExp(t,e)};return s}var me=((r="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+r)}catch{return!1}})(),b={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^\'"]*[^\\s])\\s+([\'"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>"\']/,escapeReplace:/[&<>"\']/g,escapeTestNoEncode:/[<>"\']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>"\']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:r=>new RegExp(`^( {0,3}${r})((?:[ ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:A(r=>new RegExp(`^ {0,${r}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ ][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:A(r=>new RegExp(`^ {0,${r}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`)),fencesBeginRegex:A(r=>new RegExp(`^ {0,${r}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:A(r=>new RegExp(`^ {0,${r}}#`)),htmlBeginRegex:A(r=>new RegExp(`^ {0,${r}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:A(r=>new RegExp(`^ {0,${r}}>`))},ye=/^(?:[ \\t]*(?:\\n|$))+/,$e=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,E=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Se=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,G=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,ce=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,he=k(ce).replace(/bull/g,G).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}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,"").getRegex(),Te=k(ce).replace(/bull/g,G).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}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),X=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,ze=/^[^\\n]+/,W=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Ae=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace("label",W).replace("title",/(?:"(?:\\\\"?|[^"\\\\])*"|\'[^\'\\n]*(?:\\n[^\'\\n]+)*\\n?\'|\\([^()]*\\))/).getRegex(),Le=k(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,G).getRegex(),Z="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",F=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,_e=k("^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\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|$))","i").replace("comment",F).replace("tag",Z).replace("attribute",/ +[a-zA-Z:_][\\w.:-]*(?: *= *"[^"\\n]*"| *= *\'[^\'\\n]*\'| *= *[^\\s"\'=<>`]+)?/).getRegex(),pe=r=>k(X).replace("hr",E).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list",r).replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Z).getRegex(),Pe=pe(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),ve=pe(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),Ie=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace("paragraph",ve).getRegex(),U={blockquote:Ie,code:$e,def:Ae,fences:Re,heading:Se,hr:E,html:_e,lheading:he,list:Le,newline:ye,paragraph:Pe,table:R,text:ze},te=k("^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)").replace("hr",E).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\\\t]").replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Z).getRegex(),Ee={...U,lheading:Te,table:te,paragraph:k(X).replace("hr",E).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("|lheading","").replace("table",te).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]").replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Z).getRegex()},Ce={...U,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:"[^"]*"|\'[^\']*\'|\\\\s[^\'"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace("comment",F).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(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +(["(][^\\n]+[")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:R,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(X).replace("hr",E).replace("heading",` *#{1,6} *[^\n]`).replace("lheading",he).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Be=/^\\\\([!"#$%&\'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,qe=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ue=/^( {2,}|\\\\)\\n(?!\\s*$)/,Me=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,L=/[\\p{P}\\p{S}]/u,D=/[\\s\\p{P}\\p{S}]/u,V=/[^\\s\\p{P}\\p{S}]/u,Ze=k(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,D).getRegex(),ge=/(?!~)[\\p{P}\\p{S}]/u,De=/(?!~)[\\s\\p{P}\\p{S}]/u,Qe=/(?:[^\\s\\p{P}\\p{S}]|~)/u,je=k(/link|precode-code|html/,"g").replace("link",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace("precode-",me?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),ke=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,He=k(ke,"u").replace(/punct/g,L).getRegex(),Oe=k(ke,"u").replace(/punct/g,ge).getRegex(),de="^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)",Ne=k(de,"gu").replace(/notPunctSpace/g,V).replace(/punctSpace/g,D).replace(/punct/g,L).getRegex(),Ge=k(de,"gu").replace(/notPunctSpace/g,Qe).replace(/punctSpace/g,De).replace(/punct/g,ge).getRegex(),Xe=k("^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,V).replace(/punctSpace/g,D).replace(/punct/g,L).getRegex(),We=k(/^~~?(?:((?!~)punct)|[^\\s~])/,"u").replace(/punct/g,L).getRegex(),Fe="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Ue=k(Fe,"gu").replace(/notPunctSpace/g,V).replace(/punctSpace/g,D).replace(/punct/g,L).getRegex(),Ve=k(/\\\\(punct)/,"gu").replace(/punct/g,L).getRegex(),Je=k(/^<(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(),Ke=k(F).replace("(?:-->|$)","-->").getRegex(),Ye=k("^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>").replace("comment",Ke).replace("attribute",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*"[^"]*"|\\s*=\\s*\'[^\']*\'|\\s*=\\s*[^\\s"\'=<>`]+)?/).getRegex(),B=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,et=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace("label",B).replace("href",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace("title",/"(?:\\\\"?|[^"\\\\])*"|\'(?:\\\\\'?|[^\'\\\\])*\'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),fe=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace("label",B).replace("ref",W).getRegex(),xe=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace("ref",W).getRegex(),tt=k("reflink|nolink(?!\\\\()","g").replace("reflink",fe).replace("nolink",xe).getRegex(),re=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,J={_backpedal:R,anyPunctuation:Ve,autolink:Je,blockSkip:je,br:ue,code:qe,del:R,delLDelim:R,delRDelim:R,emStrongLDelim:He,emStrongRDelimAst:Ne,emStrongRDelimUnd:Xe,escape:Be,link:et,nolink:xe,punctuation:Ze,reflink:fe,reflinkSearch:tt,tag:Ye,text:Me,url:R},rt={...J,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace("label",B).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace("label",B).getRegex()},j={...J,emStrongRDelimAst:Ge,emStrongLDelim:Oe,delLDelim:We,delRDelim:Ue,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace("protocol",re).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_\'"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_\'"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:k(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-]+@)))/).replace("protocol",re).getRegex()},nt={...j,br:k(ue).replace("{2,}","*").getRegex(),text:k(j.text).replace("\\\\b_","\\\\b_| {2,}\\\\n").replace(/\\{2,\\}/g,"*").getRegex()},C={normal:U,gfm:Ee,pedantic:Ce},v={normal:J,gfm:j,breaks:nt,pedantic:rt},st={"&":"&","<":"<",">":">",\'"\':""","\'":"'"},ne=r=>st[r];function y(r,e){if(e){if(b.escapeTest.test(r))return r.replace(b.escapeReplace,ne)}else if(b.escapeTestNoEncode.test(r))return r.replace(b.escapeReplaceNoEncode,ne);return r}function se(r){try{r=encodeURI(r).replace(b.percentDecode,"%")}catch{return null}return r}function ie(r,e){let t=r.replace(b.findPipe,(i,a,l)=>{let o=!1,c=a;for(;--c>=0&&l[c]==="\\\\";)o=!o;return o?"|":" |"}),s=t.split(b.splitPipe),n=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length<e;)s.push("");for(;n<s.length;n++)s[n]=s[n].trim().replace(b.slashPipe,"|");return s}function $(r,e,t){let s=r.length;if(s===0)return"";let n=0;for(;n<s;){let i=r.charAt(s-n-1);if(i===e&&!t)n++;else if(i!==e&&t)n++;else break}return r.slice(0,s-n)}function le(r){let e=r.split(`\n`),t=e.length-1;for(;t>=0&&b.blankLine.test(e[t]);)t--;return e.length-t<=2?r:e.slice(0,t+1).join(`\n`)}function it(r,e){if(r.indexOf(e[1])===-1)return-1;let t=0;for(let s=0;s<r.length;s++)if(r[s]==="\\\\")s++;else if(r[s]===e[0])t++;else if(r[s]===e[1]&&(t--,t<0))return s;return t>0?-2:-1}function lt(r,e=0){let t=e,s="";for(let n of r)if(n===" "){let i=4-t%4;s+=" ".repeat(i),t+=i}else s+=n,t++;return s}function ae(r,e,t,s,n){let i=e.href,a=e.title||null,l=r[1].replace(n.other.outputLinkReplace,"$1");s.state.inLink=!0;let o={type:r[0].charAt(0)==="!"?"image":"link",raw:t,href:i,title:a,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,o}function at(r,e,t){let s=r.match(t.other.indentCodeCompensation);if(s===null)return e;let n=s[1];return e.split(`\n`).map(i=>{let a=i.match(t.other.beginningSpace);if(a===null)return i;let[l]=a;return l.length>=n.length?i.slice(n.length):i}).join(`\n`)}var q=class{options;rules;lexer;constructor(r){this.options=r||T}space(r){let e=this.rules.block.newline.exec(r);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(r){let e=this.rules.block.code.exec(r);if(e){let t=this.options.pedantic?e[0]:le(e[0]),s=t.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t,codeBlockStyle:"indented",text:s}}}fences(r){let e=this.rules.block.fences.exec(r);if(e){let t=e[0],s=at(t,e[3]||"",this.rules);return{type:"code",raw:t,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(r){let e=this.rules.block.heading.exec(r);if(e){let t=e[2].trim();if(this.rules.other.endingHash.test(t)){let s=$(t,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(t=s.trim())}return{type:"heading",raw:$(e[0],`\n`),depth:e[1].length,text:t,tokens:this.lexer.inline(t)}}}hr(r){let e=this.rules.block.hr.exec(r);if(e)return{type:"hr",raw:$(e[0],`\n`)}}blockquote(r){let e=this.rules.block.blockquote.exec(r);if(e){let t=$(e[0],`\n`).split(`\n`),s="",n="",i=[];for(;t.length>0;){let a=!1,l=[],o;for(o=0;o<t.length;o++)if(this.rules.other.blockquoteStart.test(t[o]))l.push(t[o]),a=!0;else if(!a)l.push(t[o]);else break;t=t.slice(o);let c=l.join(`\n`),p=c.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}\n${c}`:c,n=n?`${n}\n${p}`:p;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(p,i,!0),this.lexer.state.top=h,t.length===0)break;let u=i.at(-1);if(u?.type==="code")break;if(u?.type==="blockquote"){let f=u,g=f.raw+`\n`+t.join(`\n`),x=this.blockquote(g);i[i.length-1]=x,s=s.substring(0,s.length-f.raw.length)+x.raw,n=n.substring(0,n.length-f.text.length)+x.text;break}else if(u?.type==="list"){let f=u,g=f.raw+`\n`+t.join(`\n`),x=this.list(g);i[i.length-1]=x,s=s.substring(0,s.length-u.raw.length)+x.raw,n=n.substring(0,n.length-f.raw.length)+x.raw,t=g.substring(i.at(-1).raw.length).split(`\n`);continue}}return{type:"blockquote",raw:s,tokens:i,text:n}}}list(r){let e=this.rules.block.list.exec(r);if(e){let t=e[1].trim(),s=t.length>1,n={type:"list",raw:"",ordered:s,start:s?+t.slice(0,-1):"",loose:!1,items:[]};t=s?`\\\\d{1,9}\\\\${t.slice(-1)}`:`\\\\${t}`,this.options.pedantic&&(t=s?t:"[*+-]");let i=this.rules.other.listItemRegex(t),a=!1;for(;r;){let o=!1,c="",p="";if(!(e=i.exec(r))||this.rules.block.hr.test(r))break;c=e[0],r=r.substring(c.length);let h=lt(e[2].split(`\n`,1)[0],e[1].length),u=r.split(`\n`,1)[0],f=!h.trim(),g=0;if(this.options.pedantic?(g=2,p=h.trimStart()):f?g=e[1].length+1:(g=h.search(this.rules.other.nonSpaceChar),g=g>4?1:g,p=h.slice(g),g+=e[1].length),f&&this.rules.other.blankLine.test(u)&&(c+=u+`\n`,r=r.substring(u.length+1),o=!0),!o){let x=this.rules.other.nextBulletRegex(g),z=this.rules.other.hrRegex(g),Y=this.rules.other.fencesBeginRegex(g),ee=this.rules.other.headingBeginRegex(g),be=this.rules.other.htmlBeginRegex(g),we=this.rules.other.blockquoteBeginRegex(g);for(;r;){let Q=r.split(`\n`,1)[0],P;if(u=Q,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),P=u):P=u.replace(this.rules.other.tabCharGlobal," "),Y.test(u)||ee.test(u)||be.test(u)||we.test(u)||x.test(u)||z.test(u))break;if(P.search(this.rules.other.nonSpaceChar)>=g||!u.trim())p+=`\n`+P.slice(g);else{if(f||h.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||Y.test(h)||ee.test(h)||z.test(h))break;p+=`\n`+u}f=!u.trim(),c+=Q+`\n`,r=r.substring(Q.length+1),h=P.slice(g)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(a=!0)),n.items.push({type:"list_item",raw:c,task:!!this.options.gfm&&this.rules.other.listIsTask.test(p),loose:!1,text:p,tokens:[]}),n.raw+=c}let l=n.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let o of n.items){this.lexer.state.top=!1,o.tokens=this.lexer.blockTokens(o.text,[]);let c=o.tokens[0];if(o.task&&(c?.type==="text"||c?.type==="paragraph")){o.text=o.text.replace(this.rules.other.listReplaceTask,""),c.raw=c.raw.replace(this.rules.other.listReplaceTask,""),c.text=c.text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}let p=this.rules.other.listTaskCheckbox.exec(o.raw);if(p){let h={type:"checkbox",raw:p[0]+" ",checked:p[0]!=="[ ]"};o.checked=h.checked,n.loose?o.tokens[0]&&["paragraph","text"].includes(o.tokens[0].type)&&"tokens"in o.tokens[0]&&o.tokens[0].tokens?(o.tokens[0].raw=h.raw+o.tokens[0].raw,o.tokens[0].text=h.raw+o.tokens[0].text,o.tokens[0].tokens.unshift(h)):o.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):o.tokens.unshift(h)}}else o.task&&(o.task=!1);if(!n.loose){let p=o.tokens.filter(u=>u.type==="space"),h=p.length>0&&p.some(u=>this.rules.other.anyLine.test(u.raw));n.loose=h}}if(n.loose)for(let o of n.items){o.loose=!0;for(let c of o.tokens)c.type==="text"&&(c.type="paragraph")}return n}}html(r){let e=this.rules.block.html.exec(r);if(e){let t=le(e[0]);return{type:"html",block:!0,raw:t,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:t}}}def(r){let e=this.rules.block.def.exec(r);if(e){let t=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:t,raw:$(e[0],`\n`),href:s,title:n}}}table(r){let e=this.rules.block.table.exec(r);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let t=ie(e[1]),s=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(`\n`):[],i={type:"table",raw:$(e[0],`\n`),header:[],align:[],rows:[]};if(t.length===s.length){for(let a of s)this.rules.other.tableAlignRight.test(a)?i.align.push("right"):this.rules.other.tableAlignCenter.test(a)?i.align.push("center"):this.rules.other.tableAlignLeft.test(a)?i.align.push("left"):i.align.push(null);for(let a=0;a<t.length;a++)i.header.push({text:t[a],tokens:this.lexer.inline(t[a]),header:!0,align:i.align[a]});for(let a of n)i.rows.push(ie(a,i.header.length).map((l,o)=>({text:l,tokens:this.lexer.inline(l),header:!1,align:i.align[o]})));return i}}lheading(r){let e=this.rules.block.lheading.exec(r);if(e){let t=e[1].trim();return{type:"heading",raw:$(e[0],`\n`),depth:e[2].charAt(0)==="="?1:2,text:t,tokens:this.lexer.inline(t)}}}paragraph(r){let e=this.rules.block.paragraph.exec(r);if(e){let t=e[1].charAt(e[1].length-1)===`\n`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:t,tokens:this.lexer.inline(t)}}}text(r){let e=this.rules.block.text.exec(r);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(r){let e=this.rules.inline.escape.exec(r);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(r){let e=this.rules.inline.tag.exec(r);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(r){let e=this.rules.inline.link.exec(r);if(e){let t=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(t)){if(!this.rules.other.endAngleBracket.test(t))return;let i=$(t.slice(0,-1),"\\\\");if((t.length-i.length)%2===0)return}else{let i=it(e[2],"()");if(i===-2)return;if(i>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+i;e[2]=e[2].substring(0,i),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let s=e[2],n="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(s);i&&(s=i[1],n=i[3])}else n=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(t)?s=s.slice(1):s=s.slice(1,-1)),ae(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(r,e){let t;if((t=this.rules.inline.reflink.exec(r))||(t=this.rules.inline.nolink.exec(r))){let s=(t[2]||t[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[s.toLowerCase()];if(!n){let i=t[0].charAt(0);return{type:"text",raw:i,text:i}}return ae(t,n,t[0],this.lexer,this.rules)}}emStrong(r,e,t=""){let s=this.rules.inline.emStrongLDelim.exec(r);if(!(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&t.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[3])||!t||this.rules.inline.punctuation.exec(t))){let n=[...s[0]].length-1,i,a,l=n,o=0,c=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,e=e.slice(-1*r.length+n);(s=c.exec(e))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(a=[...i].length,s[3]||s[4]){l+=a;continue}else if((s[5]||s[6])&&n%3&&!((n+a)%3)){o+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l+o);let p=[...s[0]][0].length,h=r.slice(0,n+s.index+p+a);if(Math.min(n,a)%2){let f=h.slice(1,-1);return{type:"em",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let u=h.slice(2,-2);return{type:"strong",raw:h,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(r){let e=this.rules.inline.code.exec(r);if(e){let t=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(t),n=this.rules.other.startingSpaceChar.test(t)&&this.rules.other.endingSpaceChar.test(t);return s&&n&&(t=t.substring(1,t.length-1)),{type:"codespan",raw:e[0],text:t}}}br(r){let e=this.rules.inline.br.exec(r);if(e)return{type:"br",raw:e[0]}}del(r,e,t=""){let s=this.rules.inline.delLDelim.exec(r);if(s&&(!s[1]||!t||this.rules.inline.punctuation.exec(t))){let n=[...s[0]].length-1,i,a,l=n,o=this.rules.inline.delRDelim;for(o.lastIndex=0,e=e.slice(-1*r.length+n);(s=o.exec(e))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(a=[...i].length,a!==n))continue;if(s[3]||s[4]){l+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l);let c=[...s[0]][0].length,p=r.slice(0,n+s.index+c+a),h=p.slice(n,-n);return{type:"del",raw:p,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(r){let e=this.rules.inline.autolink.exec(r);if(e){let t,s;return e[2]==="@"?(t=e[1],s="mailto:"+t):(t=e[1],s=t),{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}url(r){let e;if(e=this.rules.inline.url.exec(r)){let t,s;if(e[2]==="@")t=e[0],s="mailto:"+t;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);t=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}inlineText(r){let e=this.rules.inline.text.exec(r);if(e){let t=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:t}}}},w=class H{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new q,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:b,block:C.normal,inline:v.normal};this.options.pedantic?(t.block=C.pedantic,t.inline=v.pedantic):this.options.gfm&&(t.block=C.gfm,this.options.breaks?t.inline=v.breaks:t.inline=v.gfm),this.tokenizer.rules=t}static get rules(){return{block:C,inline:v}}static lex(e,t){return new H(t).lex(e)}static lexInline(e,t){return new H(t).inlineTokens(e)}lex(e){e=e.replace(b.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let s=this.inlineQueue[t];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],s=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(b.tabCharGlobal," ").replace(b.spaceLine,""));let n=1/0;for(;e;){if(e.length<n)n=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let i;if(this.options.extensions?.block?.some(l=>(i=l.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let l=t.at(-1);i.raw.length===1&&l!==void 0?l.raw+=`\n`:t.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.at(-1).src=l.text):t.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.raw,this.inlineQueue.at(-1).src=l.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},t.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),t.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let l=1/0,o=e.slice(1),c;this.options.extensions.startBlock.forEach(p=>{c=p.call({lexer:this},o),typeof c=="number"&&c>=0&&(l=Math.min(l,c))}),l<1/0&&l>=0&&(a=e.substring(0,l+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let l=t.at(-1);s&&l?.type==="paragraph"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(i),s=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let s=e;if(this.tokens.links){let l=Object.keys(this.tokens.links);l.length>0&&(s=s.replace(this.tokenizer.rules.inline.reflinkSearch,o=>l.includes(o.slice(o.lastIndexOf("[")+1,-1))?"["+"a".repeat(o.length-2)+"]":o))}s=s.replace(this.tokenizer.rules.inline.anyPunctuation,"++"),s=s.replace(this.tokenizer.rules.inline.blockSkip,(l,o,c)=>{let p=c?c.length:0;return l.slice(0,p)+"["+"a".repeat(l.length-p-2)+"]"}),s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let n=!1,i="",a=1/0;for(;e;){if(e.length<a)a=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}n||(i=""),n=!1;let l;if(this.options.extensions?.inline?.some(c=>(l=c.call({lexer:this},e,t))?(e=e.substring(l.raw.length),t.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let c=t.at(-1);l.type==="text"&&c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):t.push(l);continue}if(l=this.tokenizer.emStrong(e,s,i)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.del(e,s,i)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),t.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(e))){e=e.substring(l.raw.length),t.push(l);continue}let o=e;if(this.options.extensions?.startInline){let c=1/0,p=e.slice(1),h;this.options.extensions.startInline.forEach(u=>{h=u.call({lexer:this},p),typeof h=="number"&&h>=0&&(c=Math.min(c,h))}),c<1/0&&c>=0&&(o=e.substring(0,c+1))}if(l=this.tokenizer.inlineText(o)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(i=l.raw.slice(-1)),n=!0;let c=t.at(-1);c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):t.push(l);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t="Infinite loop on byte: "+e;if(this.options.silent)console.error(t);else throw new Error(t)}},M=class{options;parser;constructor(r){this.options=r||T}space(r){return""}code({text:r,lang:e,escaped:t}){let s=(e||"").match(b.notSpaceStart)?.[0],n=r.replace(b.endingNewline,"")+`\n`;return s?\'<pre><code class="language-\'+y(s)+\'">\'+(t?n:y(n,!0))+`</code></pre>\n`:"<pre><code>"+(t?n:y(n,!0))+`</code></pre>\n`}blockquote({tokens:r}){return`<blockquote>\n${this.parser.parse(r)}</blockquote>\n`}html({text:r}){return r}def(r){return""}heading({tokens:r,depth:e}){return`<h${e}>${this.parser.parseInline(r)}</h${e}>\n`}hr(r){return`<hr>\n`}list(r){let e=r.ordered,t=r.start,s="";for(let a=0;a<r.items.length;a++){let l=r.items[a];s+=this.listitem(l)}let n=e?"ol":"ul",i=e&&t!==1?\' start="\'+t+\'"\':"";return"<"+n+i+`>\n`+s+"</"+n+`>\n`}listitem(r){return`<li>${this.parser.parse(r.tokens)}</li>\n`}checkbox({checked:r}){return"<input "+(r?\'checked="" \':"")+\'disabled="" type="checkbox"> \'}paragraph({tokens:r}){return`<p>${this.parser.parseInline(r)}</p>\n`}table(r){let e="",t="";for(let n=0;n<r.header.length;n++)t+=this.tablecell(r.header[n]);e+=this.tablerow({text:t});let s="";for(let n=0;n<r.rows.length;n++){let i=r.rows[n];t="";for(let a=0;a<i.length;a++)t+=this.tablecell(i[a]);s+=this.tablerow({text:t})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+e+`</thead>\n`+s+`</table>\n`}tablerow({text:r}){return`<tr>\n${r}</tr>\n`}tablecell(r){let e=this.parser.parseInline(r.tokens),t=r.header?"th":"td";return(r.align?`<${t} align="${r.align}">`:`<${t}>`)+e+`</${t}>\n`}strong({tokens:r}){return`<strong>${this.parser.parseInline(r)}</strong>`}em({tokens:r}){return`<em>${this.parser.parseInline(r)}</em>`}codespan({text:r}){return`<code>${y(r,!0)}</code>`}br(r){return"<br>"}del({tokens:r}){return`<del>${this.parser.parseInline(r)}</del>`}link({href:r,title:e,tokens:t}){let s=this.parser.parseInline(t),n=se(r);if(n===null)return s;r=n;let i=\'<a href="\'+r+\'"\';return e&&(i+=\' title="\'+y(e)+\'"\'),i+=">"+s+"</a>",i}image({href:r,title:e,text:t,tokens:s}){s&&(t=this.parser.parseInline(s,this.parser.textRenderer));let n=se(r);if(n===null)return y(t);r=n;let i=`<img src="${r}" alt="${y(t)}"`;return e&&(i+=` title="${y(e)}"`),i+=">",i}text(r){return"tokens"in r&&r.tokens?this.parser.parseInline(r.tokens):"escaped"in r&&r.escaped?r.text:y(r.text)}},K=class{strong({text:r}){return r}em({text:r}){return r}codespan({text:r}){return r}del({text:r}){return r}html({text:r}){return r}text({text:r}){return r}link({text:r}){return""+r}image({text:r}){return""+r}br(){return""}checkbox({raw:r}){return r}},m=class O{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new M,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new K}static parse(e,t){return new O(t).parse(e)}static parseInline(e,t){return new O(t).parseInline(e)}parse(e){this.renderer.parser=this;let t="";for(let s=0;s<e.length;s++){let n=e[s];if(this.options.extensions?.renderers?.[n.type]){let a=n,l=this.options.extensions.renderers[a.type].call({parser:this},a);if(l!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(a.type)){t+=l||"";continue}}let i=n;switch(i.type){case"space":{t+=this.renderer.space(i);break}case"hr":{t+=this.renderer.hr(i);break}case"heading":{t+=this.renderer.heading(i);break}case"code":{t+=this.renderer.code(i);break}case"table":{t+=this.renderer.table(i);break}case"blockquote":{t+=this.renderer.blockquote(i);break}case"list":{t+=this.renderer.list(i);break}case"checkbox":{t+=this.renderer.checkbox(i);break}case"html":{t+=this.renderer.html(i);break}case"def":{t+=this.renderer.def(i);break}case"paragraph":{t+=this.renderer.paragraph(i);break}case"text":{t+=this.renderer.text(i);break}default:{let a=\'Token with "\'+i.type+\'" type was not found.\';if(this.options.silent)return console.error(a),"";throw new Error(a)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let s="";for(let n=0;n<e.length;n++){let i=e[n];if(this.options.extensions?.renderers?.[i.type]){let l=this.options.extensions.renderers[i.type].call({parser:this},i);if(l!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(i.type)){s+=l||"";continue}}let a=i;switch(a.type){case"escape":{s+=t.text(a);break}case"html":{s+=t.html(a);break}case"link":{s+=t.link(a);break}case"image":{s+=t.image(a);break}case"checkbox":{s+=t.checkbox(a);break}case"strong":{s+=t.strong(a);break}case"em":{s+=t.em(a);break}case"codespan":{s+=t.codespan(a);break}case"br":{s+=t.br(a);break}case"del":{s+=t.del(a);break}case"text":{s+=t.text(a);break}default:{let l=\'Token with "\'+a.type+\'" type was not found.\';if(this.options.silent)return console.error(l),"";throw new Error(l)}}}return s}},I=class{options;block;constructor(r){this.options=r||T}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(r){return r}postprocess(r){return r}processAllTokens(r){return r}emStrongMask(r){return r}provideLexer(r=this.block){return r?w.lex:w.lexInline}provideParser(r=this.block){return r?m.parse:m.parseInline}},ot=class{defaults=N();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=m;Renderer=M;TextRenderer=K;Lexer=w;Tokenizer=q;Hooks=I;constructor(...r){this.use(...r)}walkTokens(r,e){let t=[];for(let s of r)switch(t=t.concat(e.call(this,s)),s.type){case"table":{let n=s;for(let i of n.header)t=t.concat(this.walkTokens(i.tokens,e));for(let i of n.rows)for(let a of i)t=t.concat(this.walkTokens(a.tokens,e));break}case"list":{let n=s;t=t.concat(this.walkTokens(n.items,e));break}default:{let n=s;this.defaults.extensions?.childTokens?.[n.type]?this.defaults.extensions.childTokens[n.type].forEach(i=>{let a=n[i].flat(1/0);t=t.concat(this.walkTokens(a,e))}):n.tokens&&(t=t.concat(this.walkTokens(n.tokens,e)))}}return t}use(...r){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return r.forEach(t=>{let s={...t};if(s.async=this.defaults.async||s.async||!1,t.extensions&&(t.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let i=e.renderers[n.name];i?e.renderers[n.name]=function(...a){let l=n.renderer.apply(this,a);return l===!1&&(l=i.apply(this,a)),l}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be \'block\' or \'inline\'");let i=e[n.level];i?i.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),s.extensions=e),t.renderer){let n=this.defaults.renderer||new M(this.defaults);for(let i in t.renderer){if(!(i in n))throw new Error(`renderer \'${i}\' does not exist`);if(["options","parser"].includes(i))continue;let a=i,l=t.renderer[a],o=n[a];n[a]=(...c)=>{let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p||""}}s.renderer=n}if(t.tokenizer){let n=this.defaults.tokenizer||new q(this.defaults);for(let i in t.tokenizer){if(!(i in n))throw new Error(`tokenizer \'${i}\' does not exist`);if(["options","rules","lexer"].includes(i))continue;let a=i,l=t.tokenizer[a],o=n[a];n[a]=(...c)=>{let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p}}s.tokenizer=n}if(t.hooks){let n=this.defaults.hooks||new I;for(let i in t.hooks){if(!(i in n))throw new Error(`hook \'${i}\' does not exist`);if(["options","block"].includes(i))continue;let a=i,l=t.hooks[a],o=n[a];I.passThroughHooks.has(i)?n[a]=c=>{if(this.defaults.async&&I.passThroughHooksRespectAsync.has(i))return(async()=>{let h=await l.call(n,c);return o.call(n,h)})();let p=l.call(n,c);return o.call(n,p)}:n[a]=(...c)=>{if(this.defaults.async)return(async()=>{let h=await l.apply(n,c);return h===!1&&(h=await o.apply(n,c)),h})();let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p}}s.hooks=n}if(t.walkTokens){let n=this.defaults.walkTokens,i=t.walkTokens;s.walkTokens=function(a){let l=[];return l.push(i.call(this,a)),n&&(l=l.concat(n.call(this,a))),l}}this.defaults={...this.defaults,...s}}),this}setOptions(r){return this.defaults={...this.defaults,...r},this}lexer(r,e){return w.lex(r,e??this.defaults)}parser(r,e){return m.parse(r,e??this.defaults)}parseMarkdown(r){return(e,t)=>{let s={...t},n={...this.defaults,...s},i=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&s.async===!1)return i(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."));if(typeof e>"u"||e===null)return i(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=r),n.async)return(async()=>{let a=n.hooks?await n.hooks.preprocess(e):e,l=await(n.hooks?await n.hooks.provideLexer(r):r?w.lex:w.lexInline)(a,n),o=n.hooks?await n.hooks.processAllTokens(l):l;n.walkTokens&&await Promise.all(this.walkTokens(o,n.walkTokens));let c=await(n.hooks?await n.hooks.provideParser(r):r?m.parse:m.parseInline)(o,n);return n.hooks?await n.hooks.postprocess(c):c})().catch(i);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer(r):r?w.lex:w.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let l=(n.hooks?n.hooks.provideParser(r):r?m.parse:m.parseInline)(a,n);return n.hooks&&(l=n.hooks.postprocess(l)),l}catch(a){return i(a)}}}onError(r,e){return t=>{if(t.message+=`\nPlease report this to https://github.com/markedjs/marked.`,r){let s="<p>An error occurred:</p><pre>"+y(t.message+"",!0)+"</pre>";return e?Promise.resolve(s):s}if(e)return Promise.reject(t);throw t}}},S=new ot;function d(r,e){return S.parse(r,e)}d.options=d.setOptions=function(r){return S.setOptions(r),d.defaults=S.defaults,oe(d.defaults),d};d.getDefaults=N;d.defaults=T;d.use=function(...r){return S.use(...r),d.defaults=S.defaults,oe(d.defaults),d};d.walkTokens=function(r,e){return S.walkTokens(r,e)};d.parseInline=S.parseInline;d.Parser=m;d.parser=m.parse;d.Renderer=M;d.TextRenderer=K;d.Lexer=w;d.lexer=w.lex;d.Tokenizer=q;d.Hooks=I;d.parse=d;var ct=d.options,ht=d.setOptions,pt=d.use,ut=d.walkTokens,gt=d.parseInline;var kt=m.parse,dt=w.lex;d.use({extensions:[{name:"inlineMath",level:"inline",start(r){return r.match(/(?<![\\\\$])\\$(?![$\\s])/)?.index},tokenizer(r){let e=/^\\$(?![$\\s\\d])((?:\\\\\\$|[^$\\n])*?)(?<!\\s)\\$(?!\\d)/.exec(r);if(e)return{type:"inlineMath",raw:e[0],text:e[1].trim()}},renderer(r){return r.raw}}]});var _=new Map;self.onmessage=r=>{let e=r.data;if(typeof e!="object"||e===null)return;let{id:t,text:s,append:n,expectedLength:i,oldRaws:a,instance:l,baseVersion:o,dispose:c}=e;if(c===!0){typeof l=="string"&&_.delete(l);return}let p=typeof l=="string"?l:null,h=typeof o=="number"?o:null,u,f=null;if(typeof n=="string"){if(p===null||h===null){self.postMessage({id:t,needResync:!0});return}let g=_.get(p);if(!g||g.version!==h){self.postMessage({id:t,needResync:!0});return}if(u=g.source+n,typeof i=="number"&&u.length!==i){_.delete(p),self.postMessage({id:t,needResync:!0});return}f=g.raws}else if(typeof s=="string"){if(u=s,Array.isArray(a))f=a;else if(p!==null&&h!==null){let g=_.get(p);if(g&&g.version===h)f=g.raws;else{self.postMessage({id:t,needResync:!0});return}}}else return;try{let g=d.lexer(u),x=0;if(f){let z=Math.min(f.length,g.length);for(;x<z&&f[x]===g[x].raw;x++);}p!==null&&h!==null&&_.set(p,{version:h+1,raws:g.map(z=>z.raw),source:u}),self.postMessage({id:t,matchLen:x,tail:g.slice(x)})}catch(g){p!==null&&_.delete(p),self.postMessage({id:t,error:String(g)})}};})();\n';
|
|
407
|
+
var WORKER_SOURCE_STRING = '"use strict";(()=>{function U(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var A=U();function he(r){A=r}var T={exec:()=>null};function L(r){let e=[];return t=>{let s=Math.max(0,Math.min(3,t-1)),n=e[s];return n||(n=r(s),e[s]=n),n}}function g(r,e=""){let t=typeof r=="string"?r:r.source,s={replace:(n,i)=>{let a=typeof i=="string"?i:i.source;return a=a.replace(b.caret,"$1"),t=t.replace(n,a),s},getRegex:()=>new RegExp(t,e)};return s}var me=((r="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+r)}catch{return!1}})(),b={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^\'"]*[^\\s])\\s+([\'"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>"\']/,escapeReplace:/[&<>"\']/g,escapeTestNoEncode:/[<>"\']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>"\']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:r=>new RegExp(`^( {0,3}${r})((?:[ ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:L(r=>new RegExp(`^ {0,${r}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ ][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:L(r=>new RegExp(`^ {0,${r}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`)),fencesBeginRegex:L(r=>new RegExp(`^ {0,${r}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:L(r=>new RegExp(`^ {0,${r}}#`)),htmlBeginRegex:L(r=>new RegExp(`^ {0,${r}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:L(r=>new RegExp(`^ {0,${r}}>`))},ye=/^(?:[ \\t]*(?:\\n|$))+/,$e=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,M=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Se=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,F=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,pe=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,ue=g(pe).replace(/bull/g,F).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}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,"").getRegex(),Te=g(pe).replace(/bull/g,F).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}(?:\\s|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),V=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,ze=/^[^\\n]+/,J=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Ae=g(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace("label",J).replace("title",/(?:"(?:\\\\"?|[^"\\\\])*"|\'[^\'\\n]*(?:\\n[^\'\\n]+)*\\n?\'|\\([^()]*\\))/).getRegex(),Le=g(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,F).getRegex(),j="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",K=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,_e=g("^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\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|$))","i").replace("comment",K).replace("tag",j).replace("attribute",/ +[a-zA-Z:_][\\w.:-]*(?: *= *"[^"\\n]*"| *= *\'[^\'\\n]*\'| *= *[^\\s"\'=<>`]+)?/).getRegex(),ge=r=>g(V).replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list",r).replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",j).getRegex(),Pe=ge(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),ve=ge(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),Ie=g(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace("paragraph",ve).getRegex(),Y={blockquote:Ie,code:$e,def:Ae,fences:Re,heading:Se,hr:M,html:_e,lheading:ue,list:Le,newline:ye,paragraph:Pe,table:T,text:ze},ne=g("^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)").replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\\\t]").replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",j).getRegex(),Ce={...Y,lheading:Te,table:ne,paragraph:g(V).replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\\\s|$)").replace("|lheading","").replace("table",ne).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~~~)[^\\\\n]*\\\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]").replace("html","</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",j).getRegex()},Ee={...Y,html:g(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:"[^"]*"|\'[^\']*\'|\\\\s[^\'"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace("comment",K).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(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +(["(][^\\n]+[")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:T,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:g(V).replace("hr",M).replace("heading",` *#{1,6} *[^\n]`).replace("lheading",ue).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Me=/^\\\\([!"#$%&\'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Be=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ke=/^( {2,}|\\\\)\\n(?!\\s*$)/,qe=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,_=/[\\p{P}\\p{S}]/u,H=/[\\s\\p{P}\\p{S}]/u,ee=/[^\\s\\p{P}\\p{S}]/u,Ze=g(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,H).getRegex(),fe=/(?!~)[\\p{P}\\p{S}]/u,De=/(?!~)[\\s\\p{P}\\p{S}]/u,Qe=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Ne=g(/link|precode-code|html/,"g").replace("link",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace("precode-",me?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),de=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,je=g(de,"u").replace(/punct/g,_).getRegex(),He=g(de,"u").replace(/punct/g,fe).getRegex(),xe="^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)",Oe=g(xe,"gu").replace(/notPunctSpace/g,ee).replace(/punctSpace/g,H).replace(/punct/g,_).getRegex(),Ge=g(xe,"gu").replace(/notPunctSpace/g,Qe).replace(/punctSpace/g,De).replace(/punct/g,fe).getRegex(),We=g("^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,ee).replace(/punctSpace/g,H).replace(/punct/g,_).getRegex(),Xe=g(/^~~?(?:((?!~)punct)|[^\\s~])/,"u").replace(/punct/g,_).getRegex(),Ue="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Fe=g(Ue,"gu").replace(/notPunctSpace/g,ee).replace(/punctSpace/g,H).replace(/punct/g,_).getRegex(),Ve=g(/\\\\(punct)/,"gu").replace(/punct/g,_).getRegex(),Je=g(/^<(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(),Ke=g(K).replace("(?:-->|$)","-->").getRegex(),Ye=g("^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>").replace("comment",Ke).replace("attribute",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*"[^"]*"|\\s*=\\s*\'[^\']*\'|\\s*=\\s*[^\\s"\'=<>`]+)?/).getRegex(),D=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,et=g(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace("label",D).replace("href",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace("title",/"(?:\\\\"?|[^"\\\\])*"|\'(?:\\\\\'?|[^\'\\\\])*\'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),be=g(/^!?\\[(label)\\]\\[(ref)\\]/).replace("label",D).replace("ref",J).getRegex(),we=g(/^!?\\[(ref)\\](?:\\[\\])?/).replace("ref",J).getRegex(),tt=g("reflink|nolink(?!\\\\()","g").replace("reflink",be).replace("nolink",we).getRegex(),se=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,te={_backpedal:T,anyPunctuation:Ve,autolink:Je,blockSkip:Ne,br:ke,code:Be,del:T,delLDelim:T,delRDelim:T,emStrongLDelim:je,emStrongRDelimAst:Oe,emStrongRDelimUnd:We,escape:Me,link:et,nolink:we,punctuation:Ze,reflink:be,reflinkSearch:tt,tag:Ye,text:qe,url:T},rt={...te,link:g(/^!?\\[(label)\\]\\((.*?)\\)/).replace("label",D).getRegex(),reflink:g(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace("label",D).getRegex()},G={...te,emStrongRDelimAst:Ge,emStrongLDelim:He,delLDelim:Xe,delRDelim:Fe,url:g(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace("protocol",se).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_\'"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_\'"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:g(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&\'*+\\/=?_`{\\|}~-]+@)))/).replace("protocol",se).getRegex()},nt={...G,br:g(ke).replace("{2,}","*").getRegex(),text:g(G.text).replace("\\\\b_","\\\\b_| {2,}\\\\n").replace(/\\{2,\\}/g,"*").getRegex()},Z={normal:Y,gfm:Ce,pedantic:Ee},C={normal:te,gfm:G,breaks:nt,pedantic:rt},st={"&":"&","<":"<",">":">",\'"\':""","\'":"'"},ie=r=>st[r];function y(r,e){if(e){if(b.escapeTest.test(r))return r.replace(b.escapeReplace,ie)}else if(b.escapeTestNoEncode.test(r))return r.replace(b.escapeReplaceNoEncode,ie);return r}function le(r){try{r=encodeURI(r).replace(b.percentDecode,"%")}catch{return null}return r}function ae(r,e){let t=r.replace(b.findPipe,(i,a,l)=>{let o=!1,c=a;for(;--c>=0&&l[c]==="\\\\";)o=!o;return o?"|":" |"}),s=t.split(b.splitPipe),n=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length<e;)s.push("");for(;n<s.length;n++)s[n]=s[n].trim().replace(b.slashPipe,"|");return s}function S(r,e,t){let s=r.length;if(s===0)return"";let n=0;for(;n<s;){let i=r.charAt(s-n-1);if(i===e&&!t)n++;else if(i!==e&&t)n++;else break}return r.slice(0,s-n)}function oe(r){let e=r.split(`\n`),t=e.length-1;for(;t>=0&&b.blankLine.test(e[t]);)t--;return e.length-t<=2?r:e.slice(0,t+1).join(`\n`)}function it(r,e){if(r.indexOf(e[1])===-1)return-1;let t=0;for(let s=0;s<r.length;s++)if(r[s]==="\\\\")s++;else if(r[s]===e[0])t++;else if(r[s]===e[1]&&(t--,t<0))return s;return t>0?-2:-1}function lt(r,e=0){let t=e,s="";for(let n of r)if(n===" "){let i=4-t%4;s+=" ".repeat(i),t+=i}else s+=n,t++;return s}function ce(r,e,t,s,n){let i=e.href,a=e.title||null,l=r[1].replace(n.other.outputLinkReplace,"$1");s.state.inLink=!0;let o={type:r[0].charAt(0)==="!"?"image":"link",raw:t,href:i,title:a,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,o}function at(r,e,t){let s=r.match(t.other.indentCodeCompensation);if(s===null)return e;let n=s[1];return e.split(`\n`).map(i=>{let a=i.match(t.other.beginningSpace);if(a===null)return i;let[l]=a;return l.length>=n.length?i.slice(n.length):i}).join(`\n`)}var Q=class{options;rules;lexer;constructor(r){this.options=r||A}space(r){let e=this.rules.block.newline.exec(r);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(r){let e=this.rules.block.code.exec(r);if(e){let t=this.options.pedantic?e[0]:oe(e[0]),s=t.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t,codeBlockStyle:"indented",text:s}}}fences(r){let e=this.rules.block.fences.exec(r);if(e){let t=e[0],s=at(t,e[3]||"",this.rules);return{type:"code",raw:t,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(r){let e=this.rules.block.heading.exec(r);if(e){let t=e[2].trim();if(this.rules.other.endingHash.test(t)){let s=S(t,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(t=s.trim())}return{type:"heading",raw:S(e[0],`\n`),depth:e[1].length,text:t,tokens:this.lexer.inline(t)}}}hr(r){let e=this.rules.block.hr.exec(r);if(e)return{type:"hr",raw:S(e[0],`\n`)}}blockquote(r){let e=this.rules.block.blockquote.exec(r);if(e){let t=S(e[0],`\n`).split(`\n`),s="",n="",i=[];for(;t.length>0;){let a=!1,l=[],o;for(o=0;o<t.length;o++)if(this.rules.other.blockquoteStart.test(t[o]))l.push(t[o]),a=!0;else if(!a)l.push(t[o]);else break;t=t.slice(o);let c=l.join(`\n`),p=c.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}\n${c}`:c,n=n?`${n}\n${p}`:p;let h=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(p,i,!0),this.lexer.state.top=h,t.length===0)break;let u=i.at(-1);if(u?.type==="code")break;if(u?.type==="blockquote"){let x=u,f=x.raw+`\n`+t.join(`\n`),d=this.blockquote(f);i[i.length-1]=d,s=s.substring(0,s.length-x.raw.length)+d.raw,n=n.substring(0,n.length-x.text.length)+d.text;break}else if(u?.type==="list"){let x=u,f=x.raw+`\n`+t.join(`\n`),d=this.list(f);i[i.length-1]=d,s=s.substring(0,s.length-u.raw.length)+d.raw,n=n.substring(0,n.length-x.raw.length)+d.raw,t=f.substring(i.at(-1).raw.length).split(`\n`);continue}}return{type:"blockquote",raw:s,tokens:i,text:n}}}list(r){let e=this.rules.block.list.exec(r);if(e){let t=e[1].trim(),s=t.length>1,n={type:"list",raw:"",ordered:s,start:s?+t.slice(0,-1):"",loose:!1,items:[]};t=s?`\\\\d{1,9}\\\\${t.slice(-1)}`:`\\\\${t}`,this.options.pedantic&&(t=s?t:"[*+-]");let i=this.rules.other.listItemRegex(t),a=!1;for(;r;){let o=!1,c="",p="";if(!(e=i.exec(r))||this.rules.block.hr.test(r))break;c=e[0],r=r.substring(c.length);let h=lt(e[2].split(`\n`,1)[0],e[1].length),u=r.split(`\n`,1)[0],x=!h.trim(),f=0;if(this.options.pedantic?(f=2,p=h.trimStart()):x?f=e[1].length+1:(f=h.search(this.rules.other.nonSpaceChar),f=f>4?1:f,p=h.slice(f),f+=e[1].length),x&&this.rules.other.blankLine.test(u)&&(c+=u+`\n`,r=r.substring(u.length+1),o=!0),!o){let d=this.rules.other.nextBulletRegex(f),B=this.rules.other.hrRegex(f),$=this.rules.other.fencesBeginRegex(f),q=this.rules.other.headingBeginRegex(f),R=this.rules.other.htmlBeginRegex(f),v=this.rules.other.blockquoteBeginRegex(f);for(;r;){let O=r.split(`\n`,1)[0],I;if(u=O,this.options.pedantic?(u=u.replace(this.rules.other.listReplaceNesting," "),I=u):I=u.replace(this.rules.other.tabCharGlobal," "),$.test(u)||q.test(u)||R.test(u)||v.test(u)||d.test(u)||B.test(u))break;if(I.search(this.rules.other.nonSpaceChar)>=f||!u.trim())p+=`\n`+I.slice(f);else{if(x||h.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||$.test(h)||q.test(h)||B.test(h))break;p+=`\n`+u}x=!u.trim(),c+=O+`\n`,r=r.substring(O.length+1),h=I.slice(f)}}n.loose||(a?n.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(a=!0)),n.items.push({type:"list_item",raw:c,task:!!this.options.gfm&&this.rules.other.listIsTask.test(p),loose:!1,text:p,tokens:[]}),n.raw+=c}let l=n.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let o of n.items){this.lexer.state.top=!1,o.tokens=this.lexer.blockTokens(o.text,[]);let c=o.tokens[0];if(o.task&&(c?.type==="text"||c?.type==="paragraph")){o.text=o.text.replace(this.rules.other.listReplaceTask,""),c.raw=c.raw.replace(this.rules.other.listReplaceTask,""),c.text=c.text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}let p=this.rules.other.listTaskCheckbox.exec(o.raw);if(p){let h={type:"checkbox",raw:p[0]+" ",checked:p[0]!=="[ ]"};o.checked=h.checked,n.loose?o.tokens[0]&&["paragraph","text"].includes(o.tokens[0].type)&&"tokens"in o.tokens[0]&&o.tokens[0].tokens?(o.tokens[0].raw=h.raw+o.tokens[0].raw,o.tokens[0].text=h.raw+o.tokens[0].text,o.tokens[0].tokens.unshift(h)):o.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):o.tokens.unshift(h)}}else o.task&&(o.task=!1);if(!n.loose){let p=o.tokens.filter(u=>u.type==="space"),h=p.length>0&&p.some(u=>this.rules.other.anyLine.test(u.raw));n.loose=h}}if(n.loose)for(let o of n.items){o.loose=!0;for(let c of o.tokens)c.type==="text"&&(c.type="paragraph")}return n}}html(r){let e=this.rules.block.html.exec(r);if(e){let t=oe(e[0]);return{type:"html",block:!0,raw:t,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:t}}}def(r){let e=this.rules.block.def.exec(r);if(e){let t=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:t,raw:S(e[0],`\n`),href:s,title:n}}}table(r){let e=this.rules.block.table.exec(r);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let t=ae(e[1]),s=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),n=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(`\n`):[],i={type:"table",raw:S(e[0],`\n`),header:[],align:[],rows:[]};if(t.length===s.length){for(let a of s)this.rules.other.tableAlignRight.test(a)?i.align.push("right"):this.rules.other.tableAlignCenter.test(a)?i.align.push("center"):this.rules.other.tableAlignLeft.test(a)?i.align.push("left"):i.align.push(null);for(let a=0;a<t.length;a++)i.header.push({text:t[a],tokens:this.lexer.inline(t[a]),header:!0,align:i.align[a]});for(let a of n)i.rows.push(ae(a,i.header.length).map((l,o)=>({text:l,tokens:this.lexer.inline(l),header:!1,align:i.align[o]})));return i}}lheading(r){let e=this.rules.block.lheading.exec(r);if(e){let t=e[1].trim();return{type:"heading",raw:S(e[0],`\n`),depth:e[2].charAt(0)==="="?1:2,text:t,tokens:this.lexer.inline(t)}}}paragraph(r){let e=this.rules.block.paragraph.exec(r);if(e){let t=e[1].charAt(e[1].length-1)===`\n`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:t,tokens:this.lexer.inline(t)}}}text(r){let e=this.rules.block.text.exec(r);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(r){let e=this.rules.inline.escape.exec(r);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(r){let e=this.rules.inline.tag.exec(r);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(r){let e=this.rules.inline.link.exec(r);if(e){let t=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(t)){if(!this.rules.other.endAngleBracket.test(t))return;let i=S(t.slice(0,-1),"\\\\");if((t.length-i.length)%2===0)return}else{let i=it(e[2],"()");if(i===-2)return;if(i>-1){let a=(e[0].indexOf("!")===0?5:4)+e[1].length+i;e[2]=e[2].substring(0,i),e[0]=e[0].substring(0,a).trim(),e[3]=""}}let s=e[2],n="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(s);i&&(s=i[1],n=i[3])}else n=e[3]?e[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(t)?s=s.slice(1):s=s.slice(1,-1)),ce(e,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(r,e){let t;if((t=this.rules.inline.reflink.exec(r))||(t=this.rules.inline.nolink.exec(r))){let s=(t[2]||t[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[s.toLowerCase()];if(!n){let i=t[0].charAt(0);return{type:"text",raw:i,text:i}}return ce(t,n,t[0],this.lexer,this.rules)}}emStrong(r,e,t=""){let s=this.rules.inline.emStrongLDelim.exec(r);if(!(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&t.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[3])||!t||this.rules.inline.punctuation.exec(t))){let n=[...s[0]].length-1,i,a,l=n,o=0,c=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,e=e.slice(-1*r.length+n);(s=c.exec(e))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(a=[...i].length,s[3]||s[4]){l+=a;continue}else if((s[5]||s[6])&&n%3&&!((n+a)%3)){o+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l+o);let p=[...s[0]][0].length,h=r.slice(0,n+s.index+p+a);if(Math.min(n,a)%2){let x=h.slice(1,-1);return{type:"em",raw:h,text:x,tokens:this.lexer.inlineTokens(x)}}let u=h.slice(2,-2);return{type:"strong",raw:h,text:u,tokens:this.lexer.inlineTokens(u)}}}}codespan(r){let e=this.rules.inline.code.exec(r);if(e){let t=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(t),n=this.rules.other.startingSpaceChar.test(t)&&this.rules.other.endingSpaceChar.test(t);return s&&n&&(t=t.substring(1,t.length-1)),{type:"codespan",raw:e[0],text:t}}}br(r){let e=this.rules.inline.br.exec(r);if(e)return{type:"br",raw:e[0]}}del(r,e,t=""){let s=this.rules.inline.delLDelim.exec(r);if(s&&(!s[1]||!t||this.rules.inline.punctuation.exec(t))){let n=[...s[0]].length-1,i,a,l=n,o=this.rules.inline.delRDelim;for(o.lastIndex=0,e=e.slice(-1*r.length+n);(s=o.exec(e))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(a=[...i].length,a!==n))continue;if(s[3]||s[4]){l+=a;continue}if(l-=a,l>0)continue;a=Math.min(a,a+l);let c=[...s[0]][0].length,p=r.slice(0,n+s.index+c+a),h=p.slice(n,-n);return{type:"del",raw:p,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(r){let e=this.rules.inline.autolink.exec(r);if(e){let t,s;return e[2]==="@"?(t=e[1],s="mailto:"+t):(t=e[1],s=t),{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}url(r){let e;if(e=this.rules.inline.url.exec(r)){let t,s;if(e[2]==="@")t=e[0],s="mailto:"+t;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);t=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:t,href:s,tokens:[{type:"text",raw:t,text:t}]}}}inlineText(r){let e=this.rules.inline.text.exec(r);if(e){let t=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:t}}}},w=class W{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||A,this.options.tokenizer=this.options.tokenizer||new Q,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:b,block:Z.normal,inline:C.normal};this.options.pedantic?(t.block=Z.pedantic,t.inline=C.pedantic):this.options.gfm&&(t.block=Z.gfm,this.options.breaks?t.inline=C.breaks:t.inline=C.gfm),this.tokenizer.rules=t}static get rules(){return{block:Z,inline:C}}static lex(e,t){return new W(t).lex(e)}static lexInline(e,t){return new W(t).inlineTokens(e)}lex(e){e=e.replace(b.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let s=this.inlineQueue[t];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],s=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(b.tabCharGlobal," ").replace(b.spaceLine,""));let n=1/0;for(;e;){if(e.length<n)n=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let i;if(this.options.extensions?.block?.some(l=>(i=l.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let l=t.at(-1);i.raw.length===1&&l!==void 0?l.raw+=`\n`:t.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.at(-1).src=l.text):t.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.raw,this.inlineQueue.at(-1).src=l.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},t.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),t.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let l=1/0,o=e.slice(1),c;this.options.extensions.startBlock.forEach(p=>{c=p.call({lexer:this},o),typeof c=="number"&&c>=0&&(l=Math.min(l,c))}),l<1/0&&l>=0&&(a=e.substring(0,l+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let l=t.at(-1);s&&l?.type==="paragraph"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(i),s=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let l=t.at(-1);l?.type==="text"?(l.raw+=(l.raw.endsWith(`\n`)?"":`\n`)+i.raw,l.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let s=e;if(this.tokens.links){let l=Object.keys(this.tokens.links);l.length>0&&(s=s.replace(this.tokenizer.rules.inline.reflinkSearch,o=>l.includes(o.slice(o.lastIndexOf("[")+1,-1))?"["+"a".repeat(o.length-2)+"]":o))}s=s.replace(this.tokenizer.rules.inline.anyPunctuation,"++"),s=s.replace(this.tokenizer.rules.inline.blockSkip,(l,o,c)=>{let p=c?c.length:0;return l.slice(0,p)+"["+"a".repeat(l.length-p-2)+"]"}),s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let n=!1,i="",a=1/0;for(;e;){if(e.length<a)a=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}n||(i=""),n=!1;let l;if(this.options.extensions?.inline?.some(c=>(l=c.call({lexer:this},e,t))?(e=e.substring(l.raw.length),t.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let c=t.at(-1);l.type==="text"&&c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):t.push(l);continue}if(l=this.tokenizer.emStrong(e,s,i)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.del(e,s,i)){e=e.substring(l.raw.length),t.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),t.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(e))){e=e.substring(l.raw.length),t.push(l);continue}let o=e;if(this.options.extensions?.startInline){let c=1/0,p=e.slice(1),h;this.options.extensions.startInline.forEach(u=>{h=u.call({lexer:this},p),typeof h=="number"&&h>=0&&(c=Math.min(c,h))}),c<1/0&&c>=0&&(o=e.substring(0,c+1))}if(l=this.tokenizer.inlineText(o)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(i=l.raw.slice(-1)),n=!0;let c=t.at(-1);c?.type==="text"?(c.raw+=l.raw,c.text+=l.text):t.push(l);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t="Infinite loop on byte: "+e;if(this.options.silent)console.error(t);else throw new Error(t)}},N=class{options;parser;constructor(r){this.options=r||A}space(r){return""}code({text:r,lang:e,escaped:t}){let s=(e||"").match(b.notSpaceStart)?.[0],n=r.replace(b.endingNewline,"")+`\n`;return s?\'<pre><code class="language-\'+y(s)+\'">\'+(t?n:y(n,!0))+`</code></pre>\n`:"<pre><code>"+(t?n:y(n,!0))+`</code></pre>\n`}blockquote({tokens:r}){return`<blockquote>\n${this.parser.parse(r)}</blockquote>\n`}html({text:r}){return r}def(r){return""}heading({tokens:r,depth:e}){return`<h${e}>${this.parser.parseInline(r)}</h${e}>\n`}hr(r){return`<hr>\n`}list(r){let e=r.ordered,t=r.start,s="";for(let a=0;a<r.items.length;a++){let l=r.items[a];s+=this.listitem(l)}let n=e?"ol":"ul",i=e&&t!==1?\' start="\'+t+\'"\':"";return"<"+n+i+`>\n`+s+"</"+n+`>\n`}listitem(r){return`<li>${this.parser.parse(r.tokens)}</li>\n`}checkbox({checked:r}){return"<input "+(r?\'checked="" \':"")+\'disabled="" type="checkbox"> \'}paragraph({tokens:r}){return`<p>${this.parser.parseInline(r)}</p>\n`}table(r){let e="",t="";for(let n=0;n<r.header.length;n++)t+=this.tablecell(r.header[n]);e+=this.tablerow({text:t});let s="";for(let n=0;n<r.rows.length;n++){let i=r.rows[n];t="";for(let a=0;a<i.length;a++)t+=this.tablecell(i[a]);s+=this.tablerow({text:t})}return s&&(s=`<tbody>${s}</tbody>`),`<table>\n<thead>\n`+e+`</thead>\n`+s+`</table>\n`}tablerow({text:r}){return`<tr>\n${r}</tr>\n`}tablecell(r){let e=this.parser.parseInline(r.tokens),t=r.header?"th":"td";return(r.align?`<${t} align="${r.align}">`:`<${t}>`)+e+`</${t}>\n`}strong({tokens:r}){return`<strong>${this.parser.parseInline(r)}</strong>`}em({tokens:r}){return`<em>${this.parser.parseInline(r)}</em>`}codespan({text:r}){return`<code>${y(r,!0)}</code>`}br(r){return"<br>"}del({tokens:r}){return`<del>${this.parser.parseInline(r)}</del>`}link({href:r,title:e,tokens:t}){let s=this.parser.parseInline(t),n=le(r);if(n===null)return s;r=n;let i=\'<a href="\'+r+\'"\';return e&&(i+=\' title="\'+y(e)+\'"\'),i+=">"+s+"</a>",i}image({href:r,title:e,text:t,tokens:s}){s&&(t=this.parser.parseInline(s,this.parser.textRenderer));let n=le(r);if(n===null)return y(t);r=n;let i=`<img src="${r}" alt="${y(t)}"`;return e&&(i+=` title="${y(e)}"`),i+=">",i}text(r){return"tokens"in r&&r.tokens?this.parser.parseInline(r.tokens):"escaped"in r&&r.escaped?r.text:y(r.text)}},re=class{strong({text:r}){return r}em({text:r}){return r}codespan({text:r}){return r}del({text:r}){return r}html({text:r}){return r}text({text:r}){return r}link({text:r}){return""+r}image({text:r}){return""+r}br(){return""}checkbox({raw:r}){return r}},m=class X{options;renderer;textRenderer;constructor(e){this.options=e||A,this.options.renderer=this.options.renderer||new N,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new re}static parse(e,t){return new X(t).parse(e)}static parseInline(e,t){return new X(t).parseInline(e)}parse(e){this.renderer.parser=this;let t="";for(let s=0;s<e.length;s++){let n=e[s];if(this.options.extensions?.renderers?.[n.type]){let a=n,l=this.options.extensions.renderers[a.type].call({parser:this},a);if(l!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(a.type)){t+=l||"";continue}}let i=n;switch(i.type){case"space":{t+=this.renderer.space(i);break}case"hr":{t+=this.renderer.hr(i);break}case"heading":{t+=this.renderer.heading(i);break}case"code":{t+=this.renderer.code(i);break}case"table":{t+=this.renderer.table(i);break}case"blockquote":{t+=this.renderer.blockquote(i);break}case"list":{t+=this.renderer.list(i);break}case"checkbox":{t+=this.renderer.checkbox(i);break}case"html":{t+=this.renderer.html(i);break}case"def":{t+=this.renderer.def(i);break}case"paragraph":{t+=this.renderer.paragraph(i);break}case"text":{t+=this.renderer.text(i);break}default:{let a=\'Token with "\'+i.type+\'" type was not found.\';if(this.options.silent)return console.error(a),"";throw new Error(a)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let s="";for(let n=0;n<e.length;n++){let i=e[n];if(this.options.extensions?.renderers?.[i.type]){let l=this.options.extensions.renderers[i.type].call({parser:this},i);if(l!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(i.type)){s+=l||"";continue}}let a=i;switch(a.type){case"escape":{s+=t.text(a);break}case"html":{s+=t.html(a);break}case"link":{s+=t.link(a);break}case"image":{s+=t.image(a);break}case"checkbox":{s+=t.checkbox(a);break}case"strong":{s+=t.strong(a);break}case"em":{s+=t.em(a);break}case"codespan":{s+=t.codespan(a);break}case"br":{s+=t.br(a);break}case"del":{s+=t.del(a);break}case"text":{s+=t.text(a);break}default:{let l=\'Token with "\'+a.type+\'" type was not found.\';if(this.options.silent)return console.error(l),"";throw new Error(l)}}}return s}},E=class{options;block;constructor(r){this.options=r||A}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(r){return r}postprocess(r){return r}processAllTokens(r){return r}emStrongMask(r){return r}provideLexer(r=this.block){return r?w.lex:w.lexInline}provideParser(r=this.block){return r?m.parse:m.parseInline}},ot=class{defaults=U();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=m;Renderer=N;TextRenderer=re;Lexer=w;Tokenizer=Q;Hooks=E;constructor(...r){this.use(...r)}walkTokens(r,e){let t=[];for(let s of r)switch(t=t.concat(e.call(this,s)),s.type){case"table":{let n=s;for(let i of n.header)t=t.concat(this.walkTokens(i.tokens,e));for(let i of n.rows)for(let a of i)t=t.concat(this.walkTokens(a.tokens,e));break}case"list":{let n=s;t=t.concat(this.walkTokens(n.items,e));break}default:{let n=s;this.defaults.extensions?.childTokens?.[n.type]?this.defaults.extensions.childTokens[n.type].forEach(i=>{let a=n[i].flat(1/0);t=t.concat(this.walkTokens(a,e))}):n.tokens&&(t=t.concat(this.walkTokens(n.tokens,e)))}}return t}use(...r){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return r.forEach(t=>{let s={...t};if(s.async=this.defaults.async||s.async||!1,t.extensions&&(t.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let i=e.renderers[n.name];i?e.renderers[n.name]=function(...a){let l=n.renderer.apply(this,a);return l===!1&&(l=i.apply(this,a)),l}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be \'block\' or \'inline\'");let i=e[n.level];i?i.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),s.extensions=e),t.renderer){let n=this.defaults.renderer||new N(this.defaults);for(let i in t.renderer){if(!(i in n))throw new Error(`renderer \'${i}\' does not exist`);if(["options","parser"].includes(i))continue;let a=i,l=t.renderer[a],o=n[a];n[a]=(...c)=>{let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p||""}}s.renderer=n}if(t.tokenizer){let n=this.defaults.tokenizer||new Q(this.defaults);for(let i in t.tokenizer){if(!(i in n))throw new Error(`tokenizer \'${i}\' does not exist`);if(["options","rules","lexer"].includes(i))continue;let a=i,l=t.tokenizer[a],o=n[a];n[a]=(...c)=>{let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p}}s.tokenizer=n}if(t.hooks){let n=this.defaults.hooks||new E;for(let i in t.hooks){if(!(i in n))throw new Error(`hook \'${i}\' does not exist`);if(["options","block"].includes(i))continue;let a=i,l=t.hooks[a],o=n[a];E.passThroughHooks.has(i)?n[a]=c=>{if(this.defaults.async&&E.passThroughHooksRespectAsync.has(i))return(async()=>{let h=await l.call(n,c);return o.call(n,h)})();let p=l.call(n,c);return o.call(n,p)}:n[a]=(...c)=>{if(this.defaults.async)return(async()=>{let h=await l.apply(n,c);return h===!1&&(h=await o.apply(n,c)),h})();let p=l.apply(n,c);return p===!1&&(p=o.apply(n,c)),p}}s.hooks=n}if(t.walkTokens){let n=this.defaults.walkTokens,i=t.walkTokens;s.walkTokens=function(a){let l=[];return l.push(i.call(this,a)),n&&(l=l.concat(n.call(this,a))),l}}this.defaults={...this.defaults,...s}}),this}setOptions(r){return this.defaults={...this.defaults,...r},this}lexer(r,e){return w.lex(r,e??this.defaults)}parser(r,e){return m.parse(r,e??this.defaults)}parseMarkdown(r){return(e,t)=>{let s={...t},n={...this.defaults,...s},i=this.onError(!!n.silent,!!n.async);if(this.defaults.async===!0&&s.async===!1)return i(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."));if(typeof e>"u"||e===null)return i(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(n.hooks&&(n.hooks.options=n,n.hooks.block=r),n.async)return(async()=>{let a=n.hooks?await n.hooks.preprocess(e):e,l=await(n.hooks?await n.hooks.provideLexer(r):r?w.lex:w.lexInline)(a,n),o=n.hooks?await n.hooks.processAllTokens(l):l;n.walkTokens&&await Promise.all(this.walkTokens(o,n.walkTokens));let c=await(n.hooks?await n.hooks.provideParser(r):r?m.parse:m.parseInline)(o,n);return n.hooks?await n.hooks.postprocess(c):c})().catch(i);try{n.hooks&&(e=n.hooks.preprocess(e));let a=(n.hooks?n.hooks.provideLexer(r):r?w.lex:w.lexInline)(e,n);n.hooks&&(a=n.hooks.processAllTokens(a)),n.walkTokens&&this.walkTokens(a,n.walkTokens);let l=(n.hooks?n.hooks.provideParser(r):r?m.parse:m.parseInline)(a,n);return n.hooks&&(l=n.hooks.postprocess(l)),l}catch(a){return i(a)}}}onError(r,e){return t=>{if(t.message+=`\nPlease report this to https://github.com/markedjs/marked.`,r){let s="<p>An error occurred:</p><pre>"+y(t.message+"",!0)+"</pre>";return e?Promise.resolve(s):s}if(e)return Promise.reject(t);throw t}}},z=new ot;function k(r,e){return z.parse(r,e)}k.options=k.setOptions=function(r){return z.setOptions(r),k.defaults=z.defaults,he(k.defaults),k};k.getDefaults=U;k.defaults=A;k.use=function(...r){return z.use(...r),k.defaults=z.defaults,he(k.defaults),k};k.walkTokens=function(r,e){return z.walkTokens(r,e)};k.parseInline=z.parseInline;k.Parser=m;k.parser=m.parse;k.Renderer=N;k.TextRenderer=re;k.Lexer=w;k.lexer=w.lex;k.Tokenizer=Q;k.Hooks=E;k.parse=k;var ut=k.options,gt=k.setOptions,kt=k.use,ft=k.walkTokens,dt=k.parseInline;var xt=m.parse,bt=w.lex;var ct=0;function ht(r){if(typeof r!="string"||typeof performance.mark!="function"||typeof performance.measure!="function")return null;let e=ct++,t={name:r,startMark:`${r}:start:${e}`,endMark:`${r}:end:${e}`};try{return performance.mark(t.startMark),t}catch{return null}}function pt(r){if(r)try{performance.mark(r.endMark),performance.measure(r.name,r.startMark,r.endMark)}catch{}finally{try{performance.clearMarks?.(r.startMark),performance.clearMarks?.(r.endMark)}catch{}}}k.use({extensions:[{name:"inlineMath",level:"inline",start(r){return r.match(/(?<![\\\\$])\\$(?![$\\s])/)?.index},tokenizer(r){let e=/^\\$(?![$\\s\\d])((?:\\\\\\$|[^$\\n])*?)(?<!\\s)\\$(?!\\d)/.exec(r);if(e)return{type:"inlineMath",raw:e[0],text:e[1].trim()}},renderer(r){return r.raw}}]});var P=new Map;self.onmessage=r=>{let e=r.data;if(typeof e!="object"||e===null)return;let{id:t,text:s,append:n,expectedLength:i,oldRaws:a,instance:l,baseVersion:o,dispose:c,userTimingName:p}=e;if(c===!0){typeof l=="string"&&P.delete(l);return}let h=typeof l=="string"?l:null,u=typeof o=="number"?o:null,x,f=null;if(typeof n=="string"){if(h===null||u===null){self.postMessage({id:t,needResync:!0});return}let d=P.get(h);if(!d||d.version!==u){self.postMessage({id:t,needResync:!0});return}if(x=d.source+n,typeof i=="number"&&x.length!==i){P.delete(h),self.postMessage({id:t,needResync:!0});return}f=d.raws}else if(typeof s=="string"){if(x=s,Array.isArray(a))f=a;else if(h!==null&&u!==null){let d=P.get(h);if(d&&d.version===u)f=d.raws;else{self.postMessage({id:t,needResync:!0});return}}}else return;try{let d=typeof p=="string"?ht(p):null,B=performance.now(),$;try{$=k.lexer(x)}finally{d&&pt(d)}let q=performance.now()-B,R=0;if(f){let v=Math.min(f.length,$.length);for(;R<v&&f[R]===$[R].raw;R++);}h!==null&&u!==null&&P.set(h,{version:u+1,raws:$.map(v=>v.raw),source:x}),self.postMessage({id:t,matchLen:R,tail:$.slice(R),lexerMs:q,sourceCharsLexed:x.length})}catch(d){h!==null&&P.delete(h),self.postMessage({id:t,error:String(d)})}};})();\n';
|
|
20
408
|
|
|
21
409
|
// src/Markdown.ts
|
|
22
410
|
var now = () => typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
|
|
411
|
+
function lexMarkdown(text, userTiming) {
|
|
412
|
+
if (!userTiming) return marked.lexer(text);
|
|
413
|
+
const timing = beginVectoUserTiming(VECTO_USER_TIMING.markdown.parse);
|
|
414
|
+
try {
|
|
415
|
+
return marked.lexer(text);
|
|
416
|
+
} finally {
|
|
417
|
+
if (timing) endVectoUserTiming(timing);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
23
420
|
marked.use({
|
|
24
421
|
extensions: [
|
|
25
422
|
{
|
|
@@ -73,7 +470,7 @@ var workerInstanceCounter = 0;
|
|
|
73
470
|
var workerCallbacks = /* @__PURE__ */ new Map();
|
|
74
471
|
function runSyncFallback(entry) {
|
|
75
472
|
try {
|
|
76
|
-
entry.cb(0,
|
|
473
|
+
entry.cb(0, lexMarkdown(entry.text, entry.userTiming), true);
|
|
77
474
|
} catch (err) {
|
|
78
475
|
console.warn("Markdown sync fallback parse failed", err);
|
|
79
476
|
}
|
|
@@ -85,7 +482,7 @@ if (typeof Worker !== "undefined") {
|
|
|
85
482
|
});
|
|
86
483
|
markdownWorker = new Worker(URL.createObjectURL(blob));
|
|
87
484
|
markdownWorker.onmessage = (e) => {
|
|
88
|
-
const { id, matchLen, tail, error, needResync } = e.data;
|
|
485
|
+
const { id, matchLen, tail, error, needResync, lexerMs, sourceCharsLexed } = e.data;
|
|
89
486
|
const entry = workerCallbacks.get(id);
|
|
90
487
|
if (entry) {
|
|
91
488
|
workerCallbacks.delete(id);
|
|
@@ -94,7 +491,10 @@ if (typeof Worker !== "undefined") {
|
|
|
94
491
|
} else if (needResync) {
|
|
95
492
|
runSyncFallback(entry);
|
|
96
493
|
} else if (!error) {
|
|
97
|
-
entry.cb(matchLen, tail
|
|
494
|
+
entry.cb(matchLen, tail, false, {
|
|
495
|
+
lexerMs: typeof lexerMs === "number" ? lexerMs : 0,
|
|
496
|
+
sourceCharsLexed: typeof sourceCharsLexed === "number" ? sourceCharsLexed : 0
|
|
497
|
+
});
|
|
98
498
|
} else {
|
|
99
499
|
runSyncFallback(entry);
|
|
100
500
|
}
|
|
@@ -721,8 +1121,19 @@ var Markdown = class extends UIComponent {
|
|
|
721
1121
|
theme;
|
|
722
1122
|
onLinkClick;
|
|
723
1123
|
selectable;
|
|
1124
|
+
activeBlockMetrics = null;
|
|
1125
|
+
/**
|
|
1126
|
+
* Called after a streamed append has re-laid-out the document.
|
|
1127
|
+
*
|
|
1128
|
+
* Not required for a `VirtualList` to track a streaming row's height: the list
|
|
1129
|
+
* re-reads `height` on every mounted row each frame, so it sees this entity grow
|
|
1130
|
+
* without being told. Prefer that over wiring this up — it fires from the append
|
|
1131
|
+
* path only, **not** from `setContent()`, so it is not a complete size signal.
|
|
1132
|
+
*/
|
|
724
1133
|
onLayoutUpdated;
|
|
725
1134
|
rawMarkdown;
|
|
1135
|
+
streamController = null;
|
|
1136
|
+
_userTiming;
|
|
726
1137
|
tokens = [];
|
|
727
1138
|
// At most one worker lex request in flight at a time. Required for the
|
|
728
1139
|
// delta-transfer protocol below to be safe: the request captures a
|
|
@@ -737,19 +1148,38 @@ var Markdown = class extends UIComponent {
|
|
|
737
1148
|
/**
|
|
738
1149
|
* Streaming counters for the DevTools inspector.
|
|
739
1150
|
*
|
|
740
|
-
* Cheap enough to keep always-on (
|
|
741
|
-
*
|
|
742
|
-
*
|
|
743
|
-
*
|
|
744
|
-
*
|
|
1151
|
+
* Cheap enough to keep always-on (a handful of integer increments per append).
|
|
1152
|
+
*
|
|
1153
|
+
* These describe the **token diff and the transfer**, not the parser. `marked`
|
|
1154
|
+
* has no incremental lexing API, so the worker calls `marked.lexer()` on the
|
|
1155
|
+
* whole accumulated source for every chunk and the lexer's cost is O(document)
|
|
1156
|
+
* per append no matter how well the diff goes. That is what `lexerMs` and
|
|
1157
|
+
* `sourceCharsLexed` are for; an earlier version of these counters was named as
|
|
1158
|
+
* though a high prefix match meant less lexing, which sent readers to optimise
|
|
1159
|
+
* the already-solved transfer path.
|
|
745
1160
|
*/
|
|
746
1161
|
streamStats = {
|
|
747
1162
|
appends: 0,
|
|
748
1163
|
workerResponses: 0,
|
|
749
|
-
/**
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
1164
|
+
/**
|
|
1165
|
+
* Sum of `matchLen`: leading tokens whose `raw` was unchanged, so the main
|
|
1166
|
+
* thread kept its existing token objects and child entities. A prefix match,
|
|
1167
|
+
* not a lexer saving — the worker still lexed them.
|
|
1168
|
+
*/
|
|
1169
|
+
tokensPrefixMatched: 0,
|
|
1170
|
+
/**
|
|
1171
|
+
* Sum of returned tail lengths: tokens the worker sent back because their
|
|
1172
|
+
* `raw` differed. This is the structured-clone payload size in tokens, which
|
|
1173
|
+
* is what the delta protocol exists to keep small.
|
|
1174
|
+
*/
|
|
1175
|
+
tokensReturned: 0,
|
|
1176
|
+
/** Total ms spent inside `marked.lexer()` across worker responses. */
|
|
1177
|
+
lexerMs: 0,
|
|
1178
|
+
/**
|
|
1179
|
+
* Characters handed to the lexer, summed across responses. Grows ~O(n^2) over
|
|
1180
|
+
* a stream of n chunks, because every chunk re-lexes the whole document.
|
|
1181
|
+
*/
|
|
1182
|
+
sourceCharsLexed: 0,
|
|
753
1183
|
/** Total round-trip ms across worker lex requests, dispatch to callback. */
|
|
754
1184
|
workerMs: 0,
|
|
755
1185
|
/** Longest single worker round trip, which is what a dropped frame feels. */
|
|
@@ -759,7 +1189,7 @@ var Markdown = class extends UIComponent {
|
|
|
759
1189
|
* worker matched and did not re-read.
|
|
760
1190
|
*/
|
|
761
1191
|
stablePrefixChars: 0,
|
|
762
|
-
/** Source length of the tail
|
|
1192
|
+
/** Source length of the tail whose tokens changed on the most recent append. */
|
|
763
1193
|
changedTailChars: 0,
|
|
764
1194
|
/** Child entities kept across reconciles, either untouched or updated in place. */
|
|
765
1195
|
entitiesReused: 0,
|
|
@@ -832,6 +1262,7 @@ var Markdown = class extends UIComponent {
|
|
|
832
1262
|
this.theme = { ...DEFAULT_THEME, ...opts.theme };
|
|
833
1263
|
this.onLinkClick = opts.onLinkClick;
|
|
834
1264
|
this.selectable = opts.selectable ?? true;
|
|
1265
|
+
this._userTiming = opts.userTiming ?? false;
|
|
835
1266
|
this.content = new Stack({ direction: "vertical", gap: 16 });
|
|
836
1267
|
this.add(this.content);
|
|
837
1268
|
this.rawMarkdown = markdownText;
|
|
@@ -839,7 +1270,7 @@ var Markdown = class extends UIComponent {
|
|
|
839
1270
|
this.renderMarkdown(markdownText);
|
|
840
1271
|
}
|
|
841
1272
|
renderMarkdown(text) {
|
|
842
|
-
const tokens =
|
|
1273
|
+
const tokens = lexMarkdown(text, this._userTiming);
|
|
843
1274
|
this.setTokens(tokens);
|
|
844
1275
|
for (const token of tokens) {
|
|
845
1276
|
const el = this.renderToken(token);
|
|
@@ -850,8 +1281,26 @@ var Markdown = class extends UIComponent {
|
|
|
850
1281
|
this.width = this.content.width;
|
|
851
1282
|
this.height = this.content.height;
|
|
852
1283
|
}
|
|
1284
|
+
/** Create a frame-coalesced stream bound to this Markdown instance. */
|
|
1285
|
+
createStream(options = {}) {
|
|
1286
|
+
if (this.streamController) {
|
|
1287
|
+
throw new Error("Markdown already has an active StreamController");
|
|
1288
|
+
}
|
|
1289
|
+
const controller = createStreamController(
|
|
1290
|
+
{
|
|
1291
|
+
append: (chunk) => this.appendMarkdownCore(chunk),
|
|
1292
|
+
release: (released) => {
|
|
1293
|
+
if (this.streamController === released) this.streamController = null;
|
|
1294
|
+
}
|
|
1295
|
+
},
|
|
1296
|
+
options
|
|
1297
|
+
);
|
|
1298
|
+
if (controller.state === "open") this.streamController = controller;
|
|
1299
|
+
return controller;
|
|
1300
|
+
}
|
|
853
1301
|
/** Replace all markdown content (full rebuild). */
|
|
854
1302
|
setContent(markdown) {
|
|
1303
|
+
this.streamController?.abort(new Error("Markdown content was replaced"));
|
|
855
1304
|
for (const id of this.pendingWorkerIds) workerCallbacks.delete(id);
|
|
856
1305
|
this.pendingWorkerIds.clear();
|
|
857
1306
|
this.appendInFlight = false;
|
|
@@ -872,6 +1321,7 @@ var Markdown = class extends UIComponent {
|
|
|
872
1321
|
* content subtree via `super.destroy()` so every block's resources are freed.
|
|
873
1322
|
*/
|
|
874
1323
|
destroy() {
|
|
1324
|
+
this.streamController?.destroy();
|
|
875
1325
|
for (const id of this.pendingWorkerIds) workerCallbacks.delete(id);
|
|
876
1326
|
this.pendingWorkerIds.clear();
|
|
877
1327
|
this.appendInFlight = false;
|
|
@@ -886,15 +1336,17 @@ var Markdown = class extends UIComponent {
|
|
|
886
1336
|
* Streaming and parse state — the markdown streaming inspector.
|
|
887
1337
|
*
|
|
888
1338
|
* Source length, chunk count, worker in-flight state, and the stable-prefix
|
|
889
|
-
* versus
|
|
1339
|
+
* versus changed-tail split. That last ratio is the one worth watching: it is
|
|
890
1340
|
* how you tell incremental reuse is working from outside, and nothing else
|
|
891
1341
|
* surfaces it. A ratio near 1 means the worker matched almost the whole prefix
|
|
892
|
-
* and only
|
|
1342
|
+
* and rebuilt only the tail's entities; near 0 means almost nothing was reused.
|
|
1343
|
+
* Neither says anything about lexer CPU, which is O(document) per append — that
|
|
1344
|
+
* is what the Parser cost group reports.
|
|
893
1345
|
*/
|
|
894
1346
|
getDevtoolsDescriptor() {
|
|
895
1347
|
const s = this.streamStats;
|
|
896
|
-
const
|
|
897
|
-
const
|
|
1348
|
+
const diffedTokens = s.tokensPrefixMatched + s.tokensReturned;
|
|
1349
|
+
const tokenPrefixReuseRatio = diffedTokens > 0 ? s.tokensPrefixMatched / diffedTokens : 0;
|
|
898
1350
|
return {
|
|
899
1351
|
kind: "Markdown",
|
|
900
1352
|
groups: [
|
|
@@ -966,7 +1418,7 @@ var Markdown = class extends UIComponent {
|
|
|
966
1418
|
{
|
|
967
1419
|
label: "changedTailChars",
|
|
968
1420
|
value: s.changedTailChars,
|
|
969
|
-
hint: "Source characters
|
|
1421
|
+
hint: "Source characters whose tokens changed on the last append. Growing with the document means the delta is not a delta",
|
|
970
1422
|
readOnly: true
|
|
971
1423
|
},
|
|
972
1424
|
{
|
|
@@ -993,21 +1445,38 @@ var Markdown = class extends UIComponent {
|
|
|
993
1445
|
label: "Incremental reuse",
|
|
994
1446
|
fields: [
|
|
995
1447
|
{
|
|
996
|
-
label: "
|
|
997
|
-
value: s.
|
|
998
|
-
hint: "Sum of matchLen:
|
|
1448
|
+
label: "tokensPrefixMatched",
|
|
1449
|
+
value: s.tokensPrefixMatched,
|
|
1450
|
+
hint: "Sum of matchLen: leading tokens whose raw was unchanged, so their entities were kept",
|
|
999
1451
|
readOnly: true
|
|
1000
1452
|
},
|
|
1001
1453
|
{
|
|
1002
|
-
label: "
|
|
1003
|
-
value: s.
|
|
1004
|
-
hint: "Sum of returned tail lengths:
|
|
1454
|
+
label: "tokensReturned",
|
|
1455
|
+
value: s.tokensReturned,
|
|
1456
|
+
hint: "Sum of returned tail lengths: the changed suffix the worker cloned back",
|
|
1005
1457
|
readOnly: true
|
|
1006
1458
|
},
|
|
1007
1459
|
{
|
|
1008
|
-
label: "
|
|
1009
|
-
value: Math.round(
|
|
1010
|
-
hint: "
|
|
1460
|
+
label: "tokenPrefixReuseRatio",
|
|
1461
|
+
value: Math.round(tokenPrefixReuseRatio * 1e3) / 1e3,
|
|
1462
|
+
hint: "matched / (matched + returned). Near 1 means small transfers and high entity reuse \u2014 NOT less lexing",
|
|
1463
|
+
readOnly: true
|
|
1464
|
+
}
|
|
1465
|
+
]
|
|
1466
|
+
},
|
|
1467
|
+
{
|
|
1468
|
+
label: "Parser cost",
|
|
1469
|
+
fields: [
|
|
1470
|
+
{
|
|
1471
|
+
label: "lexerMs",
|
|
1472
|
+
value: Math.round(s.lexerMs * 10) / 10,
|
|
1473
|
+
hint: "Total ms inside marked.lexer() \u2014 the whole source, every append",
|
|
1474
|
+
readOnly: true
|
|
1475
|
+
},
|
|
1476
|
+
{
|
|
1477
|
+
label: "sourceCharsLexed",
|
|
1478
|
+
value: s.sourceCharsLexed,
|
|
1479
|
+
hint: "Characters lexed, summed over appends. Grows ~O(n^2) across a stream",
|
|
1011
1480
|
readOnly: true
|
|
1012
1481
|
}
|
|
1013
1482
|
]
|
|
@@ -1015,13 +1484,22 @@ var Markdown = class extends UIComponent {
|
|
|
1015
1484
|
],
|
|
1016
1485
|
notes: s.workerResponses === 0 && s.appends > 0 ? [
|
|
1017
1486
|
"No worker responses yet: either the worker is unavailable and parsing ran synchronously on the main thread, or the first request is still in flight."
|
|
1018
|
-
] :
|
|
1019
|
-
`Only ${Math.round(
|
|
1487
|
+
] : tokenPrefixReuseRatio > 0 && tokenPrefixReuseRatio < 0.5 ? [
|
|
1488
|
+
`Only ${Math.round(tokenPrefixReuseRatio * 100)}% of tokens matched the prior prefix, so most of the token array is being returned and its entities rebuilt every chunk. Note the LEXER is O(document) per append regardless \u2014 see lexerMs.`
|
|
1020
1489
|
] : s.changedTailChars > 0 && this.rawMarkdown.length > 0 && s.changedTailChars / this.rawMarkdown.length > 0.5 ? [
|
|
1021
|
-
`The last append
|
|
1490
|
+
`The last append changed ${s.changedTailChars} of ${this.rawMarkdown.length} characters. A changed tail that grows with the document means the delta is not a delta, so almost every entity is rebuilt per chunk.`
|
|
1022
1491
|
] : void 0
|
|
1023
1492
|
};
|
|
1024
1493
|
}
|
|
1494
|
+
/** Enable or disable User Timing for subsequent parses. */
|
|
1495
|
+
setUserTiming(enabled) {
|
|
1496
|
+
this._userTiming = enabled;
|
|
1497
|
+
return this;
|
|
1498
|
+
}
|
|
1499
|
+
/** Whether Markdown parse User Timing is enabled. */
|
|
1500
|
+
get userTiming() {
|
|
1501
|
+
return this._userTiming;
|
|
1502
|
+
}
|
|
1025
1503
|
/** Enable or disable native selection for existing and future Markdown text. */
|
|
1026
1504
|
setSelectable(selectable) {
|
|
1027
1505
|
this.selectable = selectable;
|
|
@@ -1036,11 +1514,15 @@ var Markdown = class extends UIComponent {
|
|
|
1036
1514
|
}
|
|
1037
1515
|
/** Append a markdown chunk incrementally. Reuses unchanged prefix entities. */
|
|
1038
1516
|
appendMarkdown(chunk) {
|
|
1517
|
+
this.streamController?.flush();
|
|
1518
|
+
return this.appendMarkdownCore(chunk);
|
|
1519
|
+
}
|
|
1520
|
+
appendMarkdownCore(chunk) {
|
|
1039
1521
|
this.rawMarkdown += chunk;
|
|
1040
1522
|
this.streamStats.appends++;
|
|
1041
1523
|
if (!markdownWorker) {
|
|
1042
1524
|
this.workerSourceLen = 0;
|
|
1043
|
-
const newTokens =
|
|
1525
|
+
const newTokens = lexMarkdown(this.rawMarkdown, this._userTiming);
|
|
1044
1526
|
this.updateTokens(newTokens);
|
|
1045
1527
|
return this;
|
|
1046
1528
|
}
|
|
@@ -1076,11 +1558,15 @@ var Markdown = class extends UIComponent {
|
|
|
1076
1558
|
const canSendDelta = !resync && this.workerSourceLen > 0 && this.workerSourceLen <= sentLength;
|
|
1077
1559
|
this.pendingWorkerIds.add(id);
|
|
1078
1560
|
workerCallbacks.set(id, {
|
|
1079
|
-
cb: (matchLen, tail, local = false) => {
|
|
1561
|
+
cb: (matchLen, tail, local = false, lex) => {
|
|
1080
1562
|
this.pendingWorkerIds.delete(id);
|
|
1081
1563
|
this.streamStats.workerResponses++;
|
|
1082
|
-
this.streamStats.
|
|
1083
|
-
this.streamStats.
|
|
1564
|
+
this.streamStats.tokensPrefixMatched += matchLen;
|
|
1565
|
+
this.streamStats.tokensReturned += tail.length;
|
|
1566
|
+
if (lex) {
|
|
1567
|
+
this.streamStats.lexerMs += lex.lexerMs;
|
|
1568
|
+
this.streamStats.sourceCharsLexed += lex.sourceCharsLexed;
|
|
1569
|
+
}
|
|
1084
1570
|
const elapsed = now() - dispatchedAt;
|
|
1085
1571
|
this.streamStats.workerMs += elapsed;
|
|
1086
1572
|
if (elapsed > this.streamStats.workerMsMax) this.streamStats.workerMsMax = elapsed;
|
|
@@ -1106,12 +1592,14 @@ var Markdown = class extends UIComponent {
|
|
|
1106
1592
|
this.workerSourceLen = 0;
|
|
1107
1593
|
this.dispatchAppend(true);
|
|
1108
1594
|
},
|
|
1109
|
-
text: this.rawMarkdown
|
|
1595
|
+
text: this.rawMarkdown,
|
|
1596
|
+
userTiming: this._userTiming
|
|
1110
1597
|
});
|
|
1111
1598
|
markdownWorker.postMessage({
|
|
1112
1599
|
id,
|
|
1113
1600
|
instance: this.workerInstanceId,
|
|
1114
1601
|
baseVersion,
|
|
1602
|
+
userTimingName: this._userTiming ? VECTO_USER_TIMING.markdown.parse : void 0,
|
|
1115
1603
|
...canSendDelta ? {
|
|
1116
1604
|
append: this.rawMarkdown.slice(this.workerSourceLen),
|
|
1117
1605
|
// What the worker's source must total once it applies this append. It
|
|
@@ -1197,6 +1685,19 @@ var Markdown = class extends UIComponent {
|
|
|
1197
1685
|
this.onLayoutUpdated();
|
|
1198
1686
|
}
|
|
1199
1687
|
}
|
|
1688
|
+
/**
|
|
1689
|
+
* Render one nested block with a temporary width/margin context while
|
|
1690
|
+
* preserving `renderToken` as the subclass override seam.
|
|
1691
|
+
*/
|
|
1692
|
+
renderTokenWithMetrics(token, metrics) {
|
|
1693
|
+
const previous = this.activeBlockMetrics;
|
|
1694
|
+
this.activeBlockMetrics = metrics;
|
|
1695
|
+
try {
|
|
1696
|
+
return this.renderToken(token);
|
|
1697
|
+
} finally {
|
|
1698
|
+
this.activeBlockMetrics = previous;
|
|
1699
|
+
}
|
|
1700
|
+
}
|
|
1200
1701
|
/**
|
|
1201
1702
|
* Whether {@link renderToken} produces a child entity for this token (vs
|
|
1202
1703
|
* `null`). `updateTokens` maps token indices to child-entity indices, and the
|
|
@@ -1231,6 +1732,13 @@ var Markdown = class extends UIComponent {
|
|
|
1231
1732
|
renderToken(token) {
|
|
1232
1733
|
const t = this.theme;
|
|
1233
1734
|
const bodyFont = `${t.fontSize}px ${t.bodyFont}`;
|
|
1735
|
+
const metrics = this.activeBlockMetrics ?? {
|
|
1736
|
+
marginBefore: 0,
|
|
1737
|
+
marginAfter: 0,
|
|
1738
|
+
indentStart: 0,
|
|
1739
|
+
availableWidth: this.maxWidth
|
|
1740
|
+
};
|
|
1741
|
+
const availableWidth = metrics.availableWidth;
|
|
1234
1742
|
switch (token.type) {
|
|
1235
1743
|
// ── Headings ─────────────────────────────────────────────────────
|
|
1236
1744
|
case "heading": {
|
|
@@ -1243,7 +1751,7 @@ var Markdown = class extends UIComponent {
|
|
|
1243
1751
|
hToken.text,
|
|
1244
1752
|
headingFont,
|
|
1245
1753
|
t.headingColor,
|
|
1246
|
-
|
|
1754
|
+
availableWidth,
|
|
1247
1755
|
t,
|
|
1248
1756
|
this.selectable,
|
|
1249
1757
|
this.onLinkClick
|
|
@@ -1258,7 +1766,7 @@ var Markdown = class extends UIComponent {
|
|
|
1258
1766
|
pToken.text,
|
|
1259
1767
|
bodyFont,
|
|
1260
1768
|
t.textColor,
|
|
1261
|
-
|
|
1769
|
+
availableWidth,
|
|
1262
1770
|
t,
|
|
1263
1771
|
this.selectable,
|
|
1264
1772
|
this.onLinkClick
|
|
@@ -1267,7 +1775,7 @@ var Markdown = class extends UIComponent {
|
|
|
1267
1775
|
const stack = new Stack({
|
|
1268
1776
|
direction: "vertical",
|
|
1269
1777
|
gap: 16,
|
|
1270
|
-
maxWidth:
|
|
1778
|
+
maxWidth: availableWidth
|
|
1271
1779
|
});
|
|
1272
1780
|
let currentTokens = [];
|
|
1273
1781
|
const flushText = () => {
|
|
@@ -1278,7 +1786,7 @@ var Markdown = class extends UIComponent {
|
|
|
1278
1786
|
"",
|
|
1279
1787
|
bodyFont,
|
|
1280
1788
|
t.textColor,
|
|
1281
|
-
|
|
1789
|
+
availableWidth,
|
|
1282
1790
|
t,
|
|
1283
1791
|
this.selectable,
|
|
1284
1792
|
this.onLinkClick
|
|
@@ -1291,7 +1799,7 @@ var Markdown = class extends UIComponent {
|
|
|
1291
1799
|
if (child.type === "image") {
|
|
1292
1800
|
flushText();
|
|
1293
1801
|
const imgToken = child;
|
|
1294
|
-
const initialWidth = Math.min(800,
|
|
1802
|
+
const initialWidth = Math.min(800, availableWidth);
|
|
1295
1803
|
const initialHeight = Math.round(initialWidth * 0.6);
|
|
1296
1804
|
const img = new Image(imgToken.href, {
|
|
1297
1805
|
width: initialWidth,
|
|
@@ -1302,7 +1810,7 @@ var Markdown = class extends UIComponent {
|
|
|
1302
1810
|
const bmp = img.bitmap;
|
|
1303
1811
|
if (bmp && bmp.naturalWidth && bmp.naturalHeight) {
|
|
1304
1812
|
const aspect = bmp.naturalHeight / bmp.naturalWidth;
|
|
1305
|
-
img.width = Math.min(bmp.naturalWidth,
|
|
1813
|
+
img.width = Math.min(bmp.naturalWidth, availableWidth);
|
|
1306
1814
|
img.height = Math.round(img.width * aspect);
|
|
1307
1815
|
if (this.scene) this.scene.markDirty();
|
|
1308
1816
|
}
|
|
@@ -1324,8 +1832,8 @@ var Markdown = class extends UIComponent {
|
|
|
1324
1832
|
const mathData = renderMathToSVGDataURI(codeToken.text, true);
|
|
1325
1833
|
if (mathData) {
|
|
1326
1834
|
const mathImg = new Image(mathData.uri, {
|
|
1327
|
-
width: Math.min(
|
|
1328
|
-
height: mathData.height * Math.min(1,
|
|
1835
|
+
width: Math.min(availableWidth, mathData.width),
|
|
1836
|
+
height: mathData.height * Math.min(1, availableWidth / mathData.width),
|
|
1329
1837
|
alt: codeToken.text
|
|
1330
1838
|
});
|
|
1331
1839
|
const wrapper = new MarkdownContainer();
|
|
@@ -1337,20 +1845,27 @@ var Markdown = class extends UIComponent {
|
|
|
1337
1845
|
return wrapper;
|
|
1338
1846
|
}
|
|
1339
1847
|
}
|
|
1340
|
-
return new CodeBlock(codeToken.text, lang,
|
|
1848
|
+
return new CodeBlock(codeToken.text, lang, availableWidth, t, this.selectable);
|
|
1341
1849
|
}
|
|
1342
1850
|
// ── Blockquotes ──────────────────────────────────────────────────
|
|
1343
1851
|
case "blockquote": {
|
|
1344
1852
|
const bqToken = token;
|
|
1345
1853
|
const innerStack = new Stack({ direction: "vertical", gap: 8 });
|
|
1854
|
+
const indentStart = Math.min(16, availableWidth);
|
|
1855
|
+
const childMetrics = {
|
|
1856
|
+
marginBefore: 0,
|
|
1857
|
+
marginAfter: 0,
|
|
1858
|
+
indentStart,
|
|
1859
|
+
availableWidth: Math.max(0, availableWidth - indentStart)
|
|
1860
|
+
};
|
|
1346
1861
|
if (bqToken.tokens) {
|
|
1347
1862
|
for (const inner of bqToken.tokens) {
|
|
1348
|
-
const el = this.
|
|
1863
|
+
const el = this.renderTokenWithMetrics(inner, childMetrics);
|
|
1349
1864
|
if (el) {
|
|
1350
1865
|
const wrapper = new MarkdownContainer();
|
|
1351
|
-
el.x =
|
|
1866
|
+
el.x = childMetrics.indentStart;
|
|
1352
1867
|
wrapper.add(el);
|
|
1353
|
-
wrapper.width = el.width +
|
|
1868
|
+
wrapper.width = el.width + childMetrics.indentStart;
|
|
1354
1869
|
wrapper.height = el.height;
|
|
1355
1870
|
innerStack.add(wrapper);
|
|
1356
1871
|
}
|
|
@@ -1364,7 +1879,7 @@ var Markdown = class extends UIComponent {
|
|
|
1364
1879
|
innerStack.y = 0;
|
|
1365
1880
|
innerStack.x = 0;
|
|
1366
1881
|
container.add(innerStack);
|
|
1367
|
-
container.width =
|
|
1882
|
+
container.width = availableWidth;
|
|
1368
1883
|
container.height = Math.max(border.height, innerStack.height);
|
|
1369
1884
|
return container;
|
|
1370
1885
|
}
|
|
@@ -1396,7 +1911,7 @@ var Markdown = class extends UIComponent {
|
|
|
1396
1911
|
const itemRt = new RichText(itemSpans, {
|
|
1397
1912
|
font: bodyFont,
|
|
1398
1913
|
color: t.textColor,
|
|
1399
|
-
maxWidth:
|
|
1914
|
+
maxWidth: Math.max(0, availableWidth - 24),
|
|
1400
1915
|
linkColor: "#38bdf8",
|
|
1401
1916
|
selectable: this.selectable,
|
|
1402
1917
|
onLinkClick: this.onLinkClick
|
|
@@ -1427,7 +1942,7 @@ var Markdown = class extends UIComponent {
|
|
|
1427
1942
|
return new Table({
|
|
1428
1943
|
headers,
|
|
1429
1944
|
rows,
|
|
1430
|
-
width:
|
|
1945
|
+
width: availableWidth,
|
|
1431
1946
|
textColor: t.textColor,
|
|
1432
1947
|
headerTextColor: t.headingColor,
|
|
1433
1948
|
font: `${t.fontSize - 2}px ${t.bodyFont}`,
|
|
@@ -1439,7 +1954,7 @@ var Markdown = class extends UIComponent {
|
|
|
1439
1954
|
}
|
|
1440
1955
|
// ── Horizontal rule ──────────────────────────────────────────────
|
|
1441
1956
|
case "hr":
|
|
1442
|
-
return new HorizontalRule(
|
|
1957
|
+
return new HorizontalRule(availableWidth, t.hrColor);
|
|
1443
1958
|
// ── Whitespace ───────────────────────────────────────────────────
|
|
1444
1959
|
case "space":
|
|
1445
1960
|
return null;
|
|
@@ -1457,7 +1972,7 @@ var Markdown = class extends UIComponent {
|
|
|
1457
1972
|
return new Text(token.text, {
|
|
1458
1973
|
font: bodyFont,
|
|
1459
1974
|
color: t.textColor,
|
|
1460
|
-
maxWidth:
|
|
1975
|
+
maxWidth: availableWidth,
|
|
1461
1976
|
lineHeight: 24,
|
|
1462
1977
|
selectable: this.selectable
|
|
1463
1978
|
});
|