markdown-flow-ui 0.2.35 → 0.3.0-dev.1
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 +12 -0
- package/dist/_virtual/index.es10.js +2 -2
- 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 -5
- package/dist/_virtual/index.es6.js +5 -3
- package/dist/_virtual/index.es6.js.map +1 -1
- package/dist/_virtual/index.es7.js +3 -5
- package/dist/_virtual/index.es7.js.map +1 -1
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/_virtual/index10.cjs +1 -1
- 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/variable-marker.cjs +2 -0
- package/dist/_virtual/variable-marker.cjs.map +1 -0
- package/dist/_virtual/variable-marker.es.js +5 -0
- package/dist/_virtual/variable-marker.es.js.map +1 -0
- package/dist/_virtual/variable-name.cjs +2 -0
- package/dist/_virtual/variable-name.cjs.map +1 -0
- package/dist/_virtual/variable-name.es.js +5 -0
- package/dist/_virtual/variable-name.es.js.map +1 -0
- package/dist/components/ContentRender/ContentRender.cjs +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.map +1 -1
- package/dist/components/ContentRender/ContentRender.es.js +206 -205
- package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.es.js +52 -51
- package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
- package/dist/components/ContentRender/utils/inline-code-ranges.cjs +9 -9
- package/dist/components/ContentRender/utils/inline-code-ranges.cjs.map +1 -1
- package/dist/components/ContentRender/utils/inline-code-ranges.d.ts +3 -0
- package/dist/components/ContentRender/utils/inline-code-ranges.es.js +185 -161
- package/dist/components/ContentRender/utils/inline-code-ranges.es.js.map +1 -1
- package/dist/components/ContentRender/utils/mermaid-parse.cjs +4 -4
- package/dist/components/ContentRender/utils/mermaid-parse.cjs.map +1 -1
- package/dist/components/ContentRender/utils/mermaid-parse.es.js +53 -48
- package/dist/components/ContentRender/utils/mermaid-parse.es.js.map +1 -1
- package/dist/components/ContentRender/utils/split-content.cjs +6 -6
- package/dist/components/ContentRender/utils/split-content.cjs.map +1 -1
- package/dist/components/ContentRender/utils/split-content.d.ts +1 -0
- package/dist/components/ContentRender/utils/split-content.es.js +361 -313
- package/dist/components/ContentRender/utils/split-content.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +286 -290
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +62 -63
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js +13 -13
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +19 -19
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +13 -13
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js +16 -16
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +13 -13
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js +13 -13
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +176 -174
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs +2 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.d.ts +3 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js +38 -55
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.test.d.ts +1 -0
- package/dist/components/MarkdownFlowEditor/utils.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/utils.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.d.ts +2 -3
- package/dist/components/MarkdownFlowEditor/utils.es.js +47 -51
- package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.variables.test.d.ts +1 -0
- package/dist/components/ui/inputGroup/textarea.cjs +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +1 -1
- package/dist/lib/interaction-defaults.cjs +1 -1
- package/dist/lib/interaction-defaults.cjs.map +1 -1
- package/dist/lib/interaction-defaults.es.js +123 -132
- package/dist/lib/interaction-defaults.es.js.map +1 -1
- package/dist/lib/interaction-defaults.failure.test.d.ts +1 -0
- 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/cose-base/cose-base.cjs +1 -1
- package/dist/node_modules/cose-base/cose-base.cjs.map +1 -1
- package/dist/node_modules/cose-base/cose-base.es.js +1 -1
- package/dist/node_modules/cytoscape-fcose/node_modules/cose-base/cose-base.cjs +1 -1
- package/dist/node_modules/cytoscape-fcose/node_modules/cose-base/cose-base.cjs.map +1 -1
- package/dist/node_modules/cytoscape-fcose/node_modules/cose-base/cose-base.es.js +1 -1
- package/dist/node_modules/cytoscape-fcose/node_modules/layout-base/layout-base.cjs +1 -1
- package/dist/node_modules/cytoscape-fcose/node_modules/layout-base/layout-base.cjs.map +1 -1
- package/dist/node_modules/cytoscape-fcose/node_modules/layout-base/layout-base.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/layout-base/layout-base.cjs +1 -1
- package/dist/node_modules/layout-base/layout-base.cjs.map +1 -1
- package/dist/node_modules/layout-base/layout-base.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/escaping.cjs +2 -2
- package/dist/node_modules/remark-flow/dist/escaping.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/escaping.es.js +128 -63
- package/dist/node_modules/remark-flow/dist/escaping.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/index.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/index.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/index.es.js +62 -33
- package/dist/node_modules/remark-flow/dist/index.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.es.js +260 -256
- package/dist/node_modules/remark-flow/dist/interaction-parser.es.js.map +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.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js +71 -42
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-syntax.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-syntax.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-syntax.es.js +500 -46
- package/dist/node_modules/remark-flow/dist/interaction-syntax.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/variable-marker.cjs +2 -0
- package/dist/node_modules/remark-flow/dist/variable-marker.cjs.map +1 -0
- package/dist/node_modules/remark-flow/dist/variable-marker.es.js +77 -0
- package/dist/node_modules/remark-flow/dist/variable-marker.es.js.map +1 -0
- package/dist/node_modules/remark-flow/dist/variable-name.cjs +15 -0
- package/dist/node_modules/remark-flow/dist/variable-name.cjs.map +1 -0
- package/dist/node_modules/remark-flow/dist/variable-name.es.js +748 -0
- package/dist/node_modules/remark-flow/dist/variable-name.es.js.map +1 -0
- package/dist/node_modules/style-to-object/cjs/index.cjs +1 -1
- package/dist/node_modules/style-to-object/cjs/index.cjs.map +1 -1
- package/dist/node_modules/style-to-object/cjs/index.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 +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
2
|
-
`:"";return`${c}${
|
|
3
|
-
`),
|
|
4
|
-
`);return{start:t,block:c,end:t+c.length}},
|
|
5
|
-
`)){const c=
|
|
6
|
-
`);let
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("./inline-code-ranges.cjs"),Z=require("./resumed-prose-fence.cjs"),E=require("./html-block-end.cjs"),J=/<(?:!doctype(?=[\s>])|(?:script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)[\s/>])/i,Y=new Set(["div","style","script","iframe","section","article","header","footer","nav","main","aside","figure","details","summary","form","table","canvas","video","audio","pre","blockquote","ul","ol","dl","fieldset","address","hgroup","center","link","html","head","body","meta","title","base","template"]),ee=new Set(["pre","details","summary","aside","blockquote","ul","ol","dl","table"]),te=new Set(["script","style","link","iframe","html","head","body","meta","title","base","template"]),ne=[/<svg[\s\S]*?<\/svg>/i,/<img\b[^>]*?>/i,/```mermaid[\s\S]*?```/i,/```[a-zA-Z0-9]+[\s\S]*?```/i],$=/!\[[^\]]*]\([^\s)\n]+(?:\s+"[^"]*")?\)/i,D=new RegExp($.source,"iy"),z=/<iframe\b[^>]*\bdata-tag\s*=\s*(["'])video\1[^>]*>[\s\S]*?<\/iframe>/i,V=/<\/[a-z][^>]*>\s*\n(?=[^\s<])/gi,q=/<custom-button-after-content\b[\s\S]*?<\/custom-button-after-content>/gi,X=/^"[\s\S]*"$/,ie=/```mermaid[\s\S]*?```/i,G=e=>e.split(/\r?\n/).map(i=>i.trim()).find(Boolean)??"",se=(e,i=[])=>{const s=a=>{let l=e.indexOf("```",a);for(;l!==-1&&H(l,i);)l=e.indexOf("```",l+3);return l},n=s(0);if(n===-1)return null;const t=s(n+3);return t===-1?{start:n,block:e.slice(n),complete:!1}:{start:n,end:t+3,block:e.slice(n,t+3),complete:!0}},oe=e=>{const i=e.split(/\r?\n/).map(s=>s.trim()).filter(Boolean);return i.length<=1?e:i[0]},j=(e,i,s=!1)=>{if(!X.test(e))return e;const n=e.slice(1,-1);if(!i)return n;const t=n.match(ie);if(!t||typeof t.index!="number")return n;const a=n.slice(0,t.index),l=n.slice(t.index+t[0].length),c=G(a),r=G(l);if(!c||!r)return n;const u=s?`
|
|
2
|
+
`:"";return`${c}${u}${t[0]}${u}${r}`},le=e=>X.test(e)&&B(e,!0).some(s=>s.type==="sandbox")?j(e,!0,!0):e,ae=(e,i=[])=>{const s=[],n=[...e.matchAll(/```/g)].map(t=>t.index).filter(t=>!H(t,i));for(let t=0;t<n.length;t+=2)s.push({start:n[t],end:n[t+1]===void 0?e.length:n[t+1]+3});return s},C=(e,i)=>{let s=0;for(let n=i-1;n>=0&&e[n]==="\\";n--)s++;return s%2===1},H=(e,i)=>i.some(({start:s,end:n})=>e>=s&&e<n),L=(e,i,s)=>{const n=i.flags.includes("g")?i.flags:`${i.flags}g`,t=new RegExp(i.source,n);let a;for(;(a=t.exec(e))!==null;)if(!C(e,a.index)&&!H(a.index,s))return a.index;return-1},re=(e,i)=>{let s=e.length,n;for(V.lastIndex=0;n=V.exec(e);)if(!(n.index<=i)){s=n.index+n[0].length;break}return s},ce=e=>{if(!e.length)return e;const i=[];return e.forEach(s=>{if(s.type!=="sandbox"){i.push(s);return}q.lastIndex=0;let n=0,t;for(;(t=q.exec(s.value))!==null;){const l=s.value.slice(n,t.index);l.trim()&&i.push({type:"sandbox",value:l}),i.push({type:"markdown",value:t[0]}),n=t.index+t[0].length}const a=s.value.slice(n);a.trim()&&i.push({type:"sandbox",value:a})}),i},de=(e,i)=>{let s=null;return ne.forEach(n=>{const t=i?L(e,n,i):n.exec(e)?.index??-1;if(t===-1)return;const a=n.exec(e.slice(t));if(!a)return;const l=t+a[0].length;(!s||t<s.start)&&(s={start:t,end:l})}),s},ue=(...e)=>e.reduce((i,s)=>s&&(!i||s.start<i.start)?s:i,null),K=(e,i)=>{const s=L(e,$,i);if(s===-1)return null;const n=e.slice(s).match($);return n?{start:s,end:s+n[0].length}:null},me=(e,i)=>{const s=L(e,z,i);if(s===-1)return null;const n=e.slice(s).match(z);return n?{start:s,end:s+n[0].length}:null},fe=e=>z.test(e.trim()),F=(e,i)=>{if(i===-1)return null;const s=e.slice(i),n=/^<([a-z]+)/i.exec(s);if(!n)return null;const t=n[1].toLowerCase(),a=()=>({start:i,end:e.length,immediate:!0,pending:!0});if(n[0].length===s.length&&"iframe".startsWith(t))return a();if(t!=="iframe"||!/[\s/>]/.test(s[n[0].length]??""))return null;const l=i+n[0].length;let c="",r=-1;for(let R=l;R<e.length;R+=1){const k=e[R];if(c)k===c&&(c="");else if(k==='"'||k==="'")c=k;else if(k===">"){r=R+1;break}}if(r===-1)return a();const u=e.slice(l,r-1),g=/([^\s=/>]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]*)))?/g;let o,b=!1;for(;(o=g.exec(u))!==null;)if(o[1].toLowerCase()==="data-tag"){b=(o[2]??o[3]??o[4]??"").toLowerCase()==="video";break}if(!b)return null;const p=/<\/iframe\s*>/i.exec(e.slice(r));return{start:i,end:p?r+p.index+p[0].length:e.length,immediate:!0}},he=(e,i)=>{const s=/^\s*\|.+\|\s*$/gm;let n,t=-1;for(;(n=s.exec(e))!==null;){const r=n[0].match(/^\s*/)?.[0].length??0,u=n.index+r;if(!H(u,i)){t=u;break}}if(t===-1)return null;const a=e.slice(t).split(`
|
|
3
|
+
`),l=[];for(const r of a){if(!r.trim().startsWith("|"))break;l.push(r)}const c=l.join(`
|
|
4
|
+
`);return{start:t,block:c,end:t+c.length}},Q=(e,i)=>{const s=/^<([a-z][a-z0-9:-]*)(?=[\s/>])/i.exec(e.slice(i));return s?Y.has(s[1].toLowerCase()):/^<!doctype(?=[\s>])/i.test(e.slice(i))},U=(e,i)=>{const s=/^<([a-z][a-z0-9:-]*)(?=[\s/>])/i.exec(e.slice(i));return!!(s&&ee.has(s[1].toLowerCase()))},ge=(e,i,s)=>{let n=i;for(;n<s;){if(e[n]!=="<"){n+=1;continue}const t=E.readHtmlMarkup(e,n),a=t.kind==="tag"?t.closing?void 0:t.name:/^<([a-z][a-z0-9:-]*)(?=[\s/>])/i.exec(e.slice(n))?.[1].toLowerCase();if(a&&te.has(a)&&!(a==="iframe"&&F(e,n)))return!0;if(t.kind==="incomplete"||t.kind==="invalid"){if(t.kind==="incomplete")break;n+=1;continue}if(t.kind==="tag"&&!t.closing&&E.isHtmlRawTextTag(t.name)){n=E.findStreamingHtmlElementEnd(e,n);continue}n=t.end}return!1},pe=e=>{const i=new Map,s=[...e.matchAll(/`+|\$+/g)],n=new Map;for(let l=s.length-1;l>=0;l-=1){const c=s[l],r=c[0],u=n.get(r);u!==void 0&&i.set(c.index,u+r.length),(r[0]==="`"||!C(e,c.index))&&n.set(r,c.index)}const t=[];let a=0;for(const l of e.split(`
|
|
5
|
+
`)){const c=a+(l.match(/^[ \t]*/)?.[0].length??0);(!l.trim()||Q(e,c))&&t.push(a),a+=l.length+1}return{nextClosing:i,boundaries:t}},be=(e,i,s)=>{const n=e[i];if(n!=="`"&&n!=="$"||C(e,i))return;let t=1;for(;e[i+t]===n;)t+=1;const a=i+t,l=n==="$"&&t>2?void 0:s.nextClosing.get(i);if(l===void 0)return{markerEnd:a};if(n==="$"&&t===2)return{markerEnd:a,end:l};let c=0,r=s.boundaries.length;for(;c<r;){const u=c+r>>>1;s.boundaries[u]<=i?c=u+1:r=u}return l<=(s.boundaries[c]??e.length)?{markerEnd:a,end:l}:{markerEnd:a}},xe=(e,i,s)=>{if(i.pending){s.push({type:"sandbox",value:e.slice(i.start,i.end),pending:!0});return}let n=i.start,t=n;for(;t<i.end;){if(e[t]!=="<"){t+=1;continue}const a=E.readHtmlMarkup(e,t);if(a.kind==="incomplete")break;if(a.kind==="invalid"){t+=1;continue}if(a.kind==="tag"&&!a.closing){if(a.name==="custom-button-after-content"){const l=Math.min(E.findStreamingHtmlElementEnd(e,t),i.end);if(/<\/custom-button-after-content\s*>$/i.test(e.slice(t,l))){t>n&&s.push({type:"sandbox",value:e.slice(n,t)}),s.push({type:"markdown",value:e.slice(t,l)}),n=l,t=l;continue}}if(E.isHtmlRawTextTag(a.name)){t=E.findStreamingHtmlElementEnd(e,t);continue}}t=a.end}n<i.end&&s.push({type:"sandbox",value:e.slice(n,i.end)})},ke=(e,i,s)=>{const n=[],t=e.split(`
|
|
6
|
+
`);let a=0,l=0,c=0;for(let r=0;r<t.length;r+=1){const u=t[r],g=a+(u.match(/^[ \t]*/)?.[0].length??0);for(;i[l]?.end<=g;)l+=1;const o=i[l];if(/^[ \t]*\|.+\|[ \t]*\r?$/.test(u)&&!(o&&o.start<=g)){let b=a+u.length;for(;r+1<t.length&&t[r+1].trim().startsWith("|");)a+=t[r].length+1,r+=1,b=a+t[r].length;for(;s[c]?.end<=g;)c+=1;s[c]?.start<b||n.push({start:g,end:b,type:"markdown"})}a+=t[r].length+1}return n},ve=(e,i,s)=>{const n=[],t=new Set(s.comments),a=s.literal.filter(m=>!t.has(m)),l=[];let c=0,r=0,u=0,g=0,o=0,b=!1,p;for(;o<e.length;){for(;s.fences[r]?.end<=o;)r+=1;const m=s.fences[r];if(m?.start===o){n.push({...m,type:"markdown"}),l.push(m),o=m.end;continue}for(;a[c]?.end<=o;)c+=1;const A=a[c];if(A&&A.start<=o){l.push(A),o=A.end;continue}for(;s.html[u]?.end<=o;)u+=1;const w=s.html[u];if(b&&w&&w.start<=o){const h=Z.findResumedProseFence(e,o);if(h){for(n.push(h),l.push(h);a[c]?.start<h.end;)c+=1;o=h.end;continue}(e[o]==="`"||e[o]==="$")&&(p??=pe(e));const S=p&&be(e,o,p);if(S){S.end!==void 0&&l.push({start:o,end:S.end}),o=S.end??S.markerEnd;continue}}if(e[o]==="!"&&!C(e,o)){D.lastIndex=o;const h=D.exec(e);if(h){n.push({start:o,end:o+h[0].length,type:"markdown"}),o+=h[0].length;continue}}if(e[o]!=="<"||C(e,o)){o+=1;continue}const d=E.readHtmlMarkup(e,o);for(;s.interactions[g]?.end<=o;)g+=1;const N=s.interactions[g],v=w?.start===o&&N&&N.start>=w.end?w.end:void 0;if(Q(e,o)){const h=F(e,o),S=U(e,o);let f=h?.end??(S?E.findStreamingHtmlElementEnd(e,o):E.findStreamingHtmlBlockEnd(e,o,y=>{const W=F(e,y);return!!(W&&!W.pending)||U(e,y)}));w?.start===o&&(d.kind==="declaration"||d.kind==="tag"&&["script","style","pre","textarea"].includes(d.name))&&s.documentVariables.some(y=>y.start>=f&&y.start<w.end)&&(f=Math.max(f,w.end));const x=v!==void 0&&f>v,I=x&&(d.kind==="incomplete"||d.kind==="tag"&&["script","style","pre","textarea"].includes(d.name)&&s.documentVariables.some(y=>y.start>o&&y.start<d.end));x&&(f=v);const O=S&&!I&&!ge(e,o,f);n.push({start:o,end:f,type:h||O?"markdown":"sandbox",...h?.immediate||O?{immediate:!0}:{},...h?.pending||I||O&&d.kind==="incomplete"?{pending:!0}:{}}),o=f,b=!0;continue}if(d.kind==="tag")if(!d.closing&&(d.name==="svg"||d.name==="img")){const h=d.name==="img"?d.end:E.findStreamingHtmlElementEnd(e,o);n.push({start:o,end:h,type:"markdown"}),o=h}else if(!d.closing&&E.isHtmlRawTextTag(d.name)){const h=E.findStreamingHtmlElementEnd(e,o);if(v!==void 0&&h>v){n.push({start:o,end:v,type:"sandbox",pending:!0}),o=v;continue}l.push({start:o,end:h}),o=h}else o=d.end;else if(d.kind==="comment"||d.kind==="declaration")d.kind==="comment"&&l.push({start:o,end:d.end}),o=d.end;else if(d.kind==="incomplete"){if(v!==void 0){n.push({start:o,end:v,type:"sandbox",pending:!0}),o=v;continue}/^<svg(?=[\s/>])/i.test(e.slice(o))&&n.push({start:o,end:e.length,type:"markdown"}),o=e.length}else o+=1}const R=ke(e,l,n),k=[];let _=0;for(const m of n){for(;R[_]?.start<m.start;)k.push(R[_++]);k.push(m)}k.push(...R.slice(_));const T=[];let M=0;for(const m of k)m.start<M||(i&&m.start>M&&T.push({type:"text",value:e.slice(M,m.start)}),m.type==="sandbox"?xe(e,m,T):T.push({type:"markdown",value:e.slice(m.start,m.end),...m.immediate?{immediate:!0}:{},...m.pending?{pending:!0}:{}}),M=m.end);return i&&M<e.length&&T.push({type:"text",value:e.slice(M)}),T},B=(e,i=!1,s=!1,n)=>{if(s)return ve(e,i,n??P.getMarkdownSourceAnalysis(e));const t=j(e,i),a=f=>ce(f),l=f=>!!f.trim(),r=P.getMarkdownSourceAnalysis(t).variables,u=P.getInlineCodeRanges(t),g=se(t,r),o=[...ae(t,r),...u,...r],b=L(t,J,o);if(g){if(!g.complete)return a([{type:"markdown",value:i?t:g.block}]);if(!i)return a([{type:"markdown",value:g.block}]);const f=[],x=oe(t.slice(0,g.start));l(x)&&f.push({type:"text",value:x}),f.push({type:"markdown",value:g.block});const I=t.slice(g.end);return l(I)&&f.push(...B(I,!0)),a(f)}const p=L(t,/<svg\b/i,o),R=b!==-1&&p!==-1&&b<p,k=K(t,o),_=!!k&&p!==-1&&k.start<p;if(p!==-1&&!R&&!_){const f=t.slice(0,p),x=t.indexOf("</svg>",p),I=x===-1?`${t.slice(p)}</svg>`:t.slice(p,x+6),O=x===-1?"":t.slice(x+6);if(i){const y=[];return l(f)&&y.push({type:"text",value:f}),y.push({type:"markdown",value:I}),l(O)&&y.push(...B(O,!0)),a(y)}if(x===-1)return a([{type:"markdown",value:I}])}const T=he(t,r);if(T){const f=[],x=t.slice(0,T.start);i&&l(x)&&f.push(...B(x,!0)),f.push({type:"markdown",value:T.block});const I=t.slice(T.end);return l(I)&&I.length<t.length&&f.push(...B(I,i)),a(f)}const M=ue(de(t,r),K(t,o),me(t,o));if(b===-1&&!M)return i&&l(t)?[{type:"text",value:t}]:[];const m=!!M&&(b===-1||M.start<=b),A=m?M.start:b,w=m?M.end:re(t,A),d=t.slice(A,w),N=m&&fe(d),v=N?t.slice(0,A).trimEnd():t.slice(0,A),h=N?t.slice(w).trimStart():t.slice(w),S=[];return i&&l(v)&&S.push({type:"text",value:v}),S.push({type:m?"markdown":"sandbox",value:d}),l(h)&&S.push(...B(h,i)),a(S)};exports.normalizeWrappedSandboxContent=le;exports.splitContentSegments=B;
|
|
7
7
|
//# sourceMappingURL=split-content.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"split-content.cjs","sources":["../../../../src/components/ContentRender/utils/split-content.ts"],"sourcesContent":["import {\n getInlineCodeRanges,\n getMarkdownSourceAnalysis,\n type MarkdownSourceAnalysis,\n} from \"./inline-code-ranges\";\nimport { findResumedProseFence } from \"./resumed-prose-fence\";\nimport {\n findStreamingHtmlBlockEnd,\n findStreamingHtmlElementEnd,\n isHtmlRawTextTag,\n readHtmlMarkup,\n} from \"./html-block-end\";\n\nexport type RenderSegment =\n | {\n type: \"markdown\";\n value: string;\n /** Render received HTML without spending the prose typewriter budget. */\n immediate?: true;\n /** A native HTML header has not arrived fully, so it cannot mount yet. */\n pending?: true;\n }\n | { type: \"sandbox\"; value: string }\n | { type: \"text\"; value: string };\n\nconst SANDBOX_START_PATTERN =\n /<(?:!doctype(?=[\\s>])|(?:script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)[\\s/>])/i;\n\n// Keep streaming block roots aligned with markdown-flow 0.3.4 while retaining\n// document roots supported by the existing UI. Inline formatting stays Markdown.\nconst STREAMING_SANDBOX_ROOTS = new Set([\n \"div\",\n \"style\",\n \"script\",\n \"iframe\",\n \"section\",\n \"article\",\n \"header\",\n \"footer\",\n \"nav\",\n \"main\",\n \"aside\",\n \"figure\",\n \"details\",\n \"summary\",\n \"form\",\n \"table\",\n \"canvas\",\n \"video\",\n \"audio\",\n \"pre\",\n \"blockquote\",\n \"ul\",\n \"ol\",\n \"dl\",\n \"fieldset\",\n \"address\",\n \"hgroup\",\n \"center\",\n \"link\",\n \"html\",\n \"head\",\n \"body\",\n \"meta\",\n \"title\",\n \"base\",\n \"template\",\n]);\n\n// These authored HTML blocks already use the host's Markdown components and\n// styles. Reveal their received HTML immediately without moving it into an iframe.\nconst NATIVE_MARKDOWN_HTML_ROOTS = new Set([\n \"pre\",\n \"details\",\n \"summary\",\n \"aside\",\n \"blockquote\",\n \"ul\",\n \"ol\",\n \"dl\",\n \"table\",\n]);\nconst WIDGET_RESOURCE_ROOTS = new Set([\n \"script\",\n \"style\",\n \"link\",\n \"iframe\",\n \"html\",\n \"head\",\n \"body\",\n \"meta\",\n \"title\",\n \"base\",\n \"template\",\n]);\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 STREAMING_MARKDOWN_IMAGE_PATTERN = new RegExp(\n MARKDOWN_IMAGE_PATTERN.source,\n \"iy\"\n);\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 = {\n start: number;\n end: number;\n immediate?: true;\n pending?: true;\n};\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 = (\n raw: string,\n keepText: boolean,\n preserveFenceLines = false\n) => {\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 const boundary = preserveFenceLines ? \"\\n\" : \"\";\n return `${leadingLine}${boundary}${mermaidMatch[0]}${boundary}${trailingLine}`;\n};\n\n// Preserve the legacy component's wrapped-sandbox projection without changing\n// literal quoted prose or making streaming HTML use the legacy block splitter.\nexport const normalizeWrappedSandboxContent = (raw: string) => {\n if (!WRAPPED_QUOTES_PATTERN.test(raw)) return raw;\n const legacySegments = splitContentSegments(raw, true);\n return legacySegments.some((segment) => segment.type === \"sandbox\")\n ? normalizeQuotedMermaidContent(raw, true, true)\n : raw;\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 isEscaped = (raw: string, index: number) => {\n let backslashes = 0;\n for (let i = index - 1; i >= 0 && raw[i] === \"\\\\\"; i--) backslashes++;\n return backslashes % 2 === 1;\n};\n\nconst isIndexInRanges = (index: number, ranges: readonly FenceRange[]) =>\n ranges.some(({ start, end }) => index >= start && index < end);\n\nconst findFirstMatchOutsideFence = (\n raw: string,\n pattern: RegExp,\n fenceRanges: readonly 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 (\n !isEscaped(raw, match.index) &&\n !isIndexInRanges(match.index, fenceRanges)\n ) {\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 = (\n raw: string,\n codeRanges?: readonly FenceRange[]\n): MatchResult | null => {\n let earliest: MatchResult | null = null;\n\n INLINE_SANDBOX_PATTERNS.forEach((pattern) => {\n const start = codeRanges\n ? findFirstMatchOutsideFence(raw, pattern, codeRanges)\n : (pattern.exec(raw)?.index ?? -1);\n if (start === -1) return;\n const match = pattern.exec(raw.slice(start));\n if (!match) return;\n const end = start + 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: readonly 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: readonly 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 findStreamingVideoIframeMatch = (\n raw: string,\n start: number\n): MatchResult | null => {\n if (start === -1) return null;\n const prefix = raw.slice(start);\n const nameMatch = /^<([a-z]+)/i.exec(prefix);\n if (!nameMatch) return null;\n const name = nameMatch[1].toLowerCase();\n const pending = (): MatchResult => ({\n start,\n end: raw.length,\n immediate: true,\n pending: true,\n });\n if (nameMatch[0].length === prefix.length && \"iframe\".startsWith(name)) {\n return pending();\n }\n if (name !== \"iframe\" || !/[\\s/>]/.test(prefix[nameMatch[0].length] ?? \"\")) {\n return null;\n }\n\n // A quoted '>' belongs to an attribute, not the end of the opening header.\n const attributesStart = start + nameMatch[0].length;\n let quote = \"\";\n let openingEnd = -1;\n for (let index = attributesStart; index < raw.length; index += 1) {\n const character = raw[index];\n if (quote) {\n if (character === quote) quote = \"\";\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === \">\") {\n openingEnd = index + 1;\n break;\n }\n }\n if (openingEnd === -1) return pending();\n\n // Tokenize whole attributes so marker-looking text in another value is inert.\n const attributes = raw.slice(attributesStart, openingEnd - 1);\n const attributePattern =\n /([^\\s=/>]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]*)))?/g;\n let attribute: RegExpExecArray | null;\n let isVideo = false;\n while ((attribute = attributePattern.exec(attributes)) !== null) {\n if (attribute[1].toLowerCase() === \"data-tag\") {\n isVideo =\n (attribute[2] ?? attribute[3] ?? attribute[4] ?? \"\").toLowerCase() ===\n \"video\";\n break;\n }\n }\n if (!isVideo) return null;\n\n // A video is one raw-text element, not an HTML run containing later siblings.\n const closing = /<\\/iframe\\s*>/i.exec(raw.slice(openingEnd));\n return {\n start,\n end: closing ? openingEnd + closing.index + closing[0].length : raw.length,\n immediate: true,\n };\n};\n\nconst extractTableBlock = (\n raw: string,\n codeRanges: readonly FenceRange[]\n): { start: number; block: string; end: number } | null => {\n const tablePattern = /^\\s*\\|.+\\|\\s*$/gm;\n let tableMatch: RegExpExecArray | null;\n let tableStart = -1;\n while ((tableMatch = tablePattern.exec(raw)) !== null) {\n const leadingSpaces = tableMatch[0].match(/^\\s*/)?.[0].length ?? 0;\n const start = tableMatch.index + leadingSpaces;\n if (isIndexInRanges(start, codeRanges)) continue;\n tableStart = start;\n break;\n }\n if (tableStart === -1) return null;\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\ntype StreamingMatch = FenceRange & {\n type: \"markdown\" | \"sandbox\";\n immediate?: true;\n pending?: true;\n};\n\nconst isStreamingSandboxStart = (source: string, start: number) => {\n const name = /^<([a-z][a-z0-9:-]*)(?=[\\s/>])/i.exec(source.slice(start));\n return name\n ? STREAMING_SANDBOX_ROOTS.has(name[1].toLowerCase())\n : /^<!doctype(?=[\\s>])/i.test(source.slice(start));\n};\n\nconst isNativeMarkdownHtmlStart = (source: string, start: number) => {\n const name = /^<([a-z][a-z0-9:-]*)(?=[\\s/>])/i.exec(source.slice(start));\n return Boolean(name && NATIVE_MARKDOWN_HTML_ROOTS.has(name[1].toLowerCase()));\n};\n\n// Native presentation blocks containing widget resources need the\n// sandbox. Header attributes, comments and raw-text examples are not resources.\nconst containsWidgetResources = (\n source: string,\n start: number,\n end: number\n) => {\n let position = start;\n while (position < end) {\n if (source[position] !== \"<\") {\n position += 1;\n continue;\n }\n const markup = readHtmlMarkup(source, position);\n const resourceName =\n markup.kind === \"tag\"\n ? markup.closing\n ? undefined\n : markup.name\n : /^<([a-z][a-z0-9:-]*)(?=[\\s/>])/i\n .exec(source.slice(position))?.[1]\n .toLowerCase();\n if (resourceName && WIDGET_RESOURCE_ROOTS.has(resourceName)) {\n const video =\n resourceName === \"iframe\" &&\n findStreamingVideoIframeMatch(source, position);\n // An unfinished iframe header cannot mount. Keep its current native\n // container until a complete header establishes whether it is a widget.\n if (!video) return true;\n }\n if (markup.kind === \"incomplete\" || markup.kind === \"invalid\") {\n if (markup.kind === \"incomplete\") break;\n position += 1;\n continue;\n }\n if (markup.kind === \"tag\" && !markup.closing) {\n if (isHtmlRawTextTag(markup.name)) {\n position = findStreamingHtmlElementEnd(source, position);\n continue;\n }\n }\n position = markup.end;\n }\n return false;\n};\n\n// A Markdown HTML node can extend past our closed root until the next blank\n// line. Only that resumed prose needs a small lexical fallback for literals;\n// code/math inside the actual HTML element remains HTML.\nconst resumedProseLiteralIndex = (source: string) => {\n const nextClosing = new Map<number, number>();\n const delimiters = [...source.matchAll(/`+|\\$+/g)];\n const nextByMarker = new Map<string, number>();\n for (let index = delimiters.length - 1; index >= 0; index -= 1) {\n const match = delimiters[index];\n const marker = match[0];\n const next = nextByMarker.get(marker);\n if (next !== undefined) nextClosing.set(match.index, next + marker.length);\n if (marker[0] === \"`\" || !isEscaped(source, match.index))\n nextByMarker.set(marker, match.index);\n }\n const boundaries: number[] = [];\n let offset = 0;\n for (const line of source.split(\"\\n\")) {\n const contentStart = offset + (line.match(/^[ \\t]*/)?.[0].length ?? 0);\n if (!line.trim() || isStreamingSandboxStart(source, contentStart))\n boundaries.push(offset);\n offset += line.length + 1;\n }\n return { nextClosing, boundaries };\n};\n\nconst findResumedProseLiteralEnd = (\n source: string,\n start: number,\n index: ReturnType<typeof resumedProseLiteralIndex>\n) => {\n const marker = source[start];\n if ((marker !== \"`\" && marker !== \"$\") || isEscaped(source, start)) return;\n let width = 1;\n while (source[start + width] === marker) width += 1;\n const markerEnd = start + width;\n const end =\n marker === \"$\" && width > 2 ? undefined : index.nextClosing.get(start);\n if (end === undefined) return { markerEnd };\n if (marker === \"$\" && width === 2) return { markerEnd, end };\n let low = 0;\n let high = index.boundaries.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (index.boundaries[middle] <= start) low = middle + 1;\n else high = middle;\n }\n return end <= (index.boundaries[low] ?? source.length)\n ? { markerEnd, end }\n : { markerEnd };\n};\n\nconst appendStreamingSandbox = (\n source: string,\n match: StreamingMatch,\n segments: RenderSegment[]\n) => {\n let start = match.start;\n let position = start;\n while (position < match.end) {\n if (source[position] !== \"<\") {\n position += 1;\n continue;\n }\n const markup = readHtmlMarkup(source, position);\n if (markup.kind === \"incomplete\") break;\n if (markup.kind === \"invalid\") {\n position += 1;\n continue;\n }\n if (markup.kind === \"tag\" && !markup.closing) {\n if (markup.name === \"custom-button-after-content\") {\n const end = Math.min(\n findStreamingHtmlElementEnd(source, position),\n match.end\n );\n if (\n /<\\/custom-button-after-content\\s*>$/i.test(\n source.slice(position, end)\n )\n ) {\n if (position > start)\n segments.push({\n type: \"sandbox\",\n value: source.slice(start, position),\n });\n segments.push({\n type: \"markdown\",\n value: source.slice(position, end),\n });\n start = end;\n position = end;\n continue;\n }\n }\n if (isHtmlRawTextTag(markup.name)) {\n position = findStreamingHtmlElementEnd(source, position);\n continue;\n }\n }\n position = markup.end;\n }\n if (start < match.end)\n segments.push({ type: \"sandbox\", value: source.slice(start, match.end) });\n};\n\nconst streamingTableRanges = (\n source: string,\n literals: readonly FenceRange[],\n matches: readonly StreamingMatch[]\n) => {\n const tables: StreamingMatch[] = [];\n const lines = source.split(\"\\n\");\n let offset = 0;\n let literalIndex = 0;\n let matchIndex = 0;\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n const start = offset + (line.match(/^[ \\t]*/)?.[0].length ?? 0);\n while (literals[literalIndex]?.end <= start) literalIndex += 1;\n const literal = literals[literalIndex];\n if (\n /^[ \\t]*\\|.+\\|[ \\t]*\\r?$/.test(line) &&\n !(literal && literal.start <= start)\n ) {\n let end = offset + line.length;\n while (\n index + 1 < lines.length &&\n lines[index + 1].trim().startsWith(\"|\")\n ) {\n offset += lines[index].length + 1;\n index += 1;\n end = offset + lines[index].length;\n }\n while (matches[matchIndex]?.end <= start) matchIndex += 1;\n if (!(matches[matchIndex]?.start < end))\n tables.push({ start, end, type: \"markdown\" });\n }\n offset += lines[index].length + 1;\n }\n return tables;\n};\n\nconst splitStreamingContent = (\n source: string,\n keepText: boolean,\n analysis: MarkdownSourceAnalysis\n): RenderSegment[] => {\n const matches: StreamingMatch[] = [];\n const comments = new Set(analysis.comments);\n // Comments are scanned lexically below. This also handles Markdown prose\n // resumed inside a source HTML node, where fenced examples can contain '<!--'.\n const literals = analysis.literal.filter((range) => !comments.has(range));\n const actualLiterals: FenceRange[] = [];\n let literalIndex = 0;\n let fenceIndex = 0;\n let htmlIndex = 0;\n let position = 0;\n let resumedProse = false;\n let resumedLiterals: ReturnType<typeof resumedProseLiteralIndex> | undefined;\n while (position < source.length) {\n while (analysis.fences[fenceIndex]?.end <= position) fenceIndex += 1;\n const sourceFence = analysis.fences[fenceIndex];\n if (sourceFence?.start === position) {\n matches.push({ ...sourceFence, type: \"markdown\" });\n actualLiterals.push(sourceFence);\n position = sourceFence.end;\n continue;\n }\n while (literals[literalIndex]?.end <= position) literalIndex += 1;\n const literal = literals[literalIndex];\n if (literal && literal.start <= position) {\n actualLiterals.push(literal);\n position = literal.end;\n continue;\n }\n while (analysis.html[htmlIndex]?.end <= position) htmlIndex += 1;\n const html = analysis.html[htmlIndex];\n if (resumedProse && html && html.start <= position) {\n const fence = findResumedProseFence(source, position);\n if (fence) {\n matches.push(fence);\n actualLiterals.push(fence);\n // The source HTML AST can misread code-internal link/image syntax as\n // pending metadata that extends past this fence into later prose.\n while (literals[literalIndex]?.start < fence.end) literalIndex += 1;\n position = fence.end;\n continue;\n }\n if (source[position] === \"`\" || source[position] === \"$\")\n resumedLiterals ??= resumedProseLiteralIndex(source);\n const proseLiteral =\n resumedLiterals &&\n findResumedProseLiteralEnd(source, position, resumedLiterals);\n if (proseLiteral) {\n if (proseLiteral.end !== undefined)\n actualLiterals.push({ start: position, end: proseLiteral.end });\n position = proseLiteral.end ?? proseLiteral.markerEnd;\n continue;\n }\n }\n if (source[position] === \"!\" && !isEscaped(source, position)) {\n STREAMING_MARKDOWN_IMAGE_PATTERN.lastIndex = position;\n const image = STREAMING_MARKDOWN_IMAGE_PATTERN.exec(source);\n if (image) {\n matches.push({\n start: position,\n end: position + image[0].length,\n type: \"markdown\",\n });\n position += image[0].length;\n continue;\n }\n }\n if (source[position] !== \"<\" || isEscaped(source, position)) {\n position += 1;\n continue;\n }\n const markup = readHtmlMarkup(source, position);\n if (isStreamingSandboxStart(source, position)) {\n const video = findStreamingVideoIframeMatch(source, position);\n const nativeRoot = isNativeMarkdownHtmlStart(source, position);\n const end =\n video?.end ??\n (nativeRoot\n ? findStreamingHtmlElementEnd(source, position)\n : findStreamingHtmlBlockEnd(source, position, (nextRoot) => {\n const nextVideo = findStreamingVideoIframeMatch(source, nextRoot);\n return (\n Boolean(nextVideo && !nextVideo.pending) ||\n isNativeMarkdownHtmlStart(source, nextRoot)\n );\n }));\n const nativeHtml =\n nativeRoot && !containsWidgetResources(source, position, end);\n matches.push({\n start: position,\n end,\n type: video || nativeHtml ? \"markdown\" : \"sandbox\",\n ...(video?.immediate || nativeHtml ? { immediate: true as const } : {}),\n ...(video?.pending || (nativeHtml && markup.kind === \"incomplete\")\n ? { pending: true as const }\n : {}),\n });\n position = end;\n resumedProse = true;\n continue;\n }\n if (markup.kind === \"tag\") {\n if (!markup.closing && (markup.name === \"svg\" || markup.name === \"img\")) {\n const end =\n markup.name === \"img\"\n ? markup.end\n : findStreamingHtmlElementEnd(source, position);\n matches.push({ start: position, end, type: \"markdown\" });\n position = end;\n } else if (!markup.closing && isHtmlRawTextTag(markup.name)) {\n const end = findStreamingHtmlElementEnd(source, position);\n actualLiterals.push({ start: position, end });\n position = end;\n } else {\n position = markup.end;\n }\n } else if (markup.kind === \"comment\" || markup.kind === \"declaration\") {\n if (markup.kind === \"comment\")\n actualLiterals.push({ start: position, end: markup.end });\n position = markup.end;\n } else if (markup.kind === \"incomplete\") {\n // The rest belongs to this unfinished token, including quoted attributes.\n if (/^<svg(?=[\\s/>])/i.test(source.slice(position)))\n matches.push({ start: position, end: source.length, type: \"markdown\" });\n position = source.length;\n } else {\n position += 1;\n }\n }\n const tables = streamingTableRanges(source, actualLiterals, matches);\n const orderedMatches: StreamingMatch[] = [];\n let tableIndex = 0;\n for (const match of matches) {\n while (tables[tableIndex]?.start < match.start)\n orderedMatches.push(tables[tableIndex++]);\n orderedMatches.push(match);\n }\n orderedMatches.push(...tables.slice(tableIndex));\n\n const segments: RenderSegment[] = [];\n let cursor = 0;\n for (const match of orderedMatches) {\n if (match.start < cursor) continue;\n if (keepText && match.start > cursor)\n segments.push({ type: \"text\", value: source.slice(cursor, match.start) });\n if (match.type === \"sandbox\")\n appendStreamingSandbox(source, match, segments);\n else\n segments.push({\n type: \"markdown\",\n value: source.slice(match.start, match.end),\n ...(match.immediate ? { immediate: true as const } : {}),\n ...(match.pending ? { pending: true as const } : {}),\n });\n cursor = match.end;\n }\n if (keepText && cursor < source.length)\n segments.push({ type: \"text\", value: source.slice(cursor) });\n return segments;\n};\n\n// Split incoming markdown content into markdown and sandbox HTML segments.\n// Streaming always scans the received source in absolute coordinates. The legacy\n// projection below keeps the public non-streaming splitter's existing behavior.\nexport const splitContentSegments = (\n raw: string,\n keepText = false,\n streaming = false,\n sourceAnalysis?: MarkdownSourceAnalysis\n): RenderSegment[] => {\n if (streaming)\n return splitStreamingContent(\n raw,\n keepText,\n sourceAnalysis ?? getMarkdownSourceAnalysis(raw)\n );\n const source = normalizeQuotedMermaidContent(raw, keepText);\n const finalizeSegments = (segments: RenderSegment[]) =>\n splitCustomButtonsFromSandbox(segments);\n const hasText = (value: string) => Boolean(value.trim());\n const codeRanges = getInlineCodeRanges(source);\n const fenceBlock = extractFirstFenceBlock(source);\n const fenceRanges = [...getFenceRanges(source), ...codeRanges];\n const sandboxStartIndex = findFirstMatchOutsideFence(\n source,\n SANDBOX_START_PATTERN,\n fenceRanges\n );\n\n if (fenceBlock) {\n if (!fenceBlock.complete) {\n return finalizeSegments([\n { type: \"markdown\", value: keepText ? source : fenceBlock.block },\n ]);\n }\n if (!keepText)\n return finalizeSegments([{ type: \"markdown\", value: fenceBlock.block }]);\n\n const segments: RenderSegment[] = [];\n const before = normalizeBeforeFenceText(source.slice(0, fenceBlock.start));\n if (hasText(before)) segments.push({ type: \"text\", value: before });\n segments.push({ type: \"markdown\", value: fenceBlock.block });\n const after = source.slice(fenceBlock.end);\n if (hasText(after)) segments.push(...splitContentSegments(after, true));\n return finalizeSegments(segments);\n }\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 if (keepText) {\n const segments: RenderSegment[] = [];\n if (hasText(before)) segments.push({ type: \"text\", value: before });\n segments.push({ type: \"markdown\", value: svgBlock });\n if (hasText(after)) segments.push(...splitContentSegments(after, true));\n return finalizeSegments(segments);\n }\n if (closeIdx === -1)\n return finalizeSegments([{ type: \"markdown\", value: svgBlock }]);\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 && hasText(before))\n segments.push(...splitContentSegments(before, true));\n segments.push({ type: \"markdown\", value: tableBlock.block });\n const after = source.slice(tableBlock.end);\n if (hasText(after) && after.length < source.length)\n segments.push(...splitContentSegments(after, keepText));\n return finalizeSegments(segments);\n }\n\n const inlineCandidate = pickEarliestMatch(\n findInlineSandboxMatch(source),\n findMarkdownImageMatch(source, fenceRanges),\n findMarkdownVideoIframeMatch(source, fenceRanges)\n );\n if (sandboxStartIndex === -1 && !inlineCandidate)\n return keepText && hasText(source) ? [{ type: \"text\", value: source }] : [];\n\n const shouldUseInline =\n !!inlineCandidate &&\n (sandboxStartIndex === -1 || inlineCandidate.start <= sandboxStartIndex);\n const startIndex = shouldUseInline\n ? inlineCandidate!.start\n : sandboxStartIndex;\n const blockEnd = shouldUseInline\n ? inlineCandidate!.end\n : findHtmlBlockEnd(source, startIndex);\n const matchedBlock = source.slice(startIndex, blockEnd);\n const isVideo = shouldUseInline && isMarkdownVideoIframe(matchedBlock);\n const before = isVideo\n ? source.slice(0, startIndex).trimEnd()\n : source.slice(0, startIndex);\n const after = isVideo\n ? source.slice(blockEnd).trimStart()\n : source.slice(blockEnd);\n const segments: RenderSegment[] = [];\n if (keepText && hasText(before))\n segments.push({ type: \"text\", value: before });\n segments.push({\n type: shouldUseInline ? \"markdown\" : \"sandbox\",\n value: matchedBlock,\n });\n if (hasText(after)) segments.push(...splitContentSegments(after, keepText));\n return finalizeSegments(segments);\n};\n"],"names":["SANDBOX_START_PATTERN","STREAMING_SANDBOX_ROOTS","NATIVE_MARKDOWN_HTML_ROOTS","WIDGET_RESOURCE_ROOTS","INLINE_SANDBOX_PATTERNS","MARKDOWN_IMAGE_PATTERN","STREAMING_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","preserveFenceLines","unwrapped","mermaidMatch","after","leadingLine","trailingLine","boundary","normalizeWrappedSandboxContent","splitContentSegments","segment","getFenceRanges","ranges","fencePattern","match","closeMatch","isEscaped","index","backslashes","isIndexInRanges","end","findFirstMatchOutsideFence","pattern","fenceRanges","flags","matcher","findHtmlBlockEnd","startIndex","blockEnd","splitCustomButtonsFromSandbox","segments","output","lastIndex","rest","findInlineSandboxMatch","codeRanges","earliest","pickEarliestMatch","matches","findMarkdownImageMatch","findMarkdownVideoIframeMatch","isMarkdownVideoIframe","value","findStreamingVideoIframeMatch","prefix","nameMatch","name","pending","attributesStart","quote","openingEnd","character","attributes","attributePattern","attribute","isVideo","extractTableBlock","tablePattern","tableMatch","tableStart","leadingSpaces","lines","tableLines","block","isStreamingSandboxStart","source","isNativeMarkdownHtmlStart","containsWidgetResources","position","markup","readHtmlMarkup","resourceName","isHtmlRawTextTag","findStreamingHtmlElementEnd","resumedProseLiteralIndex","nextClosing","delimiters","nextByMarker","marker","next","boundaries","offset","contentStart","findResumedProseLiteralEnd","width","markerEnd","low","high","middle","appendStreamingSandbox","streamingTableRanges","literals","tables","literalIndex","matchIndex","literal","splitStreamingContent","analysis","comments","range","actualLiterals","fenceIndex","htmlIndex","resumedProse","resumedLiterals","sourceFence","html","fence","findResumedProseFence","proseLiteral","image","video","nativeRoot","findStreamingHtmlBlockEnd","nextRoot","nextVideo","nativeHtml","orderedMatches","tableIndex","cursor","streaming","sourceAnalysis","getMarkdownSourceAnalysis","finalizeSegments","hasText","getInlineCodeRanges","fenceBlock","sandboxStartIndex","svgOpenIndex","hasSandboxBeforeSvg","markdownImageBeforeSvg","hasMarkdownImageBeforeSvg","closeIdx","svgBlock","tableBlock","inlineCandidate","shouldUseInline","matchedBlock"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"split-content.cjs","sources":["../../../../src/components/ContentRender/utils/split-content.ts"],"sourcesContent":["import {\n getInlineCodeRanges,\n getMarkdownSourceAnalysis,\n type MarkdownSourceAnalysis,\n} from \"./inline-code-ranges\";\nimport { findResumedProseFence } from \"./resumed-prose-fence\";\nimport {\n findStreamingHtmlBlockEnd,\n findStreamingHtmlElementEnd,\n isHtmlRawTextTag,\n readHtmlMarkup,\n} from \"./html-block-end\";\n\nexport type RenderSegment =\n | {\n type: \"markdown\";\n value: string;\n /** Render received HTML without spending the prose typewriter budget. */\n immediate?: true;\n /** A native HTML header has not arrived fully, so it cannot mount yet. */\n pending?: true;\n }\n | { type: \"sandbox\"; value: string; pending?: true }\n | { type: \"text\"; value: string };\n\nconst SANDBOX_START_PATTERN =\n /<(?:!doctype(?=[\\s>])|(?:script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)[\\s/>])/i;\n\n// Keep streaming block roots aligned with markdown-flow 0.3.4 while retaining\n// document roots supported by the existing UI. Inline formatting stays Markdown.\nconst STREAMING_SANDBOX_ROOTS = new Set([\n \"div\",\n \"style\",\n \"script\",\n \"iframe\",\n \"section\",\n \"article\",\n \"header\",\n \"footer\",\n \"nav\",\n \"main\",\n \"aside\",\n \"figure\",\n \"details\",\n \"summary\",\n \"form\",\n \"table\",\n \"canvas\",\n \"video\",\n \"audio\",\n \"pre\",\n \"blockquote\",\n \"ul\",\n \"ol\",\n \"dl\",\n \"fieldset\",\n \"address\",\n \"hgroup\",\n \"center\",\n \"link\",\n \"html\",\n \"head\",\n \"body\",\n \"meta\",\n \"title\",\n \"base\",\n \"template\",\n]);\n\n// These authored HTML blocks already use the host's Markdown components and\n// styles. Reveal their received HTML immediately without moving it into an iframe.\nconst NATIVE_MARKDOWN_HTML_ROOTS = new Set([\n \"pre\",\n \"details\",\n \"summary\",\n \"aside\",\n \"blockquote\",\n \"ul\",\n \"ol\",\n \"dl\",\n \"table\",\n]);\nconst WIDGET_RESOURCE_ROOTS = new Set([\n \"script\",\n \"style\",\n \"link\",\n \"iframe\",\n \"html\",\n \"head\",\n \"body\",\n \"meta\",\n \"title\",\n \"base\",\n \"template\",\n]);\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 STREAMING_MARKDOWN_IMAGE_PATTERN = new RegExp(\n MARKDOWN_IMAGE_PATTERN.source,\n \"iy\"\n);\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 = {\n start: number;\n end: number;\n immediate?: true;\n pending?: true;\n};\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 = (\n raw: string,\n variables: readonly FenceRange[] = []\n): FenceBlock | null => {\n const nextFence = (from: number) => {\n let index = raw.indexOf(\"```\", from);\n while (index !== -1 && isIndexInRanges(index, variables))\n index = raw.indexOf(\"```\", index + 3);\n return index;\n };\n const start = nextFence(0);\n if (start === -1) return null;\n\n const closing = nextFence(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 = (\n raw: string,\n keepText: boolean,\n preserveFenceLines = false\n) => {\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 const boundary = preserveFenceLines ? \"\\n\" : \"\";\n return `${leadingLine}${boundary}${mermaidMatch[0]}${boundary}${trailingLine}`;\n};\n\n// Preserve the legacy component's wrapped-sandbox projection without changing\n// literal quoted prose or making streaming HTML use the legacy block splitter.\nexport const normalizeWrappedSandboxContent = (raw: string) => {\n if (!WRAPPED_QUOTES_PATTERN.test(raw)) return raw;\n const legacySegments = splitContentSegments(raw, true);\n return legacySegments.some((segment) => segment.type === \"sandbox\")\n ? normalizeQuotedMermaidContent(raw, true, true)\n : raw;\n};\n\nconst getFenceRanges = (\n raw: string,\n variables: readonly FenceRange[] = []\n): FenceRange[] => {\n const ranges: FenceRange[] = [];\n const positions = [...raw.matchAll(/```/g)]\n .map((match) => match.index)\n .filter((position) => !isIndexInRanges(position, variables));\n for (let index = 0; index < positions.length; index += 2) {\n ranges.push({\n start: positions[index],\n end:\n positions[index + 1] === undefined\n ? raw.length\n : positions[index + 1] + 3,\n });\n }\n\n return ranges;\n};\n\nconst isEscaped = (raw: string, index: number) => {\n let backslashes = 0;\n for (let i = index - 1; i >= 0 && raw[i] === \"\\\\\"; i--) backslashes++;\n return backslashes % 2 === 1;\n};\n\nconst isIndexInRanges = (index: number, ranges: readonly FenceRange[]) =>\n ranges.some(({ start, end }) => index >= start && index < end);\n\nconst findFirstMatchOutsideFence = (\n raw: string,\n pattern: RegExp,\n fenceRanges: readonly 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 (\n !isEscaped(raw, match.index) &&\n !isIndexInRanges(match.index, fenceRanges)\n ) {\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 = (\n raw: string,\n codeRanges?: readonly FenceRange[]\n): MatchResult | null => {\n let earliest: MatchResult | null = null;\n\n INLINE_SANDBOX_PATTERNS.forEach((pattern) => {\n const start = codeRanges\n ? findFirstMatchOutsideFence(raw, pattern, codeRanges)\n : (pattern.exec(raw)?.index ?? -1);\n if (start === -1) return;\n const match = pattern.exec(raw.slice(start));\n if (!match) return;\n const end = start + 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: readonly 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: readonly 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 findStreamingVideoIframeMatch = (\n raw: string,\n start: number\n): MatchResult | null => {\n if (start === -1) return null;\n const prefix = raw.slice(start);\n const nameMatch = /^<([a-z]+)/i.exec(prefix);\n if (!nameMatch) return null;\n const name = nameMatch[1].toLowerCase();\n const pending = (): MatchResult => ({\n start,\n end: raw.length,\n immediate: true,\n pending: true,\n });\n if (nameMatch[0].length === prefix.length && \"iframe\".startsWith(name)) {\n return pending();\n }\n if (name !== \"iframe\" || !/[\\s/>]/.test(prefix[nameMatch[0].length] ?? \"\")) {\n return null;\n }\n\n // A quoted '>' belongs to an attribute, not the end of the opening header.\n const attributesStart = start + nameMatch[0].length;\n let quote = \"\";\n let openingEnd = -1;\n for (let index = attributesStart; index < raw.length; index += 1) {\n const character = raw[index];\n if (quote) {\n if (character === quote) quote = \"\";\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === \">\") {\n openingEnd = index + 1;\n break;\n }\n }\n if (openingEnd === -1) return pending();\n\n // Tokenize whole attributes so marker-looking text in another value is inert.\n const attributes = raw.slice(attributesStart, openingEnd - 1);\n const attributePattern =\n /([^\\s=/>]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]*)))?/g;\n let attribute: RegExpExecArray | null;\n let isVideo = false;\n while ((attribute = attributePattern.exec(attributes)) !== null) {\n if (attribute[1].toLowerCase() === \"data-tag\") {\n isVideo =\n (attribute[2] ?? attribute[3] ?? attribute[4] ?? \"\").toLowerCase() ===\n \"video\";\n break;\n }\n }\n if (!isVideo) return null;\n\n // A video is one raw-text element, not an HTML run containing later siblings.\n const closing = /<\\/iframe\\s*>/i.exec(raw.slice(openingEnd));\n return {\n start,\n end: closing ? openingEnd + closing.index + closing[0].length : raw.length,\n immediate: true,\n };\n};\n\nconst extractTableBlock = (\n raw: string,\n codeRanges: readonly FenceRange[]\n): { start: number; block: string; end: number } | null => {\n const tablePattern = /^\\s*\\|.+\\|\\s*$/gm;\n let tableMatch: RegExpExecArray | null;\n let tableStart = -1;\n while ((tableMatch = tablePattern.exec(raw)) !== null) {\n const leadingSpaces = tableMatch[0].match(/^\\s*/)?.[0].length ?? 0;\n const start = tableMatch.index + leadingSpaces;\n if (isIndexInRanges(start, codeRanges)) continue;\n tableStart = start;\n break;\n }\n if (tableStart === -1) return null;\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\ntype StreamingMatch = FenceRange & {\n type: \"markdown\" | \"sandbox\";\n immediate?: true;\n pending?: true;\n};\n\nconst isStreamingSandboxStart = (source: string, start: number) => {\n const name = /^<([a-z][a-z0-9:-]*)(?=[\\s/>])/i.exec(source.slice(start));\n return name\n ? STREAMING_SANDBOX_ROOTS.has(name[1].toLowerCase())\n : /^<!doctype(?=[\\s>])/i.test(source.slice(start));\n};\n\nconst isNativeMarkdownHtmlStart = (source: string, start: number) => {\n const name = /^<([a-z][a-z0-9:-]*)(?=[\\s/>])/i.exec(source.slice(start));\n return Boolean(name && NATIVE_MARKDOWN_HTML_ROOTS.has(name[1].toLowerCase()));\n};\n\n// Native presentation blocks containing widget resources need the\n// sandbox. Header attributes, comments and raw-text examples are not resources.\nconst containsWidgetResources = (\n source: string,\n start: number,\n end: number\n) => {\n let position = start;\n while (position < end) {\n if (source[position] !== \"<\") {\n position += 1;\n continue;\n }\n const markup = readHtmlMarkup(source, position);\n const resourceName =\n markup.kind === \"tag\"\n ? markup.closing\n ? undefined\n : markup.name\n : /^<([a-z][a-z0-9:-]*)(?=[\\s/>])/i\n .exec(source.slice(position))?.[1]\n .toLowerCase();\n if (resourceName && WIDGET_RESOURCE_ROOTS.has(resourceName)) {\n const video =\n resourceName === \"iframe\" &&\n findStreamingVideoIframeMatch(source, position);\n // An unfinished iframe header cannot mount. Keep its current native\n // container until a complete header establishes whether it is a widget.\n if (!video) return true;\n }\n if (markup.kind === \"incomplete\" || markup.kind === \"invalid\") {\n if (markup.kind === \"incomplete\") break;\n position += 1;\n continue;\n }\n if (markup.kind === \"tag\" && !markup.closing) {\n if (isHtmlRawTextTag(markup.name)) {\n position = findStreamingHtmlElementEnd(source, position);\n continue;\n }\n }\n position = markup.end;\n }\n return false;\n};\n\n// A Markdown HTML node can extend past our closed root until the next blank\n// line. Only that resumed prose needs a small lexical fallback for literals;\n// code/math inside the actual HTML element remains HTML.\nconst resumedProseLiteralIndex = (source: string) => {\n const nextClosing = new Map<number, number>();\n const delimiters = [...source.matchAll(/`+|\\$+/g)];\n const nextByMarker = new Map<string, number>();\n for (let index = delimiters.length - 1; index >= 0; index -= 1) {\n const match = delimiters[index];\n const marker = match[0];\n const next = nextByMarker.get(marker);\n if (next !== undefined) nextClosing.set(match.index, next + marker.length);\n if (marker[0] === \"`\" || !isEscaped(source, match.index))\n nextByMarker.set(marker, match.index);\n }\n const boundaries: number[] = [];\n let offset = 0;\n for (const line of source.split(\"\\n\")) {\n const contentStart = offset + (line.match(/^[ \\t]*/)?.[0].length ?? 0);\n if (!line.trim() || isStreamingSandboxStart(source, contentStart))\n boundaries.push(offset);\n offset += line.length + 1;\n }\n return { nextClosing, boundaries };\n};\n\nconst findResumedProseLiteralEnd = (\n source: string,\n start: number,\n index: ReturnType<typeof resumedProseLiteralIndex>\n) => {\n const marker = source[start];\n if ((marker !== \"`\" && marker !== \"$\") || isEscaped(source, start)) return;\n let width = 1;\n while (source[start + width] === marker) width += 1;\n const markerEnd = start + width;\n const end =\n marker === \"$\" && width > 2 ? undefined : index.nextClosing.get(start);\n if (end === undefined) return { markerEnd };\n if (marker === \"$\" && width === 2) return { markerEnd, end };\n let low = 0;\n let high = index.boundaries.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (index.boundaries[middle] <= start) low = middle + 1;\n else high = middle;\n }\n return end <= (index.boundaries[low] ?? source.length)\n ? { markerEnd, end }\n : { markerEnd };\n};\n\nconst appendStreamingSandbox = (\n source: string,\n match: StreamingMatch,\n segments: RenderSegment[]\n) => {\n if (match.pending) {\n segments.push({\n type: \"sandbox\",\n value: source.slice(match.start, match.end),\n pending: true,\n });\n return;\n }\n let start = match.start;\n let position = start;\n while (position < match.end) {\n if (source[position] !== \"<\") {\n position += 1;\n continue;\n }\n const markup = readHtmlMarkup(source, position);\n if (markup.kind === \"incomplete\") break;\n if (markup.kind === \"invalid\") {\n position += 1;\n continue;\n }\n if (markup.kind === \"tag\" && !markup.closing) {\n if (markup.name === \"custom-button-after-content\") {\n const end = Math.min(\n findStreamingHtmlElementEnd(source, position),\n match.end\n );\n if (\n /<\\/custom-button-after-content\\s*>$/i.test(\n source.slice(position, end)\n )\n ) {\n if (position > start)\n segments.push({\n type: \"sandbox\",\n value: source.slice(start, position),\n });\n segments.push({\n type: \"markdown\",\n value: source.slice(position, end),\n });\n start = end;\n position = end;\n continue;\n }\n }\n if (isHtmlRawTextTag(markup.name)) {\n position = findStreamingHtmlElementEnd(source, position);\n continue;\n }\n }\n position = markup.end;\n }\n if (start < match.end)\n segments.push({ type: \"sandbox\", value: source.slice(start, match.end) });\n};\n\nconst streamingTableRanges = (\n source: string,\n literals: readonly FenceRange[],\n matches: readonly StreamingMatch[]\n) => {\n const tables: StreamingMatch[] = [];\n const lines = source.split(\"\\n\");\n let offset = 0;\n let literalIndex = 0;\n let matchIndex = 0;\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n const start = offset + (line.match(/^[ \\t]*/)?.[0].length ?? 0);\n while (literals[literalIndex]?.end <= start) literalIndex += 1;\n const literal = literals[literalIndex];\n if (\n /^[ \\t]*\\|.+\\|[ \\t]*\\r?$/.test(line) &&\n !(literal && literal.start <= start)\n ) {\n let end = offset + line.length;\n while (\n index + 1 < lines.length &&\n lines[index + 1].trim().startsWith(\"|\")\n ) {\n offset += lines[index].length + 1;\n index += 1;\n end = offset + lines[index].length;\n }\n while (matches[matchIndex]?.end <= start) matchIndex += 1;\n if (!(matches[matchIndex]?.start < end))\n tables.push({ start, end, type: \"markdown\" });\n }\n offset += lines[index].length + 1;\n }\n return tables;\n};\n\nconst splitStreamingContent = (\n source: string,\n keepText: boolean,\n analysis: MarkdownSourceAnalysis\n): RenderSegment[] => {\n const matches: StreamingMatch[] = [];\n const comments = new Set(analysis.comments);\n // Comments are scanned lexically below. This also handles Markdown prose\n // resumed inside a source HTML node, where fenced examples can contain '<!--'.\n const literals = analysis.literal.filter((range) => !comments.has(range));\n const actualLiterals: FenceRange[] = [];\n let literalIndex = 0;\n let fenceIndex = 0;\n let htmlIndex = 0;\n let interactionIndex = 0;\n let position = 0;\n let resumedProse = false;\n let resumedLiterals: ReturnType<typeof resumedProseLiteralIndex> | undefined;\n while (position < source.length) {\n while (analysis.fences[fenceIndex]?.end <= position) fenceIndex += 1;\n const sourceFence = analysis.fences[fenceIndex];\n if (sourceFence?.start === position) {\n matches.push({ ...sourceFence, type: \"markdown\" });\n actualLiterals.push(sourceFence);\n position = sourceFence.end;\n continue;\n }\n while (literals[literalIndex]?.end <= position) literalIndex += 1;\n const literal = literals[literalIndex];\n if (literal && literal.start <= position) {\n actualLiterals.push(literal);\n position = literal.end;\n continue;\n }\n while (analysis.html[htmlIndex]?.end <= position) htmlIndex += 1;\n const html = analysis.html[htmlIndex];\n if (resumedProse && html && html.start <= position) {\n const fence = findResumedProseFence(source, position);\n if (fence) {\n matches.push(fence);\n actualLiterals.push(fence);\n // The source HTML AST can misread code-internal link/image syntax as\n // pending metadata that extends past this fence into later prose.\n while (literals[literalIndex]?.start < fence.end) literalIndex += 1;\n position = fence.end;\n continue;\n }\n if (source[position] === \"`\" || source[position] === \"$\")\n resumedLiterals ??= resumedProseLiteralIndex(source);\n const proseLiteral =\n resumedLiterals &&\n findResumedProseLiteralEnd(source, position, resumedLiterals);\n if (proseLiteral) {\n if (proseLiteral.end !== undefined)\n actualLiterals.push({ start: position, end: proseLiteral.end });\n position = proseLiteral.end ?? proseLiteral.markerEnd;\n continue;\n }\n }\n if (source[position] === \"!\" && !isEscaped(source, position)) {\n STREAMING_MARKDOWN_IMAGE_PATTERN.lastIndex = position;\n const image = STREAMING_MARKDOWN_IMAGE_PATTERN.exec(source);\n if (image) {\n matches.push({\n start: position,\n end: position + image[0].length,\n type: \"markdown\",\n });\n position += image[0].length;\n continue;\n }\n }\n if (source[position] !== \"<\" || isEscaped(source, position)) {\n position += 1;\n continue;\n }\n const markup = readHtmlMarkup(source, position);\n while (analysis.interactions[interactionIndex]?.end <= position)\n interactionIndex += 1;\n const control = analysis.interactions[interactionIndex];\n const controlBoundary =\n html?.start === position && control && control.start >= html.end\n ? html.end\n : undefined;\n if (isStreamingSandboxStart(source, position)) {\n const video = findStreamingVideoIframeMatch(source, position);\n const nativeRoot = isNativeMarkdownHtmlStart(source, position);\n let end =\n video?.end ??\n (nativeRoot\n ? findStreamingHtmlElementEnd(source, position)\n : findStreamingHtmlBlockEnd(source, position, (nextRoot) => {\n const nextVideo = findStreamingVideoIframeMatch(source, nextRoot);\n return (\n Boolean(nextVideo && !nextVideo.pending) ||\n isNativeMarkdownHtmlStart(source, nextRoot)\n );\n }));\n // A marker example in a raw HTML closing line keeps that line's native\n // context. Splitting it into fresh Markdown could make it own a later question.\n if (\n html?.start === position &&\n (markup.kind === \"declaration\" ||\n (markup.kind === \"tag\" &&\n [\"script\", \"style\", \"pre\", \"textarea\"].includes(markup.name))) &&\n analysis.documentVariables.some(\n (marker) => marker.start >= end && marker.start < html.end\n )\n )\n end = Math.max(end, html.end);\n // Native Markdown can end an incomplete HTML block before a real control.\n // The streaming HTML scanner must not move that control into its sandbox.\n const crossesControlBoundary =\n controlBoundary !== undefined && end > controlBoundary;\n const pendingHtml =\n crossesControlBoundary &&\n (markup.kind === \"incomplete\" ||\n (markup.kind === \"tag\" &&\n [\"script\", \"style\", \"pre\", \"textarea\"].includes(markup.name) &&\n analysis.documentVariables.some(\n (marker) => marker.start > position && marker.start < markup.end\n )));\n if (crossesControlBoundary) end = controlBoundary;\n const nativeHtml =\n nativeRoot &&\n !pendingHtml &&\n !containsWidgetResources(source, position, end);\n matches.push({\n start: position,\n end,\n type: video || nativeHtml ? \"markdown\" : \"sandbox\",\n ...(video?.immediate || nativeHtml ? { immediate: true as const } : {}),\n ...(video?.pending ||\n pendingHtml ||\n (nativeHtml && markup.kind === \"incomplete\")\n ? { pending: true as const }\n : {}),\n });\n position = end;\n resumedProse = true;\n continue;\n }\n if (markup.kind === \"tag\") {\n if (!markup.closing && (markup.name === \"svg\" || markup.name === \"img\")) {\n const end =\n markup.name === \"img\"\n ? markup.end\n : findStreamingHtmlElementEnd(source, position);\n matches.push({ start: position, end, type: \"markdown\" });\n position = end;\n } else if (!markup.closing && isHtmlRawTextTag(markup.name)) {\n const end = findStreamingHtmlElementEnd(source, position);\n if (controlBoundary !== undefined && end > controlBoundary) {\n matches.push({\n start: position,\n end: controlBoundary,\n type: \"sandbox\",\n pending: true,\n });\n position = controlBoundary;\n continue;\n }\n actualLiterals.push({ start: position, end });\n position = end;\n } else {\n position = markup.end;\n }\n } else if (markup.kind === \"comment\" || markup.kind === \"declaration\") {\n if (markup.kind === \"comment\")\n actualLiterals.push({ start: position, end: markup.end });\n position = markup.end;\n } else if (markup.kind === \"incomplete\") {\n if (controlBoundary !== undefined) {\n matches.push({\n start: position,\n end: controlBoundary,\n type: \"sandbox\",\n pending: true,\n });\n position = controlBoundary;\n continue;\n }\n // The rest belongs to this unfinished token, including quoted attributes.\n if (/^<svg(?=[\\s/>])/i.test(source.slice(position)))\n matches.push({ start: position, end: source.length, type: \"markdown\" });\n position = source.length;\n } else {\n position += 1;\n }\n }\n const tables = streamingTableRanges(source, actualLiterals, matches);\n const orderedMatches: StreamingMatch[] = [];\n let tableIndex = 0;\n for (const match of matches) {\n while (tables[tableIndex]?.start < match.start)\n orderedMatches.push(tables[tableIndex++]);\n orderedMatches.push(match);\n }\n orderedMatches.push(...tables.slice(tableIndex));\n\n const segments: RenderSegment[] = [];\n let cursor = 0;\n for (const match of orderedMatches) {\n if (match.start < cursor) continue;\n if (keepText && match.start > cursor)\n segments.push({ type: \"text\", value: source.slice(cursor, match.start) });\n if (match.type === \"sandbox\")\n appendStreamingSandbox(source, match, segments);\n else\n segments.push({\n type: \"markdown\",\n value: source.slice(match.start, match.end),\n ...(match.immediate ? { immediate: true as const } : {}),\n ...(match.pending ? { pending: true as const } : {}),\n });\n cursor = match.end;\n }\n if (keepText && cursor < source.length)\n segments.push({ type: \"text\", value: source.slice(cursor) });\n return segments;\n};\n\n// Split incoming markdown content into markdown and sandbox HTML segments.\n// Streaming always scans the received source in absolute coordinates. The legacy\n// projection below keeps the public non-streaming splitter's existing behavior.\nexport const splitContentSegments = (\n raw: string,\n keepText = false,\n streaming = false,\n sourceAnalysis?: MarkdownSourceAnalysis\n): RenderSegment[] => {\n if (streaming)\n return splitStreamingContent(\n raw,\n keepText,\n sourceAnalysis ?? getMarkdownSourceAnalysis(raw)\n );\n const source = normalizeQuotedMermaidContent(raw, keepText);\n const finalizeSegments = (segments: RenderSegment[]) =>\n splitCustomButtonsFromSandbox(segments);\n const hasText = (value: string) => Boolean(value.trim());\n const analysis = getMarkdownSourceAnalysis(source);\n const variables = analysis.variables;\n const codeRanges = getInlineCodeRanges(source);\n const fenceBlock = extractFirstFenceBlock(source, variables);\n const fenceRanges = [\n ...getFenceRanges(source, variables),\n ...codeRanges,\n ...variables,\n ];\n const sandboxStartIndex = findFirstMatchOutsideFence(\n source,\n SANDBOX_START_PATTERN,\n fenceRanges\n );\n\n if (fenceBlock) {\n if (!fenceBlock.complete) {\n return finalizeSegments([\n { type: \"markdown\", value: keepText ? source : fenceBlock.block },\n ]);\n }\n if (!keepText)\n return finalizeSegments([{ type: \"markdown\", value: fenceBlock.block }]);\n\n const segments: RenderSegment[] = [];\n const before = normalizeBeforeFenceText(source.slice(0, fenceBlock.start));\n if (hasText(before)) segments.push({ type: \"text\", value: before });\n segments.push({ type: \"markdown\", value: fenceBlock.block });\n const after = source.slice(fenceBlock.end);\n if (hasText(after)) segments.push(...splitContentSegments(after, true));\n return finalizeSegments(segments);\n }\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 if (keepText) {\n const segments: RenderSegment[] = [];\n if (hasText(before)) segments.push({ type: \"text\", value: before });\n segments.push({ type: \"markdown\", value: svgBlock });\n if (hasText(after)) segments.push(...splitContentSegments(after, true));\n return finalizeSegments(segments);\n }\n if (closeIdx === -1)\n return finalizeSegments([{ type: \"markdown\", value: svgBlock }]);\n }\n\n const tableBlock = extractTableBlock(source, variables);\n if (tableBlock) {\n const segments: RenderSegment[] = [];\n const before = source.slice(0, tableBlock.start);\n if (keepText && hasText(before))\n segments.push(...splitContentSegments(before, true));\n segments.push({ type: \"markdown\", value: tableBlock.block });\n const after = source.slice(tableBlock.end);\n if (hasText(after) && after.length < source.length)\n segments.push(...splitContentSegments(after, keepText));\n return finalizeSegments(segments);\n }\n\n const inlineCandidate = pickEarliestMatch(\n findInlineSandboxMatch(source, variables),\n findMarkdownImageMatch(source, fenceRanges),\n findMarkdownVideoIframeMatch(source, fenceRanges)\n );\n if (sandboxStartIndex === -1 && !inlineCandidate)\n return keepText && hasText(source) ? [{ type: \"text\", value: source }] : [];\n\n const shouldUseInline =\n !!inlineCandidate &&\n (sandboxStartIndex === -1 || inlineCandidate.start <= sandboxStartIndex);\n const startIndex = shouldUseInline\n ? inlineCandidate!.start\n : sandboxStartIndex;\n const blockEnd = shouldUseInline\n ? inlineCandidate!.end\n : findHtmlBlockEnd(source, startIndex);\n const matchedBlock = source.slice(startIndex, blockEnd);\n const isVideo = shouldUseInline && isMarkdownVideoIframe(matchedBlock);\n const before = isVideo\n ? source.slice(0, startIndex).trimEnd()\n : source.slice(0, startIndex);\n const after = isVideo\n ? source.slice(blockEnd).trimStart()\n : source.slice(blockEnd);\n const segments: RenderSegment[] = [];\n if (keepText && hasText(before))\n segments.push({ type: \"text\", value: before });\n segments.push({\n type: shouldUseInline ? \"markdown\" : \"sandbox\",\n value: matchedBlock,\n });\n if (hasText(after)) segments.push(...splitContentSegments(after, keepText));\n return finalizeSegments(segments);\n};\n"],"names":["SANDBOX_START_PATTERN","STREAMING_SANDBOX_ROOTS","NATIVE_MARKDOWN_HTML_ROOTS","WIDGET_RESOURCE_ROOTS","INLINE_SANDBOX_PATTERNS","MARKDOWN_IMAGE_PATTERN","STREAMING_MARKDOWN_IMAGE_PATTERN","MARKDOWN_VIDEO_IFRAME_PATTERN","closingBoundary","CUSTOM_BUTTON_PATTERN","WRAPPED_QUOTES_PATTERN","MERMAID_BLOCK_PATTERN","firstNonEmptyLine","content","line","extractFirstFenceBlock","raw","variables","nextFence","from","index","isIndexInRanges","start","closing","normalizeBeforeFenceText","before","nonEmptyLines","normalizeQuotedMermaidContent","keepText","preserveFenceLines","unwrapped","mermaidMatch","after","leadingLine","trailingLine","boundary","normalizeWrappedSandboxContent","splitContentSegments","segment","getFenceRanges","ranges","positions","match","position","isEscaped","backslashes","i","end","findFirstMatchOutsideFence","pattern","fenceRanges","flags","matcher","findHtmlBlockEnd","startIndex","blockEnd","splitCustomButtonsFromSandbox","segments","output","lastIndex","rest","findInlineSandboxMatch","codeRanges","earliest","pickEarliestMatch","matches","findMarkdownImageMatch","findMarkdownVideoIframeMatch","isMarkdownVideoIframe","value","findStreamingVideoIframeMatch","prefix","nameMatch","name","pending","attributesStart","quote","openingEnd","character","attributes","attributePattern","attribute","isVideo","extractTableBlock","tablePattern","tableMatch","tableStart","leadingSpaces","lines","tableLines","block","isStreamingSandboxStart","source","isNativeMarkdownHtmlStart","containsWidgetResources","markup","readHtmlMarkup","resourceName","isHtmlRawTextTag","findStreamingHtmlElementEnd","resumedProseLiteralIndex","nextClosing","delimiters","nextByMarker","marker","next","boundaries","offset","contentStart","findResumedProseLiteralEnd","width","markerEnd","low","high","middle","appendStreamingSandbox","streamingTableRanges","literals","tables","literalIndex","matchIndex","literal","splitStreamingContent","analysis","comments","range","actualLiterals","fenceIndex","htmlIndex","interactionIndex","resumedProse","resumedLiterals","sourceFence","html","fence","findResumedProseFence","proseLiteral","image","control","controlBoundary","video","nativeRoot","findStreamingHtmlBlockEnd","nextRoot","nextVideo","crossesControlBoundary","pendingHtml","nativeHtml","orderedMatches","tableIndex","cursor","streaming","sourceAnalysis","getMarkdownSourceAnalysis","finalizeSegments","hasText","getInlineCodeRanges","fenceBlock","sandboxStartIndex","svgOpenIndex","hasSandboxBeforeSvg","markdownImageBeforeSvg","hasMarkdownImageBeforeSvg","closeIdx","svgBlock","tableBlock","inlineCandidate","shouldUseInline","matchedBlock"],"mappings":"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"}
|