stream-markdown-parser 0.0.16 → 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 +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +173 -16
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.d.ts
CHANGED
|
@@ -35,6 +35,11 @@ interface ParagraphNode extends BaseNode {
|
|
|
35
35
|
children: ParsedNode[];
|
|
36
36
|
maybeCheckbox?: boolean;
|
|
37
37
|
}
|
|
38
|
+
interface InlineNode extends BaseNode {
|
|
39
|
+
type: 'inline';
|
|
40
|
+
children: ParsedNode[];
|
|
41
|
+
content?: string;
|
|
42
|
+
}
|
|
38
43
|
interface ListNode extends BaseNode {
|
|
39
44
|
type: 'list';
|
|
40
45
|
ordered: boolean;
|
|
@@ -59,8 +64,15 @@ interface CodeBlockNode extends BaseNode {
|
|
|
59
64
|
}
|
|
60
65
|
interface HtmlBlockNode extends BaseNode {
|
|
61
66
|
type: 'html_block';
|
|
67
|
+
attrs?: [string, string][] | null;
|
|
68
|
+
tag: string;
|
|
62
69
|
content: string;
|
|
63
70
|
}
|
|
71
|
+
interface HtmlInlineNode extends BaseNode {
|
|
72
|
+
type: 'html_inline';
|
|
73
|
+
content: string;
|
|
74
|
+
children: ParsedNode[];
|
|
75
|
+
}
|
|
64
76
|
interface InlineCodeNode extends BaseNode {
|
|
65
77
|
type: 'inline_code';
|
|
66
78
|
code: string;
|
|
@@ -311,5 +323,5 @@ interface GetMarkdownOptions extends FactoryOptions {
|
|
|
311
323
|
}
|
|
312
324
|
declare function getMarkdown(msgId?: string, options?: GetMarkdownOptions): MarkdownIt$1;
|
|
313
325
|
//#endregion
|
|
314
|
-
export { AdmonitionNode, BaseNode, BlockquoteNode, CheckboxInputNode, CheckboxNode, CodeBlockNode, CustomComponents, DefinitionItemNode, DefinitionListNode, ESCAPED_TEX_BRACE_COMMANDS, EmojiNode, EmphasisNode, FootnoteNode, FootnoteReferenceNode, GetMarkdownOptions, HardBreakNode, HeadingNode, HighlightNode, HtmlBlockNode, ImageNode, InlineCodeNode, InsertNode, KATEX_COMMANDS, LinkNode, ListItemNode, ListNode, MarkdownRender, MarkdownToken, MarkdownTokenLite, MathBlockNode, MathInlineNode, type MathOptions, MermaidBlockNode, ParagraphNode, ParseOptions, ParsedNode, PostTransformNodesHook, ReferenceNode, StrikethroughNode, StrongNode, SubscriptNode, SuperscriptNode, TEX_BRACE_COMMANDS, TableCellNode, TableNode, TableRowNode, TextNode, ThematicBreakNode, TransformTokensHook, applyContainers, applyMath, findMatchingClose, getMarkdown, isMathLike, normalizeStandaloneBackslashT, parseFenceToken, parseInlineTokens, parseMarkdownToStructure, processTokens, setDefaultMathOptions };
|
|
326
|
+
export { AdmonitionNode, BaseNode, BlockquoteNode, CheckboxInputNode, CheckboxNode, CodeBlockNode, CustomComponents, DefinitionItemNode, DefinitionListNode, ESCAPED_TEX_BRACE_COMMANDS, EmojiNode, EmphasisNode, FootnoteNode, FootnoteReferenceNode, GetMarkdownOptions, HardBreakNode, HeadingNode, HighlightNode, HtmlBlockNode, HtmlInlineNode, ImageNode, InlineCodeNode, InlineNode, InsertNode, KATEX_COMMANDS, LinkNode, ListItemNode, ListNode, MarkdownRender, MarkdownToken, MarkdownTokenLite, MathBlockNode, MathInlineNode, type MathOptions, MermaidBlockNode, ParagraphNode, ParseOptions, ParsedNode, PostTransformNodesHook, ReferenceNode, StrikethroughNode, StrongNode, SubscriptNode, SuperscriptNode, TEX_BRACE_COMMANDS, TableCellNode, TableNode, TableRowNode, TextNode, ThematicBreakNode, TransformTokensHook, applyContainers, applyMath, findMatchingClose, getMarkdown, isMathLike, normalizeStandaloneBackslashT, parseFenceToken, parseInlineTokens, parseMarkdownToStructure, processTokens, setDefaultMathOptions };
|
|
315
327
|
//# sourceMappingURL=index.d.ts.map
|
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":";;;
|
|
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
|
@@ -75,6 +75,61 @@ function applyContainers(md) {
|
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
//#endregion
|
|
79
|
+
//#region src/plugins/fixHtmlInline.ts
|
|
80
|
+
function applyFixHtmlInlineTokens(md) {
|
|
81
|
+
md.core.ruler.push("fix_html_inline_tokens", (state) => {
|
|
82
|
+
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
|
+
for (let i = 0; i < toks.length; i++) {
|
|
100
|
+
const t = toks[i];
|
|
101
|
+
if (!t || t.type !== "inline") continue;
|
|
102
|
+
if (/\s*<$/.test(t.content)) {
|
|
103
|
+
t.children.length = 0;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (t.children.length === 2 && t.children[0].type === "html_inline") {
|
|
107
|
+
t.children = [{
|
|
108
|
+
type: "html_block",
|
|
109
|
+
content: t.children[0].content + t.children[1].content,
|
|
110
|
+
tag: t.children[0].content.match(/<([^\s>/]+)/)?.[1] ?? "",
|
|
111
|
+
loading: true
|
|
112
|
+
}];
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (!t.content?.startsWith("<") || t.children?.length !== 1) continue;
|
|
116
|
+
const raw = String(t.content);
|
|
117
|
+
const tagName = raw.match(/<([^\s>/]+)/)?.[1]?.toLowerCase() ?? "";
|
|
118
|
+
if (!tagName) continue;
|
|
119
|
+
const isVoid = /\/\s*>\s*$/.test(raw) || VOID_TAGS.has(tagName);
|
|
120
|
+
const htmlToken = t;
|
|
121
|
+
if (isVoid) {
|
|
122
|
+
htmlToken.children = [{
|
|
123
|
+
type: "html_inline",
|
|
124
|
+
content: raw
|
|
125
|
+
}];
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
htmlToken.children.length = 0;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
78
133
|
//#endregion
|
|
79
134
|
//#region src/plugins/fixLinkInline.ts
|
|
80
135
|
function applyFixLinkInline(md) {
|
|
@@ -547,6 +602,37 @@ function findMatchingClose(src, startIdx, open, close) {
|
|
|
547
602
|
}
|
|
548
603
|
var findMatchingClose_default = findMatchingClose;
|
|
549
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
|
+
|
|
550
636
|
//#endregion
|
|
551
637
|
//#region src/plugins/isMathLike.ts
|
|
552
638
|
const TEX_BRACE_COMMANDS = [
|
|
@@ -665,6 +751,13 @@ const CONTROL_MAP = {
|
|
|
665
751
|
"\f": "f",
|
|
666
752
|
"\v": "v"
|
|
667
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);
|
|
668
761
|
function countUnescapedStrong(s) {
|
|
669
762
|
const re = /(^|[^\\])(__|\*\*)/g;
|
|
670
763
|
let c = 0;
|
|
@@ -676,11 +769,15 @@ function normalizeStandaloneBackslashT(s, opts) {
|
|
|
676
769
|
const escapeExclamation = opts?.escapeExclamation ?? true;
|
|
677
770
|
const useDefault = opts?.commands == null;
|
|
678
771
|
let re;
|
|
679
|
-
if (useDefault) re =
|
|
772
|
+
if (useDefault) re = DEFAULT_STANDALONE_BACKSLASH_T_RE;
|
|
680
773
|
else {
|
|
681
|
-
const
|
|
682
|
-
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
|
+
});
|
|
683
779
|
}
|
|
780
|
+
if (re && "lastIndex" in re) re.lastIndex = 0;
|
|
684
781
|
let out = s.replace(re, (m, cmd) => {
|
|
685
782
|
if (CONTROL_MAP[m] !== void 0) return `\\${CONTROL_MAP[m]}`;
|
|
686
783
|
if (cmd && commands.includes(cmd)) return `\\${cmd}`;
|
|
@@ -690,8 +787,18 @@ function normalizeStandaloneBackslashT(s, opts) {
|
|
|
690
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("|");
|
|
691
788
|
let result = out;
|
|
692
789
|
if (braceEscaped) {
|
|
693
|
-
|
|
694
|
-
|
|
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
|
+
}
|
|
695
802
|
}
|
|
696
803
|
result = result.replace(/span\{([^}]+)\}/, "span\\{$1\\}").replace(/\\operatorname\{span\}\{((?:[^{}]|\{[^}]*\})+)\}/, "\\operatorname{span}\\{$1\\}");
|
|
697
804
|
result = result.replace(/(^|[^\\])\\\r?\n/g, "$1\\\\\n");
|
|
@@ -986,6 +1093,7 @@ function factory(opts = {}) {
|
|
|
986
1093
|
applyFixListItem(md);
|
|
987
1094
|
applyFixTableTokens(md);
|
|
988
1095
|
applyRenderRules(md);
|
|
1096
|
+
applyFixHtmlInlineTokens(md);
|
|
989
1097
|
return md;
|
|
990
1098
|
}
|
|
991
1099
|
|
|
@@ -1444,6 +1552,12 @@ function isLikelyUrl(href) {
|
|
|
1444
1552
|
if (!href) return false;
|
|
1445
1553
|
return AUTOLINK_PROTOCOL_RE.test(href) || AUTOLINK_GENERIC_RE.test(href);
|
|
1446
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);
|
|
1447
1561
|
function parseInlineTokens(tokens, raw, pPreToken) {
|
|
1448
1562
|
if (!tokens || tokens.length === 0) return [];
|
|
1449
1563
|
const result = [];
|
|
@@ -1876,13 +1990,10 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1876
1990
|
function handleLinkOpen(token) {
|
|
1877
1991
|
resetCurrentTextNode();
|
|
1878
1992
|
const href = token.attrs?.find(([name]) => name === "href")?.[1];
|
|
1879
|
-
function escapeRegExp(str) {
|
|
1880
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1881
|
-
}
|
|
1882
1993
|
if (raw && tokens[i + 1].type === "text") {
|
|
1883
1994
|
const text = String(tokens[i + 1]?.content ?? "");
|
|
1884
1995
|
const escText = escapeRegExp(text);
|
|
1885
|
-
if (!(/* @__PURE__ */ new RegExp(`\\[${escText}\\s*\\]`)).test(raw)) {
|
|
1996
|
+
if (!bracketRegexCache.getOrCreate(escText, () => /* @__PURE__ */ new RegExp(`\\[${escText}\\s*\\]`)).test(raw)) {
|
|
1886
1997
|
const hrefAttr$1 = token.attrs?.find(([name]) => name === "href")?.[1] ?? "";
|
|
1887
1998
|
if (!raw.includes("[") && isLikelyUrl(String(hrefAttr$1))) {
|
|
1888
1999
|
resetCurrentTextNode();
|
|
@@ -1907,7 +2018,11 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1907
2018
|
}
|
|
1908
2019
|
}
|
|
1909
2020
|
if (raw && href) {
|
|
1910
|
-
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
|
+
});
|
|
1911
2026
|
const pre = result.length > 0 ? result[result.length - 1] : void 0;
|
|
1912
2027
|
const loading = !loadingMath.test(raw);
|
|
1913
2028
|
if (loading && pre) {
|
|
@@ -1917,7 +2032,7 @@ function parseInlineTokens(tokens, raw, pPreToken) {
|
|
|
1917
2032
|
else if (pre.type === "text") preText = String(pre.content ?? "");
|
|
1918
2033
|
else if (pre.content && typeof pre.content === "string") preText = String(pre.content ?? "").slice(1, -1);
|
|
1919
2034
|
}
|
|
1920
|
-
if ((/* @__PURE__ */ new RegExp(`\\[${escapeRegExp(preText)}\\s*\\]\\(`)).test(raw)) {
|
|
2035
|
+
if (linkMatchRegexCache.getOrCreate(preText, () => /* @__PURE__ */ new RegExp(`\\[${escapeRegExp(preText)}\\s*\\]\\(`)).test(raw)) {
|
|
1921
2036
|
const text = String(preText ?? "");
|
|
1922
2037
|
resetCurrentTextNode();
|
|
1923
2038
|
const node$1 = {
|
|
@@ -2455,6 +2570,7 @@ function parseAdmonition(tokens, index, match) {
|
|
|
2455
2570
|
|
|
2456
2571
|
//#endregion
|
|
2457
2572
|
//#region src/parser/node-parsers/container-parser.ts
|
|
2573
|
+
const containerCloseTypeCache = new LRUCache(50);
|
|
2458
2574
|
function parseContainer(tokens, index) {
|
|
2459
2575
|
const openToken = tokens[index];
|
|
2460
2576
|
let kind = "note";
|
|
@@ -2464,7 +2580,9 @@ function parseContainer(tokens, index) {
|
|
|
2464
2580
|
kind = typeMatch[1];
|
|
2465
2581
|
const info = String(openToken.info ?? "").trim();
|
|
2466
2582
|
if (info && !info.startsWith(":::")) {
|
|
2467
|
-
|
|
2583
|
+
let maybe = info;
|
|
2584
|
+
if (maybe.startsWith(kind)) maybe = maybe.slice(kind.length).trim();
|
|
2585
|
+
maybe = maybe.trim();
|
|
2468
2586
|
if (maybe) title = maybe;
|
|
2469
2587
|
}
|
|
2470
2588
|
} else {
|
|
@@ -2478,7 +2596,8 @@ function parseContainer(tokens, index) {
|
|
|
2478
2596
|
if (!title) title = kind.charAt(0).toUpperCase() + kind.slice(1);
|
|
2479
2597
|
const children = [];
|
|
2480
2598
|
let j = index + 1;
|
|
2481
|
-
const
|
|
2599
|
+
const key = kind;
|
|
2600
|
+
const closeType = containerCloseTypeCache.getOrCreate(key, () => /* @__PURE__ */ new RegExp(`^container_${kind}_close$`));
|
|
2482
2601
|
while (j < tokens.length && tokens[j].type !== "container_close" && !closeType.test(tokens[j].type)) if (tokens[j].type === "paragraph_open") {
|
|
2483
2602
|
const contentToken = tokens[j + 1];
|
|
2484
2603
|
if (contentToken) {
|
|
@@ -2524,13 +2643,51 @@ function parseHardBreak() {
|
|
|
2524
2643
|
|
|
2525
2644
|
//#endregion
|
|
2526
2645
|
//#region src/parser/node-parsers/html-block-parser.ts
|
|
2646
|
+
const htmlCloseTagRegexCache = new LRUCache(200);
|
|
2527
2647
|
function parseHtmlBlock(token) {
|
|
2528
|
-
|
|
2648
|
+
const raw = String(token.content ?? "");
|
|
2649
|
+
if (/^\s*<!--/.test(raw) || /^\s*<!/.test(raw) || /^\s*<\?/.test(raw)) return {
|
|
2529
2650
|
type: "html_block",
|
|
2530
|
-
content:
|
|
2531
|
-
raw
|
|
2651
|
+
content: raw,
|
|
2652
|
+
raw,
|
|
2653
|
+
tag: "",
|
|
2654
|
+
loading: false
|
|
2655
|
+
};
|
|
2656
|
+
const tag = (raw.match(/^\s*<([A-Z][\w:-]*)/i)?.[1] || "").toLowerCase();
|
|
2657
|
+
if (!tag) return {
|
|
2658
|
+
type: "html_block",
|
|
2659
|
+
content: raw,
|
|
2660
|
+
raw,
|
|
2661
|
+
tag: "",
|
|
2532
2662
|
loading: false
|
|
2533
2663
|
};
|
|
2664
|
+
const VOID_TAGS = new Set([
|
|
2665
|
+
"area",
|
|
2666
|
+
"base",
|
|
2667
|
+
"br",
|
|
2668
|
+
"col",
|
|
2669
|
+
"embed",
|
|
2670
|
+
"hr",
|
|
2671
|
+
"img",
|
|
2672
|
+
"input",
|
|
2673
|
+
"link",
|
|
2674
|
+
"meta",
|
|
2675
|
+
"param",
|
|
2676
|
+
"source",
|
|
2677
|
+
"track",
|
|
2678
|
+
"wbr"
|
|
2679
|
+
]);
|
|
2680
|
+
const selfClosing = /^\s*<[^>]*\/\s*>/.test(raw);
|
|
2681
|
+
const isVoid = VOID_TAGS.has(tag);
|
|
2682
|
+
const hasClosing = htmlCloseTagRegexCache.getOrCreate(tag, () => new RegExp(`<\\/\\s*${tag}\\b`, "i")).test(raw);
|
|
2683
|
+
const loading = !(isVoid || selfClosing || hasClosing);
|
|
2684
|
+
return {
|
|
2685
|
+
type: "html_block",
|
|
2686
|
+
content: loading ? `${raw.replace(/<[^>]*$/, "")}\n</${tag}>` : raw,
|
|
2687
|
+
raw,
|
|
2688
|
+
tag,
|
|
2689
|
+
loading
|
|
2690
|
+
};
|
|
2534
2691
|
}
|
|
2535
2692
|
|
|
2536
2693
|
//#endregion
|