stream-markdown-parser 0.0.19 → 0.0.20
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 +142 -63
- 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] ?? "";
|
|
@@ -360,7 +361,42 @@ function fixStrongTokens(tokens) {
|
|
|
360
361
|
const token = tokens[i];
|
|
361
362
|
const nextToken = tokens[i + 1];
|
|
362
363
|
const tokenContent = String(token.content ?? "");
|
|
363
|
-
if (token.type === "
|
|
364
|
+
if (token.type === "link_open" && tokens[i - 1].type === "em_open" && tokens[i - 2].type === "text" && tokens[i - 2].content?.endsWith("*")) {
|
|
365
|
+
const textContent = String(tokens[i - 2].content ?? "").slice(0, -1);
|
|
366
|
+
const replaceTokens = [
|
|
367
|
+
{
|
|
368
|
+
type: "strong_open",
|
|
369
|
+
tag: "strong",
|
|
370
|
+
attrs: null,
|
|
371
|
+
map: null,
|
|
372
|
+
children: null,
|
|
373
|
+
content: "",
|
|
374
|
+
markup: "**",
|
|
375
|
+
info: "",
|
|
376
|
+
meta: null
|
|
377
|
+
},
|
|
378
|
+
tokens[i],
|
|
379
|
+
tokens[i + 1],
|
|
380
|
+
tokens[i + 2],
|
|
381
|
+
{
|
|
382
|
+
type: "strong_close",
|
|
383
|
+
tag: "strong",
|
|
384
|
+
attrs: null,
|
|
385
|
+
map: null,
|
|
386
|
+
children: null,
|
|
387
|
+
content: "",
|
|
388
|
+
markup: "**",
|
|
389
|
+
info: "",
|
|
390
|
+
meta: null
|
|
391
|
+
}
|
|
392
|
+
];
|
|
393
|
+
if (textContent) replaceTokens.unshift({
|
|
394
|
+
type: "text",
|
|
395
|
+
content: textContent,
|
|
396
|
+
raw: textContent
|
|
397
|
+
});
|
|
398
|
+
fixedTokens.splice(i - 2, 6, ...replaceTokens);
|
|
399
|
+
} else if (token.type === "text" && tokenContent.endsWith("*") && nextToken.type === "em_open") {
|
|
364
400
|
const _nextToken = tokens[i + 2];
|
|
365
401
|
const count = _nextToken?.type === "text" ? 4 : 3;
|
|
366
402
|
const insert = [
|
|
@@ -713,6 +749,36 @@ const KATEX_COMMANDS = [
|
|
|
713
749
|
];
|
|
714
750
|
const ESCAPED_KATEX_COMMANDS = KATEX_COMMANDS.slice().sort((a, b) => b.length - a.length).map((c) => c.replace(/[.*+?^${}()|[\\]\\\]/g, "\\$&")).join("|");
|
|
715
751
|
const CONTROL_CHARS_CLASS = "[ \r\b\f\v]";
|
|
752
|
+
const SPAN_CURLY_RE = /span\{([^}]+)\}/;
|
|
753
|
+
const OPERATORNAME_SPAN_RE = /\\operatorname\{span\}\{((?:[^{}]|\{[^}]*\})+)\}/;
|
|
754
|
+
const SINGLE_BACKSLASH_NEWLINE_RE = /(^|[^\\])\\\r?\n/g;
|
|
755
|
+
const ENDING_SINGLE_BACKSLASH_RE = /(^|[^\\])\\$/g;
|
|
756
|
+
const DEFAULT_MATH_RE = new RegExp(`${CONTROL_CHARS_CLASS}|(?<!\\\\|\\w)(${ESCAPED_KATEX_COMMANDS})\\b`, "g");
|
|
757
|
+
const MATH_RE_CACHE = /* @__PURE__ */ new Map();
|
|
758
|
+
const BRACE_CMD_RE_CACHE = /* @__PURE__ */ new Map();
|
|
759
|
+
function getMathRegex(commands) {
|
|
760
|
+
if (!commands) return DEFAULT_MATH_RE;
|
|
761
|
+
const arr = [...commands];
|
|
762
|
+
arr.sort((a, b) => b.length - a.length);
|
|
763
|
+
const key = arr.join("");
|
|
764
|
+
const cached = MATH_RE_CACHE.get(key);
|
|
765
|
+
if (cached) return cached;
|
|
766
|
+
const commandPattern = `(?:${arr.map((c) => c.replace(/[.*+?^${}()|[\\]\\"\]/g, "\\$&")).join("|")})`;
|
|
767
|
+
const re = new RegExp(`${CONTROL_CHARS_CLASS}|(?<!\\\\|\\w)(${commandPattern})\\b`, "g");
|
|
768
|
+
MATH_RE_CACHE.set(key, re);
|
|
769
|
+
return re;
|
|
770
|
+
}
|
|
771
|
+
function getBraceCmdRegex(useDefault, commands) {
|
|
772
|
+
const arr = useDefault ? [] : [...commands ?? []];
|
|
773
|
+
if (!useDefault) arr.sort((a, b) => b.length - a.length);
|
|
774
|
+
const key = useDefault ? "__default__" : arr.join("");
|
|
775
|
+
const cached = BRACE_CMD_RE_CACHE.get(key);
|
|
776
|
+
if (cached) return cached;
|
|
777
|
+
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("|");
|
|
778
|
+
const re = new RegExp(`(^|[^\\\\\\w])(${braceEscaped})\\s*\\{`, "g");
|
|
779
|
+
BRACE_CMD_RE_CACHE.set(key, re);
|
|
780
|
+
return re;
|
|
781
|
+
}
|
|
716
782
|
const CONTROL_MAP = {
|
|
717
783
|
" ": "t",
|
|
718
784
|
"\r": "r",
|
|
@@ -730,27 +796,19 @@ function normalizeStandaloneBackslashT(s, opts) {
|
|
|
730
796
|
const commands = opts?.commands ?? KATEX_COMMANDS;
|
|
731
797
|
const escapeExclamation = opts?.escapeExclamation ?? true;
|
|
732
798
|
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
|
-
}
|
|
799
|
+
const re = getMathRegex(useDefault ? void 0 : commands);
|
|
739
800
|
let out = s.replace(re, (m, cmd) => {
|
|
740
801
|
if (CONTROL_MAP[m] !== void 0) return `\\${CONTROL_MAP[m]}`;
|
|
741
802
|
if (cmd && commands.includes(cmd)) return `\\${cmd}`;
|
|
742
803
|
return m;
|
|
743
804
|
});
|
|
744
805
|
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
806
|
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\\\\");
|
|
807
|
+
const braceCmdRe = getBraceCmdRegex(useDefault, useDefault ? void 0 : commands);
|
|
808
|
+
result = result.replace(braceCmdRe, (_m, p1, p2) => `${p1}\\${p2}{`);
|
|
809
|
+
result = result.replace(SPAN_CURLY_RE, "span\\{$1\\}").replace(OPERATORNAME_SPAN_RE, "\\operatorname{span}\\{$1\\}");
|
|
810
|
+
result = result.replace(SINGLE_BACKSLASH_NEWLINE_RE, "$1\\\\\n");
|
|
811
|
+
result = result.replace(ENDING_SINGLE_BACKSLASH_RE, "$1\\\\");
|
|
754
812
|
return result;
|
|
755
813
|
}
|
|
756
814
|
function applyMath(md, mathOpts) {
|
|
@@ -1103,14 +1161,23 @@ function parseEmphasisToken(tokens, startIndex) {
|
|
|
1103
1161
|
|
|
1104
1162
|
//#endregion
|
|
1105
1163
|
//#region src/parser/inline-parsers/fence-parser.ts
|
|
1164
|
+
const TRAILING_FENCE_LINE_RE = /\r?\n[ \t]*`+\s*$/;
|
|
1165
|
+
const DIFF_HEADER_PREFIXES = [
|
|
1166
|
+
"diff ",
|
|
1167
|
+
"index ",
|
|
1168
|
+
"--- ",
|
|
1169
|
+
"+++ ",
|
|
1170
|
+
"@@ "
|
|
1171
|
+
];
|
|
1172
|
+
const NEWLINE_RE = /\r?\n/;
|
|
1106
1173
|
function splitUnifiedDiff(content) {
|
|
1107
1174
|
const orig = [];
|
|
1108
1175
|
const updated = [];
|
|
1109
|
-
for (const rawLine of content.split(
|
|
1176
|
+
for (const rawLine of content.split(NEWLINE_RE)) {
|
|
1110
1177
|
const line = rawLine;
|
|
1111
|
-
if (
|
|
1112
|
-
if (line.
|
|
1113
|
-
else if (line.
|
|
1178
|
+
if (DIFF_HEADER_PREFIXES.some((p) => line.startsWith(p))) continue;
|
|
1179
|
+
if (line.length >= 2 && line[0] === "-" && line[1] === " ") orig.push(` ${line.slice(1)}`);
|
|
1180
|
+
else if (line.length >= 2 && line[0] === "+" && line[1] === " ") updated.push(` ${line.slice(1)}`);
|
|
1114
1181
|
else {
|
|
1115
1182
|
orig.push(line);
|
|
1116
1183
|
updated.push(line);
|
|
@@ -1127,10 +1194,13 @@ function parseFenceToken(token) {
|
|
|
1127
1194
|
const closed = typeof tokenMeta.closed === "boolean" ? tokenMeta.closed : void 0;
|
|
1128
1195
|
const info = String(token.info ?? "");
|
|
1129
1196
|
const diff = info.startsWith("diff");
|
|
1130
|
-
const language = diff ?
|
|
1197
|
+
const language = diff ? (() => {
|
|
1198
|
+
const s = info;
|
|
1199
|
+
const sp = s.indexOf(" ");
|
|
1200
|
+
return sp === -1 ? "" : String(s.slice(sp + 1) ?? "");
|
|
1201
|
+
})() : info;
|
|
1131
1202
|
let content = String(token.content ?? "");
|
|
1132
|
-
|
|
1133
|
-
if (trailingFenceLine.test(content)) content = content.replace(trailingFenceLine, "");
|
|
1203
|
+
if (TRAILING_FENCE_LINE_RE.test(content)) content = content.replace(TRAILING_FENCE_LINE_RE, "");
|
|
1134
1204
|
if (diff) {
|
|
1135
1205
|
const { original, updated } = splitUnifiedDiff(content);
|
|
1136
1206
|
return {
|
|
@@ -1333,11 +1403,12 @@ function parseLinkToken(tokens, startIndex) {
|
|
|
1333
1403
|
const title = _title === null ? null : String(_title);
|
|
1334
1404
|
let i = startIndex + 1;
|
|
1335
1405
|
const linkTokens = [];
|
|
1336
|
-
|
|
1406
|
+
let loading = true;
|
|
1337
1407
|
while (i < tokens.length && tokens[i].type !== "link_close") {
|
|
1338
1408
|
linkTokens.push(tokens[i]);
|
|
1339
1409
|
i++;
|
|
1340
1410
|
}
|
|
1411
|
+
if (tokens[i]?.type === "link_close") loading = false;
|
|
1341
1412
|
const children = parseInlineTokens(linkTokens);
|
|
1342
1413
|
const linkText = children.map((node) => {
|
|
1343
1414
|
const nodeAny = node;
|
|
@@ -1494,6 +1565,10 @@ function parseTextToken(token) {
|
|
|
1494
1565
|
|
|
1495
1566
|
//#endregion
|
|
1496
1567
|
//#region src/parser/inline-parsers/index.ts
|
|
1568
|
+
const STRONG_PAIR_RE = /\*\*([\s\S]*?)\*\*/;
|
|
1569
|
+
function escapeRegExp(str) {
|
|
1570
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1571
|
+
}
|
|
1497
1572
|
const AUTOLINK_PROTOCOL_RE = /^(?:https?:\/\/|mailto:|ftp:\/\/)/i;
|
|
1498
1573
|
const AUTOLINK_GENERIC_RE = /:\/\//;
|
|
1499
1574
|
function isLikelyUrl(href) {
|
|
@@ -1563,7 +1638,7 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1563
1638
|
i++;
|
|
1564
1639
|
return true;
|
|
1565
1640
|
}
|
|
1566
|
-
const exec =
|
|
1641
|
+
const exec = STRONG_PAIR_RE.exec(content);
|
|
1567
1642
|
let inner = "";
|
|
1568
1643
|
let after = "";
|
|
1569
1644
|
if (exec && typeof exec.index === "number") {
|
|
@@ -1932,9 +2007,6 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1932
2007
|
function handleLinkOpen(token) {
|
|
1933
2008
|
resetCurrentTextNode();
|
|
1934
2009
|
const href = token.attrs?.find(([name]) => name === "href")?.[1];
|
|
1935
|
-
function escapeRegExp(str) {
|
|
1936
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1937
|
-
}
|
|
1938
2010
|
if (raw && tokens[i + 1].type === "text") {
|
|
1939
2011
|
const text = String(tokens[i + 1]?.content ?? "");
|
|
1940
2012
|
const escText = escapeRegExp(text);
|
|
@@ -2580,6 +2652,23 @@ function parseHardBreak() {
|
|
|
2580
2652
|
|
|
2581
2653
|
//#endregion
|
|
2582
2654
|
//#region src/parser/node-parsers/html-block-parser.ts
|
|
2655
|
+
const VOID_TAGS = new Set([
|
|
2656
|
+
"area",
|
|
2657
|
+
"base",
|
|
2658
|
+
"br",
|
|
2659
|
+
"col",
|
|
2660
|
+
"embed",
|
|
2661
|
+
"hr",
|
|
2662
|
+
"img",
|
|
2663
|
+
"input",
|
|
2664
|
+
"link",
|
|
2665
|
+
"meta",
|
|
2666
|
+
"param",
|
|
2667
|
+
"source",
|
|
2668
|
+
"track",
|
|
2669
|
+
"wbr"
|
|
2670
|
+
]);
|
|
2671
|
+
const CLOSE_TAG_RE_CACHE = /* @__PURE__ */ new Map();
|
|
2583
2672
|
function parseHtmlBlock(token) {
|
|
2584
2673
|
const raw = String(token.content ?? "");
|
|
2585
2674
|
if (/^\s*<!--/.test(raw) || /^\s*<!/.test(raw) || /^\s*<\?/.test(raw)) return {
|
|
@@ -2597,25 +2686,14 @@ function parseHtmlBlock(token) {
|
|
|
2597
2686
|
tag: "",
|
|
2598
2687
|
loading: false
|
|
2599
2688
|
};
|
|
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
2689
|
const selfClosing = /^\s*<[^>]*\/\s*>/.test(raw);
|
|
2617
2690
|
const isVoid = VOID_TAGS.has(tag);
|
|
2618
|
-
|
|
2691
|
+
let closeRe = CLOSE_TAG_RE_CACHE.get(tag);
|
|
2692
|
+
if (!closeRe) {
|
|
2693
|
+
closeRe = new RegExp(`<\\/\\s*${tag}\\b`, "i");
|
|
2694
|
+
CLOSE_TAG_RE_CACHE.set(tag, closeRe);
|
|
2695
|
+
}
|
|
2696
|
+
const hasClosing = closeRe.test(raw);
|
|
2619
2697
|
const loading = !(isVoid || selfClosing || hasClosing);
|
|
2620
2698
|
return {
|
|
2621
2699
|
type: "html_block",
|
|
@@ -2849,10 +2927,11 @@ function getMarkdown(msgId = `editor-${Date.now()}`, options = {}) {
|
|
|
2849
2927
|
<div class="code-editor"></div>
|
|
2850
2928
|
</div>`;
|
|
2851
2929
|
};
|
|
2930
|
+
const RE_REFERENCE = /^\[(\d+)\]/;
|
|
2852
2931
|
const referenceInline = (state, silent) => {
|
|
2853
2932
|
const s = state;
|
|
2854
2933
|
if (s.src[s.pos] !== "[") return false;
|
|
2855
|
-
const match =
|
|
2934
|
+
const match = RE_REFERENCE.exec(s.src.slice(s.pos));
|
|
2856
2935
|
if (!match) return false;
|
|
2857
2936
|
if (!silent) {
|
|
2858
2937
|
const id = match[1];
|