stream-markdown-parser 0.0.17 → 0.0.18
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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -14
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
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":";;;UAaiB,cAAA,SAAuB;sBAClB;;EADL,gBAAA,CAAe,EAAA,OAAA;;;;ECXf,CAAA;AAQjB;;;UARiB,QAAA;;EDWA,GAAA,EAAA,MAAA;;;;ACXjB;AAQiB,UAAA,QAAA,SAAiB,QAAQ,CAAA;EAMzB,IAAA,EAAA,MAAA;EAOA,OAAA,EAAA,MAAA;EAMA,MAAA,CAAA,EAAA,OAAW;AAM5B;AAQiB,UA3BA,WAAA,SAAoB,QA2BC,CAAA;EAKrB,IAAA,EAAA,SAAA;EAiBA,KAAA,EAAA,MAAA;
|
|
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
|
@@ -602,6 +602,37 @@ function findMatchingClose(src, startIdx, open, close) {
|
|
|
602
602
|
}
|
|
603
603
|
var findMatchingClose_default = findMatchingClose;
|
|
604
604
|
|
|
605
|
+
//#endregion
|
|
606
|
+
//#region src/utils/lru.ts
|
|
607
|
+
var LRUCache = class {
|
|
608
|
+
constructor(max = 500) {
|
|
609
|
+
this.max = max;
|
|
610
|
+
this.map = /* @__PURE__ */ new Map();
|
|
611
|
+
}
|
|
612
|
+
get(key) {
|
|
613
|
+
if (!this.map.has(key)) return void 0;
|
|
614
|
+
const val = this.map.get(key);
|
|
615
|
+
this.map.delete(key);
|
|
616
|
+
this.map.set(key, val);
|
|
617
|
+
return val;
|
|
618
|
+
}
|
|
619
|
+
set(key, value) {
|
|
620
|
+
if (this.map.has(key)) this.map.delete(key);
|
|
621
|
+
this.map.set(key, value);
|
|
622
|
+
if (this.map.size > this.max) {
|
|
623
|
+
const firstKey = this.map.keys().next().value;
|
|
624
|
+
if (firstKey !== void 0) this.map.delete(firstKey);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
getOrCreate(key, factory$1) {
|
|
628
|
+
const existing = this.get(key);
|
|
629
|
+
if (existing !== void 0) return existing;
|
|
630
|
+
const v = factory$1();
|
|
631
|
+
this.set(key, v);
|
|
632
|
+
return v;
|
|
633
|
+
}
|
|
634
|
+
};
|
|
635
|
+
|
|
605
636
|
//#endregion
|
|
606
637
|
//#region src/plugins/isMathLike.ts
|
|
607
638
|
const TEX_BRACE_COMMANDS = [
|
|
@@ -720,6 +751,13 @@ const CONTROL_MAP = {
|
|
|
720
751
|
"\f": "f",
|
|
721
752
|
"\v": "v"
|
|
722
753
|
};
|
|
754
|
+
const DEFAULT_STANDALONE_BACKSLASH_T_RE = new RegExp(`${CONTROL_CHARS_CLASS}|(?<!\\\\|\\w)(${ESCAPED_KATEX_COMMANDS})\\b`, "g");
|
|
755
|
+
const DEFAULT_BRACE_CMD_RE = (() => {
|
|
756
|
+
const combined = [ESCAPED_TEX_BRACE_COMMANDS, ESCAPED_KATEX_COMMANDS].filter(Boolean).join("|");
|
|
757
|
+
return combined ? new RegExp(`(^|[^\\\\\\w])(${combined})\\s*\\{`, "g") : null;
|
|
758
|
+
})();
|
|
759
|
+
const commandsRegexCache = new LRUCache(500);
|
|
760
|
+
const braceCmdRegexCache = new LRUCache(500);
|
|
723
761
|
function countUnescapedStrong(s) {
|
|
724
762
|
const re = /(^|[^\\])(__|\*\*)/g;
|
|
725
763
|
let c = 0;
|
|
@@ -731,11 +769,15 @@ function normalizeStandaloneBackslashT(s, opts) {
|
|
|
731
769
|
const escapeExclamation = opts?.escapeExclamation ?? true;
|
|
732
770
|
const useDefault = opts?.commands == null;
|
|
733
771
|
let re;
|
|
734
|
-
if (useDefault) re =
|
|
772
|
+
if (useDefault) re = DEFAULT_STANDALONE_BACKSLASH_T_RE;
|
|
735
773
|
else {
|
|
736
|
-
const
|
|
737
|
-
re =
|
|
774
|
+
const key = commands.slice().sort((a, b) => b.length - a.length).join("|");
|
|
775
|
+
re = commandsRegexCache.getOrCreate(key, () => {
|
|
776
|
+
const commandPattern = `(?:${commands.slice().sort((a, b) => b.length - a.length).map((c) => c.replace(/[.*+?^${}()|[\\]\\"\\\]/g, "\\$&")).join("|")})`;
|
|
777
|
+
return new RegExp(`${CONTROL_CHARS_CLASS}|(?<!\\\\|\\w)(${commandPattern})\\b`, "g");
|
|
778
|
+
});
|
|
738
779
|
}
|
|
780
|
+
if (re && "lastIndex" in re) re.lastIndex = 0;
|
|
739
781
|
let out = s.replace(re, (m, cmd) => {
|
|
740
782
|
if (CONTROL_MAP[m] !== void 0) return `\\${CONTROL_MAP[m]}`;
|
|
741
783
|
if (cmd && commands.includes(cmd)) return `\\${cmd}`;
|
|
@@ -745,8 +787,18 @@ function normalizeStandaloneBackslashT(s, opts) {
|
|
|
745
787
|
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
788
|
let result = out;
|
|
747
789
|
if (braceEscaped) {
|
|
748
|
-
|
|
749
|
-
|
|
790
|
+
let braceCmdRe = null;
|
|
791
|
+
if (useDefault && DEFAULT_BRACE_CMD_RE) braceCmdRe = DEFAULT_BRACE_CMD_RE;
|
|
792
|
+
else {
|
|
793
|
+
const key = commands.slice().sort((a, b) => b.length - a.length).join("|");
|
|
794
|
+
const combined = [commands.map((c) => c.replace(/[.*+?^${}()|[\\]\\"\]/g, "\\$&")).join("|"), ESCAPED_TEX_BRACE_COMMANDS].filter(Boolean).join("|");
|
|
795
|
+
if (combined) braceCmdRe = braceCmdRegexCache.getOrCreate(key, () => new RegExp(`(^|[^\\\\\\w])(${combined})\\s*\\{`, "g"));
|
|
796
|
+
else braceCmdRe = null;
|
|
797
|
+
}
|
|
798
|
+
if (braceCmdRe) {
|
|
799
|
+
if ("lastIndex" in braceCmdRe) braceCmdRe.lastIndex = 0;
|
|
800
|
+
result = result.replace(braceCmdRe, (_m, p1, p2) => `${p1}\\${p2}{`);
|
|
801
|
+
}
|
|
750
802
|
}
|
|
751
803
|
result = result.replace(/span\{([^}]+)\}/, "span\\{$1\\}").replace(/\\operatorname\{span\}\{((?:[^{}]|\{[^}]*\})+)\}/, "\\operatorname{span}\\{$1\\}");
|
|
752
804
|
result = result.replace(/(^|[^\\])\\\r?\n/g, "$1\\\\\n");
|
|
@@ -1500,6 +1552,12 @@ function isLikelyUrl(href) {
|
|
|
1500
1552
|
if (!href) return false;
|
|
1501
1553
|
return AUTOLINK_PROTOCOL_RE.test(href) || AUTOLINK_GENERIC_RE.test(href);
|
|
1502
1554
|
}
|
|
1555
|
+
function escapeRegExp(str) {
|
|
1556
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1557
|
+
}
|
|
1558
|
+
const bracketRegexCache = new LRUCache(500);
|
|
1559
|
+
const parenHrefRegexCache = new LRUCache(500);
|
|
1560
|
+
const linkMatchRegexCache = new LRUCache(500);
|
|
1503
1561
|
function parseInlineTokens(tokens, raw, pPreToken) {
|
|
1504
1562
|
if (!tokens || tokens.length === 0) return [];
|
|
1505
1563
|
const result = [];
|
|
@@ -1932,13 +1990,10 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1932
1990
|
function handleLinkOpen(token) {
|
|
1933
1991
|
resetCurrentTextNode();
|
|
1934
1992
|
const href = token.attrs?.find(([name]) => name === "href")?.[1];
|
|
1935
|
-
function escapeRegExp(str) {
|
|
1936
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1937
|
-
}
|
|
1938
1993
|
if (raw && tokens[i + 1].type === "text") {
|
|
1939
1994
|
const text = String(tokens[i + 1]?.content ?? "");
|
|
1940
1995
|
const escText = escapeRegExp(text);
|
|
1941
|
-
if (!(/* @__PURE__ */ new RegExp(`\\[${escText}\\s*\\]`)).test(raw)) {
|
|
1996
|
+
if (!bracketRegexCache.getOrCreate(escText, () => /* @__PURE__ */ new RegExp(`\\[${escText}\\s*\\]`)).test(raw)) {
|
|
1942
1997
|
const hrefAttr$1 = token.attrs?.find(([name]) => name === "href")?.[1] ?? "";
|
|
1943
1998
|
if (!raw.includes("[") && isLikelyUrl(String(hrefAttr$1))) {
|
|
1944
1999
|
resetCurrentTextNode();
|
|
@@ -1963,7 +2018,11 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1963
2018
|
}
|
|
1964
2019
|
}
|
|
1965
2020
|
if (raw && href) {
|
|
1966
|
-
const
|
|
2021
|
+
const hrefStrLocal = String(href);
|
|
2022
|
+
const loadingMath = parenHrefRegexCache.getOrCreate(hrefStrLocal, () => {
|
|
2023
|
+
const escHref = escapeRegExp(hrefStrLocal);
|
|
2024
|
+
return /* @__PURE__ */ new RegExp(`\\(\\s*${escHref}\\s*\\)`);
|
|
2025
|
+
});
|
|
1967
2026
|
const pre = result.length > 0 ? result[result.length - 1] : void 0;
|
|
1968
2027
|
const loading = !loadingMath.test(raw);
|
|
1969
2028
|
if (loading && pre) {
|
|
@@ -1973,7 +2032,7 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1973
2032
|
else if (pre.type === "text") preText = String(pre.content ?? "");
|
|
1974
2033
|
else if (pre.content && typeof pre.content === "string") preText = String(pre.content ?? "").slice(1, -1);
|
|
1975
2034
|
}
|
|
1976
|
-
if ((/* @__PURE__ */ new RegExp(`\\[${escapeRegExp(preText)}\\s*\\]\\(`)).test(raw)) {
|
|
2035
|
+
if (linkMatchRegexCache.getOrCreate(preText, () => /* @__PURE__ */ new RegExp(`\\[${escapeRegExp(preText)}\\s*\\]\\(`)).test(raw)) {
|
|
1977
2036
|
const text = String(preText ?? "");
|
|
1978
2037
|
resetCurrentTextNode();
|
|
1979
2038
|
const node$1 = {
|
|
@@ -2511,6 +2570,7 @@ function parseAdmonition(tokens, index, match) {
|
|
|
2511
2570
|
|
|
2512
2571
|
//#endregion
|
|
2513
2572
|
//#region src/parser/node-parsers/container-parser.ts
|
|
2573
|
+
const containerCloseTypeCache = new LRUCache(50);
|
|
2514
2574
|
function parseContainer(tokens, index) {
|
|
2515
2575
|
const openToken = tokens[index];
|
|
2516
2576
|
let kind = "note";
|
|
@@ -2520,7 +2580,9 @@ function parseContainer(tokens, index) {
|
|
|
2520
2580
|
kind = typeMatch[1];
|
|
2521
2581
|
const info = String(openToken.info ?? "").trim();
|
|
2522
2582
|
if (info && !info.startsWith(":::")) {
|
|
2523
|
-
|
|
2583
|
+
let maybe = info;
|
|
2584
|
+
if (maybe.startsWith(kind)) maybe = maybe.slice(kind.length).trim();
|
|
2585
|
+
maybe = maybe.trim();
|
|
2524
2586
|
if (maybe) title = maybe;
|
|
2525
2587
|
}
|
|
2526
2588
|
} else {
|
|
@@ -2534,7 +2596,8 @@ function parseContainer(tokens, index) {
|
|
|
2534
2596
|
if (!title) title = kind.charAt(0).toUpperCase() + kind.slice(1);
|
|
2535
2597
|
const children = [];
|
|
2536
2598
|
let j = index + 1;
|
|
2537
|
-
const
|
|
2599
|
+
const key = kind;
|
|
2600
|
+
const closeType = containerCloseTypeCache.getOrCreate(key, () => /* @__PURE__ */ new RegExp(`^container_${kind}_close$`));
|
|
2538
2601
|
while (j < tokens.length && tokens[j].type !== "container_close" && !closeType.test(tokens[j].type)) if (tokens[j].type === "paragraph_open") {
|
|
2539
2602
|
const contentToken = tokens[j + 1];
|
|
2540
2603
|
if (contentToken) {
|
|
@@ -2580,6 +2643,7 @@ function parseHardBreak() {
|
|
|
2580
2643
|
|
|
2581
2644
|
//#endregion
|
|
2582
2645
|
//#region src/parser/node-parsers/html-block-parser.ts
|
|
2646
|
+
const htmlCloseTagRegexCache = new LRUCache(200);
|
|
2583
2647
|
function parseHtmlBlock(token) {
|
|
2584
2648
|
const raw = String(token.content ?? "");
|
|
2585
2649
|
if (/^\s*<!--/.test(raw) || /^\s*<!/.test(raw) || /^\s*<\?/.test(raw)) return {
|
|
@@ -2615,7 +2679,7 @@ function parseHtmlBlock(token) {
|
|
|
2615
2679
|
]);
|
|
2616
2680
|
const selfClosing = /^\s*<[^>]*\/\s*>/.test(raw);
|
|
2617
2681
|
const isVoid = VOID_TAGS.has(tag);
|
|
2618
|
-
const hasClosing = new RegExp(`<\\/\\s*${tag}\\b`, "i").test(raw);
|
|
2682
|
+
const hasClosing = htmlCloseTagRegexCache.getOrCreate(tag, () => new RegExp(`<\\/\\s*${tag}\\b`, "i")).test(raw);
|
|
2619
2683
|
const loading = !(isVoid || selfClosing || hasClosing);
|
|
2620
2684
|
return {
|
|
2621
2685
|
type: "html_block",
|