markdown-flow-ui 0.1.92 → 0.1.93-beta.0

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.
Files changed (108) hide show
  1. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
  2. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js.map +1 -1
  3. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  4. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
  5. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
  6. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/diff@5.2.0/node_modules/diff/lib/index.cjs.js +6 -0
  7. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/diff@5.2.0/node_modules/diff/lib/index.cjs.js.map +1 -0
  8. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/diff@5.2.0/node_modules/diff/lib/index.es.js +350 -0
  9. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/diff@5.2.0/node_modules/diff/lib/index.es.js.map +1 -0
  10. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js +1 -1
  11. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.es.js +1 -1
  12. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js +1 -1
  13. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.es.js +1 -1
  14. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js +1 -1
  15. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.es.js +1 -1
  16. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js +1 -1
  17. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.es.js +1 -1
  18. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js +1 -1
  19. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.es.js +1 -1
  20. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.cjs.js +1 -1
  21. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.es.js +1 -1
  22. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.cjs.js +1 -1
  23. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
  24. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.cjs.js +1 -1
  25. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.es.js +1 -1
  26. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.cjs.js +1 -1
  27. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.es.js +1 -1
  28. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/index.cjs.js +1 -1
  29. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/index.es.js +1 -1
  30. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-custom-variable.cjs.js +1 -1
  31. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-custom-variable.es.js +1 -1
  32. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-interaction.cjs.js +1 -1
  33. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-interaction.es.js +1 -1
  34. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.cjs.js +1 -1
  35. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.es.js +1 -1
  36. package/dist/_virtual/index.cjs10.js +1 -1
  37. package/dist/_virtual/index.cjs2.js +1 -1
  38. package/dist/_virtual/index.cjs3.js +1 -1
  39. package/dist/_virtual/index.cjs4.js +1 -1
  40. package/dist/_virtual/index.cjs7.js +1 -1
  41. package/dist/_virtual/index.cjs8.js +1 -1
  42. package/dist/_virtual/index.es10.js +2 -2
  43. package/dist/_virtual/index.es2.js +5 -2
  44. package/dist/_virtual/index.es2.js.map +1 -1
  45. package/dist/_virtual/index.es3.js +2 -4
  46. package/dist/_virtual/index.es3.js.map +1 -1
  47. package/dist/_virtual/index.es4.js +4 -5
  48. package/dist/_virtual/index.es4.js.map +1 -1
  49. package/dist/_virtual/index.es7.js +2 -3
  50. package/dist/_virtual/index.es7.js.map +1 -1
  51. package/dist/_virtual/index.es8.js +3 -2
  52. package/dist/_virtual/index.es8.js.map +1 -1
  53. package/dist/components/ContentRender/ContentRender.cjs.js +2 -2
  54. package/dist/components/ContentRender/ContentRender.cjs.js.map +1 -1
  55. package/dist/components/ContentRender/ContentRender.es.js +111 -104
  56. package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
  57. package/dist/components/ContentRender/ContentRender.stories.d.ts +1 -0
  58. package/dist/components/ContentRender/IframeSandbox.cjs.js +6 -5
  59. package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
  60. package/dist/components/ContentRender/IframeSandbox.es.js +104 -98
  61. package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
  62. package/dist/components/ContentRender/SandboxApp.cjs.js +3 -2
  63. package/dist/components/ContentRender/SandboxApp.cjs.js.map +1 -1
  64. package/dist/components/ContentRender/SandboxApp.es.js +92 -84
  65. package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
  66. package/dist/components/ContentRender/blackboard/blackboard-runtime.cjs.js +5 -0
  67. package/dist/components/ContentRender/blackboard/blackboard-runtime.cjs.js.map +1 -0
  68. package/dist/components/ContentRender/blackboard/blackboard-runtime.d.ts +18 -0
  69. package/dist/components/ContentRender/blackboard/blackboard-runtime.es.js +137 -0
  70. package/dist/components/ContentRender/blackboard/blackboard-runtime.es.js.map +1 -0
  71. package/dist/components/ContentRender/blackboard/diff-parser.cjs.js +2 -0
  72. package/dist/components/ContentRender/blackboard/diff-parser.cjs.js.map +1 -0
  73. package/dist/components/ContentRender/blackboard/diff-parser.d.ts +8 -0
  74. package/dist/components/ContentRender/blackboard/diff-parser.es.js +132 -0
  75. package/dist/components/ContentRender/blackboard/diff-parser.es.js.map +1 -0
  76. package/dist/components/ContentRender/blackboard/diff-parser.test.d.ts +1 -0
  77. package/dist/components/ContentRender/blackboard-vendor.cjs.js +2 -0
  78. package/dist/components/ContentRender/blackboard-vendor.cjs.js.map +1 -0
  79. package/dist/components/ContentRender/blackboard-vendor.d.ts +5 -0
  80. package/dist/components/ContentRender/blackboard-vendor.es.js +15 -0
  81. package/dist/components/ContentRender/blackboard-vendor.es.js.map +1 -0
  82. package/dist/components/ContentRender/index.cjs.js +1 -1
  83. package/dist/components/ContentRender/index.es.js +1 -0
  84. package/dist/components/ContentRender/index.es.js.map +1 -1
  85. package/dist/components/ContentRender/utils/split-content.cjs.js +2 -2
  86. package/dist/components/ContentRender/utils/split-content.cjs.js.map +1 -1
  87. package/dist/components/ContentRender/utils/split-content.es.js +118 -109
  88. package/dist/components/ContentRender/utils/split-content.es.js.map +1 -1
  89. package/dist/components/ContentRender/vendor/daisyui-v4.min.css.cjs.js +22 -0
  90. package/dist/components/ContentRender/vendor/daisyui-v4.min.css.cjs.js.map +1 -0
  91. package/dist/components/ContentRender/vendor/daisyui-v4.min.css.es.js +25 -0
  92. package/dist/components/ContentRender/vendor/daisyui-v4.min.css.es.js.map +1 -0
  93. package/dist/components/ContentRender/vendor/gsap-v3.min.cjs.js +12 -0
  94. package/dist/components/ContentRender/vendor/gsap-v3.min.cjs.js.map +1 -0
  95. package/dist/components/ContentRender/vendor/gsap-v3.min.es.js +15 -0
  96. package/dist/components/ContentRender/vendor/gsap-v3.min.es.js.map +1 -0
  97. package/dist/components/ContentRender/vendor/tailwindcss-v3.min.cjs.js +2 -0
  98. package/dist/components/ContentRender/vendor/tailwindcss-v3.min.cjs.js.map +1 -0
  99. package/dist/components/ContentRender/vendor/tailwindcss-v3.min.es.js +5 -0
  100. package/dist/components/ContentRender/vendor/tailwindcss-v3.min.es.js.map +1 -0
  101. package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js +1 -1
  102. package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js.map +1 -1
  103. package/dist/components/MarkdownFlow/MarkdownFlow.es.js +3 -2
  104. package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
  105. package/dist/components/ui/inputGroup/textarea.cjs.js +1 -1
  106. package/dist/components/ui/inputGroup/textarea.es.js +1 -1
  107. package/dist/markdown-flow-ui-lib.css +1 -1
  108. package/package.json +4 -1
