markdown-flow-ui 0.2.30 → 0.2.31
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 +25 -2
- package/dist/_virtual/index.es5.js +5 -3
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +3 -5
- package/dist/_virtual/index.es6.js.map +1 -1
- package/dist/_virtual/index.es7.js +4 -4
- package/dist/_virtual/index5.cjs +1 -1
- package/dist/_virtual/index6.cjs +1 -1
- package/dist/_virtual/index7.cjs +1 -1
- package/dist/components/ContentRender/ContentRender.cjs +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.map +1 -1
- package/dist/components/ContentRender/ContentRender.es.js +603 -392
- package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
- package/dist/components/ContentRender/index.cjs +1 -1
- package/dist/components/ContentRender/index.es.js +1 -0
- package/dist/components/ContentRender/index.es.js.map +1 -1
- package/dist/components/ContentRender/utils/escape-typed-metadata.cjs +2 -0
- package/dist/components/ContentRender/utils/escape-typed-metadata.cjs.map +1 -0
- package/dist/components/ContentRender/utils/escape-typed-metadata.d.ts +9 -0
- package/dist/components/ContentRender/utils/escape-typed-metadata.es.js +47 -0
- package/dist/components/ContentRender/utils/escape-typed-metadata.es.js.map +1 -0
- package/dist/components/ContentRender/utils/escape-typed-metadata.test.d.ts +1 -0
- package/dist/components/ContentRender/utils/html-block-end.cjs +1 -1
- package/dist/components/ContentRender/utils/html-block-end.cjs.map +1 -1
- package/dist/components/ContentRender/utils/html-block-end.d.ts +20 -6
- package/dist/components/ContentRender/utils/html-block-end.es.js +63 -56
- package/dist/components/ContentRender/utils/html-block-end.es.js.map +1 -1
- package/dist/components/ContentRender/utils/inline-code-ranges.cache.test.d.ts +1 -0
- package/dist/components/ContentRender/utils/inline-code-ranges.cjs +10 -0
- package/dist/components/ContentRender/utils/inline-code-ranges.cjs.map +1 -0
- package/dist/components/ContentRender/utils/inline-code-ranges.d.ts +39 -0
- package/dist/components/ContentRender/utils/inline-code-ranges.es.js +336 -0
- package/dist/components/ContentRender/utils/inline-code-ranges.es.js.map +1 -0
- package/dist/components/ContentRender/utils/inline-code-ranges.test.d.ts +1 -0
- package/dist/components/ContentRender/utils/markdown-plugins.cjs +2 -0
- package/dist/components/ContentRender/utils/markdown-plugins.cjs.map +1 -0
- package/dist/components/ContentRender/utils/markdown-plugins.d.ts +2 -0
- package/dist/components/ContentRender/utils/markdown-plugins.es.js +14 -0
- package/dist/components/ContentRender/utils/markdown-plugins.es.js.map +1 -0
- package/dist/components/ContentRender/utils/mermaid-parse.cjs +4 -3
- package/dist/components/ContentRender/utils/mermaid-parse.cjs.map +1 -1
- package/dist/components/ContentRender/utils/mermaid-parse.es.js +86 -67
- package/dist/components/ContentRender/utils/mermaid-parse.es.js.map +1 -1
- package/dist/components/ContentRender/utils/mermaid-parse.test.d.ts +1 -0
- package/dist/components/ContentRender/utils/normalize-inline-html.cjs +4 -2
- package/dist/components/ContentRender/utils/normalize-inline-html.cjs.map +1 -1
- package/dist/components/ContentRender/utils/normalize-inline-html.d.ts +4 -1
- package/dist/components/ContentRender/utils/normalize-inline-html.es.js +15 -7
- package/dist/components/ContentRender/utils/normalize-inline-html.es.js.map +1 -1
- package/dist/components/ContentRender/utils/normalize-inline-html.test.d.ts +1 -0
- package/dist/components/ContentRender/utils/resumed-prose-fence.cjs +5 -0
- package/dist/components/ContentRender/utils/resumed-prose-fence.cjs.map +1 -0
- package/dist/components/ContentRender/utils/resumed-prose-fence.d.ts +5 -0
- package/dist/components/ContentRender/utils/resumed-prose-fence.es.js +60 -0
- package/dist/components/ContentRender/utils/resumed-prose-fence.es.js.map +1 -0
- package/dist/components/ContentRender/utils/split-content.cjs +6 -3
- package/dist/components/ContentRender/utils/split-content.cjs.map +1 -1
- package/dist/components/ContentRender/utils/split-content.d.ts +7 -1
- package/dist/components/ContentRender/utils/split-content.es.js +460 -216
- package/dist/components/ContentRender/utils/split-content.es.js.map +1 -1
- package/dist/components/ContentRender/utils/split-content.image-alt.test.d.ts +1 -0
- package/dist/components/ContentRender/utils/split-content.resumed-fences.test.d.ts +1 -0
- package/dist/components/ContentRender/utils/video-markdown-run.cjs +14 -0
- package/dist/components/ContentRender/utils/video-markdown-run.cjs.map +1 -0
- package/dist/components/ContentRender/utils/video-markdown-run.d.ts +47 -0
- package/dist/components/ContentRender/utils/video-markdown-run.es.js +462 -0
- package/dist/components/ContentRender/utils/video-markdown-run.es.js.map +1 -0
- package/dist/components/ContentRender/utils/video-markdown-run.test.d.ts +1 -0
- package/dist/components/ContentRender/utils/wrapped-content.test.d.ts +1 -0
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js +9 -8
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs +1 -1
- package/dist/components/Slide/Slide.cjs.map +1 -1
- package/dist/components/Slide/Slide.es.js +3 -2
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/node_modules/hast-util-to-jsx-runtime/lib/index.cjs +1 -1
- package/dist/node_modules/hast-util-to-jsx-runtime/lib/index.es.js +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-AAMF2YG6.cjs +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-AAMF2YG6.es.js +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-OMD6QJNC.cjs +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-OMD6QJNC.es.js +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-U37J5Y7L.cjs +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/chunk-U37J5Y7L.es.js +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-WV7ZQ7D5.cjs +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-WV7ZQ7D5.es.js +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-4MX5Z3NR.cjs +1 -1
- package/dist/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-4MX5Z3NR.es.js +1 -1
- package/dist/node_modules/unified/lib/index.cjs +1 -1
- package/dist/node_modules/unified/lib/index.es.js +1 -1
- package/package.json +6 -1
|
@@ -1,96 +1,115 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import { getMarkdownSourceAnalysis as x } from "./inline-code-ranges.es.js";
|
|
2
|
+
function O(e) {
|
|
3
|
+
const s = [], o = x(e), r = o.markdown, a = o.inline, u = (t) => {
|
|
4
|
+
let c = 0, l = o.metadata.length;
|
|
5
|
+
for (; c < l; ) {
|
|
6
|
+
const d = c + l >>> 1;
|
|
7
|
+
o.metadata[d].start <= t ? c = d + 1 : l = d;
|
|
8
|
+
}
|
|
9
|
+
const p = o.metadata[c - 1];
|
|
10
|
+
return p && t < p.end ? p : void 0;
|
|
11
|
+
}, m = (t) => !!u(t), h = (t) => r.some(({ start: c, end: l }) => t >= c && t < l), y = (t) => {
|
|
12
|
+
const c = e.lastIndexOf(`
|
|
13
|
+
`, t - 1) + 1;
|
|
14
|
+
return /^ {0,3}$/.test(e.slice(c, t)) && !m(t) && r.some(({ start: l }) => l === t) && !a.some(({ start: l, end: p }) => t >= l && t < p);
|
|
15
|
+
}, v = /```[\s\S]*?```|<svg[\s\S]*?<\/svg>/g;
|
|
16
|
+
let i = 0, I;
|
|
17
|
+
for (; (I = v.exec(e)) !== null; ) {
|
|
18
|
+
const t = I.index, c = v.lastIndex, l = I[0], p = u(t);
|
|
19
|
+
if (p) {
|
|
20
|
+
v.lastIndex = p.end;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (!(l.startsWith("```") ? !y(t) : h(t))) {
|
|
24
|
+
if (t > i && s.push({
|
|
25
|
+
type: "text",
|
|
26
|
+
value: e.slice(i, t)
|
|
27
|
+
}), l.startsWith("```mermaid")) {
|
|
28
|
+
const d = l.replace(/^```mermaid/, "").replace(/```$/, "").trim();
|
|
29
|
+
s.push({
|
|
30
|
+
type: "mermaid",
|
|
31
|
+
value: d,
|
|
32
|
+
complete: !0
|
|
33
|
+
});
|
|
34
|
+
} else l.startsWith("```") ? s.push({
|
|
35
|
+
type: "text",
|
|
36
|
+
value: l
|
|
37
|
+
}) : s.push({
|
|
38
|
+
type: "svg",
|
|
39
|
+
value: l,
|
|
14
40
|
complete: !0
|
|
15
41
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
value: r
|
|
19
|
-
}) : t.push({
|
|
20
|
-
type: "svg",
|
|
21
|
-
value: r,
|
|
22
|
-
complete: !0
|
|
23
|
-
});
|
|
24
|
-
s = a;
|
|
42
|
+
i = c;
|
|
43
|
+
}
|
|
25
44
|
}
|
|
26
|
-
let
|
|
27
|
-
const
|
|
28
|
-
(
|
|
29
|
-
const
|
|
30
|
-
if (!(
|
|
31
|
-
return
|
|
45
|
+
let n = e.lastIndexOf("<svg");
|
|
46
|
+
const g = e.lastIndexOf("</svg>");
|
|
47
|
+
(n === -1 || g !== -1 && g > n) && (e.endsWith("<sv") ? n = e.length - 3 : e.endsWith("<s") && (n = e.length - 2));
|
|
48
|
+
const S = e.indexOf("```", i);
|
|
49
|
+
if (!(S !== -1 && S < n) && !h(n) && !m(n) && n !== -1 && (g === -1 || g < n) && n >= i)
|
|
50
|
+
return n > i && s.push({
|
|
32
51
|
type: "text",
|
|
33
|
-
value: e.slice(
|
|
34
|
-
}),
|
|
52
|
+
value: e.slice(i, n)
|
|
53
|
+
}), s.push({
|
|
35
54
|
type: "svg",
|
|
36
|
-
value: e.slice(
|
|
55
|
+
value: e.slice(n),
|
|
37
56
|
complete: !1
|
|
38
|
-
}),
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
57
|
+
}), s;
|
|
58
|
+
const f = e.lastIndexOf("```mermaid");
|
|
59
|
+
if (f !== -1 && y(f) && f >= i && // Ensure this mermaid block isn't inside another code block (unlikely but safe to check)
|
|
41
60
|
// Actually, incompleteCodeBlockStart would capture this "```mermaid" as just "```"
|
|
42
61
|
// so we need to be careful.
|
|
43
62
|
// If incompleteCodeBlockStart points to THIS mermaid block, we process it as mermaid.
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
return
|
|
63
|
+
f === S) {
|
|
64
|
+
const t = e.slice(f + 10);
|
|
65
|
+
return s.push({
|
|
47
66
|
type: "mermaid",
|
|
48
|
-
value:
|
|
67
|
+
value: t.trim(),
|
|
49
68
|
complete: !1
|
|
50
|
-
}),
|
|
69
|
+
}), f > i && s.push({
|
|
51
70
|
type: "text",
|
|
52
|
-
value: e.slice(
|
|
53
|
-
}),
|
|
71
|
+
value: e.slice(i, f)
|
|
72
|
+
}), s;
|
|
54
73
|
}
|
|
55
|
-
return
|
|
74
|
+
return i < e.length && s.push({
|
|
56
75
|
type: "text",
|
|
57
|
-
value: e.slice(
|
|
58
|
-
}),
|
|
76
|
+
value: e.slice(i)
|
|
77
|
+
}), s;
|
|
59
78
|
}
|
|
60
|
-
function
|
|
61
|
-
const
|
|
62
|
-
let
|
|
63
|
-
return
|
|
64
|
-
if (!
|
|
65
|
-
|
|
79
|
+
function C(e) {
|
|
80
|
+
const s = [], o = e.split(/\r?\n/);
|
|
81
|
+
let r = !1, a = [], u = 0;
|
|
82
|
+
return o.forEach((m, h) => {
|
|
83
|
+
if (!r) {
|
|
84
|
+
m.trim().startsWith("```mermaid") && (r = !0, u = h, a = []);
|
|
66
85
|
return;
|
|
67
86
|
}
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
code:
|
|
87
|
+
if (m.trim() === "```") {
|
|
88
|
+
s.push({
|
|
89
|
+
code: a.join(`
|
|
71
90
|
`).trim(),
|
|
72
|
-
startLine:
|
|
73
|
-
endLine:
|
|
91
|
+
startLine: u,
|
|
92
|
+
endLine: h,
|
|
74
93
|
complete: !0
|
|
75
|
-
}),
|
|
94
|
+
}), r = !1;
|
|
76
95
|
return;
|
|
77
96
|
}
|
|
78
|
-
|
|
79
|
-
}),
|
|
80
|
-
code:
|
|
97
|
+
a.push(m);
|
|
98
|
+
}), r && s.push({
|
|
99
|
+
code: a.join(`
|
|
81
100
|
`).trim(),
|
|
82
|
-
startLine:
|
|
101
|
+
startLine: u,
|
|
83
102
|
endLine: null,
|
|
84
103
|
complete: !1
|
|
85
|
-
}),
|
|
104
|
+
}), s;
|
|
86
105
|
}
|
|
87
|
-
function
|
|
88
|
-
const
|
|
89
|
-
return
|
|
106
|
+
function b(e, s) {
|
|
107
|
+
const o = s.trim(), a = C(e).find((u) => u.code === o);
|
|
108
|
+
return a ? a.complete : !1;
|
|
90
109
|
}
|
|
91
110
|
export {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
111
|
+
b as mermaidBlockIsComplete,
|
|
112
|
+
O as parseMarkdownSegments,
|
|
113
|
+
C as parseMermaidBlocks
|
|
95
114
|
};
|
|
96
115
|
//# sourceMappingURL=mermaid-parse.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mermaid-parse.es.js","sources":["../../../../src/components/ContentRender/utils/mermaid-parse.ts"],"sourcesContent":["export function parseMarkdownSegments(markdown: string) {\n const segments: Array<\n | { type: \"text\"; value: string }\n | { type: \"mermaid\"; value: string; complete: boolean }\n | { type: \"svg\"; value: string; complete: boolean }\n > = [];\n\n // Match:\n // 1. Generic code blocks (including mermaid): ``` ... ```\n // 2. SVG blocks: <svg ... </svg>\n const regex = /```[\\s\\S]*?```|<svg[\\s\\S]*?<\\/svg>/g;\n\n let lastIndex = 0;\n let match;\n\n while ((match = regex.exec(markdown)) !== null) {\n const start = match.index;\n const end = regex.lastIndex;\n const rawMatch = match[0];\n\n // Preceding plain text\n if (start > lastIndex) {\n segments.push({\n type: \"text\",\n value: markdown.slice(lastIndex, start),\n });\n }\n\n // Complete mermaid block, generic code block, or svg block\n if (rawMatch.startsWith(\"```mermaid\")) {\n const code = rawMatch\n .replace(/^```mermaid/, \"\")\n .replace(/```$/, \"\")\n .trim();\n segments.push({\n type: \"mermaid\",\n value: code,\n complete: true,\n });\n } else if (rawMatch.startsWith(\"```\")) {\n // Generic code block - treat as text so ReactMarkdown renders it\n segments.push({\n type: \"text\",\n value: rawMatch,\n });\n } else {\n // SVG block\n segments.push({\n type: \"svg\",\n value: rawMatch,\n complete: true,\n });\n }\n\n lastIndex = end;\n }\n\n // Handle unfinished svg block to avoid leaking raw tags while streaming\n let incompleteSvgStart = markdown.lastIndexOf(\"<svg\");\n const lastSvgClose = markdown.lastIndexOf(\"</svg>\");\n\n // If we haven't found an open <svg tag (or the last one is closed),\n // check if the string ends with a partial <svg tag (<s, <sv).\n if (\n incompleteSvgStart === -1 ||\n (lastSvgClose !== -1 && lastSvgClose > incompleteSvgStart)\n ) {\n if (markdown.endsWith(\"<sv\")) {\n incompleteSvgStart = markdown.length - 3;\n } else if (markdown.endsWith(\"<s\")) {\n incompleteSvgStart = markdown.length - 2;\n }\n }\n\n // Check if we are inside an unclosed code block\n // If an unclosed code block starts AFTER the last complete segment (lastIndex),\n // and BEFORE the potential SVG start, then the SVG is inside the code block.\n const incompleteCodeBlockStart = markdown.indexOf(\"```\", lastIndex);\n const isInsideCodeBlock =\n incompleteCodeBlockStart !== -1 &&\n incompleteCodeBlockStart < incompleteSvgStart;\n\n const hasIncompleteSvg =\n !isInsideCodeBlock &&\n incompleteSvgStart !== -1 &&\n (lastSvgClose === -1 || lastSvgClose < incompleteSvgStart) &&\n incompleteSvgStart >= lastIndex;\n\n if (hasIncompleteSvg) {\n if (incompleteSvgStart > lastIndex) {\n segments.push({\n type: \"text\",\n value: markdown.slice(lastIndex, incompleteSvgStart),\n });\n }\n\n segments.push({\n type: \"svg\",\n value: markdown.slice(incompleteSvgStart),\n complete: false,\n });\n return segments;\n }\n\n // Check whether there is an unfinished mermaid block\n // Only if we are NOT inside a generic incomplete code block that started earlier\n // Actually, standard mermaid block starts with ```mermaid, so it IS a code block start.\n // We just need to check if it's specifically mermaid.\n const incompleteStart = markdown.lastIndexOf(\"```mermaid\");\n if (\n incompleteStart !== -1 &&\n incompleteStart >= lastIndex &&\n // Ensure this mermaid block isn't inside another code block (unlikely but safe to check)\n // Actually, incompleteCodeBlockStart would capture this \"```mermaid\" as just \"```\"\n // so we need to be careful.\n // If incompleteCodeBlockStart points to THIS mermaid block, we process it as mermaid.\n incompleteStart === incompleteCodeBlockStart\n ) {\n const code = markdown.slice(incompleteStart + 10);\n segments.push({\n type: \"mermaid\",\n value: code.trim(),\n complete: false,\n });\n\n if (incompleteStart > lastIndex) {\n segments.push({\n type: \"text\",\n value: markdown.slice(lastIndex, incompleteStart),\n });\n }\n\n return segments;\n }\n\n // Remaining text\n if (lastIndex < markdown.length) {\n segments.push({\n type: \"text\",\n value: markdown.slice(lastIndex),\n });\n }\n\n return segments;\n}\n\nexport function parseMermaidBlocks(fullMarkdown: string) {\n const blocks = [];\n const lines: string[] = fullMarkdown.split(/\\r?\\n/);\n\n let inside = false;\n let current: string[] = [];\n let startLine = 0;\n\n lines.forEach((line, index) => {\n if (!inside) {\n if (line.trim().startsWith(\"```mermaid\")) {\n inside = true;\n startLine = index;\n current = [];\n }\n return;\n }\n\n // inside mermaid mode\n if (line.trim() === \"```\") {\n // block complete\n blocks.push({\n code: current.join(\"\\n\").trim(),\n startLine,\n endLine: index,\n complete: true,\n });\n inside = false;\n return;\n }\n\n current.push(line);\n });\n\n // if still inside → incomplete block\n if (inside) {\n blocks.push({\n code: current.join(\"\\n\").trim(),\n startLine,\n endLine: null,\n complete: false,\n });\n }\n\n return blocks;\n}\n\n/**\n * Determine whether the mermaid block for the given codeString is fully closed.\n * @param fullMarkdown Full markdown text (grows over time in streaming scenarios)\n * @param codeString Mermaid block code passed to the renderer (children)\n */\nexport function mermaidBlockIsComplete(\n fullMarkdown: string,\n codeString: string\n) {\n const cleaned = codeString.trim();\n const blocks = parseMermaidBlocks(fullMarkdown);\n // Locate the block that matches the current codeString\n const block = blocks.find((b) => b.code === cleaned);\n\n if (!block) return false;\n\n // Block is complete when the closing fence already exists\n return block.complete;\n}\n"],"names":["parseMarkdownSegments","markdown","segments","regex","lastIndex","match","start","end","rawMatch","code","incompleteSvgStart","lastSvgClose","incompleteCodeBlockStart","incompleteStart","parseMermaidBlocks","fullMarkdown","blocks","lines","inside","current","startLine","line","index","mermaidBlockIsComplete","codeString","cleaned","block","b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mermaid-parse.es.js","sources":["../../../../src/components/ContentRender/utils/mermaid-parse.ts"],"sourcesContent":["import { getMarkdownSourceAnalysis } from \"./inline-code-ranges\";\n\nexport function parseMarkdownSegments(markdown: string) {\n const segments: Array<\n | { type: \"text\"; value: string }\n | { type: \"mermaid\"; value: string; complete: boolean }\n | { type: \"svg\"; value: string; complete: boolean }\n > = [];\n\n const analysis = getMarkdownSourceAnalysis(markdown);\n const codeRanges = analysis.markdown;\n const inlineCodeRanges = analysis.inline;\n const metadataAt = (index: number) => {\n let low = 0;\n let high = analysis.metadata.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (analysis.metadata[middle].start <= index) low = middle + 1;\n else high = middle;\n }\n const range = analysis.metadata[low - 1];\n return range && index < range.end ? range : undefined;\n };\n const isInsideMetadata = (index: number) => Boolean(metadataAt(index));\n const isInsideCode = (index: number) =>\n codeRanges.some(({ start, end }) => index >= start && index < end);\n const isTopLevelFenceStart = (index: number) => {\n const lineStart = markdown.lastIndexOf(\"\\n\", index - 1) + 1;\n return (\n /^ {0,3}$/.test(markdown.slice(lineStart, index)) &&\n !isInsideMetadata(index) &&\n codeRanges.some(({ start }) => start === index) &&\n !inlineCodeRanges.some(({ start, end }) => index >= start && index < end)\n );\n };\n\n // Match:\n // 1. Generic code blocks (including mermaid): ``` ... ```\n // 2. SVG blocks: <svg ... </svg>\n const regex = /```[\\s\\S]*?```|<svg[\\s\\S]*?<\\/svg>/g;\n\n let lastIndex = 0;\n let match;\n\n while ((match = regex.exec(markdown)) !== null) {\n const start = match.index;\n const end = regex.lastIndex;\n const rawMatch = match[0];\n\n const metadata = metadataAt(start);\n if (metadata) {\n // A quoted opener may make this regex match extend into real markup.\n // Resume after the title so that later SVG/fences still get rendered.\n regex.lastIndex = metadata.end;\n continue;\n }\n // Keep container fences and code examples in one Markdown source segment.\n if (\n rawMatch.startsWith(\"```\")\n ? !isTopLevelFenceStart(start)\n : isInsideCode(start)\n ) {\n continue;\n }\n\n // Preceding plain text\n if (start > lastIndex) {\n segments.push({\n type: \"text\",\n value: markdown.slice(lastIndex, start),\n });\n }\n\n // Complete mermaid block, generic code block, or svg block\n if (rawMatch.startsWith(\"```mermaid\")) {\n const code = rawMatch\n .replace(/^```mermaid/, \"\")\n .replace(/```$/, \"\")\n .trim();\n segments.push({\n type: \"mermaid\",\n value: code,\n complete: true,\n });\n } else if (rawMatch.startsWith(\"```\")) {\n // Generic code block - treat as text so ReactMarkdown renders it\n segments.push({\n type: \"text\",\n value: rawMatch,\n });\n } else {\n // SVG block\n segments.push({\n type: \"svg\",\n value: rawMatch,\n complete: true,\n });\n }\n\n lastIndex = end;\n }\n\n // Handle unfinished svg block to avoid leaking raw tags while streaming\n let incompleteSvgStart = markdown.lastIndexOf(\"<svg\");\n const lastSvgClose = markdown.lastIndexOf(\"</svg>\");\n\n // If we haven't found an open <svg tag (or the last one is closed),\n // check if the string ends with a partial <svg tag (<s, <sv).\n if (\n incompleteSvgStart === -1 ||\n (lastSvgClose !== -1 && lastSvgClose > incompleteSvgStart)\n ) {\n if (markdown.endsWith(\"<sv\")) {\n incompleteSvgStart = markdown.length - 3;\n } else if (markdown.endsWith(\"<s\")) {\n incompleteSvgStart = markdown.length - 2;\n }\n }\n\n // Check if we are inside an unclosed code block\n // If an unclosed code block starts AFTER the last complete segment (lastIndex),\n // and BEFORE the potential SVG start, then the SVG is inside the code block.\n const incompleteCodeBlockStart = markdown.indexOf(\"```\", lastIndex);\n const isInsideCodeBlock =\n incompleteCodeBlockStart !== -1 &&\n incompleteCodeBlockStart < incompleteSvgStart;\n\n const hasIncompleteSvg =\n !isInsideCodeBlock &&\n !isInsideCode(incompleteSvgStart) &&\n !isInsideMetadata(incompleteSvgStart) &&\n incompleteSvgStart !== -1 &&\n (lastSvgClose === -1 || lastSvgClose < incompleteSvgStart) &&\n incompleteSvgStart >= lastIndex;\n\n if (hasIncompleteSvg) {\n if (incompleteSvgStart > lastIndex) {\n segments.push({\n type: \"text\",\n value: markdown.slice(lastIndex, incompleteSvgStart),\n });\n }\n\n segments.push({\n type: \"svg\",\n value: markdown.slice(incompleteSvgStart),\n complete: false,\n });\n return segments;\n }\n\n // Check whether there is an unfinished mermaid block\n // Only if we are NOT inside a generic incomplete code block that started earlier\n // Actually, standard mermaid block starts with ```mermaid, so it IS a code block start.\n // We just need to check if it's specifically mermaid.\n const incompleteStart = markdown.lastIndexOf(\"```mermaid\");\n if (\n incompleteStart !== -1 &&\n isTopLevelFenceStart(incompleteStart) &&\n incompleteStart >= lastIndex &&\n // Ensure this mermaid block isn't inside another code block (unlikely but safe to check)\n // Actually, incompleteCodeBlockStart would capture this \"```mermaid\" as just \"```\"\n // so we need to be careful.\n // If incompleteCodeBlockStart points to THIS mermaid block, we process it as mermaid.\n incompleteStart === incompleteCodeBlockStart\n ) {\n const code = markdown.slice(incompleteStart + 10);\n segments.push({\n type: \"mermaid\",\n value: code.trim(),\n complete: false,\n });\n\n if (incompleteStart > lastIndex) {\n segments.push({\n type: \"text\",\n value: markdown.slice(lastIndex, incompleteStart),\n });\n }\n\n return segments;\n }\n\n // Remaining text\n if (lastIndex < markdown.length) {\n segments.push({\n type: \"text\",\n value: markdown.slice(lastIndex),\n });\n }\n\n return segments;\n}\n\nexport function parseMermaidBlocks(fullMarkdown: string) {\n const blocks = [];\n const lines: string[] = fullMarkdown.split(/\\r?\\n/);\n\n let inside = false;\n let current: string[] = [];\n let startLine = 0;\n\n lines.forEach((line, index) => {\n if (!inside) {\n if (line.trim().startsWith(\"```mermaid\")) {\n inside = true;\n startLine = index;\n current = [];\n }\n return;\n }\n\n // inside mermaid mode\n if (line.trim() === \"```\") {\n // block complete\n blocks.push({\n code: current.join(\"\\n\").trim(),\n startLine,\n endLine: index,\n complete: true,\n });\n inside = false;\n return;\n }\n\n current.push(line);\n });\n\n // if still inside → incomplete block\n if (inside) {\n blocks.push({\n code: current.join(\"\\n\").trim(),\n startLine,\n endLine: null,\n complete: false,\n });\n }\n\n return blocks;\n}\n\n/**\n * Determine whether the mermaid block for the given codeString is fully closed.\n * @param fullMarkdown Full markdown text (grows over time in streaming scenarios)\n * @param codeString Mermaid block code passed to the renderer (children)\n */\nexport function mermaidBlockIsComplete(\n fullMarkdown: string,\n codeString: string\n) {\n const cleaned = codeString.trim();\n const blocks = parseMermaidBlocks(fullMarkdown);\n // Locate the block that matches the current codeString\n const block = blocks.find((b) => b.code === cleaned);\n\n if (!block) return false;\n\n // Block is complete when the closing fence already exists\n return block.complete;\n}\n"],"names":["parseMarkdownSegments","markdown","segments","analysis","getMarkdownSourceAnalysis","codeRanges","inlineCodeRanges","metadataAt","index","low","high","middle","range","isInsideMetadata","isInsideCode","start","end","isTopLevelFenceStart","lineStart","regex","lastIndex","match","rawMatch","metadata","code","incompleteSvgStart","lastSvgClose","incompleteCodeBlockStart","incompleteStart","parseMermaidBlocks","fullMarkdown","blocks","lines","inside","current","startLine","line","mermaidBlockIsComplete","codeString","cleaned","block","b"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
2
|
-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("./inline-code-ranges.cjs"),m=(e,i=g.getMarkdownCodeRanges(e))=>{const d=e.split(/\r?\n/);let n=0,c=0,l=!1;return d.map(t=>{const a=c,o=a+t.length;c=o+(e.startsWith(`\r
|
|
2
|
+
`,o)?2:e[o]===`
|
|
3
|
+
`?1:0);const r=t.trimStart(),f=a+t.length-r.length;for(;n<i.length&&i[n].end<=f;)n+=1;const s=i[n],u=s&&e[s.start];return s&&s.start<=f&&(u==="`"||u==="~")?t:r.startsWith("```")?(l=!l,t):l?t:/^<[/!a-zA-Z]/.test(r)?r:t}).join(`
|
|
4
|
+
`)};exports.normalizeInlineHtml=m;
|
|
3
5
|
//# sourceMappingURL=normalize-inline-html.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-inline-html.cjs","sources":["../../../../src/components/ContentRender/utils/normalize-inline-html.ts"],"sourcesContent":["// Normalize inline HTML indentation to avoid Markdown treating it as code block\nexport const normalizeInlineHtml = (markdown: string) => {\n const lines = markdown.split(/\\r?\\n/);\n let inFence = false;\n\n const normalized = lines.map((line) => {\n const trimmedStart = line.trimStart();\n if (trimmedStart.startsWith(\"```\")) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n if (/^<[/!a-zA-Z]/.test(trimmedStart)) {\n return trimmedStart;\n }\n return line;\n });\n\n return normalized.join(\"\\n\");\n};\n"],"names":["normalizeInlineHtml","markdown","lines","inFence","line","trimmedStart"],"mappings":"
|
|
1
|
+
{"version":3,"file":"normalize-inline-html.cjs","sources":["../../../../src/components/ContentRender/utils/normalize-inline-html.ts"],"sourcesContent":["import { getMarkdownCodeRanges } from \"./inline-code-ranges\";\n\n// Normalize inline HTML indentation to avoid Markdown treating it as code block\nexport const normalizeInlineHtml = (\n markdown: string,\n codeRanges: readonly Readonly<{\n start: number;\n end: number;\n }>[] = getMarkdownCodeRanges(markdown)\n) => {\n const lines = markdown.split(/\\r?\\n/);\n let codeIndex = 0;\n let nextLineOffset = 0;\n let inFence = false;\n\n const normalized = lines.map((line) => {\n const lineOffset = nextLineOffset;\n const lineEnd = lineOffset + line.length;\n // Markdown positions refer to the received string, before CRLF normalization.\n nextLineOffset =\n lineEnd +\n (markdown.startsWith(\"\\r\\n\", lineEnd)\n ? 2\n : markdown[lineEnd] === \"\\n\"\n ? 1\n : 0);\n const trimmedStart = line.trimStart();\n const contentOffset = lineOffset + line.length - trimmedStart.length;\n while (\n codeIndex < codeRanges.length &&\n codeRanges[codeIndex].end <= contentOffset\n ) {\n codeIndex += 1;\n }\n const codeRange = codeRanges[codeIndex];\n // Preserve inline and fenced block code, including container indentation.\n // Indented HTML alone still uses the existing HTML normalization behavior.\n const delimiter = codeRange && markdown[codeRange.start];\n if (\n codeRange &&\n codeRange.start <= contentOffset &&\n (delimiter === \"`\" || delimiter === \"~\")\n )\n return line;\n\n if (trimmedStart.startsWith(\"```\")) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n if (/^<[/!a-zA-Z]/.test(trimmedStart)) {\n return trimmedStart;\n }\n return line;\n });\n\n return normalized.join(\"\\n\");\n};\n"],"names":["normalizeInlineHtml","markdown","codeRanges","getMarkdownCodeRanges","lines","codeIndex","nextLineOffset","inFence","line","lineOffset","lineEnd","trimmedStart","contentOffset","codeRange","delimiter"],"mappings":"4HAGaA,EAAsB,CACjCC,EACAC,EAGOC,EAAAA,sBAAsBF,CAAQ,IAClC,CACH,MAAMG,EAAQH,EAAS,MAAM,OAAO,EACpC,IAAII,EAAY,EACZC,EAAiB,EACjBC,EAAU,GA2Cd,OAzCmBH,EAAM,IAAKI,GAAS,CACrC,MAAMC,EAAaH,EACbI,EAAUD,EAAaD,EAAK,OAElCF,EACEI,GACCT,EAAS,WAAW;AAAA,EAAQS,CAAO,EAChC,EACAT,EAASS,CAAO,IAAM;AAAA,EACpB,EACA,GACR,MAAMC,EAAeH,EAAK,UAAA,EACpBI,EAAgBH,EAAaD,EAAK,OAASG,EAAa,OAC9D,KACEN,EAAYH,EAAW,QACvBA,EAAWG,CAAS,EAAE,KAAOO,GAE7BP,GAAa,EAEf,MAAMQ,EAAYX,EAAWG,CAAS,EAGhCS,EAAYD,GAAaZ,EAASY,EAAU,KAAK,EACvD,OACEA,GACAA,EAAU,OAASD,IAClBE,IAAc,KAAOA,IAAc,KAE7BN,EAELG,EAAa,WAAW,KAAK,GAC/BJ,EAAU,CAACA,EACJC,GAELD,EAAgBC,EAChB,eAAe,KAAKG,CAAY,EAC3BA,EAEFH,CACT,CAAC,EAEiB,KAAK;AAAA,CAAI,CAC7B"}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { getMarkdownCodeRanges as u } from "./inline-code-ranges.es.js";
|
|
2
|
+
const p = (e, i = u(e)) => {
|
|
3
|
+
const m = e.split(/\r?\n/);
|
|
4
|
+
let n = 0, f = 0, o = !1;
|
|
5
|
+
return m.map((t) => {
|
|
6
|
+
const c = f, l = c + t.length;
|
|
7
|
+
f = l + (e.startsWith(`\r
|
|
8
|
+
`, l) ? 2 : e[l] === `
|
|
9
|
+
` ? 1 : 0);
|
|
10
|
+
const r = t.trimStart(), a = c + t.length - r.length;
|
|
11
|
+
for (; n < i.length && i[n].end <= a; )
|
|
12
|
+
n += 1;
|
|
13
|
+
const s = i[n], h = s && e[s.start];
|
|
14
|
+
return s && s.start <= a && (h === "`" || h === "~") ? t : r.startsWith("```") ? (o = !o, t) : o ? t : /^<[/!a-zA-Z]/.test(r) ? r : t;
|
|
7
15
|
}).join(`
|
|
8
16
|
`);
|
|
9
17
|
};
|
|
10
18
|
export {
|
|
11
|
-
|
|
19
|
+
p as normalizeInlineHtml
|
|
12
20
|
};
|
|
13
21
|
//# sourceMappingURL=normalize-inline-html.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-inline-html.es.js","sources":["../../../../src/components/ContentRender/utils/normalize-inline-html.ts"],"sourcesContent":["// Normalize inline HTML indentation to avoid Markdown treating it as code block\nexport const normalizeInlineHtml = (markdown: string) => {\n const lines = markdown.split(/\\r?\\n/);\n let inFence = false;\n\n const normalized = lines.map((line) => {\n const trimmedStart = line.trimStart();\n if (trimmedStart.startsWith(\"```\")) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n if (/^<[/!a-zA-Z]/.test(trimmedStart)) {\n return trimmedStart;\n }\n return line;\n });\n\n return normalized.join(\"\\n\");\n};\n"],"names":["normalizeInlineHtml","markdown","lines","inFence","line","trimmedStart"],"mappings":"
|
|
1
|
+
{"version":3,"file":"normalize-inline-html.es.js","sources":["../../../../src/components/ContentRender/utils/normalize-inline-html.ts"],"sourcesContent":["import { getMarkdownCodeRanges } from \"./inline-code-ranges\";\n\n// Normalize inline HTML indentation to avoid Markdown treating it as code block\nexport const normalizeInlineHtml = (\n markdown: string,\n codeRanges: readonly Readonly<{\n start: number;\n end: number;\n }>[] = getMarkdownCodeRanges(markdown)\n) => {\n const lines = markdown.split(/\\r?\\n/);\n let codeIndex = 0;\n let nextLineOffset = 0;\n let inFence = false;\n\n const normalized = lines.map((line) => {\n const lineOffset = nextLineOffset;\n const lineEnd = lineOffset + line.length;\n // Markdown positions refer to the received string, before CRLF normalization.\n nextLineOffset =\n lineEnd +\n (markdown.startsWith(\"\\r\\n\", lineEnd)\n ? 2\n : markdown[lineEnd] === \"\\n\"\n ? 1\n : 0);\n const trimmedStart = line.trimStart();\n const contentOffset = lineOffset + line.length - trimmedStart.length;\n while (\n codeIndex < codeRanges.length &&\n codeRanges[codeIndex].end <= contentOffset\n ) {\n codeIndex += 1;\n }\n const codeRange = codeRanges[codeIndex];\n // Preserve inline and fenced block code, including container indentation.\n // Indented HTML alone still uses the existing HTML normalization behavior.\n const delimiter = codeRange && markdown[codeRange.start];\n if (\n codeRange &&\n codeRange.start <= contentOffset &&\n (delimiter === \"`\" || delimiter === \"~\")\n )\n return line;\n\n if (trimmedStart.startsWith(\"```\")) {\n inFence = !inFence;\n return line;\n }\n if (inFence) return line;\n if (/^<[/!a-zA-Z]/.test(trimmedStart)) {\n return trimmedStart;\n }\n return line;\n });\n\n return normalized.join(\"\\n\");\n};\n"],"names":["normalizeInlineHtml","markdown","codeRanges","getMarkdownCodeRanges","lines","codeIndex","nextLineOffset","inFence","line","lineOffset","lineEnd","trimmedStart","contentOffset","codeRange","delimiter"],"mappings":";AAGO,MAAMA,IAAsB,CACjCC,GACAC,IAGOC,EAAsBF,CAAQ,MAClC;AACH,QAAMG,IAAQH,EAAS,MAAM,OAAO;AACpC,MAAII,IAAY,GACZC,IAAiB,GACjBC,IAAU;AA2Cd,SAzCmBH,EAAM,IAAI,CAACI,MAAS;AACrC,UAAMC,IAAaH,GACbI,IAAUD,IAAaD,EAAK;AAElC,IAAAF,IACEI,KACCT,EAAS,WAAW;AAAA,GAAQS,CAAO,IAChC,IACAT,EAASS,CAAO,MAAM;AAAA,IACpB,IACA;AACR,UAAMC,IAAeH,EAAK,UAAA,GACpBI,IAAgBH,IAAaD,EAAK,SAASG,EAAa;AAC9D,WACEN,IAAYH,EAAW,UACvBA,EAAWG,CAAS,EAAE,OAAOO;AAE7B,MAAAP,KAAa;AAEf,UAAMQ,IAAYX,EAAWG,CAAS,GAGhCS,IAAYD,KAAaZ,EAASY,EAAU,KAAK;AACvD,WACEA,KACAA,EAAU,SAASD,MAClBE,MAAc,OAAOA,MAAc,OAE7BN,IAELG,EAAa,WAAW,KAAK,KAC/BJ,IAAU,CAACA,GACJC,KAELD,IAAgBC,IAChB,eAAe,KAAKG,CAAY,IAC3BA,IAEFH;AAAA,EACT,CAAC,EAEiB,KAAK;AAAA,CAAI;AAC7B;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=e=>{let n=0;return e.replace(/\t/g,(r,o)=>{const s=4-(o+n)%4;return n+=s-1," ".repeat(s)})},w=(e,n)=>{if(n>0&&e[n-1]!==`
|
|
2
|
+
`)return;const r=e.indexOf(`
|
|
3
|
+
`,n),o=u(e.slice(n,r===-1?e.length:r)),s=[];let d=0;for(;d<o.length;){const l=/^ {0,3}> ?/.exec(o.slice(d));if(l){s.push({quote:!0}),d+=l[0].length;continue}const i=/^( {0,3})([*+-]|\d{1,9}[.)])( +)/.exec(o.slice(d));if(!i)break;const c=i[3].length>4?1:i[3].length,t=i[1].length+i[2].length+c;s.push({indent:t}),d+=t}const h=/^ {0,3}(`{3,}|~{3,})([^\r\n]*)\r?$/.exec(o.slice(d));if(!h||h[1][0]==="`"&&h[2].includes("`"))return;const a=new RegExp(`^ {0,3}${h[1][0]}{${h[1].length},} *\\r?$`);let g=r===-1?e.length:r+1;for(;g<e.length;){const l=e.indexOf(`
|
|
4
|
+
`,g),i=l===-1?e.length:l,c=u(e.slice(g,i));let t=0;for(const f of s)if("quote"in f){const p=/^ {0,3}> ?/.exec(c.slice(t));if(!p)return{start:n,end:g,type:"markdown"};t+=p[0].length}else{if(/^ */.exec(c.slice(t))[0].length<f.indent){if(!c.slice(t).trim()){t=c.length;break}return{start:n,end:g,type:"markdown"}}t+=f.indent}if(a.test(c.slice(t)))return{start:n,end:i,type:"markdown"};g=l===-1?e.length:l+1}return{start:n,end:e.length,type:"markdown"}};exports.findResumedProseFence=w;
|
|
5
|
+
//# sourceMappingURL=resumed-prose-fence.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resumed-prose-fence.cjs","sources":["../../../../src/components/ContentRender/utils/resumed-prose-fence.ts"],"sourcesContent":["type FenceContainer = { quote: true } | { indent: number };\n\nconst expandFenceTabs = (line: string) => {\n let added = 0;\n return line.replace(/\\t/g, (_tab, index: number) => {\n const width = 4 - ((index + added) % 4);\n added += width - 1;\n return \" \".repeat(width);\n });\n};\n\nexport const findResumedProseFence = (source: string, start: number) => {\n if (start > 0 && source[start - 1] !== \"\\n\") return;\n const openingEnd = source.indexOf(\"\\n\", start);\n const line = expandFenceTabs(\n source.slice(start, openingEnd === -1 ? source.length : openingEnd)\n );\n const containers: FenceContainer[] = [];\n let cursor = 0;\n while (cursor < line.length) {\n const quote = /^ {0,3}> ?/.exec(line.slice(cursor));\n if (quote) {\n containers.push({ quote: true });\n cursor += quote[0].length;\n continue;\n }\n const list = /^( {0,3})([*+-]|\\d{1,9}[.)])( +)/.exec(line.slice(cursor));\n if (!list) break;\n // Five or more spaces begin indented code instead of a fence in the item.\n const padding = list[3].length > 4 ? 1 : list[3].length;\n const indent = list[1].length + list[2].length + padding;\n containers.push({ indent });\n cursor += indent;\n }\n const opening = /^ {0,3}(`{3,}|~{3,})([^\\r\\n]*)\\r?$/.exec(line.slice(cursor));\n if (!opening || (opening[1][0] === \"`\" && opening[2].includes(\"`\"))) return;\n const closing = new RegExp(\n `^ {0,3}${opening[1][0]}{${opening[1].length},} *\\\\r?$`\n );\n let position = openingEnd === -1 ? source.length : openingEnd + 1;\n while (position < source.length) {\n const newline = source.indexOf(\"\\n\", position);\n const end = newline === -1 ? source.length : newline;\n const body = expandFenceTabs(source.slice(position, end));\n let offset = 0;\n for (const container of containers) {\n if (\"quote\" in container) {\n const quote = /^ {0,3}> ?/.exec(body.slice(offset));\n if (!quote) return { start, end: position, type: \"markdown\" as const };\n offset += quote[0].length;\n } else {\n const spaces = /^ */.exec(body.slice(offset))![0].length;\n if (spaces < container.indent) {\n // Empty lines may omit list continuation indentation.\n if (!body.slice(offset).trim()) {\n offset = body.length;\n break;\n }\n return { start, end: position, type: \"markdown\" as const };\n }\n offset += container.indent;\n }\n }\n if (closing.test(body.slice(offset)))\n return { start, end, type: \"markdown\" as const };\n position = newline === -1 ? source.length : newline + 1;\n }\n return { start, end: source.length, type: \"markdown\" as const };\n};\n"],"names":["expandFenceTabs","line","added","_tab","index","width","findResumedProseFence","source","start","openingEnd","containers","cursor","quote","list","padding","indent","opening","closing","position","newline","end","body","offset","container"],"mappings":"gFAEA,MAAMA,EAAmBC,GAAiB,CACxC,IAAIC,EAAQ,EACZ,OAAOD,EAAK,QAAQ,MAAO,CAACE,EAAMC,IAAkB,CAClD,MAAMC,EAAQ,GAAMD,EAAQF,GAAS,EACrC,OAAAA,GAASG,EAAQ,EACV,IAAI,OAAOA,CAAK,CACzB,CAAC,CACH,EAEaC,EAAwB,CAACC,EAAgBC,IAAkB,CACtE,GAAIA,EAAQ,GAAKD,EAAOC,EAAQ,CAAC,IAAM;AAAA,EAAM,OAC7C,MAAMC,EAAaF,EAAO,QAAQ;AAAA,EAAMC,CAAK,EACvCP,EAAOD,EACXO,EAAO,MAAMC,EAAOC,IAAe,GAAKF,EAAO,OAASE,CAAU,CAAA,EAE9DC,EAA+B,CAAA,EACrC,IAAIC,EAAS,EACb,KAAOA,EAASV,EAAK,QAAQ,CAC3B,MAAMW,EAAQ,aAAa,KAAKX,EAAK,MAAMU,CAAM,CAAC,EAClD,GAAIC,EAAO,CACTF,EAAW,KAAK,CAAE,MAAO,EAAA,CAAM,EAC/BC,GAAUC,EAAM,CAAC,EAAE,OACnB,QACF,CACA,MAAMC,EAAO,mCAAmC,KAAKZ,EAAK,MAAMU,CAAM,CAAC,EACvE,GAAI,CAACE,EAAM,MAEX,MAAMC,EAAUD,EAAK,CAAC,EAAE,OAAS,EAAI,EAAIA,EAAK,CAAC,EAAE,OAC3CE,EAASF,EAAK,CAAC,EAAE,OAASA,EAAK,CAAC,EAAE,OAASC,EACjDJ,EAAW,KAAK,CAAE,OAAAK,EAAQ,EAC1BJ,GAAUI,CACZ,CACA,MAAMC,EAAU,qCAAqC,KAAKf,EAAK,MAAMU,CAAM,CAAC,EAC5E,GAAI,CAACK,GAAYA,EAAQ,CAAC,EAAE,CAAC,IAAM,KAAOA,EAAQ,CAAC,EAAE,SAAS,GAAG,EAAI,OACrE,MAAMC,EAAU,IAAI,OAClB,UAAUD,EAAQ,CAAC,EAAE,CAAC,CAAC,IAAIA,EAAQ,CAAC,EAAE,MAAM,WAAA,EAE9C,IAAIE,EAAWT,IAAe,GAAKF,EAAO,OAASE,EAAa,EAChE,KAAOS,EAAWX,EAAO,QAAQ,CAC/B,MAAMY,EAAUZ,EAAO,QAAQ;AAAA,EAAMW,CAAQ,EACvCE,EAAMD,IAAY,GAAKZ,EAAO,OAASY,EACvCE,EAAOrB,EAAgBO,EAAO,MAAMW,EAAUE,CAAG,CAAC,EACxD,IAAIE,EAAS,EACb,UAAWC,KAAab,EACtB,GAAI,UAAWa,EAAW,CACxB,MAAMX,EAAQ,aAAa,KAAKS,EAAK,MAAMC,CAAM,CAAC,EAClD,GAAI,CAACV,EAAO,MAAO,CAAE,MAAAJ,EAAO,IAAKU,EAAU,KAAM,UAAA,EACjDI,GAAUV,EAAM,CAAC,EAAE,MACrB,KAAO,CAEL,GADe,MAAM,KAAKS,EAAK,MAAMC,CAAM,CAAC,EAAG,CAAC,EAAE,OACrCC,EAAU,OAAQ,CAE7B,GAAI,CAACF,EAAK,MAAMC,CAAM,EAAE,OAAQ,CAC9BA,EAASD,EAAK,OACd,KACF,CACA,MAAO,CAAE,MAAAb,EAAO,IAAKU,EAAU,KAAM,UAAA,CACvC,CACAI,GAAUC,EAAU,MACtB,CAEF,GAAIN,EAAQ,KAAKI,EAAK,MAAMC,CAAM,CAAC,EACjC,MAAO,CAAE,MAAAd,EAAO,IAAAY,EAAK,KAAM,UAAA,EAC7BF,EAAWC,IAAY,GAAKZ,EAAO,OAASY,EAAU,CACxD,CACA,MAAO,CAAE,MAAAX,EAAO,IAAKD,EAAO,OAAQ,KAAM,UAAA,CAC5C"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const a = (e) => {
|
|
2
|
+
let n = 0;
|
|
3
|
+
return e.replace(/\t/g, (h, o) => {
|
|
4
|
+
const s = 4 - (o + n) % 4;
|
|
5
|
+
return n += s - 1, " ".repeat(s);
|
|
6
|
+
});
|
|
7
|
+
}, u = (e, n) => {
|
|
8
|
+
if (n > 0 && e[n - 1] !== `
|
|
9
|
+
`) return;
|
|
10
|
+
const h = e.indexOf(`
|
|
11
|
+
`, n), o = a(
|
|
12
|
+
e.slice(n, h === -1 ? e.length : h)
|
|
13
|
+
), s = [];
|
|
14
|
+
let d = 0;
|
|
15
|
+
for (; d < o.length; ) {
|
|
16
|
+
const l = /^ {0,3}> ?/.exec(o.slice(d));
|
|
17
|
+
if (l) {
|
|
18
|
+
s.push({ quote: !0 }), d += l[0].length;
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const i = /^( {0,3})([*+-]|\d{1,9}[.)])( +)/.exec(o.slice(d));
|
|
22
|
+
if (!i) break;
|
|
23
|
+
const c = i[3].length > 4 ? 1 : i[3].length, t = i[1].length + i[2].length + c;
|
|
24
|
+
s.push({ indent: t }), d += t;
|
|
25
|
+
}
|
|
26
|
+
const r = /^ {0,3}(`{3,}|~{3,})([^\r\n]*)\r?$/.exec(o.slice(d));
|
|
27
|
+
if (!r || r[1][0] === "`" && r[2].includes("`")) return;
|
|
28
|
+
const x = new RegExp(
|
|
29
|
+
`^ {0,3}${r[1][0]}{${r[1].length},} *\\r?$`
|
|
30
|
+
);
|
|
31
|
+
let g = h === -1 ? e.length : h + 1;
|
|
32
|
+
for (; g < e.length; ) {
|
|
33
|
+
const l = e.indexOf(`
|
|
34
|
+
`, g), i = l === -1 ? e.length : l, c = a(e.slice(g, i));
|
|
35
|
+
let t = 0;
|
|
36
|
+
for (const p of s)
|
|
37
|
+
if ("quote" in p) {
|
|
38
|
+
const f = /^ {0,3}> ?/.exec(c.slice(t));
|
|
39
|
+
if (!f) return { start: n, end: g, type: "markdown" };
|
|
40
|
+
t += f[0].length;
|
|
41
|
+
} else {
|
|
42
|
+
if (/^ */.exec(c.slice(t))[0].length < p.indent) {
|
|
43
|
+
if (!c.slice(t).trim()) {
|
|
44
|
+
t = c.length;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
return { start: n, end: g, type: "markdown" };
|
|
48
|
+
}
|
|
49
|
+
t += p.indent;
|
|
50
|
+
}
|
|
51
|
+
if (x.test(c.slice(t)))
|
|
52
|
+
return { start: n, end: i, type: "markdown" };
|
|
53
|
+
g = l === -1 ? e.length : l + 1;
|
|
54
|
+
}
|
|
55
|
+
return { start: n, end: e.length, type: "markdown" };
|
|
56
|
+
};
|
|
57
|
+
export {
|
|
58
|
+
u as findResumedProseFence
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=resumed-prose-fence.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resumed-prose-fence.es.js","sources":["../../../../src/components/ContentRender/utils/resumed-prose-fence.ts"],"sourcesContent":["type FenceContainer = { quote: true } | { indent: number };\n\nconst expandFenceTabs = (line: string) => {\n let added = 0;\n return line.replace(/\\t/g, (_tab, index: number) => {\n const width = 4 - ((index + added) % 4);\n added += width - 1;\n return \" \".repeat(width);\n });\n};\n\nexport const findResumedProseFence = (source: string, start: number) => {\n if (start > 0 && source[start - 1] !== \"\\n\") return;\n const openingEnd = source.indexOf(\"\\n\", start);\n const line = expandFenceTabs(\n source.slice(start, openingEnd === -1 ? source.length : openingEnd)\n );\n const containers: FenceContainer[] = [];\n let cursor = 0;\n while (cursor < line.length) {\n const quote = /^ {0,3}> ?/.exec(line.slice(cursor));\n if (quote) {\n containers.push({ quote: true });\n cursor += quote[0].length;\n continue;\n }\n const list = /^( {0,3})([*+-]|\\d{1,9}[.)])( +)/.exec(line.slice(cursor));\n if (!list) break;\n // Five or more spaces begin indented code instead of a fence in the item.\n const padding = list[3].length > 4 ? 1 : list[3].length;\n const indent = list[1].length + list[2].length + padding;\n containers.push({ indent });\n cursor += indent;\n }\n const opening = /^ {0,3}(`{3,}|~{3,})([^\\r\\n]*)\\r?$/.exec(line.slice(cursor));\n if (!opening || (opening[1][0] === \"`\" && opening[2].includes(\"`\"))) return;\n const closing = new RegExp(\n `^ {0,3}${opening[1][0]}{${opening[1].length},} *\\\\r?$`\n );\n let position = openingEnd === -1 ? source.length : openingEnd + 1;\n while (position < source.length) {\n const newline = source.indexOf(\"\\n\", position);\n const end = newline === -1 ? source.length : newline;\n const body = expandFenceTabs(source.slice(position, end));\n let offset = 0;\n for (const container of containers) {\n if (\"quote\" in container) {\n const quote = /^ {0,3}> ?/.exec(body.slice(offset));\n if (!quote) return { start, end: position, type: \"markdown\" as const };\n offset += quote[0].length;\n } else {\n const spaces = /^ */.exec(body.slice(offset))![0].length;\n if (spaces < container.indent) {\n // Empty lines may omit list continuation indentation.\n if (!body.slice(offset).trim()) {\n offset = body.length;\n break;\n }\n return { start, end: position, type: \"markdown\" as const };\n }\n offset += container.indent;\n }\n }\n if (closing.test(body.slice(offset)))\n return { start, end, type: \"markdown\" as const };\n position = newline === -1 ? source.length : newline + 1;\n }\n return { start, end: source.length, type: \"markdown\" as const };\n};\n"],"names":["expandFenceTabs","line","added","_tab","index","width","findResumedProseFence","source","start","openingEnd","containers","cursor","quote","list","padding","indent","opening","closing","position","newline","end","body","offset","container"],"mappings":"AAEA,MAAMA,IAAkB,CAACC,MAAiB;AACxC,MAAIC,IAAQ;AACZ,SAAOD,EAAK,QAAQ,OAAO,CAACE,GAAMC,MAAkB;AAClD,UAAMC,IAAQ,KAAMD,IAAQF,KAAS;AACrC,WAAAA,KAASG,IAAQ,GACV,IAAI,OAAOA,CAAK;AAAA,EACzB,CAAC;AACH,GAEaC,IAAwB,CAACC,GAAgBC,MAAkB;AACtE,MAAIA,IAAQ,KAAKD,EAAOC,IAAQ,CAAC,MAAM;AAAA,EAAM;AAC7C,QAAMC,IAAaF,EAAO,QAAQ;AAAA,GAAMC,CAAK,GACvCP,IAAOD;AAAA,IACXO,EAAO,MAAMC,GAAOC,MAAe,KAAKF,EAAO,SAASE,CAAU;AAAA,EAAA,GAE9DC,IAA+B,CAAA;AACrC,MAAIC,IAAS;AACb,SAAOA,IAASV,EAAK,UAAQ;AAC3B,UAAMW,IAAQ,aAAa,KAAKX,EAAK,MAAMU,CAAM,CAAC;AAClD,QAAIC,GAAO;AACT,MAAAF,EAAW,KAAK,EAAE,OAAO,GAAA,CAAM,GAC/BC,KAAUC,EAAM,CAAC,EAAE;AACnB;AAAA,IACF;AACA,UAAMC,IAAO,mCAAmC,KAAKZ,EAAK,MAAMU,CAAM,CAAC;AACvE,QAAI,CAACE,EAAM;AAEX,UAAMC,IAAUD,EAAK,CAAC,EAAE,SAAS,IAAI,IAAIA,EAAK,CAAC,EAAE,QAC3CE,IAASF,EAAK,CAAC,EAAE,SAASA,EAAK,CAAC,EAAE,SAASC;AACjD,IAAAJ,EAAW,KAAK,EAAE,QAAAK,GAAQ,GAC1BJ,KAAUI;AAAA,EACZ;AACA,QAAMC,IAAU,qCAAqC,KAAKf,EAAK,MAAMU,CAAM,CAAC;AAC5E,MAAI,CAACK,KAAYA,EAAQ,CAAC,EAAE,CAAC,MAAM,OAAOA,EAAQ,CAAC,EAAE,SAAS,GAAG,EAAI;AACrE,QAAMC,IAAU,IAAI;AAAA,IAClB,UAAUD,EAAQ,CAAC,EAAE,CAAC,CAAC,IAAIA,EAAQ,CAAC,EAAE,MAAM;AAAA,EAAA;AAE9C,MAAIE,IAAWT,MAAe,KAAKF,EAAO,SAASE,IAAa;AAChE,SAAOS,IAAWX,EAAO,UAAQ;AAC/B,UAAMY,IAAUZ,EAAO,QAAQ;AAAA,GAAMW,CAAQ,GACvCE,IAAMD,MAAY,KAAKZ,EAAO,SAASY,GACvCE,IAAOrB,EAAgBO,EAAO,MAAMW,GAAUE,CAAG,CAAC;AACxD,QAAIE,IAAS;AACb,eAAWC,KAAab;AACtB,UAAI,WAAWa,GAAW;AACxB,cAAMX,IAAQ,aAAa,KAAKS,EAAK,MAAMC,CAAM,CAAC;AAClD,YAAI,CAACV,EAAO,QAAO,EAAE,OAAAJ,GAAO,KAAKU,GAAU,MAAM,WAAA;AACjD,QAAAI,KAAUV,EAAM,CAAC,EAAE;AAAA,MACrB,OAAO;AAEL,YADe,MAAM,KAAKS,EAAK,MAAMC,CAAM,CAAC,EAAG,CAAC,EAAE,SACrCC,EAAU,QAAQ;AAE7B,cAAI,CAACF,EAAK,MAAMC,CAAM,EAAE,QAAQ;AAC9B,YAAAA,IAASD,EAAK;AACd;AAAA,UACF;AACA,iBAAO,EAAE,OAAAb,GAAO,KAAKU,GAAU,MAAM,WAAA;AAAA,QACvC;AACA,QAAAI,KAAUC,EAAU;AAAA,MACtB;AAEF,QAAIN,EAAQ,KAAKI,EAAK,MAAMC,CAAM,CAAC;AACjC,aAAO,EAAE,OAAAd,GAAO,KAAAY,GAAK,MAAM,WAAA;AAC7B,IAAAF,IAAWC,MAAY,KAAKZ,EAAO,SAASY,IAAU;AAAA,EACxD;AACA,SAAO,EAAE,OAAAX,GAAO,KAAKD,EAAO,QAAQ,MAAM,WAAA;AAC5C;"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
2
|
-
`),
|
|
3
|
-
`)
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const H=require("./inline-code-ranges.cjs"),X=require("./resumed-prose-fence.cjs"),x=require("./html-block-end.cjs"),j=/<(?:!doctype(?=[\s>])|(?:script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)[\s/>])/i,Q=new Set(["div","style","script","iframe","section","article","header","footer","nav","main","aside","figure","details","summary","form","table","canvas","video","audio","pre","blockquote","ul","ol","dl","fieldset","address","hgroup","center","link","html","head","body","meta","title","base","template"]),Z=new Set(["pre","details","summary","aside","blockquote","ul","ol","dl","table"]),J=new Set(["script","style","link","iframe","html","head","body","meta","title","base","template"]),Y=[/<svg[\s\S]*?<\/svg>/i,/<img\b[^>]*?>/i,/```mermaid[\s\S]*?```/i,/```[a-zA-Z0-9]+[\s\S]*?```/i],N=/!\[[^\]]*]\([^\s)\n]+(?:\s+"[^"]*")?\)/i,$=new RegExp(N.source,"iy"),C=/<iframe\b[^>]*\bdata-tag\s*=\s*(["'])video\1[^>]*>[\s\S]*?<\/iframe>/i,z=/<\/[a-z][^>]*>\s*\n(?=[^\s<])/gi,W=/<custom-button-after-content\b[\s\S]*?<\/custom-button-after-content>/gi,q=/^"[\s\S]*"$/,ee=/```mermaid[\s\S]*?```/i,D=e=>e.split(/\r?\n/).map(n=>n.trim()).find(Boolean)??"",te=e=>{const n=e.indexOf("```");if(n===-1)return null;const s=e.indexOf("```",n+3);return s===-1?{start:n,block:e.slice(n),complete:!1}:{start:n,end:s+3,block:e.slice(n,s+3),complete:!0}},ne=e=>{const n=e.split(/\r?\n/).map(s=>s.trim()).filter(Boolean);return n.length<=1?e:n[0]},G=(e,n,s=!1)=>{if(!q.test(e))return e;const i=e.slice(1,-1);if(!n)return i;const t=i.match(ee);if(!t||typeof t.index!="number")return i;const o=i.slice(0,t.index),a=i.slice(t.index+t[0].length),c=D(o),r=D(a);if(!c||!r)return i;const d=s?`
|
|
2
|
+
`:"";return`${c}${d}${t[0]}${d}${r}`},ie=e=>q.test(e)&&T(e,!0).some(s=>s.type==="sandbox")?G(e,!0,!0):e,se=e=>{const n=[],s=/```/g;let i;for(;(i=s.exec(e))!==null;){const t=i.index,o=s.exec(e);if(!o){n.push({start:t,end:e.length});break}n.push({start:t,end:o.index+3})}return n},B=(e,n)=>{let s=0;for(let i=n-1;i>=0&&e[i]==="\\";i--)s++;return s%2===1},K=(e,n)=>n.some(({start:s,end:i})=>e>=s&&e<i),_=(e,n,s)=>{const i=n.flags.includes("g")?n.flags:`${n.flags}g`,t=new RegExp(n.source,i);let o;for(;(o=t.exec(e))!==null;)if(!B(e,o.index)&&!K(o.index,s))return o.index;return-1},le=(e,n)=>{let s=e.length,i;for(z.lastIndex=0;i=z.exec(e);)if(!(i.index<=n)){s=i.index+i[0].length;break}return s},oe=e=>{if(!e.length)return e;const n=[];return e.forEach(s=>{if(s.type!=="sandbox"){n.push(s);return}W.lastIndex=0;let i=0,t;for(;(t=W.exec(s.value))!==null;){const a=s.value.slice(i,t.index);a.trim()&&n.push({type:"sandbox",value:a}),n.push({type:"markdown",value:t[0]}),i=t.index+t[0].length}const o=s.value.slice(i);o.trim()&&n.push({type:"sandbox",value:o})}),n},ae=(e,n)=>{let s=null;return Y.forEach(i=>{const t=i.exec(e)?.index??-1;if(t===-1)return;const o=i.exec(e.slice(t));if(!o)return;const a=t+o[0].length;(!s||t<s.start)&&(s={start:t,end:a})}),s},re=(...e)=>e.reduce((n,s)=>s&&(!n||s.start<n.start)?s:n,null),F=(e,n)=>{const s=_(e,N,n);if(s===-1)return null;const i=e.slice(s).match(N);return i?{start:s,end:s+i[0].length}:null},ce=(e,n)=>{const s=_(e,C,n);if(s===-1)return null;const i=e.slice(s).match(C);return i?{start:s,end:s+i[0].length}:null},de=e=>C.test(e.trim()),L=(e,n)=>{if(n===-1)return null;const s=e.slice(n),i=/^<([a-z]+)/i.exec(s);if(!i)return null;const t=i[1].toLowerCase(),o=()=>({start:n,end:e.length,immediate:!0,pending:!0});if(i[0].length===s.length&&"iframe".startsWith(t))return o();if(t!=="iframe"||!/[\s/>]/.test(s[i[0].length]??""))return null;const a=n+i[0].length;let c="",r=-1;for(let v=a;v<e.length;v+=1){const p=e[v];if(c)p===c&&(c="");else if(p==='"'||p==="'")c=p;else if(p===">"){r=v+1;break}}if(r===-1)return o();const d=e.slice(a,r-1),l=/([^\s=/>]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]*)))?/g;let u,k=!1;for(;(u=l.exec(d))!==null;)if(u[1].toLowerCase()==="data-tag"){k=(u[2]??u[3]??u[4]??"").toLowerCase()==="video";break}if(!k)return null;const R=/<\/iframe\s*>/i.exec(e.slice(r));return{start:n,end:R?r+R.index+R[0].length:e.length,immediate:!0}},me=(e,n)=>{const s=/^\s*\|.+\|\s*$/gm;let i,t=-1;for(;(i=s.exec(e))!==null;){const r=i[0].match(/^\s*/)?.[0].length??0,d=i.index+r;if(!K(d,n)){t=d;break}}if(t===-1)return null;const o=e.slice(t).split(`
|
|
3
|
+
`),a=[];for(const r of o){if(!r.trim().startsWith("|"))break;a.push(r)}const c=a.join(`
|
|
4
|
+
`);return{start:t,block:c,end:t+c.length}},U=(e,n)=>{const s=/^<([a-z][a-z0-9:-]*)(?=[\s/>])/i.exec(e.slice(n));return s?Q.has(s[1].toLowerCase()):/^<!doctype(?=[\s>])/i.test(e.slice(n))},V=(e,n)=>{const s=/^<([a-z][a-z0-9:-]*)(?=[\s/>])/i.exec(e.slice(n));return!!(s&&Z.has(s[1].toLowerCase()))},fe=(e,n,s)=>{let i=n;for(;i<s;){if(e[i]!=="<"){i+=1;continue}const t=x.readHtmlMarkup(e,i),o=t.kind==="tag"?t.closing?void 0:t.name:/^<([a-z][a-z0-9:-]*)(?=[\s/>])/i.exec(e.slice(i))?.[1].toLowerCase();if(o&&J.has(o)&&!(o==="iframe"&&L(e,i)))return!0;if(t.kind==="incomplete"||t.kind==="invalid"){if(t.kind==="incomplete")break;i+=1;continue}if(t.kind==="tag"&&!t.closing&&x.isHtmlRawTextTag(t.name)){i=x.findStreamingHtmlElementEnd(e,i);continue}i=t.end}return!1},ue=e=>{const n=new Map,s=[...e.matchAll(/`+|\$+/g)],i=new Map;for(let a=s.length-1;a>=0;a-=1){const c=s[a],r=c[0],d=i.get(r);d!==void 0&&n.set(c.index,d+r.length),(r[0]==="`"||!B(e,c.index))&&i.set(r,c.index)}const t=[];let o=0;for(const a of e.split(`
|
|
5
|
+
`)){const c=o+(a.match(/^[ \t]*/)?.[0].length??0);(!a.trim()||U(e,c))&&t.push(o),o+=a.length+1}return{nextClosing:n,boundaries:t}},he=(e,n,s)=>{const i=e[n];if(i!=="`"&&i!=="$"||B(e,n))return;let t=1;for(;e[n+t]===i;)t+=1;const o=n+t,a=i==="$"&&t>2?void 0:s.nextClosing.get(n);if(a===void 0)return{markerEnd:o};if(i==="$"&&t===2)return{markerEnd:o,end:a};let c=0,r=s.boundaries.length;for(;c<r;){const d=c+r>>>1;s.boundaries[d]<=n?c=d+1:r=d}return a<=(s.boundaries[c]??e.length)?{markerEnd:o,end:a}:{markerEnd:o}},ge=(e,n,s)=>{let i=n.start,t=i;for(;t<n.end;){if(e[t]!=="<"){t+=1;continue}const o=x.readHtmlMarkup(e,t);if(o.kind==="incomplete")break;if(o.kind==="invalid"){t+=1;continue}if(o.kind==="tag"&&!o.closing){if(o.name==="custom-button-after-content"){const a=Math.min(x.findStreamingHtmlElementEnd(e,t),n.end);if(/<\/custom-button-after-content\s*>$/i.test(e.slice(t,a))){t>i&&s.push({type:"sandbox",value:e.slice(i,t)}),s.push({type:"markdown",value:e.slice(t,a)}),i=a,t=a;continue}}if(x.isHtmlRawTextTag(o.name)){t=x.findStreamingHtmlElementEnd(e,t);continue}}t=o.end}i<n.end&&s.push({type:"sandbox",value:e.slice(i,n.end)})},pe=(e,n,s)=>{const i=[],t=e.split(`
|
|
6
|
+
`);let o=0,a=0,c=0;for(let r=0;r<t.length;r+=1){const d=t[r],l=o+(d.match(/^[ \t]*/)?.[0].length??0);for(;n[a]?.end<=l;)a+=1;const u=n[a];if(/^[ \t]*\|.+\|[ \t]*\r?$/.test(d)&&!(u&&u.start<=l)){let k=o+d.length;for(;r+1<t.length&&t[r+1].trim().startsWith("|");)o+=t[r].length+1,r+=1,k=o+t[r].length;for(;s[c]?.end<=l;)c+=1;s[c]?.start<k||i.push({start:l,end:k,type:"markdown"})}o+=t[r].length+1}return i},be=(e,n,s)=>{const i=[],t=new Set(s.comments),o=s.literal.filter(m=>!t.has(m)),a=[];let c=0,r=0,d=0,l=0,u=!1,k;for(;l<e.length;){for(;s.fences[r]?.end<=l;)r+=1;const m=s.fences[r];if(m?.start===l){i.push({...m,type:"markdown"}),a.push(m),l=m.end;continue}for(;o[c]?.end<=l;)c+=1;const w=o[c];if(w&&w.start<=l){a.push(w),l=w.end;continue}for(;s.html[d]?.end<=l;)d+=1;const A=s.html[d];if(u&&A&&A.start<=l){const f=X.findResumedProseFence(e,l);if(f){for(i.push(f),a.push(f);o[c]?.start<f.end;)c+=1;l=f.end;continue}(e[l]==="`"||e[l]==="$")&&(k??=ue(e));const M=k&&he(e,l,k);if(M){M.end!==void 0&&a.push({start:l,end:M.end}),l=M.end??M.markerEnd;continue}}if(e[l]==="!"&&!B(e,l)){$.lastIndex=l;const f=$.exec(e);if(f){i.push({start:l,end:l+f[0].length,type:"markdown"}),l+=f[0].length;continue}}if(e[l]!=="<"||B(e,l)){l+=1;continue}const g=x.readHtmlMarkup(e,l);if(U(e,l)){const f=L(e,l),M=V(e,l),I=f?.end??(M?x.findStreamingHtmlElementEnd(e,l):x.findStreamingHtmlBlockEnd(e,l,b=>{const S=L(e,b);return!!(S&&!S.pending)||V(e,b)})),h=M&&!fe(e,l,I);i.push({start:l,end:I,type:f||h?"markdown":"sandbox",...f?.immediate||h?{immediate:!0}:{},...f?.pending||h&&g.kind==="incomplete"?{pending:!0}:{}}),l=I,u=!0;continue}if(g.kind==="tag")if(!g.closing&&(g.name==="svg"||g.name==="img")){const f=g.name==="img"?g.end:x.findStreamingHtmlElementEnd(e,l);i.push({start:l,end:f,type:"markdown"}),l=f}else if(!g.closing&&x.isHtmlRawTextTag(g.name)){const f=x.findStreamingHtmlElementEnd(e,l);a.push({start:l,end:f}),l=f}else l=g.end;else g.kind==="comment"||g.kind==="declaration"?(g.kind==="comment"&&a.push({start:l,end:g.end}),l=g.end):g.kind==="incomplete"?(/^<svg(?=[\s/>])/i.test(e.slice(l))&&i.push({start:l,end:e.length,type:"markdown"}),l=e.length):l+=1}const R=pe(e,a,i),v=[];let p=0;for(const m of i){for(;R[p]?.start<m.start;)v.push(R[p++]);v.push(m)}v.push(...R.slice(p));const E=[];let y=0;for(const m of v)m.start<y||(n&&m.start>y&&E.push({type:"text",value:e.slice(y,m.start)}),m.type==="sandbox"?ge(e,m,E):E.push({type:"markdown",value:e.slice(m.start,m.end),...m.immediate?{immediate:!0}:{},...m.pending?{pending:!0}:{}}),y=m.end);return n&&y<e.length&&E.push({type:"text",value:e.slice(y)}),E},T=(e,n=!1,s=!1,i)=>{if(s)return be(e,n,i??H.getMarkdownSourceAnalysis(e));const t=G(e,n),o=h=>oe(h),a=h=>!!h.trim(),c=H.getInlineCodeRanges(t),r=te(t),d=[...se(t),...c],l=_(t,j,d);if(r){if(!r.complete)return o([{type:"markdown",value:n?t:r.block}]);if(!n)return o([{type:"markdown",value:r.block}]);const h=[],b=ne(t.slice(0,r.start));a(b)&&h.push({type:"text",value:b}),h.push({type:"markdown",value:r.block});const S=t.slice(r.end);return a(S)&&h.push(...T(S,!0)),o(h)}const u=_(t,/<svg\b/i,d),k=l!==-1&&u!==-1&&l<u,R=F(t,d),v=!!R&&u!==-1&&R.start<u;if(u!==-1&&!k&&!v){const h=t.slice(0,u),b=t.indexOf("</svg>",u),S=b===-1?`${t.slice(u)}</svg>`:t.slice(u,b+6),P=b===-1?"":t.slice(b+6);if(n){const O=[];return a(h)&&O.push({type:"text",value:h}),O.push({type:"markdown",value:S}),a(P)&&O.push(...T(P,!0)),o(O)}if(b===-1)return o([{type:"markdown",value:S}])}const p=me(t,[]);if(p){const h=[],b=t.slice(0,p.start);n&&a(b)&&h.push(...T(b,!0)),h.push({type:"markdown",value:p.block});const S=t.slice(p.end);return a(S)&&S.length<t.length&&h.push(...T(S,n)),o(h)}const E=re(ae(t),F(t,d),ce(t,d));if(l===-1&&!E)return n&&a(t)?[{type:"text",value:t}]:[];const y=!!E&&(l===-1||E.start<=l),m=y?E.start:l,w=y?E.end:le(t,m),A=t.slice(m,w),g=y&&de(A),f=g?t.slice(0,m).trimEnd():t.slice(0,m),M=g?t.slice(w).trimStart():t.slice(w),I=[];return n&&a(f)&&I.push({type:"text",value:f}),I.push({type:y?"markdown":"sandbox",value:A}),a(M)&&I.push(...T(M,n)),o(I)};exports.normalizeWrappedSandboxContent=ie;exports.splitContentSegments=T;
|
|
4
7
|
//# sourceMappingURL=split-content.cjs.map
|