markdown-flow-ui 0.2.30 → 0.2.32
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 +27 -4
- package/dist/_virtual/index.es3.js +5 -4
- package/dist/_virtual/index.es3.js.map +1 -1
- package/dist/_virtual/index.es4.js +4 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- 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/index.es8.js +2 -2
- package/dist/_virtual/index.es9.js +2 -2
- package/dist/_virtual/index3.cjs +1 -1
- package/dist/_virtual/index4.cjs +1 -1
- package/dist/_virtual/index5.cjs +1 -1
- package/dist/_virtual/index6.cjs +1 -1
- package/dist/_virtual/index7.cjs +1 -1
- package/dist/_virtual/index8.cjs +1 -1
- package/dist/_virtual/index9.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.d.ts +1 -1
- package/dist/components/ContentRender/ContentRender.es.js +623 -401
- 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 +468 -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/components/ui/inputGroup/textarea.cjs +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/node_modules/classnames/index.cjs +1 -1
- package/dist/node_modules/classnames/index.es.js +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/rc-input/es/BaseInput.cjs +1 -1
- package/dist/node_modules/rc-input/es/BaseInput.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/index.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/index.es.js +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.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
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { remarkPlugins as H } from "./markdown-plugins.es.js";
|
|
2
|
+
import { findResumedProseFence as P } from "./resumed-prose-fence.es.js";
|
|
3
|
+
import { readHtmlMarkup as L, findStreamingHtmlBlockEnd as D, isHtmlRawTextTag as N } from "./html-block-end.es.js";
|
|
4
|
+
import { unified as B } from "../../../node_modules/unified/lib/index.es.js";
|
|
5
|
+
import X from "../../../node_modules/remark-parse/lib/index.es.js";
|
|
6
|
+
import { visit as $ } from "../../../node_modules/unist-util-visit/lib/index.es.js";
|
|
7
|
+
const q = B().use(X).use(H), F = 16, C = 256 * 1024, G = Object.freeze([]), R = /* @__PURE__ */ new Map();
|
|
8
|
+
let x = 0;
|
|
9
|
+
const I = (e) => {
|
|
10
|
+
if (e && typeof e == "object") {
|
|
11
|
+
for (const o of Object.values(e)) I(o);
|
|
12
|
+
Object.freeze(e);
|
|
13
|
+
}
|
|
14
|
+
return e;
|
|
15
|
+
}, S = (e, o) => {
|
|
16
|
+
let s = 0, t = "", r = !1, p = !1, f = "destination", n = -1;
|
|
17
|
+
for (let a = o + 1; a < e.length; a += 1) {
|
|
18
|
+
const l = e[a], h = /[ \t\r\n]/.test(l);
|
|
19
|
+
if (l === `
|
|
20
|
+
`) {
|
|
21
|
+
if (n >= 0) return { end: n, pending: !0 };
|
|
22
|
+
n = a;
|
|
23
|
+
} else /[ \t\r]/.test(l) || (n = -1);
|
|
24
|
+
if (t)
|
|
25
|
+
l === "\\" ? a += 1 : l === t && (t = "", f = "close");
|
|
26
|
+
else if (f === "destination")
|
|
27
|
+
if (l === "\\")
|
|
28
|
+
p = !0, a += 1;
|
|
29
|
+
else if (r) {
|
|
30
|
+
if (l === ">")
|
|
31
|
+
r = !1, f = "after-angle";
|
|
32
|
+
else if (l === "<" || /[\r\n]/.test(l)) return;
|
|
33
|
+
} else if (h) {
|
|
34
|
+
if (s) return;
|
|
35
|
+
p && (f = "title");
|
|
36
|
+
} else if (!p && l === "<")
|
|
37
|
+
r = !0, p = !0;
|
|
38
|
+
else {
|
|
39
|
+
if (l === ")" && s === 0) return { end: a + 1 };
|
|
40
|
+
l === "(" ? s += 1 : l === ")" && (s -= 1), p = !0;
|
|
41
|
+
}
|
|
42
|
+
else if (h)
|
|
43
|
+
f === "after-angle" && (f = "title");
|
|
44
|
+
else {
|
|
45
|
+
if (l === ")")
|
|
46
|
+
return { end: a + 1 };
|
|
47
|
+
if (f === "title" && (l === '"' || l === "'" || l === "("))
|
|
48
|
+
t = l === "(" ? ")" : l;
|
|
49
|
+
else
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { end: e.length, pending: !0 };
|
|
54
|
+
}, T = (e, o, s) => {
|
|
55
|
+
let t = o;
|
|
56
|
+
if (!s) {
|
|
57
|
+
for (; e[t] === " " || e[t] === " "; ) t += 1;
|
|
58
|
+
if (e[t] === "<") {
|
|
59
|
+
for (t += 1; t < e.length && e[t] !== ">"; ) {
|
|
60
|
+
if (e[t] === "<" || /[\r\n]/.test(e[t])) return;
|
|
61
|
+
t += e[t] === "\\" ? 2 : 1;
|
|
62
|
+
}
|
|
63
|
+
if (e[t] !== ">") return;
|
|
64
|
+
t += 1;
|
|
65
|
+
} else {
|
|
66
|
+
const h = t;
|
|
67
|
+
for (; t < e.length && !/\s/.test(e[t]); ) {
|
|
68
|
+
if (e[t] === "<" || e[t] === ">") return;
|
|
69
|
+
t += e[t] === "\\" ? 2 : 1;
|
|
70
|
+
}
|
|
71
|
+
if (t === h) return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
let r = 0;
|
|
75
|
+
const p = t;
|
|
76
|
+
for (; t < e.length && /\s/.test(e[t]); ) {
|
|
77
|
+
if (e[t] === `
|
|
78
|
+
` && ++r > 1) return;
|
|
79
|
+
t += 1;
|
|
80
|
+
}
|
|
81
|
+
const f = e[t];
|
|
82
|
+
if (t === p || f !== '"' && f !== "'" && f !== "(")
|
|
83
|
+
return;
|
|
84
|
+
const n = t, a = f === "(" ? ")" : f;
|
|
85
|
+
let l = -1;
|
|
86
|
+
for (t += 1; t < e.length; t += 1) {
|
|
87
|
+
const h = e[t];
|
|
88
|
+
if (h === `
|
|
89
|
+
`) {
|
|
90
|
+
if (l >= 0)
|
|
91
|
+
return { start: n, end: l, pending: !0 };
|
|
92
|
+
l = t;
|
|
93
|
+
} else /[ \t\r]/.test(h) || (l = -1);
|
|
94
|
+
if (h === "\\") t += 1;
|
|
95
|
+
else if (h === a) return;
|
|
96
|
+
}
|
|
97
|
+
return { start: n, end: e.length, pending: !0 };
|
|
98
|
+
}, U = (e, o) => {
|
|
99
|
+
let s = o - 1;
|
|
100
|
+
for (; s >= 0 && e[s] === " " && o - s <= 3; )
|
|
101
|
+
s -= 1;
|
|
102
|
+
return s < 0 || e[s] === `
|
|
103
|
+
`;
|
|
104
|
+
}, W = (e, o, s, t) => {
|
|
105
|
+
const r = [], p = [], f = [];
|
|
106
|
+
let n = 0, a = 0, l = 0, h = 0, M = -1;
|
|
107
|
+
const k = (m) => {
|
|
108
|
+
for (const g of f)
|
|
109
|
+
g.image && p.push({
|
|
110
|
+
start: g.start + 1,
|
|
111
|
+
end: m,
|
|
112
|
+
imageAltEnd: m,
|
|
113
|
+
pending: !0
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
for (; n < e.length; ) {
|
|
117
|
+
for (; o[a]?.end <= n; ) a += 1;
|
|
118
|
+
const m = o[a];
|
|
119
|
+
if (m && m.start <= n) {
|
|
120
|
+
t.has(m.start) && f[f.length - 1]?.start === m.start - 1 && f.pop(), n = m.end;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (n >= l && n < h) {
|
|
124
|
+
const d = P(e, n);
|
|
125
|
+
if (d) {
|
|
126
|
+
f.length = 0, n = d.end;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (e[n] === "\\") {
|
|
131
|
+
n += 2;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (e[n] === "!" && e[n + 1] === "[" && (M = n + 1), n >= l && e[n] === "[")
|
|
135
|
+
f.push({ start: n, image: n === M });
|
|
136
|
+
else if (n >= l && e[n] === "]") {
|
|
137
|
+
const d = f.pop();
|
|
138
|
+
if (d !== void 0) {
|
|
139
|
+
if (d.image) {
|
|
140
|
+
let i;
|
|
141
|
+
if (e[n + 1] === "(")
|
|
142
|
+
i = S(e, n + 1);
|
|
143
|
+
else if (n + 1 === e.length)
|
|
144
|
+
i = { end: e.length, pending: !0 };
|
|
145
|
+
else if (e[n + 1] === "[") {
|
|
146
|
+
let c = n + 2;
|
|
147
|
+
for (; c < e.length && e[c] !== "]" && e[c] !== "[" && e[c] !== `
|
|
148
|
+
`; )
|
|
149
|
+
c += e[c] === "\\" ? 2 : 1;
|
|
150
|
+
(c === e.length || e[c] === "]") && (i = {
|
|
151
|
+
end: e[c] === "]" ? c + 1 : e.length,
|
|
152
|
+
pending: !0
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (i) {
|
|
156
|
+
p.push({
|
|
157
|
+
start: d.start + 1,
|
|
158
|
+
imageAltEnd: n,
|
|
159
|
+
...i
|
|
160
|
+
}), n = i.end;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (!d.image && e[n + 1] === "(" && m?.start !== n + 1) {
|
|
165
|
+
const i = S(e, n + 1);
|
|
166
|
+
if (i) {
|
|
167
|
+
p.push({ start: n + 1, ...i }), n = i.end;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (e[n + 1] === ":" && U(e, d.start)) {
|
|
172
|
+
const i = T(e, n + 2, !1);
|
|
173
|
+
if (i) {
|
|
174
|
+
p.push({ ...i, start: n + 1 }), n = i.end;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
} else if (e[n] === `
|
|
180
|
+
`) {
|
|
181
|
+
let d = n - 1;
|
|
182
|
+
for (; /[ \t\r]/.test(e[d] ?? ""); ) d -= 1;
|
|
183
|
+
e[d] === `
|
|
184
|
+
` && (k(d), f.length = 0);
|
|
185
|
+
}
|
|
186
|
+
if (e[n] !== "<") {
|
|
187
|
+
n += 1;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const g = L(e, n);
|
|
191
|
+
if (e.startsWith("<!--", n)) {
|
|
192
|
+
const d = g.kind === "comment" ? g.end : e.length;
|
|
193
|
+
r.push(Object.freeze({ start: n, end: d })), n = d;
|
|
194
|
+
} else if (g.kind === "tag") {
|
|
195
|
+
if (!g.closing && n >= l && s.has(n) && (l = D(e, n), h = s.get(n), f.length = 0), n = g.end, !g.closing && N(g.name)) {
|
|
196
|
+
const d = new RegExp(`</${g.name}(?=[\\s/>])`, "gi");
|
|
197
|
+
d.lastIndex = n, n = d.exec(e)?.index ?? e.length;
|
|
198
|
+
}
|
|
199
|
+
} else if (g.kind === "declaration")
|
|
200
|
+
n = g.end;
|
|
201
|
+
else {
|
|
202
|
+
if (g.kind === "incomplete")
|
|
203
|
+
break;
|
|
204
|
+
n += 1;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return k(e.length), { comments: r, metadata: p };
|
|
208
|
+
}, Y = (e) => {
|
|
209
|
+
e.sort((s, t) => s.start - t.start);
|
|
210
|
+
const o = [];
|
|
211
|
+
for (const s of e) {
|
|
212
|
+
const t = o[o.length - 1];
|
|
213
|
+
t && s.start < t.end ? o[o.length - 1] = Object.freeze({
|
|
214
|
+
start: t.start,
|
|
215
|
+
end: Math.max(t.end, s.end),
|
|
216
|
+
...t.pending || s.pending ? { pending: !0 } : {},
|
|
217
|
+
...t.imageAltEnd !== void 0 || s.imageAltEnd !== void 0 ? {
|
|
218
|
+
imageAltEnd: Math.max(
|
|
219
|
+
t.imageAltEnd ?? 0,
|
|
220
|
+
s.imageAltEnd ?? 0
|
|
221
|
+
)
|
|
222
|
+
} : {},
|
|
223
|
+
...t.imageResolveEnd !== void 0 || s.imageResolveEnd !== void 0 ? {
|
|
224
|
+
imageResolveEnd: Math.max(
|
|
225
|
+
t.imageResolveEnd ?? 0,
|
|
226
|
+
s.imageResolveEnd ?? 0
|
|
227
|
+
)
|
|
228
|
+
} : {}
|
|
229
|
+
}) : o.push(Object.freeze(s));
|
|
230
|
+
}
|
|
231
|
+
return o;
|
|
232
|
+
}, J = (e, o, s) => {
|
|
233
|
+
let t = 1;
|
|
234
|
+
for (let r = o + 2; r < s; r += 1)
|
|
235
|
+
if (e[r] === "\\") r += 1;
|
|
236
|
+
else if (e[r] === "[") t += 1;
|
|
237
|
+
else if (e[r] === "]" && --t === 0) return r + 1;
|
|
238
|
+
return s;
|
|
239
|
+
}, K = (e) => {
|
|
240
|
+
const o = q.parse(e), s = [], t = [], r = [], p = [], f = [], n = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map();
|
|
241
|
+
$(o, (i, c, u) => {
|
|
242
|
+
const y = i.position?.start.offset, E = i.position?.end.offset;
|
|
243
|
+
if (y === void 0 || E === void 0) return;
|
|
244
|
+
if (i.type === "definition" && !a.has(i.identifier) && a.set(i.identifier, E), i.type === "definition" || i.type === "link" || i.type === "linkReference" || i.type === "image" || i.type === "imageReference") {
|
|
245
|
+
let b = y, j;
|
|
246
|
+
if (i.type === "image" || i.type === "imageReference")
|
|
247
|
+
b = y + 2, j = J(e, y, E) - 1;
|
|
248
|
+
else if (i.type !== "definition" && e[y] === "[") {
|
|
249
|
+
const v = i.children[i.children.length - 1]?.position?.end.offset ?? y + 1;
|
|
250
|
+
if (b = e.indexOf("]", v) + 1, b <= v || b > E) return;
|
|
251
|
+
}
|
|
252
|
+
if (b < E) {
|
|
253
|
+
const v = i.type === "definition" && !i.title ? T(e, E, !0) : void 0, A = {
|
|
254
|
+
start: b,
|
|
255
|
+
end: v?.end ?? E,
|
|
256
|
+
...v ? { pending: !0 } : {},
|
|
257
|
+
...j === void 0 ? {} : { imageAltEnd: j }
|
|
258
|
+
};
|
|
259
|
+
p.push(A), i.type === "imageReference" && l.set(A, i.identifier);
|
|
260
|
+
}
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const z = i.type === "inlineCode" || i.type === "code";
|
|
264
|
+
if (!z && i.type !== "inlineMath" && i.type !== "math" && i.type !== "html")
|
|
265
|
+
return;
|
|
266
|
+
const O = Object.freeze({ start: y, end: E });
|
|
267
|
+
if (i.type === "html") {
|
|
268
|
+
f.push(O), u && u.type !== "paragraph" && u.type !== "heading" && u.type !== "tableCell" && u.type !== "link" && u.type !== "linkReference" && u.type !== "emphasis" && u.type !== "strong" && u.type !== "delete" && n.set(y, E);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
r.push(O), z && t.push(O), i.type === "inlineCode" && s.push(O);
|
|
272
|
+
});
|
|
273
|
+
const h = p.map((i) => {
|
|
274
|
+
const c = l.get(i);
|
|
275
|
+
return c === void 0 ? i : {
|
|
276
|
+
...i,
|
|
277
|
+
imageResolveEnd: Math.max(
|
|
278
|
+
i.end,
|
|
279
|
+
a.get(c) ?? i.end
|
|
280
|
+
)
|
|
281
|
+
};
|
|
282
|
+
}), M = [...r, ...h].sort(
|
|
283
|
+
(i, c) => i.start - c.start
|
|
284
|
+
), k = W(
|
|
285
|
+
e,
|
|
286
|
+
M,
|
|
287
|
+
n,
|
|
288
|
+
new Set(
|
|
289
|
+
h.filter((i) => i.imageAltEnd !== void 0).map((i) => i.start)
|
|
290
|
+
)
|
|
291
|
+
), m = Y([
|
|
292
|
+
...h,
|
|
293
|
+
...k.metadata
|
|
294
|
+
]), g = k.comments;
|
|
295
|
+
r.push(...m, ...g), r.sort((i, c) => i.start - c.start);
|
|
296
|
+
const d = [];
|
|
297
|
+
for (const i of o.children) {
|
|
298
|
+
const c = i.position?.start.offset, u = i.position?.end.offset;
|
|
299
|
+
if (i.type !== "code" || c === void 0 || u === void 0)
|
|
300
|
+
continue;
|
|
301
|
+
const y = e.lastIndexOf(`
|
|
302
|
+
`, c - 1) + 1;
|
|
303
|
+
/^[ \t]{0,3}$/.test(e.slice(y, c)) && /^(?:`{3,}|~{3,})/.test(e.slice(c)) && d.push(Object.freeze({ start: y, end: u }));
|
|
304
|
+
}
|
|
305
|
+
return Object.freeze({
|
|
306
|
+
tree: I(o),
|
|
307
|
+
inline: Object.freeze(s),
|
|
308
|
+
markdown: Object.freeze(t),
|
|
309
|
+
literal: Object.freeze(r),
|
|
310
|
+
metadata: Object.freeze(m),
|
|
311
|
+
comments: Object.freeze(g),
|
|
312
|
+
fences: Object.freeze(d),
|
|
313
|
+
html: Object.freeze(f)
|
|
314
|
+
});
|
|
315
|
+
}, Q = (e) => {
|
|
316
|
+
const o = R.get(e);
|
|
317
|
+
if (o)
|
|
318
|
+
return R.delete(e), R.set(e, o), o;
|
|
319
|
+
const s = K(e);
|
|
320
|
+
if (e.length > C) return s;
|
|
321
|
+
for (; R.size >= F || x + e.length > C; ) {
|
|
322
|
+
const t = R.keys().next().value;
|
|
323
|
+
if (t === void 0) break;
|
|
324
|
+
x -= t.length, R.delete(t);
|
|
325
|
+
}
|
|
326
|
+
return R.set(e, s), x += e.length, s;
|
|
327
|
+
}, _ = (e, o) => {
|
|
328
|
+
const s = Q(e);
|
|
329
|
+
return o ? s.inline : s.markdown;
|
|
330
|
+
}, ie = (e) => e.includes("`") ? _(e, !0) : G, se = (e) => _(e, !1);
|
|
331
|
+
export {
|
|
332
|
+
ie as getInlineCodeRanges,
|
|
333
|
+
se as getMarkdownCodeRanges,
|
|
334
|
+
Q as getMarkdownSourceAnalysis
|
|
335
|
+
};
|
|
336
|
+
//# sourceMappingURL=inline-code-ranges.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-code-ranges.es.js","sources":["../../../../src/components/ContentRender/utils/inline-code-ranges.ts"],"sourcesContent":["import { unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport { visit } from \"unist-util-visit\";\nimport { remarkPlugins } from \"./markdown-plugins\";\nimport { findResumedProseFence } from \"./resumed-prose-fence\";\nimport {\n findStreamingHtmlBlockEnd,\n isHtmlRawTextTag,\n readHtmlMarkup,\n} from \"./html-block-end\";\n\nconst parser = unified().use(remarkParse).use(remarkPlugins);\n\nconst MAX_CACHE_ENTRIES = 16;\nconst MAX_CACHED_SOURCE_CHARACTERS = 256 * 1024;\n\ntype CodeRange = Readonly<{ start: number; end: number }>;\ntype MetadataRange = CodeRange &\n Readonly<{\n pending?: true;\n // Alt text is always literal. Resolution may depend on a later definition,\n // but its classification mask must stop at the image's own source end.\n imageAltEnd?: number;\n imageResolveEnd?: number;\n }>;\ntype Immutable<T> = T extends object\n ? { readonly [Key in keyof T]: Immutable<T[Key]> }\n : T;\nexport type MarkdownSourceTree = Immutable<ReturnType<typeof parser.parse>>;\nexport type MarkdownSourceAnalysis = {\n tree: MarkdownSourceTree;\n inline: readonly CodeRange[];\n markdown: readonly CodeRange[];\n literal: readonly CodeRange[];\n metadata: readonly MetadataRange[];\n comments: readonly CodeRange[];\n fences: readonly CodeRange[];\n html: readonly CodeRange[];\n};\n\nconst EMPTY_RANGES: readonly CodeRange[] = Object.freeze([]);\nconst sourceRangesCache = new Map<string, MarkdownSourceAnalysis>();\nlet cachedSourceCharacters = 0;\n\nconst freezeTree = <T>(value: T): Immutable<T> => {\n if (value && typeof value === \"object\") {\n for (const child of Object.values(value)) freezeTree(child);\n Object.freeze(value);\n }\n return value as Immutable<T>;\n};\n\n// An unfinished link has no MDAST link node yet. Its received destination/title\n// stays inert until Markdown can resolve the construct or a blank line ends it.\nconst findPendingLinkMetadataEnd = (raw: string, start: number) => {\n let depth = 0;\n let quote = \"\";\n let angle = false;\n let hasDestination = false;\n let stage: \"destination\" | \"after-angle\" | \"title\" | \"close\" = \"destination\";\n let newline = -1;\n for (let position = start + 1; position < raw.length; position += 1) {\n const character = raw[position];\n const whitespace = /[ \\t\\r\\n]/.test(character);\n if (character === \"\\n\") {\n if (newline >= 0) return { end: newline, pending: true as const };\n newline = position;\n } else if (!/[ \\t\\r]/.test(character)) {\n newline = -1;\n }\n if (quote) {\n if (character === \"\\\\\") position += 1;\n else if (character === quote) {\n quote = \"\";\n stage = \"close\";\n }\n } else if (stage === \"destination\") {\n if (character === \"\\\\\") {\n hasDestination = true;\n position += 1;\n } else if (angle) {\n if (character === \">\") {\n angle = false;\n stage = \"after-angle\";\n } else if (character === \"<\" || /[\\r\\n]/.test(character)) return;\n } else if (whitespace) {\n if (depth) return;\n if (hasDestination) stage = \"title\";\n } else if (!hasDestination && character === \"<\") {\n angle = true;\n hasDestination = true;\n } else if (character === \")\" && depth === 0) return { end: position + 1 };\n else {\n if (character === \"(\") depth += 1;\n else if (character === \")\") depth -= 1;\n hasDestination = true;\n }\n } else if (whitespace) {\n if (stage === \"after-angle\") stage = \"title\";\n } else if (character === \")\") {\n return { end: position + 1 };\n } else if (\n stage === \"title\" &&\n (character === '\"' || character === \"'\" || character === \"(\")\n ) {\n quote = character === \"(\" ? \")\" : character;\n } else {\n // Once a destination ends, only a title opener or the link closer can\n // follow. Other prose makes the construct invalid, so keep scanning HTML.\n return;\n }\n }\n return { end: raw.length, pending: true as const };\n};\n\nconst findPendingDefinitionTitle = (\n raw: string,\n start: number,\n hasDestination: boolean\n): MetadataRange | undefined => {\n let position = start;\n if (!hasDestination) {\n while (raw[position] === \" \" || raw[position] === \"\\t\") position += 1;\n if (raw[position] === \"<\") {\n position += 1;\n while (position < raw.length && raw[position] !== \">\") {\n if (raw[position] === \"<\" || /[\\r\\n]/.test(raw[position])) return;\n position += raw[position] === \"\\\\\" ? 2 : 1;\n }\n if (raw[position] !== \">\") return;\n position += 1;\n } else {\n const destinationStart = position;\n while (position < raw.length && !/\\s/.test(raw[position])) {\n if (raw[position] === \"<\" || raw[position] === \">\") return;\n position += raw[position] === \"\\\\\" ? 2 : 1;\n }\n if (position === destinationStart) return;\n }\n }\n let newlines = 0;\n const whitespaceStart = position;\n while (position < raw.length && /\\s/.test(raw[position])) {\n if (raw[position] === \"\\n\" && ++newlines > 1) return;\n position += 1;\n }\n const opener = raw[position];\n if (\n position === whitespaceStart ||\n (opener !== '\"' && opener !== \"'\" && opener !== \"(\")\n )\n return;\n const titleStart = position;\n const closer = opener === \"(\" ? \")\" : opener;\n let newline = -1;\n for (position += 1; position < raw.length; position += 1) {\n const character = raw[position];\n if (character === \"\\n\") {\n if (newline >= 0)\n return { start: titleStart, end: newline, pending: true };\n newline = position;\n } else if (!/[ \\t\\r]/.test(character)) {\n newline = -1;\n }\n if (character === \"\\\\\") position += 1;\n else if (character === closer) return;\n }\n return { start: titleStart, end: raw.length, pending: true };\n};\n\nconst isDefinitionLabelStart = (raw: string, start: number) => {\n let position = start - 1;\n while (position >= 0 && raw[position] === \" \" && start - position <= 3)\n position -= 1;\n return position < 0 || raw[position] === \"\\n\";\n};\n\nconst collectLexicalRanges = (\n raw: string,\n literals: readonly CodeRange[],\n htmlBlocks: ReadonlyMap<number, number>,\n imageStarts: ReadonlySet<number>\n) => {\n const comments: CodeRange[] = [];\n const metadata: MetadataRange[] = [];\n const labels: Array<{ start: number; image: boolean }> = [];\n let position = 0;\n let literalIndex = 0;\n let htmlBodyEnd = 0;\n let htmlNodeEnd = 0;\n let imageLabelStart = -1;\n const pendingImages = (end: number) => {\n for (const label of labels)\n if (label.image)\n metadata.push({\n start: label.start + 1,\n end,\n imageAltEnd: end,\n pending: true,\n });\n };\n while (position < raw.length) {\n while (literals[literalIndex]?.end <= position) literalIndex += 1;\n const literal = literals[literalIndex];\n if (literal && literal.start <= position) {\n if (\n imageStarts.has(literal.start) &&\n labels[labels.length - 1]?.start === literal.start - 1\n )\n labels.pop();\n position = literal.end;\n continue;\n }\n if (position >= htmlBodyEnd && position < htmlNodeEnd) {\n const fence = findResumedProseFence(raw, position);\n if (fence) {\n // The original HTML node can outlive its closed root. A resumed code\n // fence has its own lexical scope, including unfinished examples.\n labels.length = 0;\n position = fence.end;\n continue;\n }\n }\n if (raw[position] === \"\\\\\") {\n position += 2;\n continue;\n }\n if (raw[position] === \"!\" && raw[position + 1] === \"[\")\n imageLabelStart = position + 1;\n if (position >= htmlBodyEnd && raw[position] === \"[\")\n labels.push({ start: position, image: position === imageLabelStart });\n else if (position >= htmlBodyEnd && raw[position] === \"]\") {\n const label = labels.pop();\n if (label !== undefined) {\n if (label.image) {\n let tail: { end: number; pending?: true } | undefined;\n if (raw[position + 1] === \"(\")\n tail = findPendingLinkMetadataEnd(raw, position + 1);\n else if (position + 1 === raw.length)\n tail = { end: raw.length, pending: true };\n else if (raw[position + 1] === \"[\") {\n let end = position + 2;\n while (\n end < raw.length &&\n raw[end] !== \"]\" &&\n raw[end] !== \"[\" &&\n raw[end] !== \"\\n\"\n )\n end += raw[end] === \"\\\\\" ? 2 : 1;\n if (end === raw.length || raw[end] === \"]\")\n tail = {\n end: raw[end] === \"]\" ? end + 1 : raw.length,\n pending: true,\n };\n }\n if (tail) {\n metadata.push({\n start: label.start + 1,\n imageAltEnd: position,\n ...tail,\n });\n position = tail.end;\n continue;\n }\n }\n if (\n !label.image &&\n raw[position + 1] === \"(\" &&\n literal?.start !== position + 1\n ) {\n const tail = findPendingLinkMetadataEnd(raw, position + 1);\n if (tail) {\n metadata.push({ start: position + 1, ...tail });\n position = tail.end;\n continue;\n }\n }\n if (\n raw[position + 1] === \":\" &&\n isDefinitionLabelStart(raw, label.start)\n ) {\n const title = findPendingDefinitionTitle(raw, position + 2, false);\n if (title) {\n metadata.push({ ...title, start: position + 1 });\n position = title.end;\n continue;\n }\n }\n }\n } else if (raw[position] === \"\\n\") {\n let previous = position - 1;\n while (/[ \\t\\r]/.test(raw[previous] ?? \"\")) previous -= 1;\n if (raw[previous] === \"\\n\") {\n pendingImages(previous);\n labels.length = 0;\n }\n }\n if (raw[position] !== \"<\") {\n position += 1;\n continue;\n }\n const markup = readHtmlMarkup(raw, position);\n if (raw.startsWith(\"<!--\", position)) {\n const end = markup.kind === \"comment\" ? markup.end : raw.length;\n comments.push(Object.freeze({ start: position, end }));\n position = end;\n } else if (markup.kind === \"tag\") {\n if (\n !markup.closing &&\n position >= htmlBodyEnd &&\n htmlBlocks.has(position)\n ) {\n // Block HTML bodies retain HTML semantics. Resume Markdown only after\n // adjacent roots end, even if their MDAST HTML node extends farther.\n htmlBodyEnd = findStreamingHtmlBlockEnd(raw, position);\n htmlNodeEnd = htmlBlocks.get(position)!;\n labels.length = 0;\n }\n position = markup.end;\n if (!markup.closing && isHtmlRawTextTag(markup.name)) {\n const close = new RegExp(`</${markup.name}(?=[\\\\s/>])`, \"gi\");\n close.lastIndex = position;\n position = close.exec(raw)?.index ?? raw.length;\n }\n } else if (markup.kind === \"declaration\") {\n position = markup.end;\n } else if (markup.kind === \"incomplete\") {\n break;\n } else {\n position += 1;\n }\n }\n pendingImages(raw.length);\n return { comments, metadata };\n};\n\nconst mergeMetadataRanges = (ranges: MetadataRange[]) => {\n ranges.sort((left, right) => left.start - right.start);\n const merged: MetadataRange[] = [];\n for (const range of ranges) {\n const previous = merged[merged.length - 1];\n if (previous && range.start < previous.end) {\n merged[merged.length - 1] = Object.freeze({\n start: previous.start,\n end: Math.max(previous.end, range.end),\n ...(previous.pending || range.pending\n ? { pending: true as const }\n : {}),\n ...(previous.imageAltEnd !== undefined ||\n range.imageAltEnd !== undefined\n ? {\n imageAltEnd: Math.max(\n previous.imageAltEnd ?? 0,\n range.imageAltEnd ?? 0\n ),\n }\n : {}),\n ...(previous.imageResolveEnd !== undefined ||\n range.imageResolveEnd !== undefined\n ? {\n imageResolveEnd: Math.max(\n previous.imageResolveEnd ?? 0,\n range.imageResolveEnd ?? 0\n ),\n }\n : {}),\n });\n } else merged.push(Object.freeze(range));\n }\n return merged;\n};\n\nconst findImageLabelEnd = (raw: string, start: number, end: number) => {\n let depth = 1;\n for (let position = start + 2; position < end; position += 1) {\n if (raw[position] === \"\\\\\") position += 1;\n else if (raw[position] === \"[\") depth += 1;\n else if (raw[position] === \"]\" && --depth === 0) return position + 1;\n }\n return end;\n};\n\nconst parseCodeRanges = (raw: string): MarkdownSourceAnalysis => {\n const tree = parser.parse(raw);\n const inline: CodeRange[] = [];\n const markdown: CodeRange[] = [];\n const literal: CodeRange[] = [];\n const metadata: MetadataRange[] = [];\n const html: CodeRange[] = [];\n const htmlBlocks = new Map<number, number>();\n const definitionEnds = new Map<string, number>();\n const imageReferences = new Map<MetadataRange, string>();\n\n // Use the renderer's Markdown grammar, including HTML paragraph boundaries.\n visit(tree, (node, _index, parent) => {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n if (start === undefined || end === undefined) return;\n if (node.type === \"definition\" && !definitionEnds.has(node.identifier))\n definitionEnds.set(node.identifier, end);\n if (\n node.type === \"definition\" ||\n node.type === \"link\" ||\n node.type === \"linkReference\" ||\n node.type === \"image\" ||\n node.type === \"imageReference\"\n ) {\n let metadataStart = start;\n let imageAltEnd: number | undefined;\n if (node.type === \"image\" || node.type === \"imageReference\") {\n metadataStart = start + 2;\n imageAltEnd = findImageLabelEnd(raw, start, end) - 1;\n } else if (node.type !== \"definition\" && raw[start] === \"[\") {\n // Preserve label HTML, including real videos. Only destinations,\n // titles and reference identifiers after the label are inert.\n const labelEnd =\n node.children[node.children.length - 1]?.position?.end.offset ??\n start + 1;\n metadataStart = raw.indexOf(\"]\", labelEnd) + 1;\n if (metadataStart <= labelEnd || metadataStart > end) return;\n }\n if (metadataStart < end) {\n const title =\n node.type === \"definition\" && !node.title\n ? findPendingDefinitionTitle(raw, end, true)\n : undefined;\n const range: MetadataRange = {\n start: metadataStart,\n end: title?.end ?? end,\n ...(title ? { pending: true as const } : {}),\n ...(imageAltEnd === undefined ? {} : { imageAltEnd }),\n };\n metadata.push(range);\n if (node.type === \"imageReference\")\n imageReferences.set(range, node.identifier);\n }\n return;\n }\n const isCode = node.type === \"inlineCode\" || node.type === \"code\";\n if (\n !isCode &&\n node.type !== \"inlineMath\" &&\n node.type !== \"math\" &&\n node.type !== \"html\"\n )\n return;\n const range = Object.freeze({ start, end });\n if (node.type === \"html\") {\n html.push(range);\n if (\n parent &&\n parent.type !== \"paragraph\" &&\n parent.type !== \"heading\" &&\n parent.type !== \"tableCell\" &&\n parent.type !== \"link\" &&\n parent.type !== \"linkReference\" &&\n parent.type !== \"emphasis\" &&\n parent.type !== \"strong\" &&\n parent.type !== \"delete\"\n )\n htmlBlocks.set(start, end);\n return;\n }\n literal.push(range);\n if (isCode) markdown.push(range);\n if (node.type === \"inlineCode\") inline.push(range);\n });\n\n // Parent link metadata follows its child label ranges in source order.\n const resolvedMetadata = metadata.map((range) => {\n const reference = imageReferences.get(range);\n return reference === undefined\n ? range\n : {\n ...range,\n imageResolveEnd: Math.max(\n range.end,\n definitionEnds.get(reference) ?? range.end\n ),\n };\n });\n const protectedRanges = [...literal, ...resolvedMetadata].sort(\n (left, right) => left.start - right.start\n );\n const lexical = collectLexicalRanges(\n raw,\n protectedRanges,\n htmlBlocks,\n new Set(\n resolvedMetadata\n .filter((range) => range.imageAltEnd !== undefined)\n .map((range) => range.start)\n )\n );\n const allMetadata = mergeMetadataRanges([\n ...resolvedMetadata,\n ...lexical.metadata,\n ]);\n const comments = lexical.comments;\n literal.push(...allMetadata, ...comments);\n literal.sort((left, right) => left.start - right.start);\n const fences: CodeRange[] = [];\n for (const node of tree.children) {\n const start = node.position?.start.offset;\n const end = node.position?.end.offset;\n if (node.type !== \"code\" || start === undefined || end === undefined)\n continue;\n const lineStart = raw.lastIndexOf(\"\\n\", start - 1) + 1;\n if (\n /^[ \\t]{0,3}$/.test(raw.slice(lineStart, start)) &&\n /^(?:`{3,}|~{3,})/.test(raw.slice(start))\n )\n fences.push(Object.freeze({ start: lineStart, end }));\n }\n\n // Cached trees are immutable: renderers clone before running transforms.\n return Object.freeze({\n tree: freezeTree(tree),\n inline: Object.freeze(inline),\n markdown: Object.freeze(markdown),\n literal: Object.freeze(literal),\n metadata: Object.freeze(allMetadata),\n comments: Object.freeze(comments),\n fences: Object.freeze(fences),\n html: Object.freeze(html),\n });\n};\n\nexport const getMarkdownSourceAnalysis = (\n raw: string\n): MarkdownSourceAnalysis => {\n const cached = sourceRangesCache.get(raw);\n if (cached) {\n sourceRangesCache.delete(raw);\n sourceRangesCache.set(raw, cached);\n return cached;\n }\n\n const ranges = parseCodeRanges(raw);\n // Large individual messages must not displace the bounded working set.\n if (raw.length > MAX_CACHED_SOURCE_CHARACTERS) return ranges;\n\n while (\n sourceRangesCache.size >= MAX_CACHE_ENTRIES ||\n cachedSourceCharacters + raw.length > MAX_CACHED_SOURCE_CHARACTERS\n ) {\n const oldestSource = sourceRangesCache.keys().next().value;\n if (oldestSource === undefined) break;\n cachedSourceCharacters -= oldestSource.length;\n sourceRangesCache.delete(oldestSource);\n }\n\n sourceRangesCache.set(raw, ranges);\n cachedSourceCharacters += raw.length;\n return ranges;\n};\n\nconst collectCodeRanges = (raw: string, inlineOnly: boolean) => {\n const ranges = getMarkdownSourceAnalysis(raw);\n return inlineOnly ? ranges.inline : ranges.markdown;\n};\n\nexport const getInlineCodeRanges = (raw: string) =>\n raw.includes(\"`\") ? collectCodeRanges(raw, true) : EMPTY_RANGES;\n\nexport const getMarkdownCodeRanges = (raw: string) =>\n collectCodeRanges(raw, false);\n\n// Native HTML stays inert inside code, math, comments, image alt and metadata.\nexport const getMarkdownLiteralRanges = (raw: string) =>\n getMarkdownSourceAnalysis(raw).literal;\n\nexport const getMarkdownSourceTree = (raw: string): MarkdownSourceTree =>\n getMarkdownSourceAnalysis(raw).tree;\n"],"names":["parser","unified","remarkParse","remarkPlugins","MAX_CACHE_ENTRIES","MAX_CACHED_SOURCE_CHARACTERS","EMPTY_RANGES","sourceRangesCache","cachedSourceCharacters","freezeTree","value","child","findPendingLinkMetadataEnd","raw","start","depth","quote","angle","hasDestination","stage","newline","position","character","whitespace","findPendingDefinitionTitle","destinationStart","newlines","whitespaceStart","opener","titleStart","closer","isDefinitionLabelStart","collectLexicalRanges","literals","htmlBlocks","imageStarts","comments","metadata","labels","literalIndex","htmlBodyEnd","htmlNodeEnd","imageLabelStart","pendingImages","end","label","literal","fence","findResumedProseFence","tail","title","previous","markup","readHtmlMarkup","findStreamingHtmlBlockEnd","isHtmlRawTextTag","close","mergeMetadataRanges","ranges","left","right","merged","range","findImageLabelEnd","parseCodeRanges","tree","inline","markdown","html","definitionEnds","imageReferences","visit","node","_index","parent","metadataStart","imageAltEnd","labelEnd","isCode","resolvedMetadata","reference","protectedRanges","lexical","allMetadata","fences","lineStart","getMarkdownSourceAnalysis","cached","oldestSource","collectCodeRanges","inlineOnly","getInlineCodeRanges","getMarkdownCodeRanges"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../../_virtual/index.cjs"),r=require("../../../node_modules/remark-gfm/lib/index.cjs"),t=require("../../../node_modules/remark-math/lib/index.cjs"),i=require("../../../node_modules/remark-breaks/lib/index.cjs"),n=[r.default,t.default,e.default,i.default];exports.remarkPlugins=n;
|
|
2
|
+
//# sourceMappingURL=markdown-plugins.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-plugins.cjs","sources":["../../../../src/components/ContentRender/utils/markdown-plugins.ts"],"sourcesContent":["import type { PluggableList } from \"unified\";\nimport remarkFlow from \"remark-flow\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport remarkBreaks from \"remark-breaks\";\n\nexport const remarkPlugins: PluggableList = [\n remarkGfm,\n remarkMath,\n remarkFlow,\n remarkBreaks,\n];\n"],"names":["remarkPlugins","remarkGfm","remarkMath","remarkFlow","remarkBreaks"],"mappings":"uTAMaA,EAA+B,CAC1CC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,QACAC,EAAAA,OACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import r from "../../../_virtual/index.es.js";
|
|
2
|
+
import m from "../../../node_modules/remark-gfm/lib/index.es.js";
|
|
3
|
+
import o from "../../../node_modules/remark-math/lib/index.es.js";
|
|
4
|
+
import a from "../../../node_modules/remark-breaks/lib/index.es.js";
|
|
5
|
+
const i = [
|
|
6
|
+
m,
|
|
7
|
+
o,
|
|
8
|
+
r,
|
|
9
|
+
a
|
|
10
|
+
];
|
|
11
|
+
export {
|
|
12
|
+
i as remarkPlugins
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=markdown-plugins.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-plugins.es.js","sources":["../../../../src/components/ContentRender/utils/markdown-plugins.ts"],"sourcesContent":["import type { PluggableList } from \"unified\";\nimport remarkFlow from \"remark-flow\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport remarkBreaks from \"remark-breaks\";\n\nexport const remarkPlugins: PluggableList = [\n remarkGfm,\n remarkMath,\n remarkFlow,\n remarkBreaks,\n];\n"],"names":["remarkPlugins","remarkGfm","remarkMath","remarkFlow","remarkBreaks"],"mappings":";;;;AAMO,MAAMA,IAA+B;AAAA,EAC1CC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function
|
|
2
|
-
|
|
3
|
-
`).trim(),startLine:
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("./inline-code-ranges.cjs");function B(e){const s=[],o=x.getMarkdownSourceAnalysis(e),r=o.markdown,a=o.inline,u=t=>{let c=0,l=o.metadata.length;for(;c<l;){const h=c+l>>>1;o.metadata[h].start<=t?c=h+1:l=h}const p=o.metadata[c-1];return p&&t<p.end?p:void 0},m=t=>!!u(t),d=t=>r.some(({start:c,end:l})=>t>=c&&t<l),y=t=>{const c=e.lastIndexOf(`
|
|
2
|
+
`,t-1)+1;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)},v=/```[\s\S]*?```|<svg[\s\S]*?<\/svg>/g;let i=0,S;for(;(S=v.exec(e))!==null;){const t=S.index,c=v.lastIndex,l=S[0],p=u(t);if(p){v.lastIndex=p.end;continue}if(!(l.startsWith("```")?!y(t):d(t))){if(t>i&&s.push({type:"text",value:e.slice(i,t)}),l.startsWith("```mermaid")){const h=l.replace(/^```mermaid/,"").replace(/```$/,"").trim();s.push({type:"mermaid",value:h,complete:!0})}else l.startsWith("```")?s.push({type:"text",value:l}):s.push({type:"svg",value:l,complete:!0});i=c}}let n=e.lastIndexOf("<svg");const g=e.lastIndexOf("</svg>");(n===-1||g!==-1&&g>n)&&(e.endsWith("<sv")?n=e.length-3:e.endsWith("<s")&&(n=e.length-2));const I=e.indexOf("```",i);if(!(I!==-1&&I<n)&&!d(n)&&!m(n)&&n!==-1&&(g===-1||g<n)&&n>=i)return n>i&&s.push({type:"text",value:e.slice(i,n)}),s.push({type:"svg",value:e.slice(n),complete:!1}),s;const f=e.lastIndexOf("```mermaid");if(f!==-1&&y(f)&&f>=i&&f===I){const t=e.slice(f+10);return s.push({type:"mermaid",value:t.trim(),complete:!1}),f>i&&s.push({type:"text",value:e.slice(i,f)}),s}return i<e.length&&s.push({type:"text",value:e.slice(i)}),s}function C(e){const s=[],o=e.split(/\r?\n/);let r=!1,a=[],u=0;return o.forEach((m,d)=>{if(!r){m.trim().startsWith("```mermaid")&&(r=!0,u=d,a=[]);return}if(m.trim()==="```"){s.push({code:a.join(`
|
|
3
|
+
`).trim(),startLine:u,endLine:d,complete:!0}),r=!1;return}a.push(m)}),r&&s.push({code:a.join(`
|
|
4
|
+
`).trim(),startLine:u,endLine:null,complete:!1}),s}function M(e,s){const o=s.trim(),a=C(e).find(u=>u.code===o);return a?a.complete:!1}exports.mermaidBlockIsComplete=M;exports.parseMarkdownSegments=B;exports.parseMermaidBlocks=C;
|
|
4
5
|
//# sourceMappingURL=mermaid-parse.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mermaid-parse.cjs","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.cjs","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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"}
|