@@ -0,0 +1,132 @@
1
+ const T = [
2
+ "div",
3
+ "style",
4
+ "script",
5
+ "h1",
6
+ "h2",
7
+ "h3",
8
+ "h4",
9
+ "h5",
10
+ "h6",
11
+ "p",
12
+ "svg",
13
+ "section",
14
+ "article",
15
+ "figure",
16
+ "figcaption",
17
+ "aside",
18
+ "header",
19
+ "footer",
20
+ "nav",
21
+ "main",
22
+ "ul",
23
+ "ol",
24
+ "li",
25
+ "table",
26
+ "thead",
27
+ "tbody",
28
+ "tfoot",
29
+ "tr",
30
+ "th",
31
+ "td",
32
+ "caption",
33
+ "canvas",
34
+ "form",
35
+ "fieldset",
36
+ "blockquote",
37
+ "pre"
38
+ ], g = /!\+\+\+\s*([\s\S]+?)\s*!\+\+\+/g, x = /!\+\+\+/g, u = /!\+\+\+[\s\S]*?!\+\+\+/g, B = (e) => {
39
+ const i = [];
40
+ let s;
41
+ for (g.lastIndex = 0; (s = g.exec(e)) !== null; )
42
+ i.push({
43
+ content: s[1],
44
+ fullMatch: s[0]
45
+ });
46
+ return i;
47
+ }, m = (e, i, s) => {
48
+ const f = `<${s}`, o = `</${s}>`, a = e.indexOf(">", i);
49
+ if (a === -1)
50
+ return -1;
51
+ let t = 1, n = a + 1;
52
+ for (; n < e.length && t > 0; ) {
53
+ const r = e.indexOf(f, n), c = e.indexOf(o, n);
54
+ if (c === -1)
55
+ return -1;
56
+ if (r !== -1 && r < c) {
57
+ t += 1;
58
+ const l = e.indexOf(">", r);
59
+ n = l === -1 ? r + f.length : l + 1;
60
+ continue;
61
+ }
62
+ if (t -= 1, t === 0)
63
+ return c + o.length;
64
+ n = c + o.length;
65
+ }
66
+ return -1;
67
+ }, E = (e) => {
68
+ const i = [], s = [];
69
+ let f = -1, o = 0;
70
+ for (; o < e.length; ) {
71
+ let t = -1, n = null, r = !1;
72
+ if (T.forEach((l) => {
73
+ const h = `<${l}`, k = `</${l}>`, d = e.indexOf(h, o), p = e.indexOf(k, o);
74
+ d !== -1 && (t === -1 || d < t) && (t = d, n = l, r = !0), p !== -1 && (t === -1 || p < t) && (t = p, n = l, r = !1);
75
+ }), t === -1 || !n)
76
+ break;
77
+ if (r) {
78
+ if (s.length === 0) {
79
+ const h = m(e, t, n);
80
+ if (h !== -1) {
81
+ i.push(e.substring(t, h)), o = h;
82
+ continue;
83
+ }
84
+ f === -1 && (f = t);
85
+ }
86
+ s.push({ tagName: n, pos: t });
87
+ const l = e.indexOf(">", t);
88
+ o = l !== -1 ? l + 1 : t + n.length + 1;
89
+ continue;
90
+ }
91
+ const c = s[s.length - 1];
92
+ c && c.tagName === n && s.pop(), o = t + n.length + 3;
93
+ }
94
+ const a = f === -1 ? "" : e.substring(f);
95
+ return { blocks: i, pendingHTML: a };
96
+ }, _ = (e) => {
97
+ if (!e)
98
+ return {
99
+ htmlBlocks: [],
100
+ diffBlocks: [],
101
+ pendingHTML: "",
102
+ hasUnclosedDiffBlock: !1,
103
+ isPureDiffPayload: !1
104
+ };
105
+ const i = e.trim(), f = !!i.match(u)?.length && i.replace(u, "").trim().length === 0, o = B(e);
106
+ let a = e;
107
+ if (o.forEach((c, l) => {
108
+ a = a.replace(
109
+ c.fullMatch,
110
+ `__EXTRACTED_DIFF_${l}__`
111
+ );
112
+ }), (a.match(x) || []).length % 2 !== 0)
113
+ return {
114
+ htmlBlocks: [],
115
+ diffBlocks: [],
116
+ pendingHTML: "",
117
+ hasUnclosedDiffBlock: !0,
118
+ isPureDiffPayload: f
119
+ };
120
+ const { blocks: n, pendingHTML: r } = E(a);
121
+ return {
122
+ htmlBlocks: n,
123
+ diffBlocks: o.map((c) => c.content),
124
+ pendingHTML: r,
125
+ hasUnclosedDiffBlock: !1,
126
+ isPureDiffPayload: f
127
+ };
128
+ };
129
+ export {
130
+ _ as parseBlackboardStream
131
+ };
132
+ //# sourceMappingURL=diff-parser.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-parser.es.js","sources":["../../../../src/components/ContentRender/blackboard/diff-parser.ts"],"sourcesContent":["interface ExtractedDiffBlock {\n content: string;\n fullMatch: string;\n}\n\nexport interface BlackboardParseResult {\n htmlBlocks: string[];\n diffBlocks: string[];\n pendingHTML: string;\n hasUnclosedDiffBlock: boolean;\n isPureDiffPayload: boolean;\n}\n\nconst TARGET_TAGS = [\n \"div\",\n \"style\",\n \"script\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"p\",\n \"svg\",\n \"section\",\n \"article\",\n \"figure\",\n \"figcaption\",\n \"aside\",\n \"header\",\n \"footer\",\n \"nav\",\n \"main\",\n \"ul\",\n \"ol\",\n \"li\",\n \"table\",\n \"thead\",\n \"tbody\",\n \"tfoot\",\n \"tr\",\n \"th\",\n \"td\",\n \"caption\",\n \"canvas\",\n \"form\",\n \"fieldset\",\n \"blockquote\",\n \"pre\",\n];\n\nconst DIFF_BLOCK_PATTERN = /!\\+\\+\\+\\s*([\\s\\S]+?)\\s*!\\+\\+\\+/g;\nconst DIFF_MARKER_PATTERN = /!\\+\\+\\+/g;\nconst PURE_DIFF_BLOCK_PATTERN = /!\\+\\+\\+[\\s\\S]*?!\\+\\+\\+/g;\n\nconst extractDiffBlocks = (content: string): ExtractedDiffBlock[] => {\n const blocks: ExtractedDiffBlock[] = [];\n let match: RegExpExecArray | null;\n DIFF_BLOCK_PATTERN.lastIndex = 0;\n\n while ((match = DIFF_BLOCK_PATTERN.exec(content)) !== null) {\n blocks.push({\n content: match[1],\n fullMatch: match[0],\n });\n }\n\n return blocks;\n};\n\nconst findMatchingCloseTag = (\n content: string,\n startPos: number,\n tagName: string\n) => {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n const openTagEnd = content.indexOf(\">\", startPos);\n\n if (openTagEnd === -1) {\n return -1;\n }\n\n let depth = 1;\n let searchPos = openTagEnd + 1;\n\n while (searchPos < content.length && depth > 0) {\n const nextOpen = content.indexOf(openTag, searchPos);\n const nextClose = content.indexOf(closeTag, searchPos);\n\n if (nextClose === -1) {\n return -1;\n }\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth += 1;\n const openEnd = content.indexOf(\">\", nextOpen);\n searchPos = openEnd === -1 ? nextOpen + openTag.length : openEnd + 1;\n continue;\n }\n\n depth -= 1;\n if (depth === 0) {\n return nextClose + closeTag.length;\n }\n searchPos = nextClose + closeTag.length;\n }\n\n return -1;\n};\n\nconst extractAllCompleteBlocks = (content: string) => {\n const blocks: string[] = [];\n const unmatchedOpens: Array<{ tagName: string; pos: number }> = [];\n let pendingStart = -1;\n let cursor = 0;\n\n while (cursor < content.length) {\n let nextTagPos = -1;\n let nextTagName: string | null = null;\n let nextIsOpen = false;\n\n TARGET_TAGS.forEach((tagName) => {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n const openPos = content.indexOf(openTag, cursor);\n const closePos = content.indexOf(closeTag, cursor);\n\n if (openPos !== -1 && (nextTagPos === -1 || openPos < nextTagPos)) {\n nextTagPos = openPos;\n nextTagName = tagName;\n nextIsOpen = true;\n }\n\n if (closePos !== -1 && (nextTagPos === -1 || closePos < nextTagPos)) {\n nextTagPos = closePos;\n nextTagName = tagName;\n nextIsOpen = false;\n }\n });\n\n if (nextTagPos === -1 || !nextTagName) {\n break;\n }\n\n if (nextIsOpen) {\n if (unmatchedOpens.length === 0) {\n const blockEnd = findMatchingCloseTag(content, nextTagPos, nextTagName);\n if (blockEnd !== -1) {\n blocks.push(content.substring(nextTagPos, blockEnd));\n cursor = blockEnd;\n continue;\n }\n if (pendingStart === -1) {\n pendingStart = nextTagPos;\n }\n }\n\n unmatchedOpens.push({ tagName: nextTagName, pos: nextTagPos });\n const tagEnd = content.indexOf(\">\", nextTagPos);\n cursor = tagEnd !== -1 ? tagEnd + 1 : nextTagPos + nextTagName.length + 1;\n continue;\n }\n\n const top = unmatchedOpens[unmatchedOpens.length - 1];\n if (top && top.tagName === nextTagName) {\n unmatchedOpens.pop();\n }\n cursor = nextTagPos + nextTagName.length + 3;\n }\n\n const pendingHTML =\n pendingStart === -1 ? \"\" : content.substring(pendingStart);\n return { blocks, pendingHTML };\n};\n\nexport const parseBlackboardStream = (\n source: string\n): BlackboardParseResult => {\n if (!source) {\n return {\n htmlBlocks: [],\n diffBlocks: [],\n pendingHTML: \"\",\n hasUnclosedDiffBlock: false,\n isPureDiffPayload: false,\n };\n }\n\n const normalizedSource = source.trim();\n const pureDiffBlocks = normalizedSource.match(PURE_DIFF_BLOCK_PATTERN);\n const isPureDiffPayload =\n !!pureDiffBlocks?.length &&\n normalizedSource.replace(PURE_DIFF_BLOCK_PATTERN, \"\").trim().length === 0;\n\n const diffBlocks = extractDiffBlocks(source);\n let processedContent = source;\n\n diffBlocks.forEach((diffBlock, index) => {\n processedContent = processedContent.replace(\n diffBlock.fullMatch,\n `__EXTRACTED_DIFF_${index}__`\n );\n });\n\n const markerCount = (processedContent.match(DIFF_MARKER_PATTERN) || [])\n .length;\n if (markerCount % 2 !== 0) {\n return {\n htmlBlocks: [],\n diffBlocks: [],\n pendingHTML: \"\",\n hasUnclosedDiffBlock: true,\n isPureDiffPayload,\n };\n }\n\n const { blocks, pendingHTML } = extractAllCompleteBlocks(processedContent);\n\n return {\n htmlBlocks: blocks,\n diffBlocks: diffBlocks.map((block) => block.content),\n pendingHTML,\n hasUnclosedDiffBlock: false,\n isPureDiffPayload,\n };\n};\n"],"names":["TARGET_TAGS","DIFF_BLOCK_PATTERN","DIFF_MARKER_PATTERN","PURE_DIFF_BLOCK_PATTERN","extractDiffBlocks","content","blocks","match","findMatchingCloseTag","startPos","tagName","openTag","closeTag","openTagEnd","depth","searchPos","nextOpen","nextClose","openEnd","extractAllCompleteBlocks","unmatchedOpens","pendingStart","cursor","nextTagPos","nextTagName","nextIsOpen","openPos","closePos","blockEnd","tagEnd","top","pendingHTML","parseBlackboardStream","source","normalizedSource","isPureDiffPayload","diffBlocks","processedContent","diffBlock","index","block"],"mappings":"AAaA,MAAMA,IAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEMC,IAAqB,mCACrBC,IAAsB,YACtBC,IAA0B,2BAE1BC,IAAoB,CAACC,MAA0C;AACnE,QAAMC,IAA+B,CAAA;AACrC,MAAIC;AAGJ,OAFAN,EAAmB,YAAY,IAEvBM,IAAQN,EAAmB,KAAKI,CAAO,OAAO;AACpD,IAAAC,EAAO,KAAK;AAAA,MACV,SAASC,EAAM,CAAC;AAAA,MAChB,WAAWA,EAAM,CAAC;AAAA,IAAA,CACnB;AAGH,SAAOD;AACT,GAEME,IAAuB,CAC3BH,GACAI,GACAC,MACG;AACH,QAAMC,IAAU,IAAID,CAAO,IACrBE,IAAW,KAAKF,CAAO,KACvBG,IAAaR,EAAQ,QAAQ,KAAKI,CAAQ;AAEhD,MAAII,MAAe;AACjB,WAAO;AAGT,MAAIC,IAAQ,GACRC,IAAYF,IAAa;AAE7B,SAAOE,IAAYV,EAAQ,UAAUS,IAAQ,KAAG;AAC9C,UAAME,IAAWX,EAAQ,QAAQM,GAASI,CAAS,GAC7CE,IAAYZ,EAAQ,QAAQO,GAAUG,CAAS;AAErD,QAAIE,MAAc;AAChB,aAAO;AAGT,QAAID,MAAa,MAAMA,IAAWC,GAAW;AAC3C,MAAAH,KAAS;AACT,YAAMI,IAAUb,EAAQ,QAAQ,KAAKW,CAAQ;AAC7C,MAAAD,IAAYG,MAAY,KAAKF,IAAWL,EAAQ,SAASO,IAAU;AACnE;AAAA,IACF;AAGA,QADAJ,KAAS,GACLA,MAAU;AACZ,aAAOG,IAAYL,EAAS;AAE9B,IAAAG,IAAYE,IAAYL,EAAS;AAAA,EACnC;AAEA,SAAO;AACT,GAEMO,IAA2B,CAACd,MAAoB;AACpD,QAAMC,IAAmB,CAAA,GACnBc,IAA0D,CAAA;AAChE,MAAIC,IAAe,IACfC,IAAS;AAEb,SAAOA,IAASjB,EAAQ,UAAQ;AAC9B,QAAIkB,IAAa,IACbC,IAA6B,MAC7BC,IAAa;AAqBjB,QAnBAzB,EAAY,QAAQ,CAACU,MAAY;AAC/B,YAAMC,IAAU,IAAID,CAAO,IACrBE,IAAW,KAAKF,CAAO,KACvBgB,IAAUrB,EAAQ,QAAQM,GAASW,CAAM,GACzCK,IAAWtB,EAAQ,QAAQO,GAAUU,CAAM;AAEjD,MAAII,MAAY,OAAOH,MAAe,MAAMG,IAAUH,OACpDA,IAAaG,GACbF,IAAcd,GACde,IAAa,KAGXE,MAAa,OAAOJ,MAAe,MAAMI,IAAWJ,OACtDA,IAAaI,GACbH,IAAcd,GACde,IAAa;AAAA,IAEjB,CAAC,GAEGF,MAAe,MAAM,CAACC;AACxB;AAGF,QAAIC,GAAY;AACd,UAAIL,EAAe,WAAW,GAAG;AAC/B,cAAMQ,IAAWpB,EAAqBH,GAASkB,GAAYC,CAAW;AACtE,YAAII,MAAa,IAAI;AACnB,UAAAtB,EAAO,KAAKD,EAAQ,UAAUkB,GAAYK,CAAQ,CAAC,GACnDN,IAASM;AACT;AAAA,QACF;AACA,QAAIP,MAAiB,OACnBA,IAAeE;AAAA,MAEnB;AAEA,MAAAH,EAAe,KAAK,EAAE,SAASI,GAAa,KAAKD,GAAY;AAC7D,YAAMM,IAASxB,EAAQ,QAAQ,KAAKkB,CAAU;AAC9C,MAAAD,IAASO,MAAW,KAAKA,IAAS,IAAIN,IAAaC,EAAY,SAAS;AACxE;AAAA,IACF;AAEA,UAAMM,IAAMV,EAAeA,EAAe,SAAS,CAAC;AACpD,IAAIU,KAAOA,EAAI,YAAYN,KACzBJ,EAAe,IAAA,GAEjBE,IAASC,IAAaC,EAAY,SAAS;AAAA,EAC7C;AAEA,QAAMO,IACJV,MAAiB,KAAK,KAAKhB,EAAQ,UAAUgB,CAAY;AAC3D,SAAO,EAAE,QAAAf,GAAQ,aAAAyB,EAAA;AACnB,GAEaC,IAAwB,CACnCC,MAC0B;AAC1B,MAAI,CAACA;AACH,WAAO;AAAA,MACL,YAAY,CAAA;AAAA,MACZ,YAAY,CAAA;AAAA,MACZ,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,mBAAmB;AAAA,IAAA;AAIvB,QAAMC,IAAmBD,EAAO,KAAA,GAE1BE,IACJ,CAAC,CAFoBD,EAAiB,MAAM/B,CAAuB,GAEjD,UAClB+B,EAAiB,QAAQ/B,GAAyB,EAAE,EAAE,KAAA,EAAO,WAAW,GAEpEiC,IAAahC,EAAkB6B,CAAM;AAC3C,MAAII,IAAmBJ;AAWvB,MATAG,EAAW,QAAQ,CAACE,GAAWC,MAAU;AACvC,IAAAF,IAAmBA,EAAiB;AAAA,MAClCC,EAAU;AAAA,MACV,oBAAoBC,CAAK;AAAA,IAAA;AAAA,EAE7B,CAAC,IAEoBF,EAAiB,MAAMnC,CAAmB,KAAK,CAAA,GACjE,SACe,MAAM;AACtB,WAAO;AAAA,MACL,YAAY,CAAA;AAAA,MACZ,YAAY,CAAA;AAAA,MACZ,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,mBAAAiC;AAAA,IAAA;AAIJ,QAAM,EAAE,QAAA7B,GAAQ,aAAAyB,MAAgBZ,EAAyBkB,CAAgB;AAEzE,SAAO;AAAA,IACL,YAAY/B;AAAA,IACZ,YAAY8B,EAAW,IAAI,CAACI,MAAUA,EAAM,OAAO;AAAA,IACnD,aAAAT;AAAA,IACA,sBAAsB;AAAA,IACtB,mBAAAI;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./vendor/tailwindcss-v3.min.cjs.js"),r=require("./vendor/daisyui-v4.min.css.cjs.js"),l=require("./vendor/gsap-v3.min.cjs.js");function s(e){const t=e.createElement("script");t.textContent=a.default,e.head.appendChild(t);const i=e.createElement("style");i.textContent=r.default,e.head.appendChild(i);const n=e.createElement("script");n.textContent=l.default,e.head.appendChild(n)}exports.injectBlackboardLibraries=s;
2
+ //# sourceMappingURL=blackboard-vendor.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blackboard-vendor.cjs.js","sources":["../../../src/components/ContentRender/blackboard-vendor.ts"],"sourcesContent":["import tailwindScript from \"./vendor/tailwindcss-v3.min.js?raw\";\nimport daisyuiCss from \"./vendor/daisyui-v4.min.css?raw\";\nimport gsapScript from \"./vendor/gsap-v3.min.js?raw\";\n\n/**\n * Inject blackboard-mode libraries (Tailwind CSS, DaisyUI, GSAP)\n * into an iframe document using DOM API to avoid template-string escaping issues.\n */\nexport function injectBlackboardLibraries(doc: Document): void {\n // 1. Tailwind CSS v3 (JIT compiler, must load first)\n const tailwindEl = doc.createElement(\"script\");\n tailwindEl.textContent = tailwindScript;\n doc.head.appendChild(tailwindEl);\n\n // 2. DaisyUI v4 CSS\n const daisyuiEl = doc.createElement(\"style\");\n daisyuiEl.textContent = daisyuiCss;\n doc.head.appendChild(daisyuiEl);\n\n // 3. GSAP v3\n const gsapEl = doc.createElement(\"script\");\n gsapEl.textContent = gsapScript;\n doc.head.appendChild(gsapEl);\n}\n"],"names":["injectBlackboardLibraries","doc","tailwindEl","tailwindScript","daisyuiEl","daisyuiCss","gsapEl","gsapScript"],"mappings":"+NAQO,SAASA,EAA0BC,EAAqB,CAE7D,MAAMC,EAAaD,EAAI,cAAc,QAAQ,EAC7CC,EAAW,YAAcC,EAAAA,QACzBF,EAAI,KAAK,YAAYC,CAAU,EAG/B,MAAME,EAAYH,EAAI,cAAc,OAAO,EAC3CG,EAAU,YAAcC,EAAAA,QACxBJ,EAAI,KAAK,YAAYG,CAAS,EAG9B,MAAME,EAASL,EAAI,cAAc,QAAQ,EACzCK,EAAO,YAAcC,EAAAA,QACrBN,EAAI,KAAK,YAAYK,CAAM,CAC7B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Inject blackboard-mode libraries (Tailwind CSS, DaisyUI, GSAP)
3
+ * into an iframe document using DOM API to avoid template-string escaping issues.
4
+ */
5
+ export declare function injectBlackboardLibraries(doc: Document): void;
@@ -0,0 +1,15 @@
1
+ import a from "./vendor/tailwindcss-v3.min.es.js";
2
+ import r from "./vendor/daisyui-v4.min.css.es.js";
3
+ import p from "./vendor/gsap-v3.min.es.js";
4
+ function d(t) {
5
+ const e = t.createElement("script");
6
+ e.textContent = a, t.head.appendChild(e);
7
+ const i = t.createElement("style");
8
+ i.textContent = r, t.head.appendChild(i);
9
+ const n = t.createElement("script");
10
+ n.textContent = p, t.head.appendChild(n);
11
+ }
12
+ export {
13
+ d as injectBlackboardLibraries
14
+ };
15
+ //# sourceMappingURL=blackboard-vendor.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blackboard-vendor.es.js","sources":["../../../src/components/ContentRender/blackboard-vendor.ts"],"sourcesContent":["import tailwindScript from \"./vendor/tailwindcss-v3.min.js?raw\";\nimport daisyuiCss from \"./vendor/daisyui-v4.min.css?raw\";\nimport gsapScript from \"./vendor/gsap-v3.min.js?raw\";\n\n/**\n * Inject blackboard-mode libraries (Tailwind CSS, DaisyUI, GSAP)\n * into an iframe document using DOM API to avoid template-string escaping issues.\n */\nexport function injectBlackboardLibraries(doc: Document): void {\n // 1. Tailwind CSS v3 (JIT compiler, must load first)\n const tailwindEl = doc.createElement(\"script\");\n tailwindEl.textContent = tailwindScript;\n doc.head.appendChild(tailwindEl);\n\n // 2. DaisyUI v4 CSS\n const daisyuiEl = doc.createElement(\"style\");\n daisyuiEl.textContent = daisyuiCss;\n doc.head.appendChild(daisyuiEl);\n\n // 3. GSAP v3\n const gsapEl = doc.createElement(\"script\");\n gsapEl.textContent = gsapScript;\n doc.head.appendChild(gsapEl);\n}\n"],"names":["injectBlackboardLibraries","doc","tailwindEl","tailwindScript","daisyuiEl","daisyuiCss","gsapEl","gsapScript"],"mappings":";;;AAQO,SAASA,EAA0BC,GAAqB;AAE7D,QAAMC,IAAaD,EAAI,cAAc,QAAQ;AAC7C,EAAAC,EAAW,cAAcC,GACzBF,EAAI,KAAK,YAAYC,CAAU;AAG/B,QAAME,IAAYH,EAAI,cAAc,OAAO;AAC3C,EAAAG,EAAU,cAAcC,GACxBJ,EAAI,KAAK,YAAYG,CAAS;AAG9B,QAAME,IAASL,EAAI,cAAc,QAAQ;AACzC,EAAAK,EAAO,cAAcC,GACrBN,EAAI,KAAK,YAAYK,CAAM;AAC7B;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./ContentRender.cjs.js");require("../../_virtual/jsx-runtime.cjs.js");require("react");require("react-dom/client");require("../ui/inputGroup/input-group.cjs.js");exports.ContentRender=e.default;exports.default=e.default;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./ContentRender.cjs.js");require("../../_virtual/jsx-runtime.cjs.js");require("react");require("react-dom/client");require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/diff@5.2.0/node_modules/diff/lib/index.cjs.js");require("../ui/inputGroup/input-group.cjs.js");exports.ContentRender=e.default;exports.default=e.default;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -2,6 +2,7 @@ import o from "./ContentRender.es.js";
2
2
  import "../../_virtual/jsx-runtime.es.js";
