stream-markdown-parser 0.0.19 → 0.0.21
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/dist/index.d.ts.map +1 -1
- package/dist/index.js +291 -66
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/factory.ts","../src/types.ts","../src/parser/inline-parsers/index.ts","../src/parser/index.ts","../src/config.ts","../src/findMatchingClose.ts","../src/parser/inline-parsers/fence-parser.ts","../src/plugins/containers.ts","../src/plugins/isMathLike.ts","../src/plugins/math.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/factory.ts","../src/types.ts","../src/parser/inline-parsers/index.ts","../src/parser/index.ts","../src/config.ts","../src/findMatchingClose.ts","../src/parser/inline-parsers/fence-parser.ts","../src/plugins/containers.ts","../src/plugins/isMathLike.ts","../src/plugins/math.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -77,25 +77,25 @@ function applyContainers(md) {
|
|
|
77
77
|
|
|
78
78
|
//#endregion
|
|
79
79
|
//#region src/plugins/fixHtmlInline.ts
|
|
80
|
+
const VOID_TAGS$1 = new Set([
|
|
81
|
+
"area",
|
|
82
|
+
"base",
|
|
83
|
+
"br",
|
|
84
|
+
"col",
|
|
85
|
+
"embed",
|
|
86
|
+
"hr",
|
|
87
|
+
"img",
|
|
88
|
+
"input",
|
|
89
|
+
"link",
|
|
90
|
+
"meta",
|
|
91
|
+
"param",
|
|
92
|
+
"source",
|
|
93
|
+
"track",
|
|
94
|
+
"wbr"
|
|
95
|
+
]);
|
|
80
96
|
function applyFixHtmlInlineTokens(md) {
|
|
81
97
|
md.core.ruler.push("fix_html_inline_tokens", (state) => {
|
|
82
98
|
const toks = state.tokens ?? [];
|
|
83
|
-
const VOID_TAGS = new Set([
|
|
84
|
-
"area",
|
|
85
|
-
"base",
|
|
86
|
-
"br",
|
|
87
|
-
"col",
|
|
88
|
-
"embed",
|
|
89
|
-
"hr",
|
|
90
|
-
"img",
|
|
91
|
-
"input",
|
|
92
|
-
"link",
|
|
93
|
-
"meta",
|
|
94
|
-
"param",
|
|
95
|
-
"source",
|
|
96
|
-
"track",
|
|
97
|
-
"wbr"
|
|
98
|
-
]);
|
|
99
99
|
for (let i = 0; i < toks.length; i++) {
|
|
100
100
|
const t = toks[i];
|
|
101
101
|
if (!t || t.type !== "inline") continue;
|
|
@@ -116,7 +116,7 @@ function applyFixHtmlInlineTokens(md) {
|
|
|
116
116
|
const raw = String(t.content);
|
|
117
117
|
const tagName = raw.match(/<([^\s>/]+)/)?.[1]?.toLowerCase() ?? "";
|
|
118
118
|
if (!tagName) continue;
|
|
119
|
-
const isVoid = /\/\s*>\s*$/.test(raw) || VOID_TAGS.has(tagName);
|
|
119
|
+
const isVoid = /\/\s*>\s*$/.test(raw) || VOID_TAGS$1.has(tagName);
|
|
120
120
|
const htmlToken = t;
|
|
121
121
|
if (isVoid) {
|
|
122
122
|
htmlToken.children = [{
|
|
@@ -132,6 +132,7 @@ function applyFixHtmlInlineTokens(md) {
|
|
|
132
132
|
|
|
133
133
|
//#endregion
|
|
134
134
|
//#region src/plugins/fixLinkInline.ts
|
|
135
|
+
const LINK_PREFIX_RE = /^\[([^\]]*)\]\(([^)\s]*)/;
|
|
135
136
|
function applyFixLinkInline(md) {
|
|
136
137
|
const rule = (state, silent) => {
|
|
137
138
|
const s = state;
|
|
@@ -139,7 +140,7 @@ function applyFixLinkInline(md) {
|
|
|
139
140
|
if (s.src[start] !== "[") return false;
|
|
140
141
|
if (start > 0 && s.src[start - 1] === "!") return false;
|
|
141
142
|
const rest = s.src.slice(start);
|
|
142
|
-
const m =
|
|
143
|
+
const m = LINK_PREFIX_RE.exec(rest);
|
|
143
144
|
if (!m) return false;
|
|
144
145
|
if (silent) return true;
|
|
145
146
|
const text = m[1] ?? "";
|
|
@@ -180,8 +181,8 @@ function isTextToken(t) {
|
|
|
180
181
|
}
|
|
181
182
|
function fixLinkToken(tokens) {
|
|
182
183
|
const tokensAny = tokens;
|
|
183
|
-
tokens = fixLinkToken4(
|
|
184
|
-
if (tokens.length < 5) return tokens;
|
|
184
|
+
tokens = fixLinkToken4(fixLinkToken6(tokens));
|
|
185
|
+
if (tokens.length < 5) return fixLinkToken3(tokens);
|
|
185
186
|
const first = tokens[tokens.length - 5];
|
|
186
187
|
const firstAny = first;
|
|
187
188
|
const firstContent = String(firstAny.content ?? "");
|
|
@@ -256,7 +257,7 @@ function fixLinkToken3(tokens) {
|
|
|
256
257
|
const preLast = tokens[tokens.length - 2];
|
|
257
258
|
const fixedTokens = [...tokens];
|
|
258
259
|
if (!last) return tokens;
|
|
259
|
-
if (last.type !== "text" || !last.content?.startsWith(")")) return tokens;
|
|
260
|
+
if (last.type !== "text" || !last.content?.startsWith(")")) return fixLinkToken5(tokens);
|
|
260
261
|
if (preLast.type !== "link_close") return tokens;
|
|
261
262
|
if (isTextToken(tokens[tokens.length - 5]) && String(tokens[tokens.length - 5].content ?? "").endsWith("(")) {
|
|
262
263
|
const a = tokensAny[tokens.length - 5];
|
|
@@ -315,6 +316,152 @@ function fixLinkToken4(tokens) {
|
|
|
315
316
|
}
|
|
316
317
|
return fixedTokens;
|
|
317
318
|
}
|
|
319
|
+
function fixLinkToken5(tokens) {
|
|
320
|
+
const firstToken = tokens[0];
|
|
321
|
+
const nextToken = tokens[1];
|
|
322
|
+
if (firstToken.type === "text" && firstToken.content?.endsWith("(") && nextToken.type === "link_open") {
|
|
323
|
+
const linkText = firstToken.content.match(/\[([^\]]+)\]/)?.[1] || "";
|
|
324
|
+
const href = tokens[2]?.content || "";
|
|
325
|
+
const newTokens = [{
|
|
326
|
+
type: "link",
|
|
327
|
+
loading: true,
|
|
328
|
+
href,
|
|
329
|
+
title: "",
|
|
330
|
+
text: linkText,
|
|
331
|
+
children: [{
|
|
332
|
+
type: "text",
|
|
333
|
+
content: linkText,
|
|
334
|
+
raw: linkText
|
|
335
|
+
}],
|
|
336
|
+
raw: String(`[${linkText}](${href})`)
|
|
337
|
+
}];
|
|
338
|
+
tokens.splice(0, 4, ...newTokens);
|
|
339
|
+
}
|
|
340
|
+
return tokens;
|
|
341
|
+
}
|
|
342
|
+
function fixLinkToken6(tokens) {
|
|
343
|
+
if (tokens.length < 4) return tokens;
|
|
344
|
+
for (let i = 0; i <= tokens.length - 4; i++) if (tokens[i]?.type === "text" && tokens[i].content?.endsWith("(") && tokens[i + 1]?.type === "link_open") {
|
|
345
|
+
const match = tokens[i].content.match(/\[([^\]]+)\]/);
|
|
346
|
+
if (match) {
|
|
347
|
+
let beforeText = tokens[i].content.slice(0, match.index);
|
|
348
|
+
const emphasisMatch = beforeText.match(/(\*+)$/);
|
|
349
|
+
const replacerTokens = [];
|
|
350
|
+
if (emphasisMatch) {
|
|
351
|
+
beforeText = beforeText.slice(0, emphasisMatch.index);
|
|
352
|
+
if (beforeText) replacerTokens.push({
|
|
353
|
+
type: "text",
|
|
354
|
+
content: beforeText,
|
|
355
|
+
raw: beforeText
|
|
356
|
+
});
|
|
357
|
+
const text = match[1];
|
|
358
|
+
const type = emphasisMatch[1].length;
|
|
359
|
+
if (type === 1) replacerTokens.push({
|
|
360
|
+
type: "em_open",
|
|
361
|
+
tag: "em",
|
|
362
|
+
nesting: 1
|
|
363
|
+
});
|
|
364
|
+
else if (type === 2) replacerTokens.push({
|
|
365
|
+
type: "strong_open",
|
|
366
|
+
tag: "strong",
|
|
367
|
+
nesting: 1
|
|
368
|
+
});
|
|
369
|
+
else if (type === 3) {
|
|
370
|
+
replacerTokens.push({
|
|
371
|
+
type: "strong_open",
|
|
372
|
+
tag: "strong",
|
|
373
|
+
nesting: 1
|
|
374
|
+
});
|
|
375
|
+
replacerTokens.push({
|
|
376
|
+
type: "em_open",
|
|
377
|
+
tag: "em",
|
|
378
|
+
nesting: 1
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
let href = tokens[i + 2]?.content || "";
|
|
382
|
+
if (tokens[i + 4]?.type === "text" && !tokens[i + 4].content?.startsWith(")")) {
|
|
383
|
+
href += tokens[i + 4]?.content || "";
|
|
384
|
+
tokens[i + 4].content = "";
|
|
385
|
+
}
|
|
386
|
+
replacerTokens.push({
|
|
387
|
+
type: "link",
|
|
388
|
+
loading: !tokens[i + 4]?.content?.startsWith(")"),
|
|
389
|
+
href,
|
|
390
|
+
title: "",
|
|
391
|
+
text,
|
|
392
|
+
children: [{
|
|
393
|
+
type: "text",
|
|
394
|
+
content: text,
|
|
395
|
+
raw: text
|
|
396
|
+
}],
|
|
397
|
+
raw: String(`[${text}](${tokens[i + 2]?.content || ""})`)
|
|
398
|
+
});
|
|
399
|
+
if (type === 1) replacerTokens.push({
|
|
400
|
+
type: "em_close",
|
|
401
|
+
tag: "em",
|
|
402
|
+
nesting: -1
|
|
403
|
+
});
|
|
404
|
+
else if (type === 2) replacerTokens.push({
|
|
405
|
+
type: "strong_close",
|
|
406
|
+
tag: "strong",
|
|
407
|
+
nesting: -1
|
|
408
|
+
});
|
|
409
|
+
else if (type === 3) {
|
|
410
|
+
replacerTokens.push({
|
|
411
|
+
type: "em_close",
|
|
412
|
+
tag: "em",
|
|
413
|
+
nesting: -1
|
|
414
|
+
});
|
|
415
|
+
replacerTokens.push({
|
|
416
|
+
type: "strong_close",
|
|
417
|
+
tag: "strong",
|
|
418
|
+
nesting: -1
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
if (tokens[i + 4]?.type === "text") {
|
|
422
|
+
const afterText = tokens[i + 4].content?.replace(/^\)\**/, "");
|
|
423
|
+
if (afterText) replacerTokens.push({
|
|
424
|
+
type: "text",
|
|
425
|
+
content: afterText,
|
|
426
|
+
raw: afterText
|
|
427
|
+
});
|
|
428
|
+
tokens.splice(i, 5, ...replacerTokens);
|
|
429
|
+
} else tokens.splice(i, 4, ...replacerTokens);
|
|
430
|
+
} else {
|
|
431
|
+
if (beforeText) replacerTokens.push({
|
|
432
|
+
type: "text",
|
|
433
|
+
content: beforeText,
|
|
434
|
+
raw: beforeText
|
|
435
|
+
});
|
|
436
|
+
const text = match[1];
|
|
437
|
+
replacerTokens.push(...[{
|
|
438
|
+
type: "link",
|
|
439
|
+
loading: true,
|
|
440
|
+
href: tokens[i + 2]?.content || "",
|
|
441
|
+
title: "",
|
|
442
|
+
text,
|
|
443
|
+
children: [{
|
|
444
|
+
type: "text",
|
|
445
|
+
content: text,
|
|
446
|
+
raw: text
|
|
447
|
+
}],
|
|
448
|
+
raw: String(`[${text}](${tokens[i + 2]?.content || ""})`)
|
|
449
|
+
}]);
|
|
450
|
+
if (tokens[i + 4]?.type === "text") {
|
|
451
|
+
const afterText = tokens[i + 4].content?.replace(/^\)/, "");
|
|
452
|
+
if (afterText) replacerTokens.push({
|
|
453
|
+
type: "text",
|
|
454
|
+
content: afterText,
|
|
455
|
+
raw: afterText
|
|
456
|
+
});
|
|
457
|
+
tokens.splice(i, 5, ...replacerTokens);
|
|
458
|
+
} else tokens.splice(i, 4, ...replacerTokens);
|
|
459
|
+
}
|
|
460
|
+
i -= replacerTokens.length - 1;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return tokens;
|
|
464
|
+
}
|
|
318
465
|
|
|
319
466
|
//#endregion
|
|
320
467
|
//#region src/plugins/fixListItem.ts
|
|
@@ -360,7 +507,42 @@ function fixStrongTokens(tokens) {
|
|
|
360
507
|
const token = tokens[i];
|
|
361
508
|
const nextToken = tokens[i + 1];
|
|
362
509
|
const tokenContent = String(token.content ?? "");
|
|
363
|
-
if (token.type === "
|
|
510
|
+
if (token.type === "link_open" && tokens[i - 1].type === "em_open" && tokens[i - 2].type === "text" && tokens[i - 2].content?.endsWith("*")) {
|
|
511
|
+
const textContent = String(tokens[i - 2].content ?? "").slice(0, -1);
|
|
512
|
+
const replaceTokens = [
|
|
513
|
+
{
|
|
514
|
+
type: "strong_open",
|
|
515
|
+
tag: "strong",
|
|
516
|
+
attrs: null,
|
|
517
|
+
map: null,
|
|
518
|
+
children: null,
|
|
519
|
+
content: "",
|
|
520
|
+
markup: "**",
|
|
521
|
+
info: "",
|
|
522
|
+
meta: null
|
|
523
|
+
},
|
|
524
|
+
tokens[i],
|
|
525
|
+
tokens[i + 1],
|
|
526
|
+
tokens[i + 2],
|
|
527
|
+
{
|
|
528
|
+
type: "strong_close",
|
|
529
|
+
tag: "strong",
|
|
530
|
+
attrs: null,
|
|
531
|
+
map: null,
|
|
532
|
+
children: null,
|
|
533
|
+
content: "",
|
|
534
|
+
markup: "**",
|
|
535
|
+
info: "",
|
|
536
|
+
meta: null
|
|
537
|
+
}
|
|
538
|
+
];
|
|
539
|
+
if (textContent) replaceTokens.unshift({
|
|
540
|
+
type: "text",
|
|
541
|
+
content: textContent,
|
|
542
|
+
raw: textContent
|
|
543
|
+
});
|
|
544
|
+
fixedTokens.splice(i - 2, 6, ...replaceTokens);
|
|
545
|
+
} else if (token.type === "text" && tokenContent.endsWith("*") && nextToken.type === "em_open") {
|
|
364
546
|
const _nextToken = tokens[i + 2];
|
|
365
547
|
const count = _nextToken?.type === "text" ? 4 : 3;
|
|
366
548
|
const insert = [
|
|
@@ -713,6 +895,36 @@ const KATEX_COMMANDS = [
|
|
|
713
895
|
];
|
|
714
896
|
const ESCAPED_KATEX_COMMANDS = KATEX_COMMANDS.slice().sort((a, b) => b.length - a.length).map((c) => c.replace(/[.*+?^${}()|[\\]\\\]/g, "\\$&")).join("|");
|
|
715
897
|
const CONTROL_CHARS_CLASS = "[ \r\b\f\v]";
|
|
898
|
+
const SPAN_CURLY_RE = /span\{([^}]+)\}/;
|
|
899
|
+
const OPERATORNAME_SPAN_RE = /\\operatorname\{span\}\{((?:[^{}]|\{[^}]*\})+)\}/;
|
|
900
|
+
const SINGLE_BACKSLASH_NEWLINE_RE = /(^|[^\\])\\\r?\n/g;
|
|
901
|
+
const ENDING_SINGLE_BACKSLASH_RE = /(^|[^\\])\\$/g;
|
|
902
|
+
const DEFAULT_MATH_RE = new RegExp(`${CONTROL_CHARS_CLASS}|(?<!\\\\|\\w)(${ESCAPED_KATEX_COMMANDS})\\b`, "g");
|
|
903
|
+
const MATH_RE_CACHE = /* @__PURE__ */ new Map();
|
|
904
|
+
const BRACE_CMD_RE_CACHE = /* @__PURE__ */ new Map();
|
|
905
|
+
function getMathRegex(commands) {
|
|
906
|
+
if (!commands) return DEFAULT_MATH_RE;
|
|
907
|
+
const arr = [...commands];
|
|
908
|
+
arr.sort((a, b) => b.length - a.length);
|
|
909
|
+
const key = arr.join("");
|
|
910
|
+
const cached = MATH_RE_CACHE.get(key);
|
|
911
|
+
if (cached) return cached;
|
|
912
|
+
const commandPattern = `(?:${arr.map((c) => c.replace(/[.*+?^${}()|[\\]\\"\]/g, "\\$&")).join("|")})`;
|
|
913
|
+
const re = new RegExp(`${CONTROL_CHARS_CLASS}|(?<!\\\\|\\w)(${commandPattern})\\b`, "g");
|
|
914
|
+
MATH_RE_CACHE.set(key, re);
|
|
915
|
+
return re;
|
|
916
|
+
}
|
|
917
|
+
function getBraceCmdRegex(useDefault, commands) {
|
|
918
|
+
const arr = useDefault ? [] : [...commands ?? []];
|
|
919
|
+
if (!useDefault) arr.sort((a, b) => b.length - a.length);
|
|
920
|
+
const key = useDefault ? "__default__" : arr.join("");
|
|
921
|
+
const cached = BRACE_CMD_RE_CACHE.get(key);
|
|
922
|
+
if (cached) return cached;
|
|
923
|
+
const braceEscaped = useDefault ? [ESCAPED_TEX_BRACE_COMMANDS, ESCAPED_KATEX_COMMANDS].filter(Boolean).join("|") : [arr.map((c) => c.replace(/[.*+?^${}()|[\\]\\\]/g, "\\$&")).join("|"), ESCAPED_TEX_BRACE_COMMANDS].filter(Boolean).join("|");
|
|
924
|
+
const re = new RegExp(`(^|[^\\\\\\w])(${braceEscaped})\\s*\\{`, "g");
|
|
925
|
+
BRACE_CMD_RE_CACHE.set(key, re);
|
|
926
|
+
return re;
|
|
927
|
+
}
|
|
716
928
|
const CONTROL_MAP = {
|
|
717
929
|
" ": "t",
|
|
718
930
|
"\r": "r",
|
|
@@ -730,27 +942,19 @@ function normalizeStandaloneBackslashT(s, opts) {
|
|
|
730
942
|
const commands = opts?.commands ?? KATEX_COMMANDS;
|
|
731
943
|
const escapeExclamation = opts?.escapeExclamation ?? true;
|
|
732
944
|
const useDefault = opts?.commands == null;
|
|
733
|
-
|
|
734
|
-
if (useDefault) re = new RegExp(`${CONTROL_CHARS_CLASS}|(?<!\\\\|\\w)(${ESCAPED_KATEX_COMMANDS})\\b`, "g");
|
|
735
|
-
else {
|
|
736
|
-
const commandPattern = `(?:${commands.slice().sort((a, b) => b.length - a.length).map((c) => c.replace(/[.*+?^${}()|[\\]\\"\]/g, "\\$&")).join("|")})`;
|
|
737
|
-
re = new RegExp(`${CONTROL_CHARS_CLASS}|(?<!\\\\|\\w)(${commandPattern})\\b`, "g");
|
|
738
|
-
}
|
|
945
|
+
const re = getMathRegex(useDefault ? void 0 : commands);
|
|
739
946
|
let out = s.replace(re, (m, cmd) => {
|
|
740
947
|
if (CONTROL_MAP[m] !== void 0) return `\\${CONTROL_MAP[m]}`;
|
|
741
948
|
if (cmd && commands.includes(cmd)) return `\\${cmd}`;
|
|
742
949
|
return m;
|
|
743
950
|
});
|
|
744
951
|
if (escapeExclamation) out = out.replace(/(^|[^\\])!/g, "$1\\!");
|
|
745
|
-
const braceEscaped = useDefault ? [ESCAPED_TEX_BRACE_COMMANDS, ESCAPED_KATEX_COMMANDS].filter(Boolean).join("|") : [commands.map((c) => c.replace(/[.*+?^${}()|[\\]\\\]/g, "\\$&")).join("|"), ESCAPED_TEX_BRACE_COMMANDS].filter(Boolean).join("|");
|
|
746
952
|
let result = out;
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
result = result.replace(
|
|
752
|
-
result = result.replace(/(^|[^\\])\\\r?\n/g, "$1\\\\\n");
|
|
753
|
-
result = result.replace(/(^|[^\\])\\$/g, "$1\\\\");
|
|
953
|
+
const braceCmdRe = getBraceCmdRegex(useDefault, useDefault ? void 0 : commands);
|
|
954
|
+
result = result.replace(braceCmdRe, (_m, p1, p2) => `${p1}\\${p2}{`);
|
|
955
|
+
result = result.replace(SPAN_CURLY_RE, "span\\{$1\\}").replace(OPERATORNAME_SPAN_RE, "\\operatorname{span}\\{$1\\}");
|
|
956
|
+
result = result.replace(SINGLE_BACKSLASH_NEWLINE_RE, "$1\\\\\n");
|
|
957
|
+
result = result.replace(ENDING_SINGLE_BACKSLASH_RE, "$1\\\\");
|
|
754
958
|
return result;
|
|
755
959
|
}
|
|
756
960
|
function applyMath(md, mathOpts) {
|
|
@@ -1103,14 +1307,23 @@ function parseEmphasisToken(tokens, startIndex) {
|
|
|
1103
1307
|
|
|
1104
1308
|
//#endregion
|
|
1105
1309
|
//#region src/parser/inline-parsers/fence-parser.ts
|
|
1310
|
+
const TRAILING_FENCE_LINE_RE = /\r?\n[ \t]*`+\s*$/;
|
|
1311
|
+
const DIFF_HEADER_PREFIXES = [
|
|
1312
|
+
"diff ",
|
|
1313
|
+
"index ",
|
|
1314
|
+
"--- ",
|
|
1315
|
+
"+++ ",
|
|
1316
|
+
"@@ "
|
|
1317
|
+
];
|
|
1318
|
+
const NEWLINE_RE = /\r?\n/;
|
|
1106
1319
|
function splitUnifiedDiff(content) {
|
|
1107
1320
|
const orig = [];
|
|
1108
1321
|
const updated = [];
|
|
1109
|
-
for (const rawLine of content.split(
|
|
1322
|
+
for (const rawLine of content.split(NEWLINE_RE)) {
|
|
1110
1323
|
const line = rawLine;
|
|
1111
|
-
if (
|
|
1112
|
-
if (line.
|
|
1113
|
-
else if (line.
|
|
1324
|
+
if (DIFF_HEADER_PREFIXES.some((p) => line.startsWith(p))) continue;
|
|
1325
|
+
if (line.length >= 2 && line[0] === "-" && line[1] === " ") orig.push(` ${line.slice(1)}`);
|
|
1326
|
+
else if (line.length >= 2 && line[0] === "+" && line[1] === " ") updated.push(` ${line.slice(1)}`);
|
|
1114
1327
|
else {
|
|
1115
1328
|
orig.push(line);
|
|
1116
1329
|
updated.push(line);
|
|
@@ -1127,10 +1340,13 @@ function parseFenceToken(token) {
|
|
|
1127
1340
|
const closed = typeof tokenMeta.closed === "boolean" ? tokenMeta.closed : void 0;
|
|
1128
1341
|
const info = String(token.info ?? "");
|
|
1129
1342
|
const diff = info.startsWith("diff");
|
|
1130
|
-
const language = diff ?
|
|
1343
|
+
const language = diff ? (() => {
|
|
1344
|
+
const s = info;
|
|
1345
|
+
const sp = s.indexOf(" ");
|
|
1346
|
+
return sp === -1 ? "" : String(s.slice(sp + 1) ?? "");
|
|
1347
|
+
})() : info;
|
|
1131
1348
|
let content = String(token.content ?? "");
|
|
1132
|
-
|
|
1133
|
-
if (trailingFenceLine.test(content)) content = content.replace(trailingFenceLine, "");
|
|
1349
|
+
if (TRAILING_FENCE_LINE_RE.test(content)) content = content.replace(TRAILING_FENCE_LINE_RE, "");
|
|
1134
1350
|
if (diff) {
|
|
1135
1351
|
const { original, updated } = splitUnifiedDiff(content);
|
|
1136
1352
|
return {
|
|
@@ -1333,11 +1549,12 @@ function parseLinkToken(tokens, startIndex) {
|
|
|
1333
1549
|
const title = _title === null ? null : String(_title);
|
|
1334
1550
|
let i = startIndex + 1;
|
|
1335
1551
|
const linkTokens = [];
|
|
1336
|
-
|
|
1552
|
+
let loading = true;
|
|
1337
1553
|
while (i < tokens.length && tokens[i].type !== "link_close") {
|
|
1338
1554
|
linkTokens.push(tokens[i]);
|
|
1339
1555
|
i++;
|
|
1340
1556
|
}
|
|
1557
|
+
if (tokens[i]?.type === "link_close") loading = false;
|
|
1341
1558
|
const children = parseInlineTokens(linkTokens);
|
|
1342
1559
|
const linkText = children.map((node) => {
|
|
1343
1560
|
const nodeAny = node;
|
|
@@ -1494,6 +1711,10 @@ function parseTextToken(token) {
|
|
|
1494
1711
|
|
|
1495
1712
|
//#endregion
|
|
1496
1713
|
//#region src/parser/inline-parsers/index.ts
|
|
1714
|
+
const STRONG_PAIR_RE = /\*\*([\s\S]*?)\*\*/;
|
|
1715
|
+
function escapeRegExp(str) {
|
|
1716
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1717
|
+
}
|
|
1497
1718
|
const AUTOLINK_PROTOCOL_RE = /^(?:https?:\/\/|mailto:|ftp:\/\/)/i;
|
|
1498
1719
|
const AUTOLINK_GENERIC_RE = /:\/\//;
|
|
1499
1720
|
function isLikelyUrl(href) {
|
|
@@ -1563,7 +1784,7 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1563
1784
|
i++;
|
|
1564
1785
|
return true;
|
|
1565
1786
|
}
|
|
1566
|
-
const exec =
|
|
1787
|
+
const exec = STRONG_PAIR_RE.exec(content);
|
|
1567
1788
|
let inner = "";
|
|
1568
1789
|
let after = "";
|
|
1569
1790
|
if (exec && typeof exec.index === "number") {
|
|
@@ -1932,9 +2153,6 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1932
2153
|
function handleLinkOpen(token) {
|
|
1933
2154
|
resetCurrentTextNode();
|
|
1934
2155
|
const href = token.attrs?.find(([name]) => name === "href")?.[1];
|
|
1935
|
-
function escapeRegExp(str) {
|
|
1936
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1937
|
-
}
|
|
1938
2156
|
if (raw && tokens[i + 1].type === "text") {
|
|
1939
2157
|
const text = String(tokens[i + 1]?.content ?? "");
|
|
1940
2158
|
const escText = escapeRegExp(text);
|
|
@@ -2580,6 +2798,23 @@ function parseHardBreak() {
|
|
|
2580
2798
|
|
|
2581
2799
|
//#endregion
|
|
2582
2800
|
//#region src/parser/node-parsers/html-block-parser.ts
|
|
2801
|
+
const VOID_TAGS = new Set([
|
|
2802
|
+
"area",
|
|
2803
|
+
"base",
|
|
2804
|
+
"br",
|
|
2805
|
+
"col",
|
|
2806
|
+
"embed",
|
|
2807
|
+
"hr",
|
|
2808
|
+
"img",
|
|
2809
|
+
"input",
|
|
2810
|
+
"link",
|
|
2811
|
+
"meta",
|
|
2812
|
+
"param",
|
|
2813
|
+
"source",
|
|
2814
|
+
"track",
|
|
2815
|
+
"wbr"
|
|
2816
|
+
]);
|
|
2817
|
+
const CLOSE_TAG_RE_CACHE = /* @__PURE__ */ new Map();
|
|
2583
2818
|
function parseHtmlBlock(token) {
|
|
2584
2819
|
const raw = String(token.content ?? "");
|
|
2585
2820
|
if (/^\s*<!--/.test(raw) || /^\s*<!/.test(raw) || /^\s*<\?/.test(raw)) return {
|
|
@@ -2597,25 +2832,14 @@ function parseHtmlBlock(token) {
|
|
|
2597
2832
|
tag: "",
|
|
2598
2833
|
loading: false
|
|
2599
2834
|
};
|
|
2600
|
-
const VOID_TAGS = new Set([
|
|
2601
|
-
"area",
|
|
2602
|
-
"base",
|
|
2603
|
-
"br",
|
|
2604
|
-
"col",
|
|
2605
|
-
"embed",
|
|
2606
|
-
"hr",
|
|
2607
|
-
"img",
|
|
2608
|
-
"input",
|
|
2609
|
-
"link",
|
|
2610
|
-
"meta",
|
|
2611
|
-
"param",
|
|
2612
|
-
"source",
|
|
2613
|
-
"track",
|
|
2614
|
-
"wbr"
|
|
2615
|
-
]);
|
|
2616
2835
|
const selfClosing = /^\s*<[^>]*\/\s*>/.test(raw);
|
|
2617
2836
|
const isVoid = VOID_TAGS.has(tag);
|
|
2618
|
-
|
|
2837
|
+
let closeRe = CLOSE_TAG_RE_CACHE.get(tag);
|
|
2838
|
+
if (!closeRe) {
|
|
2839
|
+
closeRe = new RegExp(`<\\/\\s*${tag}\\b`, "i");
|
|
2840
|
+
CLOSE_TAG_RE_CACHE.set(tag, closeRe);
|
|
2841
|
+
}
|
|
2842
|
+
const hasClosing = closeRe.test(raw);
|
|
2619
2843
|
const loading = !(isVoid || selfClosing || hasClosing);
|
|
2620
2844
|
return {
|
|
2621
2845
|
type: "html_block",
|
|
@@ -2849,10 +3073,11 @@ function getMarkdown(msgId = `editor-${Date.now()}`, options = {}) {
|
|
|
2849
3073
|
<div class="code-editor"></div>
|
|
2850
3074
|
</div>`;
|
|
2851
3075
|
};
|
|
3076
|
+
const RE_REFERENCE = /^\[(\d+)\]/;
|
|
2852
3077
|
const referenceInline = (state, silent) => {
|
|
2853
3078
|
const s = state;
|
|
2854
3079
|
if (s.src[s.pos] !== "[") return false;
|
|
2855
|
-
const match =
|
|
3080
|
+
const match = RE_REFERENCE.exec(s.src.slice(s.pos));
|
|
2856
3081
|
if (!match) return false;
|
|
2857
3082
|
if (!silent) {
|
|
2858
3083
|
const id = match[1];
|