3
3
  import "react";
4
4
  import "react-dom/client";
5
+ import "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/diff@5.2.0/node_modules/diff/lib/index.es.js";
5
6
  import "../ui/inputGroup/input-group.es.js";
6
7
  export {
7
8
  o as ContentRender,
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L=/<(script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)[\s>]/i,$=[/<svg[\s\S]*?<\/svg>/i,/<img\b[^>]*?>/i,/```mermaid[\s\S]*?```/i,/```[a-zA-Z0-9]+[\s\S]*?```/i],O=/!\[[^\]]*]\([^\s)\n]+(?:\s+"[^"]*")?\)/i,k=/<iframe\b[^>]*\bdata-tag\s*=\s*(["'])video\1[^>]*>[\s\S]*?<\/iframe>/i,T=/<\/[a-z][^>]*>\s*\n(?=[^\s<])/gi,_=/<custom-button-after-content\b[\s\S]*?<\/custom-button-after-content>/gi,V=/^"[\s\S]*"$/,U=/```mermaid[\s\S]*?```/i,P=s=>s.split(/\r?\n/).map(e=>e.trim()).find(Boolean)??"",W=s=>{const e=s.indexOf("```");if(e===-1)return null;const t=s.indexOf("```",e+3);return t===-1?{start:e,block:s.slice(e),complete:!1}:{start:e,end:t+3,block:s.slice(e,t+3),complete:!0}},K=s=>{const e=s.split(/\r?\n/).map(t=>t.trim()).filter(Boolean);return e.length<=1?s:e[0]},j=(s,e)=>{if(!V.test(s))return s;const t=s.slice(1,-1);if(!e)return t;const n=t.match(U);if(!n||typeof n.index!="number")return t;const o=t.slice(0,n.index),c=t.slice(n.index+n[0].length),r=P(o),i=P(c);return!r||!i?t:`${r}${n[0]}${i}`},Q=s=>{const e=[],t=/```/g;let n;for(;(n=t.exec(s))!==null;){const o=n.index,c=t.exec(s);if(!c){e.push({start:o,end:s.length});break}e.push({start:o,end:c.index+3})}return e},X=(s,e)=>e.some(({start:t,end:n})=>s>=t&&s<n),x=(s,e,t)=>{const n=e.flags.includes("g")?e.flags:`${e.flags}g`,o=new RegExp(e.source,n);let c;for(;(c=o.exec(s))!==null;)if(!X(c.index,t))return c.index;return-1},G=(s,e)=>{let t=s.length,n;for(T.lastIndex=0;n=T.exec(s);)if(!(n.index<=e)){t=n.index+n[0].length;break}return t},H=s=>{if(!s.length)return s;const e=[];return s.forEach(t=>{if(t.type!=="sandbox"){e.push(t);return}_.lastIndex=0;let n=0,o;for(;(o=_.exec(t.value))!==null;){const r=t.value.slice(n,o.index);r.trim()&&e.push({type:"sandbox",value:r}),e.push({type:"markdown",value:o[0]}),n=o.index+o[0].length}const c=t.value.slice(n);c.trim()&&e.push({type:"sandbox",value:c})}),e},Z=s=>{let e=null;return $.forEach(t=>{const n=t.exec(s);if(!n||typeof n.index!="number")return;const o=n.index,c=n.index+n[0].length;(!e||o<e.start)&&(e={start:o,end:c})}),e},q=(...s)=>s.reduce((e,t)=>t&&(!e||t.start<e.start)?t:e,null),w=(s,e)=>{const t=x(s,O,e);if(t===-1)return null;const n=s.slice(t).match(O);return n?{start:t,end:t+n[0].length}:null},J=(s,e)=>{const t=x(s,k,e);if(t===-1)return null;const n=s.slice(t).match(k);return n?{start:t,end:t+n[0].length}:null},Y=s=>k.test(s.trim()),tt=s=>{const e=s.match(/^\s*\|.+\|\s*$/m);if(!e||typeof e.index!="number")return null;const t=e[0].match(/^\s*/)?.[0].length??0,n=e.index+t,o=s.slice(n).split(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const U=/<(script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)[\s>]/i,V=[/<svg[\s\S]*?<\/svg>/i,/<img\b[^>]*?>/i,/```mermaid[\s\S]*?```/i,/```[a-zA-Z0-9]+[\s\S]*?```/i],N=/!\[[^\]]*]\([^\s)\n]+(?:\s+"[^"]*")?\)/i,k=/<iframe\b[^>]*\bdata-tag\s*=\s*(["'])video\1[^>]*>[\s\S]*?<\/iframe>/i,K=/!\+\+\+/i,P=/<\/[a-z][^>]*>\s*\n(?=[^\s<])/gi,D=/<custom-button-after-content\b[\s\S]*?<\/custom-button-after-content>/gi,W=/^"[\s\S]*"$/,j=/```mermaid[\s\S]*?```/i,F=s=>s.split(/\r?\n/).map(n=>n.trim()).find(Boolean)??"",Q=s=>{const n=s.indexOf("```");if(n===-1)return null;const t=s.indexOf("```",n+3);return t===-1?{start:n,block:s.slice(n),complete:!1}:{start:n,end:t+3,block:s.slice(n,t+3),complete:!0}},X=s=>{const n=s.split(/\r?\n/).map(t=>t.trim()).filter(Boolean);return n.length<=1?s:n[0]},G=(s,n)=>{if(!W.test(s))return s;const t=s.slice(1,-1);if(!n)return t;const e=t.match(j);if(!e||typeof e.index!="number")return t;const o=t.slice(0,e.index),c=t.slice(e.index+e[0].length),r=F(o),i=F(c);return!r||!i?t:`${r}${e[0]}${i}`},H=s=>{const n=[],t=/```/g;let e;for(;(e=t.exec(s))!==null;){const o=e.index,c=t.exec(s);if(!c){n.push({start:o,end:s.length});break}n.push({start:o,end:c.index+3})}return n},Z=(s,n)=>n.some(({start:t,end:e})=>s>=t&&s<e),g=(s,n,t)=>{const e=n.flags.includes("g")?n.flags:`${n.flags}g`,o=new RegExp(n.source,e);let c;for(;(c=o.exec(s))!==null;)if(!Z(c.index,t))return c.index;return-1},q=(s,n)=>{let t=s.length,e;for(P.lastIndex=0;e=P.exec(s);)if(!(e.index<=n)){t=e.index+e[0].length;break}return t},J=s=>{if(!s.length)return s;const n=[];return s.forEach(t=>{if(t.type!=="sandbox"){n.push(t);return}D.lastIndex=0;let e=0,o;for(;(o=D.exec(t.value))!==null;){const r=t.value.slice(e,o.index);r.trim()&&n.push({type:"sandbox",value:r}),n.push({type:"markdown",value:o[0]}),e=o.index+o[0].length}const c=t.value.slice(e);c.trim()&&n.push({type:"sandbox",value:c})}),n},Y=s=>{let n=null;return V.forEach(t=>{const e=t.exec(s);if(!e||typeof e.index!="number")return;const o=e.index,c=e.index+e[0].length;(!n||o<n.start)&&(n={start:o,end:c})}),n},tt=(...s)=>s.reduce((n,t)=>t&&(!n||t.start<n.start)?t:n,null),w=(s,n)=>{const t=g(s,N,n);if(t===-1)return null;const e=s.slice(t).match(N);return e?{start:t,end:t+e[0].length}:null},nt=(s,n)=>{const t=g(s,k,n);if(t===-1)return null;const e=s.slice(t).match(k);return e?{start:t,end:t+e[0].length}:null},et=(s,n)=>{const t=g(s,K,n);if(t===-1)return null;const e=s.indexOf("!+++",t+4),o=e===-1?s.length:e+4;return{start:t,end:o}},st=s=>k.test(s.trim()),ot=s=>{const n=s.match(/^\s*\|.+\|\s*$/m);if(!n||typeof n.index!="number")return null;const t=n[0].match(/^\s*/)?.[0].length??0,e=n.index+t,o=s.slice(e).split(`
2
2
  `),c=[];for(const i of o){if(!i.trim().startsWith("|"))break;c.push(i)}const r=c.join(`
3
- `);return{start:n,block:r,end:n+r.length}},f=(s,e=!1)=>{const t=j(s,e),n=l=>H(l),o=W(t);if(o){if(!o.complete)return n(e?[{type:"markdown",value:t}]:[{type:"markdown",value:o.block}]);if(!e)return n([{type:"markdown",value:o.block}]);const l=[],a=t.slice(0,o.start),u=K(a);u.trim()&&l.push({type:"text",value:u}),l.push({type:"markdown",value:o.block});const d=t.slice(o.end);return d.trim()&&l.push(...f(d,!0)),n(l)}const c=Q(t),r=x(t,L,c),i=x(t,/<svg\b/i,c),S=r!==-1&&i!==-1&&r<i,y=w(t,c),z=!!y&&i!==-1&&y.start<i;if(i!==-1&&!S&&!z){const l=t.slice(0,i),a=t.indexOf("</svg>",i),u=a===-1?`${t.slice(i)}</svg>`:t.slice(i,a+6),d=a===-1?"":t.slice(a+6);if(e){const b=[];return l.trim()&&b.push({type:"text",value:l}),b.push({type:"markdown",value:u}),d.trim()&&b.push(...f(d,!0)),n(b)}if(a===-1)return n([{type:"markdown",value:u}])}const h=tt(t);if(h){const l=[],a=t.slice(0,h.start);e&&a.trim()&&l.push(...f(a,!0)),l.push({type:"markdown",value:h.block});const u=t.slice(h.end),d=u.length<t.length;return u.trim()&&d&&l.push(...e?f(u,!0):f(u)),n(l)}const F=Z(t),C=w(t,c),D=J(t,c),m=q(F,C,D);if(r===-1&&!m)return e&&t.trim()?n([{type:"text",value:t}]):[];const g=!!m&&(r===-1||m.start<=r),v=g?m.start:r,I=g?m.end:G(t,v),p=[],M=t.slice(0,v),E=t.slice(v,I),B=g&&Y(E),A=B?M.trimEnd():M,R=t.slice(I),N=B?R.trimStart():R;return e&&A.trim()&&p.push({type:"text",value:A}),p.push({type:g?"markdown":"sandbox",value:E}),N.trim()&&p.push(...f(N,e)),n(p)};exports.splitContentSegments=f;
3
+ `);return{start:e,block:r,end:e+r.length}},m=(s,n=!1)=>{const t=G(s,n),e=l=>J(l),o=Q(t);if(o){if(!o.complete)return e(n?[{type:"markdown",value:t}]:[{type:"markdown",value:o.block}]);if(!n)return e([{type:"markdown",value:o.block}]);const l=[],a=t.slice(0,o.start),u=X(a);u.trim()&&l.push({type:"text",value:u}),l.push({type:"markdown",value:o.block});const f=t.slice(o.end);return f.trim()&&l.push(...m(f,!0)),e(l)}const c=H(t),r=g(t,U,c),i=g(t,/<svg\b/i,c),I=r!==-1&&i!==-1&&r<i,M=w(t,c),z=!!M&&i!==-1&&M.start<i;if(i!==-1&&!I&&!z){const l=t.slice(0,i),a=t.indexOf("</svg>",i),u=a===-1?`${t.slice(i)}</svg>`:t.slice(i,a+6),f=a===-1?"":t.slice(a+6);if(n){const v=[];return l.trim()&&v.push({type:"text",value:l}),v.push({type:"markdown",value:u}),f.trim()&&v.push(...m(f,!0)),e(v)}if(a===-1)return e([{type:"markdown",value:u}])}const p=ot(t);if(p){const l=[],a=t.slice(0,p.start);n&&a.trim()&&l.push(...m(a,!0)),l.push({type:"markdown",value:p.block});const u=t.slice(p.end),f=u.length<t.length;return u.trim()&&f&&l.push(...n?m(u,!0):m(u)),e(l)}const C=Y(t),L=w(t,c),$=nt(t,c),h=et(t,c),d=tt(C,L,$);if(r===-1&&!d&&!h)return n&&t.trim()?e([{type:"text",value:t}]):[];const b=!!d&&(r===-1||d.start<=r),y=!!h&&(r===-1||h.start<=r)&&(!d||h.start<=d.start),S=y?h.start:b?d.start:r,E=y?h.end:b?d.end:q(t,S),x=[],B=t.slice(0,S),A=t.slice(S,E),R=b&&st(A),T=R?B.trimEnd():B,_=t.slice(E),O=R?_.trimStart():_;return n&&T.trim()&&x.push({type:"text",value:T}),x.push({type:b?"markdown":"sandbox",value:A}),O.trim()&&x.push(...m(O,n)),e(x)};exports.splitContentSegments=m;
4
4
  //# sourceMappingURL=split-content.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"split-content.cjs.js","sources":["../../../../src/components/ContentRender/utils/split-content.ts"],"sourcesContent":["export type RenderSegment =\n | { type: \"markdown\"; value: string }\n | { type: \"sandbox\"; value: string }\n | { type: \"text\"; value: string };\n\nconst SANDBOX_START_PATTERN =\n /<(script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)[\\s>]/i;\n\nconst INLINE_SANDBOX_PATTERNS: RegExp[] = [\n /<svg[\\s\\S]*?<\\/svg>/i,\n /<img\\b[^>]*?>/i,\n /```mermaid[\\s\\S]*?```/i,\n /```[a-zA-Z0-9]+[\\s\\S]*?```/i,\n];\nconst MARKDOWN_IMAGE_PATTERN = /!\\[[^\\]]*]\\([^\\s)\\n]+(?:\\s+\"[^\"]*\")?\\)/i;\nconst MARKDOWN_VIDEO_IFRAME_PATTERN =\n /<iframe\\b[^>]*\\bdata-tag\\s*=\\s*([\"'])video\\1[^>]*>[\\s\\S]*?<\\/iframe>/i;\n\nconst closingBoundary = /<\\/[a-z][^>]*>\\s*\\n(?=[^\\s<])/gi;\nconst CUSTOM_BUTTON_PATTERN =\n /<custom-button-after-content\\b[\\s\\S]*?<\\/custom-button-after-content>/gi;\n\ntype MatchResult = { start: number; end: number };\ntype FenceRange = { start: number; end: number };\ntype FenceBlock =\n | { start: number; end: number; block: string; complete: true }\n | { start: number; block: string; complete: false };\n\nconst WRAPPED_QUOTES_PATTERN = /^\"[\\s\\S]*\"$/;\nconst MERMAID_BLOCK_PATTERN = /```mermaid[\\s\\S]*?```/i;\n\nconst firstNonEmptyLine = (content: string) =>\n content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\";\n\nconst extractFirstFenceBlock = (raw: string): FenceBlock | null => {\n const start = raw.indexOf(\"```\");\n if (start === -1) return null;\n\n const closing = raw.indexOf(\"```\", start + 3);\n if (closing === -1) {\n return {\n start,\n block: raw.slice(start),\n complete: false,\n };\n }\n\n return {\n start,\n end: closing + 3,\n block: raw.slice(start, closing + 3),\n complete: true,\n };\n};\n\nconst normalizeBeforeFenceText = (before: string) => {\n const nonEmptyLines = before\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (nonEmptyLines.length <= 1) return before;\n return nonEmptyLines[0];\n};\n\nconst normalizeQuotedMermaidContent = (raw: string, keepText: boolean) => {\n if (!WRAPPED_QUOTES_PATTERN.test(raw)) return raw;\n\n const unwrapped = raw.slice(1, -1);\n if (!keepText) return unwrapped;\n\n const mermaidMatch = unwrapped.match(MERMAID_BLOCK_PATTERN);\n if (!mermaidMatch || typeof mermaidMatch.index !== \"number\") {\n return unwrapped;\n }\n\n const before = unwrapped.slice(0, mermaidMatch.index);\n const after = unwrapped.slice(mermaidMatch.index + mermaidMatch[0].length);\n const leadingLine = firstNonEmptyLine(before);\n const trailingLine = firstNonEmptyLine(after);\n\n if (!leadingLine || !trailingLine) {\n return unwrapped;\n }\n\n // Keep the essential nearby text around the mermaid block in wrapped payloads.\n return `${leadingLine}${mermaidMatch[0]}${trailingLine}`;\n};\n\nconst getFenceRanges = (raw: string): FenceRange[] => {\n const ranges: FenceRange[] = [];\n const fencePattern = /```/g;\n let match: RegExpExecArray | null;\n\n while ((match = fencePattern.exec(raw)) !== null) {\n const start = match.index;\n const closeMatch = fencePattern.exec(raw);\n if (!closeMatch) {\n ranges.push({ start, end: raw.length });\n break;\n }\n ranges.push({ start, end: closeMatch.index + 3 });\n }\n\n return ranges;\n};\n\nconst isIndexInRanges = (index: number, ranges: FenceRange[]) =>\n ranges.some(({ start, end }) => index >= start && index < end);\n\nconst findFirstMatchOutsideFence = (\n raw: string,\n pattern: RegExp,\n fenceRanges: FenceRange[]\n) => {\n const flags = pattern.flags.includes(\"g\")\n ? pattern.flags\n : `${pattern.flags}g`;\n const matcher = new RegExp(pattern.source, flags);\n let match: RegExpExecArray | null;\n\n while ((match = matcher.exec(raw)) !== null) {\n if (!isIndexInRanges(match.index, fenceRanges)) {\n return match.index;\n }\n }\n\n return -1;\n};\n\nconst findHtmlBlockEnd = (raw: string, startIndex: number) => {\n let blockEnd = raw.length;\n let match: RegExpExecArray | null;\n closingBoundary.lastIndex = 0;\n\n while ((match = closingBoundary.exec(raw))) {\n if (match.index <= startIndex) continue;\n blockEnd = match.index + match[0].length;\n break;\n }\n\n return blockEnd;\n};\n\nconst splitCustomButtonsFromSandbox = (segments: RenderSegment[]) => {\n if (!segments.length) return segments;\n const output: RenderSegment[] = [];\n\n segments.forEach((segment) => {\n if (segment.type !== \"sandbox\") {\n output.push(segment);\n return;\n }\n\n CUSTOM_BUTTON_PATTERN.lastIndex = 0;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = CUSTOM_BUTTON_PATTERN.exec(segment.value)) !== null) {\n const before = segment.value.slice(lastIndex, match.index);\n if (before.trim()) {\n output.push({ type: \"sandbox\", value: before });\n }\n output.push({ type: \"markdown\", value: match[0] });\n lastIndex = match.index + match[0].length;\n }\n\n const rest = segment.value.slice(lastIndex);\n if (rest.trim()) {\n output.push({ type: \"sandbox\", value: rest });\n }\n });\n\n return output;\n};\n\nconst findInlineSandboxMatch = (raw: string): MatchResult | null => {\n let earliest: MatchResult | null = null;\n\n INLINE_SANDBOX_PATTERNS.forEach((pattern) => {\n const match = pattern.exec(raw);\n if (!match || typeof match.index !== \"number\") return;\n const start = match.index;\n const end = match.index + match[0].length;\n\n if (!earliest || start < earliest.start) {\n earliest = { start, end };\n }\n });\n\n return earliest;\n};\n\nconst pickEarliestMatch = (...matches: Array<MatchResult | null>) =>\n matches.reduce<MatchResult | null>((earliest, match) => {\n if (!match) return earliest;\n if (!earliest || match.start < earliest.start) return match;\n return earliest;\n }, null);\n\nconst findMarkdownImageMatch = (\n raw: string,\n fenceRanges: FenceRange[]\n): MatchResult | null => {\n const start = findFirstMatchOutsideFence(\n raw,\n MARKDOWN_IMAGE_PATTERN,\n fenceRanges\n );\n\n if (start === -1) return null;\n const match = raw.slice(start).match(MARKDOWN_IMAGE_PATTERN);\n if (!match) return null;\n\n return { start, end: start + match[0].length };\n};\n\nconst findMarkdownVideoIframeMatch = (\n raw: string,\n fenceRanges: FenceRange[]\n): MatchResult | null => {\n const start = findFirstMatchOutsideFence(\n raw,\n MARKDOWN_VIDEO_IFRAME_PATTERN,\n fenceRanges\n );\n\n if (start === -1) return null;\n const match = raw.slice(start).match(MARKDOWN_VIDEO_IFRAME_PATTERN);\n if (!match) return null;\n\n return { start, end: start + match[0].length };\n};\n\nconst isMarkdownVideoIframe = (value: string) =>\n MARKDOWN_VIDEO_IFRAME_PATTERN.test(value.trim());\n\nconst extractTableBlock = (\n raw: string\n): { start: number; block: string; end: number } | null => {\n const tableMatch = raw.match(/^\\s*\\|.+\\|\\s*$/m);\n if (!tableMatch || typeof tableMatch.index !== \"number\") return null;\n\n const leadingSpaces = tableMatch[0].match(/^\\s*/)?.[0].length ?? 0;\n const tableStart = tableMatch.index + leadingSpaces;\n\n const lines = raw.slice(tableStart).split(\"\\n\");\n const tableLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"|\")) break;\n tableLines.push(line);\n }\n\n const block = tableLines.join(\"\\n\");\n return { start: tableStart, block, end: tableStart + block.length };\n};\n\n// Split incoming markdown content into markdown and sandbox HTML segments\nexport const splitContentSegments = (\n raw: string,\n keepText = false\n): RenderSegment[] => {\n const source = normalizeQuotedMermaidContent(raw, keepText);\n const finalizeSegments = (segments: RenderSegment[]) =>\n splitCustomButtonsFromSandbox(segments);\n\n const fenceBlock = extractFirstFenceBlock(source);\n if (fenceBlock) {\n if (!fenceBlock.complete) {\n if (keepText) {\n return finalizeSegments([{ type: \"markdown\", value: source }]);\n }\n return finalizeSegments([{ type: \"markdown\", value: fenceBlock.block }]);\n }\n\n if (!keepText) {\n return finalizeSegments([{ type: \"markdown\", value: fenceBlock.block }]);\n }\n\n const segments: RenderSegment[] = [];\n const before = source.slice(0, fenceBlock.start);\n const normalizedBefore = normalizeBeforeFenceText(before);\n if (normalizedBefore.trim()) {\n segments.push({ type: \"text\", value: normalizedBefore });\n }\n\n segments.push({ type: \"markdown\", value: fenceBlock.block });\n\n const after = source.slice(fenceBlock.end);\n if (after.trim()) {\n segments.push(...splitContentSegments(after, true));\n }\n\n return finalizeSegments(segments);\n }\n\n const fenceRanges = getFenceRanges(source);\n // Avoid treating fenced code blocks as sandbox content.\n const sandboxStartIndex = findFirstMatchOutsideFence(\n source,\n SANDBOX_START_PATTERN,\n fenceRanges\n );\n const svgOpenIndex = findFirstMatchOutsideFence(\n source,\n /<svg\\b/i,\n fenceRanges\n );\n const hasSandboxBeforeSvg =\n sandboxStartIndex !== -1 &&\n svgOpenIndex !== -1 &&\n sandboxStartIndex < svgOpenIndex;\n const markdownImageBeforeSvg = findMarkdownImageMatch(source, fenceRanges);\n const hasMarkdownImageBeforeSvg =\n !!markdownImageBeforeSvg &&\n svgOpenIndex !== -1 &&\n markdownImageBeforeSvg.start < svgOpenIndex;\n if (\n svgOpenIndex !== -1 &&\n !hasSandboxBeforeSvg &&\n !hasMarkdownImageBeforeSvg\n ) {\n const before = source.slice(0, svgOpenIndex);\n const closeIdx = source.indexOf(\"</svg>\", svgOpenIndex);\n const svgBlock =\n closeIdx === -1\n ? `${source.slice(svgOpenIndex)}</svg>`\n : source.slice(svgOpenIndex, closeIdx + \"</svg>\".length);\n const after =\n closeIdx === -1 ? \"\" : source.slice(closeIdx + \"</svg>\".length);\n\n if (keepText) {\n const segments: RenderSegment[] = [];\n if (before.trim()) {\n segments.push({ type: \"text\", value: before });\n }\n segments.push({ type: \"markdown\", value: svgBlock });\n if (after.trim()) {\n segments.push(...splitContentSegments(after, true));\n }\n return finalizeSegments(segments);\n }\n\n if (closeIdx === -1) {\n return finalizeSegments([{ type: \"markdown\", value: svgBlock }]);\n }\n }\n\n const tableBlock = extractTableBlock(source);\n if (tableBlock) {\n const segments: RenderSegment[] = [];\n const before = source.slice(0, tableBlock.start);\n if (keepText && before.trim()) {\n segments.push(...splitContentSegments(before, true));\n }\n segments.push({ type: \"markdown\", value: tableBlock.block });\n const after = source.slice(tableBlock.end);\n const hasProgress = after.length < source.length;\n if (after.trim() && hasProgress) {\n segments.push(\n ...(keepText\n ? splitContentSegments(after, true)\n : splitContentSegments(after))\n );\n }\n return finalizeSegments(segments);\n }\n\n const inlineMatch = findInlineSandboxMatch(source);\n const markdownImageMatch = findMarkdownImageMatch(source, fenceRanges);\n const markdownVideoIframeMatch = findMarkdownVideoIframeMatch(\n source,\n fenceRanges\n );\n const inlineCandidate = pickEarliestMatch(\n inlineMatch,\n markdownImageMatch,\n markdownVideoIframeMatch\n );\n\n if (sandboxStartIndex === -1 && !inlineCandidate) {\n if (keepText && source.trim()) {\n return finalizeSegments([{ type: \"text\", value: source }]);\n }\n return [];\n }\n\n const shouldUseInline =\n !!inlineCandidate &&\n (sandboxStartIndex === -1 || inlineCandidate.start <= sandboxStartIndex);\n\n const startIndex = shouldUseInline\n ? inlineCandidate!.start\n : sandboxStartIndex;\n const blockEnd = shouldUseInline\n ? inlineCandidate!.end\n : findHtmlBlockEnd(source, startIndex);\n\n const segments: RenderSegment[] = [];\n const before = source.slice(0, startIndex);\n const matchedBlock = source.slice(startIndex, blockEnd);\n const isVideoIframeMatch =\n shouldUseInline && isMarkdownVideoIframe(matchedBlock);\n const normalizedBefore = isVideoIframeMatch ? before.trimEnd() : before;\n const after = source.slice(blockEnd);\n const normalizedAfter = isVideoIframeMatch ? after.trimStart() : after;\n\n if (keepText && normalizedBefore.trim()) {\n segments.push({ type: \"text\", value: normalizedBefore });\n }\n\n segments.push({\n type: shouldUseInline ? \"markdown\" : \"sandbox\",\n value: matchedBlock,\n });\n\n if (normalizedAfter.trim()) {\n segments.push(...splitContentSegments(normalizedAfter, keepText));\n }\n\n return finalizeSegments(segments);\n};\n"],"names":["SANDBOX_START_PATTERN","INLINE_SANDBOX_PATTERNS","MARKDOWN_IMAGE_PATTERN","MARKDOWN_VIDEO_IFRAME_PATTERN","closingBoundary","CUSTOM_BUTTON_PATTERN","WRAPPED_QUOTES_PATTERN","MERMAID_BLOCK_PATTERN","firstNonEmptyLine","content","line","extractFirstFenceBlock","raw","start","closing","normalizeBeforeFenceText","before","nonEmptyLines","normalizeQuotedMermaidContent","keepText","unwrapped","mermaidMatch","after","leadingLine","trailingLine","getFenceRanges","ranges","fencePattern","match","closeMatch","isIndexInRanges","index","end","findFirstMatchOutsideFence","pattern","fenceRanges","flags","matcher","findHtmlBlockEnd","startIndex","blockEnd","splitCustomButtonsFromSandbox","segments","output","segment","lastIndex","rest","findInlineSandboxMatch","earliest","pickEarliestMatch","matches","findMarkdownImageMatch","findMarkdownVideoIframeMatch","isMarkdownVideoIframe","value","extractTableBlock","tableMatch","leadingSpaces","tableStart","lines","tableLines","block","splitContentSegments","source","finalizeSegments","fenceBlock","normalizedBefore","sandboxStartIndex","svgOpenIndex","hasSandboxBeforeSvg","markdownImageBeforeSvg","hasMarkdownImageBeforeSvg","closeIdx","svgBlock","tableBlock","hasProgress","inlineMatch","markdownImageMatch","markdownVideoIframeMatch","inlineCandidate","shouldUseInline","matchedBlock","isVideoIframeMatch","normalizedAfter"],"mappings":"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"}
1
+ {"version":3,"file":"split-content.cjs.js","sources":["../../../../src/components/ContentRender/utils/split-content.ts"],"sourcesContent":["export type RenderSegment =\n | { type: \"markdown\"; value: string }\n | { type: \"sandbox\"; value: string }\n | { type: \"text\"; value: string };\n\nconst SANDBOX_START_PATTERN =\n /<(script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)[\\s>]/i;\n\nconst INLINE_SANDBOX_PATTERNS: RegExp[] = [\n /<svg[\\s\\S]*?<\\/svg>/i,\n /<img\\b[^>]*?>/i,\n /```mermaid[\\s\\S]*?```/i,\n /```[a-zA-Z0-9]+[\\s\\S]*?```/i,\n];\nconst MARKDOWN_IMAGE_PATTERN = /!\\[[^\\]]*]\\([^\\s)\\n]+(?:\\s+\"[^\"]*\")?\\)/i;\nconst MARKDOWN_VIDEO_IFRAME_PATTERN =\n /<iframe\\b[^>]*\\bdata-tag\\s*=\\s*([\"'])video\\1[^>]*>[\\s\\S]*?<\\/iframe>/i;\nconst DIFF_BLOCK_START_PATTERN = /!\\+\\+\\+/i;\n\nconst closingBoundary = /<\\/[a-z][^>]*>\\s*\\n(?=[^\\s<])/gi;\nconst CUSTOM_BUTTON_PATTERN =\n /<custom-button-after-content\\b[\\s\\S]*?<\\/custom-button-after-content>/gi;\n\ntype MatchResult = { start: number; end: number };\ntype FenceRange = { start: number; end: number };\ntype FenceBlock =\n | { start: number; end: number; block: string; complete: true }\n | { start: number; block: string; complete: false };\n\nconst WRAPPED_QUOTES_PATTERN = /^\"[\\s\\S]*\"$/;\nconst MERMAID_BLOCK_PATTERN = /```mermaid[\\s\\S]*?```/i;\n\nconst firstNonEmptyLine = (content: string) =>\n content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\";\n\nconst extractFirstFenceBlock = (raw: string): FenceBlock | null => {\n const start = raw.indexOf(\"```\");\n if (start === -1) return null;\n\n const closing = raw.indexOf(\"```\", start + 3);\n if (closing === -1) {\n return {\n start,\n block: raw.slice(start),\n complete: false,\n };\n }\n\n return {\n start,\n end: closing + 3,\n block: raw.slice(start, closing + 3),\n complete: true,\n };\n};\n\nconst normalizeBeforeFenceText = (before: string) => {\n const nonEmptyLines = before\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (nonEmptyLines.length <= 1) return before;\n return nonEmptyLines[0];\n};\n\nconst normalizeQuotedMermaidContent = (raw: string, keepText: boolean) => {\n if (!WRAPPED_QUOTES_PATTERN.test(raw)) return raw;\n\n const unwrapped = raw.slice(1, -1);\n if (!keepText) return unwrapped;\n\n const mermaidMatch = unwrapped.match(MERMAID_BLOCK_PATTERN);\n if (!mermaidMatch || typeof mermaidMatch.index !== \"number\") {\n return unwrapped;\n }\n\n const before = unwrapped.slice(0, mermaidMatch.index);\n const after = unwrapped.slice(mermaidMatch.index + mermaidMatch[0].length);\n const leadingLine = firstNonEmptyLine(before);\n const trailingLine = firstNonEmptyLine(after);\n\n if (!leadingLine || !trailingLine) {\n return unwrapped;\n }\n\n // Keep the essential nearby text around the mermaid block in wrapped payloads.\n return `${leadingLine}${mermaidMatch[0]}${trailingLine}`;\n};\n\nconst getFenceRanges = (raw: string): FenceRange[] => {\n const ranges: FenceRange[] = [];\n const fencePattern = /```/g;\n let match: RegExpExecArray | null;\n\n while ((match = fencePattern.exec(raw)) !== null) {\n const start = match.index;\n const closeMatch = fencePattern.exec(raw);\n if (!closeMatch) {\n ranges.push({ start, end: raw.length });\n break;\n }\n ranges.push({ start, end: closeMatch.index + 3 });\n }\n\n return ranges;\n};\n\nconst isIndexInRanges = (index: number, ranges: FenceRange[]) =>\n ranges.some(({ start, end }) => index >= start && index < end);\n\nconst findFirstMatchOutsideFence = (\n raw: string,\n pattern: RegExp,\n fenceRanges: FenceRange[]\n) => {\n const flags = pattern.flags.includes(\"g\")\n ? pattern.flags\n : `${pattern.flags}g`;\n const matcher = new RegExp(pattern.source, flags);\n let match: RegExpExecArray | null;\n\n while ((match = matcher.exec(raw)) !== null) {\n if (!isIndexInRanges(match.index, fenceRanges)) {\n return match.index;\n }\n }\n\n return -1;\n};\n\nconst findHtmlBlockEnd = (raw: string, startIndex: number) => {\n let blockEnd = raw.length;\n let match: RegExpExecArray | null;\n closingBoundary.lastIndex = 0;\n\n while ((match = closingBoundary.exec(raw))) {\n if (match.index <= startIndex) continue;\n blockEnd = match.index + match[0].length;\n break;\n }\n\n return blockEnd;\n};\n\nconst splitCustomButtonsFromSandbox = (segments: RenderSegment[]) => {\n if (!segments.length) return segments;\n const output: RenderSegment[] = [];\n\n segments.forEach((segment) => {\n if (segment.type !== \"sandbox\") {\n output.push(segment);\n return;\n }\n\n CUSTOM_BUTTON_PATTERN.lastIndex = 0;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = CUSTOM_BUTTON_PATTERN.exec(segment.value)) !== null) {\n const before = segment.value.slice(lastIndex, match.index);\n if (before.trim()) {\n output.push({ type: \"sandbox\", value: before });\n }\n output.push({ type: \"markdown\", value: match[0] });\n lastIndex = match.index + match[0].length;\n }\n\n const rest = segment.value.slice(lastIndex);\n if (rest.trim()) {\n output.push({ type: \"sandbox\", value: rest });\n }\n });\n\n return output;\n};\n\nconst findInlineSandboxMatch = (raw: string): MatchResult | null => {\n let earliest: MatchResult | null = null;\n\n INLINE_SANDBOX_PATTERNS.forEach((pattern) => {\n const match = pattern.exec(raw);\n if (!match || typeof match.index !== \"number\") return;\n const start = match.index;\n const end = match.index + match[0].length;\n\n if (!earliest || start < earliest.start) {\n earliest = { start, end };\n }\n });\n\n return earliest;\n};\n\nconst pickEarliestMatch = (...matches: Array<MatchResult | null>) =>\n matches.reduce<MatchResult | null>((earliest, match) => {\n if (!match) return earliest;\n if (!earliest || match.start < earliest.start) return match;\n return earliest;\n }, null);\n\nconst findMarkdownImageMatch = (\n raw: string,\n fenceRanges: FenceRange[]\n): MatchResult | null => {\n const start = findFirstMatchOutsideFence(\n raw,\n MARKDOWN_IMAGE_PATTERN,\n fenceRanges\n );\n\n if (start === -1) return null;\n const match = raw.slice(start).match(MARKDOWN_IMAGE_PATTERN);\n if (!match) return null;\n\n return { start, end: start + match[0].length };\n};\n\nconst findMarkdownVideoIframeMatch = (\n raw: string,\n fenceRanges: FenceRange[]\n): MatchResult | null => {\n const start = findFirstMatchOutsideFence(\n raw,\n MARKDOWN_VIDEO_IFRAME_PATTERN,\n fenceRanges\n );\n\n if (start === -1) return null;\n const match = raw.slice(start).match(MARKDOWN_VIDEO_IFRAME_PATTERN);\n if (!match) return null;\n\n return { start, end: start + match[0].length };\n};\n\nconst findDiffSandboxMatch = (\n raw: string,\n fenceRanges: FenceRange[]\n): MatchResult | null => {\n const start = findFirstMatchOutsideFence(\n raw,\n DIFF_BLOCK_START_PATTERN,\n fenceRanges\n );\n if (start === -1) return null;\n\n const closeIndex = raw.indexOf(\"!+++\", start + 4);\n const end = closeIndex === -1 ? raw.length : closeIndex + 4;\n return { start, end };\n};\n\nconst isMarkdownVideoIframe = (value: string) =>\n MARKDOWN_VIDEO_IFRAME_PATTERN.test(value.trim());\n\nconst extractTableBlock = (\n raw: string\n): { start: number; block: string; end: number } | null => {\n const tableMatch = raw.match(/^\\s*\\|.+\\|\\s*$/m);\n if (!tableMatch || typeof tableMatch.index !== \"number\") return null;\n\n const leadingSpaces = tableMatch[0].match(/^\\s*/)?.[0].length ?? 0;\n const tableStart = tableMatch.index + leadingSpaces;\n\n const lines = raw.slice(tableStart).split(\"\\n\");\n const tableLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"|\")) break;\n tableLines.push(line);\n }\n\n const block = tableLines.join(\"\\n\");\n return { start: tableStart, block, end: tableStart + block.length };\n};\n\n// Split incoming markdown content into markdown and sandbox HTML segments\nexport const splitContentSegments = (\n raw: string,\n keepText = false\n): RenderSegment[] => {\n const source = normalizeQuotedMermaidContent(raw, keepText);\n const finalizeSegments = (segments: RenderSegment[]) =>\n splitCustomButtonsFromSandbox(segments);\n\n const fenceBlock = extractFirstFenceBlock(source);\n if (fenceBlock) {\n if (!fenceBlock.complete) {\n if (keepText) {\n return finalizeSegments([{ type: \"markdown\", value: source }]);\n }\n return finalizeSegments([{ type: \"markdown\", value: fenceBlock.block }]);\n }\n\n if (!keepText) {\n return finalizeSegments([{ type: \"markdown\", value: fenceBlock.block }]);\n }\n\n const segments: RenderSegment[] = [];\n const before = source.slice(0, fenceBlock.start);\n const normalizedBefore = normalizeBeforeFenceText(before);\n if (normalizedBefore.trim()) {\n segments.push({ type: \"text\", value: normalizedBefore });\n }\n\n segments.push({ type: \"markdown\", value: fenceBlock.block });\n\n const after = source.slice(fenceBlock.end);\n if (after.trim()) {\n segments.push(...splitContentSegments(after, true));\n }\n\n return finalizeSegments(segments);\n }\n\n const fenceRanges = getFenceRanges(source);\n // Avoid treating fenced code blocks as sandbox content.\n const sandboxStartIndex = findFirstMatchOutsideFence(\n source,\n SANDBOX_START_PATTERN,\n fenceRanges\n );\n const svgOpenIndex = findFirstMatchOutsideFence(\n source,\n /<svg\\b/i,\n fenceRanges\n );\n const hasSandboxBeforeSvg =\n sandboxStartIndex !== -1 &&\n svgOpenIndex !== -1 &&\n sandboxStartIndex < svgOpenIndex;\n const markdownImageBeforeSvg = findMarkdownImageMatch(source, fenceRanges);\n const hasMarkdownImageBeforeSvg =\n !!markdownImageBeforeSvg &&\n svgOpenIndex !== -1 &&\n markdownImageBeforeSvg.start < svgOpenIndex;\n if (\n svgOpenIndex !== -1 &&\n !hasSandboxBeforeSvg &&\n !hasMarkdownImageBeforeSvg\n ) {\n const before = source.slice(0, svgOpenIndex);\n const closeIdx = source.indexOf(\"</svg>\", svgOpenIndex);\n const svgBlock =\n closeIdx === -1\n ? `${source.slice(svgOpenIndex)}</svg>`\n : source.slice(svgOpenIndex, closeIdx + \"</svg>\".length);\n const after =\n closeIdx === -1 ? \"\" : source.slice(closeIdx + \"</svg>\".length);\n\n if (keepText) {\n const segments: RenderSegment[] = [];\n if (before.trim()) {\n segments.push({ type: \"text\", value: before });\n }\n segments.push({ type: \"markdown\", value: svgBlock });\n if (after.trim()) {\n segments.push(...splitContentSegments(after, true));\n }\n return finalizeSegments(segments);\n }\n\n if (closeIdx === -1) {\n return finalizeSegments([{ type: \"markdown\", value: svgBlock }]);\n }\n }\n\n const tableBlock = extractTableBlock(source);\n if (tableBlock) {\n const segments: RenderSegment[] = [];\n const before = source.slice(0, tableBlock.start);\n if (keepText && before.trim()) {\n segments.push(...splitContentSegments(before, true));\n }\n segments.push({ type: \"markdown\", value: tableBlock.block });\n const after = source.slice(tableBlock.end);\n const hasProgress = after.length < source.length;\n if (after.trim() && hasProgress) {\n segments.push(\n ...(keepText\n ? splitContentSegments(after, true)\n : splitContentSegments(after))\n );\n }\n return finalizeSegments(segments);\n }\n\n const inlineMatch = findInlineSandboxMatch(source);\n const markdownImageMatch = findMarkdownImageMatch(source, fenceRanges);\n const markdownVideoIframeMatch = findMarkdownVideoIframeMatch(\n source,\n fenceRanges\n );\n const diffSandboxMatch = findDiffSandboxMatch(source, fenceRanges);\n const inlineCandidate = pickEarliestMatch(\n inlineMatch,\n markdownImageMatch,\n markdownVideoIframeMatch\n );\n\n if (sandboxStartIndex === -1 && !inlineCandidate && !diffSandboxMatch) {\n if (keepText && source.trim()) {\n return finalizeSegments([{ type: \"text\", value: source }]);\n }\n return [];\n }\n\n const shouldUseInline =\n !!inlineCandidate &&\n (sandboxStartIndex === -1 || inlineCandidate.start <= sandboxStartIndex);\n\n const shouldUseDiffSandbox =\n !!diffSandboxMatch &&\n (sandboxStartIndex === -1 || diffSandboxMatch.start <= sandboxStartIndex) &&\n (!inlineCandidate || diffSandboxMatch.start <= inlineCandidate.start);\n\n const startIndex = shouldUseDiffSandbox\n ? diffSandboxMatch.start\n : shouldUseInline\n ? inlineCandidate!.start\n : sandboxStartIndex;\n const blockEnd = shouldUseDiffSandbox\n ? diffSandboxMatch.end\n : shouldUseInline\n ? inlineCandidate!.end\n : findHtmlBlockEnd(source, startIndex);\n\n const segments: RenderSegment[] = [];\n const before = source.slice(0, startIndex);\n const matchedBlock = source.slice(startIndex, blockEnd);\n const isVideoIframeMatch =\n shouldUseInline && isMarkdownVideoIframe(matchedBlock);\n const normalizedBefore = isVideoIframeMatch ? before.trimEnd() : before;\n const after = source.slice(blockEnd);\n const normalizedAfter = isVideoIframeMatch ? after.trimStart() : after;\n\n if (keepText && normalizedBefore.trim()) {\n segments.push({ type: \"text\", value: normalizedBefore });\n }\n\n segments.push({\n type: shouldUseInline ? \"markdown\" : \"sandbox\",\n value: matchedBlock,\n });\n\n if (normalizedAfter.trim()) {\n segments.push(...splitContentSegments(normalizedAfter, keepText));\n }\n\n return finalizeSegments(segments);\n};\n"],"names":["SANDBOX_START_PATTERN","INLINE_SANDBOX_PATTERNS","MARKDOWN_IMAGE_PATTERN","MARKDOWN_VIDEO_IFRAME_PATTERN","DIFF_BLOCK_START_PATTERN","closingBoundary","CUSTOM_BUTTON_PATTERN","WRAPPED_QUOTES_PATTERN","MERMAID_BLOCK_PATTERN","firstNonEmptyLine","content","line","extractFirstFenceBlock","raw","start","closing","normalizeBeforeFenceText","before","nonEmptyLines","normalizeQuotedMermaidContent","keepText","unwrapped","mermaidMatch","after","leadingLine","trailingLine","getFenceRanges","ranges","fencePattern","match","closeMatch","isIndexInRanges","index","end","findFirstMatchOutsideFence","pattern","fenceRanges","flags","matcher","findHtmlBlockEnd","startIndex","blockEnd","splitCustomButtonsFromSandbox","segments","output","segment","lastIndex","rest","findInlineSandboxMatch","earliest","pickEarliestMatch","matches","findMarkdownImageMatch","findMarkdownVideoIframeMatch","findDiffSandboxMatch","closeIndex","isMarkdownVideoIframe","value","extractTableBlock","tableMatch","leadingSpaces","tableStart","lines","tableLines","block","splitContentSegments","source","finalizeSegments","fenceBlock","normalizedBefore","sandboxStartIndex","svgOpenIndex","hasSandboxBeforeSvg","markdownImageBeforeSvg","hasMarkdownImageBeforeSvg","closeIdx","svgBlock","tableBlock","hasProgress","inlineMatch","markdownImageMatch","markdownVideoIframeMatch","diffSandboxMatch","inlineCandidate","shouldUseInline","shouldUseDiffSandbox","matchedBlock","isVideoIframeMatch","normalizedAfter"],"mappings":"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"}