markdown-flow-ui 0.1.126 → 0.1.128-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.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
2
2
  //# sourceMappingURL=index.cjs8.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
2
2
  //# sourceMappingURL=index.cjs9.js.map
@@ -1,5 +1,5 @@
1
- var s = { exports: {} };
1
+ var r = {};
2
2
  export {
3
- s as __module
3
+ r as __exports
4
4
  };
5
5
  //# sourceMappingURL=index.es8.js.map
@@ -1,5 +1,5 @@
1
- var r = {};
1
+ var s = { exports: {} };
2
2
  export {
3
- r as __exports
3
+ s as __module
4
4
  };
5
5
  //# sourceMappingURL=index.es9.js.map
@@ -1,2 +1,4 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const O=require("../../../node_modules/@codemirror/view/dist/index.cjs.js"),j=require("../../../node_modules/@codemirror/state/dist/index.cjs.js"),A=require("../utils.cjs.js"),w=/\{\{.*?\}\}/g,C=/<!--[\s\S]*?-->/g,E=/===.*?===/g,q=/\?\[(.*?)\]/g;function F(c){const k=new j.RangeSetBuilder,h=c.state.doc.toString(),S=[],I=[];C.lastIndex=0,E.lastIndex=0,q.lastIndex=0;const M=(t,n)=>I.some(a=>!(n<=a.from||t>=a.to)),p=(t,n)=>c.state.selection.ranges.some(a=>a.from>=t&&a.to<=n),i=(t,n,a)=>t>=n||M(t,n)?!1:(I.push({from:t,to:n}),S.push({from:t,to:n,className:a}),!0),y=t=>{if(!t.slice(2,-2).trim())return{className:"syntax-variable-invalid",valid:!1};const r=A.createVariableExpressionRegexp().exec(t),d=!!r&&r.index===0&&r[0]===t;return{className:d?"syntax-variable":"syntax-variable-invalid",valid:d}};let s;for(;(s=C.exec(h))!==null;)i(s.index,s.index+s[0].length,"syntax-comment");const W=c.state.doc.lines;let b=null;for(let t=1;t<=W;t++){const n=c.state.doc.line(t);if(n.text.trim()==="!==="){if(!b){b={from:n.from,line:t};continue}const r=b.from,d=n.to;i(r,d,"syntax-fixed"),b=null}}for(;(s=E.exec(h))!==null;){const t=s.index;t>0&&h[t-1]==="!"||i(t,t+s[0].length,"syntax-fixed")}for(w.lastIndex=0;(s=q.exec(h))!==null;){const t=s.index,n=s.index+s[0].length,a=s[1],r=t+2;if(!M(t,n))if(i(t,t+1,"syntax-keyword"),i(t+1,t+2,"syntax-bracket"),i(n-1,n,"syntax-bracket"),a.startsWith("%")){const d=/\{\{.*?\}\}/g,x=d.exec(a);d.lastIndex=0;let m="syntax-percent-invalid";if(x){const e=y(x[0]),l=r+x.index,P=l+x[0].length,_=p(l,P);m=e.valid&&!_?"syntax-percent-valid":"syntax-percent-invalid"}i(r,r+1,m);const v=[],N=[],R=[],V=/(\|\||\||\.\.\.)/g;let f;for(;(f=V.exec(a))!==null;)v.push({from:r+f.index,to:r+f.index+f[0].length});let o;const u=/\{\{.*?\}\}/g;for(;(o=u.exec(a))!==null;){const e=o[0],l=y(e);N.push({from:r+o.index,to:r+o.index+e.length,className:l.className})}const B=[...v.map(e=>({...e,className:"syntax-keyword"})),...N.map(e=>({...e,className:e.className}))].sort((e,l)=>e.from!==l.from?e.from-l.from:e.to-l.to);for(const e of B)e.className.startsWith("syntax-variable")&&p(e.from,e.to)||i(e.from,e.to,e.className)&&R.push({from:e.from,to:e.to});const D=r+1,T=n-1;let g=D;const H=R.sort((e,l)=>e.from!==l.from?e.from-l.from:e.to-l.to);for(const e of H)g<e.from&&i(g,e.from,"syntax-string"),g=Math.max(g,e.to);g<T&&i(g,T,"syntax-string")}else{const d=[],x=[];let m;const v=/\{\{.*?\}\}/g;for(;(m=v.exec(a))!==null;){const o=m[0],u=y(o);d.push({from:r+m.index,to:r+m.index+o.length,className:u.className})}const N=d.sort((o,u)=>o.from!==u.from?o.from-u.from:o.to-u.to);for(const o of N)o.className.startsWith("syntax-variable")&&p(o.from,o.to)||i(o.from,o.to,o.className)&&x.push({from:o.from,to:o.to});const R=r,V=n-1;let f=R;for(const o of x)f<o.from&&i(f,o.from,"syntax-button-text"),f=Math.max(f,o.to);f<V&&i(f,V,"syntax-button-text")}}for(w.lastIndex=0;(s=w.exec(h))!==null;){const t=s[0],n=y(t);n.valid&&!p(s.index,s.index+s[0].length)&&i(s.index,s.index+s[0].length,n.className)}S.sort((t,n)=>t.from!==n.from?t.from-n.from:n.to-t.to);for(const t of S)if(t.from<t.to)try{k.add(t.from,t.to,O.Decoration.mark({class:t.className}))}catch(n){console.warn("SyntaxHighlighter: Failed to add decoration",t,n)}return k.finish()}const $=O.ViewPlugin.fromClass(class{constructor(c){this.decorations=F(c)}update(c){(c.docChanged||c.viewportChanged||c.selectionSet)&&(this.decorations=F(c.view))}},{decorations:c=>c.decorations});exports.default=$;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const E=require("../../../node_modules/@codemirror/view/dist/index.cjs.js"),D=require("../../../node_modules/@codemirror/state/dist/index.cjs.js"),_=require("../utils.cjs.js"),V=/\{\{.*?\}\}/g,M=/<!--[\s\S]*?-->/g,O=/\?\[(.*?)\]/g;function j(t){const l=[];let c=null,f=0;for(;f<=t.length;){const s=t.indexOf(`
2
+ `,f),e=s===-1?t.length:s;if(t.slice(f,e).trim()==="!==="&&(c===null?c=f:(l.push({from:c,to:e,className:"syntax-fixed"}),c=null)),s===-1)break;f=s+1}return l}function A(t,l){const c=[];let f=0;const s=u=>{for(;f<l.length&&l[f].to<=u;)f++;const m=l[f];return!!m&&u>=m.from&&u<m.to};let e=0;for(;e<=t.length;){const u=t.indexOf(`
3
+ `,e),m=u===-1?t.length:u,n=t.slice(e,m),r=[];let g=0;for(;g<n.length;){const a=n.indexOf("===",g);if(a===-1)break;const x=e+a;!(x>0&&t[x-1]==="!")&&!s(x)&&r.push(x),g=a+3}for(let a=0;a+1<r.length;a+=2)c.push({from:r[a],to:r[a+1]+3,className:"syntax-fixed"});if(u===-1)break;e=u+1}return c}function L(t){const l=[];let c;for(M.lastIndex=0;(c=M.exec(t))!==null;)l.push({from:c.index,to:c.index+c[0].length,className:"syntax-comment"});return l}function F(t){const l=L(t),c=[...j(t),...A(t,l),...l].sort((s,e)=>s.from!==e.from?s.from-e.from:e.to-s.to),f=[];for(const s of c){const e=f[f.length-1];(!e||s.from>=e.to)&&f.push(s)}return f}function B(t,l=()=>!1){const c=[],f=[];O.lastIndex=0;const s=(n,r)=>f.some(g=>!(r<=g.from||n>=g.to)),e=(n,r,g)=>n>=r||s(n,r)?!1:(f.push({from:n,to:r}),c.push({from:n,to:r,className:g}),!0),u=n=>{if(!n.slice(2,-2).trim())return{className:"syntax-variable-invalid",valid:!1};const a=_.createVariableExpressionRegexp().exec(n),x=!!a&&a.index===0&&a[0]===n;return{className:x?"syntax-variable":"syntax-variable-invalid",valid:x}};let m;for(const n of F(t))e(n.from,n.to,n.className);for(;(m=O.exec(t))!==null;){const n=m.index,r=m.index+m[0].length,g=m[1],a=n+2;if(!s(n,r))if(e(n,n+1,"syntax-keyword"),e(n+1,n+2,"syntax-bracket"),e(r-1,r,"syntax-bracket"),g.startsWith("%")){const x=/\{\{.*?\}\}/g,p=x.exec(g);x.lastIndex=0;let y="syntax-percent-invalid";if(p){const o=u(p[0]),h=a+p.index,P=h+p[0].length,W=l(h,P);y=o.valid&&!W?"syntax-percent-valid":"syntax-percent-invalid"}e(a,a+1,y);const R=[],N=[],k=[],w=/(\|\||\||\.\.\.)/g;let d;for(;(d=w.exec(g))!==null;)R.push({from:a+d.index,to:a+d.index+d[0].length});let i;const b=/\{\{.*?\}\}/g;for(;(i=b.exec(g))!==null;){const o=i[0],h=u(o);N.push({from:a+i.index,to:a+i.index+o.length,className:h.className})}const H=[...R.map(o=>({...o,className:"syntax-keyword"})),...N.map(o=>({...o,className:o.className}))].sort((o,h)=>o.from!==h.from?o.from-h.from:o.to-h.to);for(const o of H)o.className.startsWith("syntax-variable")&&l(o.from,o.to)||e(o.from,o.to,o.className)&&k.push({from:o.from,to:o.to});const q=a+1,S=r-1;let v=q;const C=k.sort((o,h)=>o.from!==h.from?o.from-h.from:o.to-h.to);for(const o of C)v<o.from&&e(v,o.from,"syntax-string"),v=Math.max(v,o.to);v<S&&e(v,S,"syntax-string")}else{const x=[],p=[];let y;const R=/\{\{.*?\}\}/g;for(;(y=R.exec(g))!==null;){const i=y[0],b=u(i);x.push({from:a+y.index,to:a+y.index+i.length,className:b.className})}const N=x.sort((i,b)=>i.from!==b.from?i.from-b.from:i.to-b.to);for(const i of N)i.className.startsWith("syntax-variable")&&l(i.from,i.to)||e(i.from,i.to,i.className)&&p.push({from:i.from,to:i.to});const k=a,w=r-1;let d=k;for(const i of p)d<i.from&&e(d,i.from,"syntax-button-text"),d=Math.max(d,i.to);d<w&&e(d,w,"syntax-button-text")}}for(V.lastIndex=0;(m=V.exec(t))!==null;){const n=m[0],r=u(n);r.valid&&!l(m.index,m.index+m[0].length)&&e(m.index,m.index+m[0].length,r.className)}return c.sort((n,r)=>n.from!==r.from?n.from-r.from:r.to-n.to),c}function I(t){const l=new D.RangeSetBuilder,c=t.state.doc.toString(),f=B(c,(s,e)=>t.state.selection.ranges.some(u=>u.from>=s&&u.to<=e));for(const s of f)if(s.from<s.to)try{l.add(s.from,s.to,E.Decoration.mark({class:s.className}))}catch(e){console.warn("SyntaxHighlighter: Failed to add decoration",s,e)}return l.finish()}const $=E.ViewPlugin.fromClass(class{constructor(t){this.decorations=I(t)}update(t){(t.docChanged||t.viewportChanged||t.selectionSet)&&(this.decorations=I(t.view))}},{decorations:t=>t.decorations});exports.collectOuterBlockRanges=F;exports.collectSyntaxHighlightRanges=B;exports.default=$;
2
4
  //# sourceMappingURL=SyntaxHighlighter.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyntaxHighlighter.cjs.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.ts"],"sourcesContent":["import {\n Decoration,\n DecorationSet,\n EditorView,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport { createVariableExpressionRegexp } from \"../utils\";\n\nconst broadVariableRegex = /\\{\\{.*?\\}\\}/g;\nconst commentRegex = /<!--[\\s\\S]*?-->/g;\nconst fixedOutputRegex = /===.*?===/g;\nconst controlBlockRegex = /\\?\\[(.*?)\\]/g;\n\nfunction buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const docText = view.state.doc.toString();\n\n const matches: { from: number; to: number; className: string }[] = [];\n const occupied: { from: number; to: number }[] = [];\n\n commentRegex.lastIndex = 0;\n fixedOutputRegex.lastIndex = 0;\n controlBlockRegex.lastIndex = 0;\n\n // Prevent overlapping decorations so styling stays deterministic\n const isOverlapping = (from: number, to: number) =>\n occupied.some((range) => !(to <= range.from || from >= range.to));\n\n const isCursorInside = (from: number, to: number) => {\n return view.state.selection.ranges.some((range) => {\n return range.from >= from && range.to <= to;\n });\n };\n\n const addMatch = (from: number, to: number, className: string) => {\n if (from >= to) return false;\n if (isOverlapping(from, to)) return false;\n occupied.push({ from, to });\n matches.push({ from, to, className });\n return true;\n };\n\n const classifyVariable = (raw: string) => {\n const inner = raw.slice(2, -2).trim();\n if (!inner) return { className: \"syntax-variable-invalid\", valid: false };\n const strict = createVariableExpressionRegexp();\n const strictMatch = strict.exec(raw);\n const valid =\n !!strictMatch && strictMatch.index === 0 && strictMatch[0] === raw;\n return {\n className: valid ? \"syntax-variable\" : \"syntax-variable-invalid\",\n valid,\n };\n };\n\n // 1. Comments\n let match;\n while ((match = commentRegex.exec(docText)) !== null) {\n addMatch(match.index, match.index + match[0].length, \"syntax-comment\");\n }\n\n // 2. Fixed Output (Multiline) - only when both markers are alone on their lines\n const lineCount = view.state.doc.lines;\n let pendingStart: { from: number; line: number } | null = null;\n for (let i = 1; i <= lineCount; i++) {\n const lineInfo = view.state.doc.line(i);\n const trimmed = lineInfo.text.trim();\n if (trimmed === \"!===\") {\n if (!pendingStart) {\n pendingStart = { from: lineInfo.from, line: i };\n continue;\n }\n const startFrom = pendingStart.from;\n const endTo = lineInfo.to;\n addMatch(startFrom, endTo, \"syntax-fixed\");\n pendingStart = null;\n }\n }\n\n // 3. Fixed Output (Single line, skip \"!===...!===\")\n while ((match = fixedOutputRegex.exec(docText)) !== null) {\n const startIndex = match.index;\n const isNegated = startIndex > 0 && docText[startIndex - 1] === \"!\";\n if (isNegated) {\n continue;\n }\n addMatch(startIndex, startIndex + match[0].length, \"syntax-fixed\");\n }\n\n // 4. Control Blocks\n broadVariableRegex.lastIndex = 0;\n while ((match = controlBlockRegex.exec(docText)) !== null) {\n const fullStart = match.index;\n const fullEnd = match.index + match[0].length;\n const content = match[1];\n const contentStart = fullStart + 2; // after ?[\n if (isOverlapping(fullStart, fullEnd)) {\n continue;\n }\n\n // Outer brackets and question mark\n addMatch(fullStart, fullStart + 1, \"syntax-keyword\"); // ?\n addMatch(fullStart + 1, fullStart + 2, \"syntax-bracket\"); // [\n addMatch(fullEnd - 1, fullEnd, \"syntax-bracket\"); // ]\n\n if (content.startsWith(\"%\")) {\n // Input / Select\n const contentVariableRegex = /\\{\\{.*?\\}\\}/g;\n const firstVariableMatch = contentVariableRegex.exec(content);\n contentVariableRegex.lastIndex = 0;\n let percentClass = \"syntax-percent-invalid\";\n if (firstVariableMatch) {\n const classification = classifyVariable(firstVariableMatch[0]);\n const varFrom = contentStart + firstVariableMatch.index;\n const varTo = varFrom + firstVariableMatch[0].length;\n const cursorInsideVar = isCursorInside(varFrom, varTo);\n percentClass =\n classification.valid && !cursorInsideVar\n ? \"syntax-percent-valid\"\n : \"syntax-percent-invalid\";\n }\n addMatch(contentStart, contentStart + 1, percentClass); // %\n\n const operatorRanges: { from: number; to: number }[] = [];\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedTokenRanges: { from: number; to: number }[] = [];\n\n // Inner operators | || ...\n const innerRegex = /(\\|\\||\\||\\.\\.\\.)/g;\n let innerMatch;\n while ((innerMatch = innerRegex.exec(content)) !== null) {\n operatorRanges.push({\n from: contentStart + innerMatch.index,\n to: contentStart + innerMatch.index + innerMatch[0].length,\n });\n }\n\n // Variables inside control block content\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const allTokens = [\n ...operatorRanges.map((range) => ({\n ...range,\n className: \"syntax-keyword\",\n })),\n ...variableRanges.map((range) => ({\n ...range,\n className: range.className,\n })),\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of allTokens) {\n if (\n token.className.startsWith(\"syntax-variable\") &&\n isCursorInside(token.from, token.to)\n ) {\n continue;\n }\n if (addMatch(token.from, token.to, token.className)) {\n appliedTokenRanges.push({ from: token.from, to: token.to });\n }\n }\n\n // Content (Dark Blue) for remaining text segments\n const stringStart = contentStart + 1;\n const stringEnd = fullEnd - 1;\n let cursor = stringStart;\n const sortedApplied = appliedTokenRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of sortedApplied) {\n if (cursor < token.from) {\n addMatch(cursor, token.from, \"syntax-string\");\n }\n cursor = Math.max(cursor, token.to);\n }\n if (cursor < stringEnd) {\n addMatch(cursor, stringEnd, \"syntax-string\");\n }\n } else {\n // Button ?[text]\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedVariableRanges: { from: number; to: number }[] = [];\n\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const sortedVariables = variableRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const variable of sortedVariables) {\n if (\n variable.className.startsWith(\"syntax-variable\") &&\n isCursorInside(variable.from, variable.to)\n ) {\n continue;\n }\n if (addMatch(variable.from, variable.to, variable.className)) {\n appliedVariableRanges.push({ from: variable.from, to: variable.to });\n }\n }\n\n const buttonTextStart = contentStart;\n const buttonTextEnd = fullEnd - 1;\n let cursor = buttonTextStart;\n\n for (const variable of appliedVariableRanges) {\n if (cursor < variable.from) {\n addMatch(cursor, variable.from, \"syntax-button-text\");\n }\n cursor = Math.max(cursor, variable.to);\n }\n if (cursor < buttonTextEnd) {\n addMatch(cursor, buttonTextEnd, \"syntax-button-text\");\n }\n }\n }\n\n // 5. Variables (only if not already decorated; invalid ones stay default outside control blocks)\n broadVariableRegex.lastIndex = 0;\n while ((match = broadVariableRegex.exec(docText)) !== null) {\n const text = match[0];\n const classification = classifyVariable(text);\n if (\n classification.valid &&\n !isCursorInside(match.index, match.index + match[0].length)\n ) {\n addMatch(\n match.index,\n match.index + match[0].length,\n classification.className\n );\n }\n }\n\n // Sort matches by 'from' asc, then 'to' desc (longest first)\n matches.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n for (const m of matches) {\n if (m.from < m.to) {\n try {\n builder.add(m.from, m.to, Decoration.mark({ class: m.className }));\n } catch (e) {\n console.warn(\"SyntaxHighlighter: Failed to add decoration\", m, e);\n }\n }\n }\n\n return builder.finish();\n}\n\nconst SyntaxHighlighter = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (instance) => instance.decorations,\n }\n);\n\nexport default SyntaxHighlighter;\n"],"names":["broadVariableRegex","commentRegex","fixedOutputRegex","controlBlockRegex","buildDecorations","view","builder","RangeSetBuilder","docText","matches","occupied","isOverlapping","from","to","range","isCursorInside","addMatch","className","classifyVariable","raw","strictMatch","createVariableExpressionRegexp","valid","match","lineCount","pendingStart","i","lineInfo","startFrom","endTo","startIndex","fullStart","fullEnd","content","contentStart","contentVariableRegex","firstVariableMatch","percentClass","classification","varFrom","varTo","cursorInsideVar","operatorRanges","variableRanges","appliedTokenRanges","innerRegex","innerMatch","innerVariableMatch","innerVariableRegex","rawVariable","allTokens","a","b","token","stringStart","stringEnd","cursor","sortedApplied","appliedVariableRanges","sortedVariables","variable","buttonTextStart","buttonTextEnd","text","m","Decoration","e","SyntaxHighlighter","ViewPlugin","update","instance"],"mappings":"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"}
1
+ {"version":3,"file":"SyntaxHighlighter.cjs.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.ts"],"sourcesContent":["import {\n Decoration,\n DecorationSet,\n EditorView,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport { createVariableExpressionRegexp } from \"../utils\";\n\nconst broadVariableRegex = /\\{\\{.*?\\}\\}/g;\nconst commentRegex = /<!--[\\s\\S]*?-->/g;\nconst controlBlockRegex = /\\?\\[(.*?)\\]/g;\n\nexport interface SyntaxHighlightRange {\n from: number;\n to: number;\n className: string;\n}\n\nfunction collectMultilineFixedOutputRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let pendingStart: number | null = null;\n let lineStart = 0;\n\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n\n if (lineText.trim() === \"!===\") {\n if (pendingStart === null) {\n pendingStart = lineStart;\n } else {\n ranges.push({\n from: pendingStart,\n to: lineEnd,\n className: \"syntax-fixed\",\n });\n pendingStart = null;\n }\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectSingleLineFixedOutputRanges(\n docText: string,\n commentRanges: SyntaxHighlightRange[]\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let commentIndex = 0;\n\n const isInsideComment = (index: number) => {\n while (\n commentIndex < commentRanges.length &&\n commentRanges[commentIndex].to <= index\n ) {\n commentIndex++;\n }\n\n const range = commentRanges[commentIndex];\n return !!range && index >= range.from && index < range.to;\n };\n\n let lineStart = 0;\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n const markerPositions: number[] = [];\n let searchFrom = 0;\n\n while (searchFrom < lineText.length) {\n const markerOffset = lineText.indexOf(\"===\", searchFrom);\n if (markerOffset === -1) {\n break;\n }\n\n const markerIndex = lineStart + markerOffset;\n const isNegated = markerIndex > 0 && docText[markerIndex - 1] === \"!\";\n if (!isNegated && !isInsideComment(markerIndex)) {\n markerPositions.push(markerIndex);\n }\n\n searchFrom = markerOffset + 3;\n }\n\n for (let i = 0; i + 1 < markerPositions.length; i += 2) {\n ranges.push({\n from: markerPositions[i],\n to: markerPositions[i + 1] + 3,\n className: \"syntax-fixed\",\n });\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectCommentRanges(docText: string): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let match;\n\n commentRegex.lastIndex = 0;\n while ((match = commentRegex.exec(docText)) !== null) {\n ranges.push({\n from: match.index,\n to: match.index + match[0].length,\n className: \"syntax-comment\",\n });\n }\n\n return ranges;\n}\n\n/**\n * Collects non-overlapping fixed-output and comment wrapper ranges.\n *\n * @param docText - Document text to scan.\n * @returns Outer syntax highlight ranges sorted by document position.\n */\nexport function collectOuterBlockRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const commentRanges = collectCommentRanges(docText);\n const blockRanges = [\n ...collectMultilineFixedOutputRanges(docText),\n ...collectSingleLineFixedOutputRanges(docText, commentRanges),\n ...commentRanges,\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n const outerRanges: SyntaxHighlightRange[] = [];\n\n for (const range of blockRanges) {\n const lastOuter = outerRanges[outerRanges.length - 1];\n if (!lastOuter || range.from >= lastOuter.to) {\n outerRanges.push(range);\n }\n }\n\n return outerRanges;\n}\n\n/**\n * Collects all custom syntax highlight ranges for editor decorations.\n *\n * @param docText - Document text to scan.\n * @param isCursorInside - Returns true when the current cursor is inside a range.\n * @returns Non-overlapping syntax highlight ranges sorted by document position.\n */\nexport function collectSyntaxHighlightRanges(\n docText: string,\n isCursorInside: (from: number, to: number) => boolean = () => false\n): SyntaxHighlightRange[] {\n const matches: SyntaxHighlightRange[] = [];\n const occupied: { from: number; to: number }[] = [];\n\n controlBlockRegex.lastIndex = 0;\n\n // Prevent overlapping decorations so styling stays deterministic\n const isOverlapping = (from: number, to: number) =>\n occupied.some((range) => !(to <= range.from || from >= range.to));\n\n const addMatch = (from: number, to: number, className: string) => {\n if (from >= to) return false;\n if (isOverlapping(from, to)) return false;\n occupied.push({ from, to });\n matches.push({ from, to, className });\n return true;\n };\n\n const classifyVariable = (raw: string) => {\n const inner = raw.slice(2, -2).trim();\n if (!inner) return { className: \"syntax-variable-invalid\", valid: false };\n const strict = createVariableExpressionRegexp();\n const strictMatch = strict.exec(raw);\n const valid =\n !!strictMatch && strictMatch.index === 0 && strictMatch[0] === raw;\n return {\n className: valid ? \"syntax-variable\" : \"syntax-variable-invalid\",\n valid,\n };\n };\n\n let match;\n\n // 1. Outer block ranges win over any syntax inside them.\n for (const range of collectOuterBlockRanges(docText)) {\n addMatch(range.from, range.to, range.className);\n }\n\n // 2. Control Blocks\n while ((match = controlBlockRegex.exec(docText)) !== null) {\n const fullStart = match.index;\n const fullEnd = match.index + match[0].length;\n const content = match[1];\n const contentStart = fullStart + 2; // after ?[\n if (isOverlapping(fullStart, fullEnd)) {\n continue;\n }\n\n // Outer brackets and question mark\n addMatch(fullStart, fullStart + 1, \"syntax-keyword\"); // ?\n addMatch(fullStart + 1, fullStart + 2, \"syntax-bracket\"); // [\n addMatch(fullEnd - 1, fullEnd, \"syntax-bracket\"); // ]\n\n if (content.startsWith(\"%\")) {\n // Input / Select\n const contentVariableRegex = /\\{\\{.*?\\}\\}/g;\n const firstVariableMatch = contentVariableRegex.exec(content);\n contentVariableRegex.lastIndex = 0;\n let percentClass = \"syntax-percent-invalid\";\n if (firstVariableMatch) {\n const classification = classifyVariable(firstVariableMatch[0]);\n const varFrom = contentStart + firstVariableMatch.index;\n const varTo = varFrom + firstVariableMatch[0].length;\n const cursorInsideVar = isCursorInside(varFrom, varTo);\n percentClass =\n classification.valid && !cursorInsideVar\n ? \"syntax-percent-valid\"\n : \"syntax-percent-invalid\";\n }\n addMatch(contentStart, contentStart + 1, percentClass); // %\n\n const operatorRanges: { from: number; to: number }[] = [];\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedTokenRanges: { from: number; to: number }[] = [];\n\n // Inner operators | || ...\n const innerRegex = /(\\|\\||\\||\\.\\.\\.)/g;\n let innerMatch;\n while ((innerMatch = innerRegex.exec(content)) !== null) {\n operatorRanges.push({\n from: contentStart + innerMatch.index,\n to: contentStart + innerMatch.index + innerMatch[0].length,\n });\n }\n\n // Variables inside control block content\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const allTokens = [\n ...operatorRanges.map((range) => ({\n ...range,\n className: \"syntax-keyword\",\n })),\n ...variableRanges.map((range) => ({\n ...range,\n className: range.className,\n })),\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of allTokens) {\n if (\n token.className.startsWith(\"syntax-variable\") &&\n isCursorInside(token.from, token.to)\n ) {\n continue;\n }\n if (addMatch(token.from, token.to, token.className)) {\n appliedTokenRanges.push({ from: token.from, to: token.to });\n }\n }\n\n // Content (Dark Blue) for remaining text segments\n const stringStart = contentStart + 1;\n const stringEnd = fullEnd - 1;\n let cursor = stringStart;\n const sortedApplied = appliedTokenRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of sortedApplied) {\n if (cursor < token.from) {\n addMatch(cursor, token.from, \"syntax-string\");\n }\n cursor = Math.max(cursor, token.to);\n }\n if (cursor < stringEnd) {\n addMatch(cursor, stringEnd, \"syntax-string\");\n }\n } else {\n // Button ?[text]\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedVariableRanges: { from: number; to: number }[] = [];\n\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const sortedVariables = variableRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const variable of sortedVariables) {\n if (\n variable.className.startsWith(\"syntax-variable\") &&\n isCursorInside(variable.from, variable.to)\n ) {\n continue;\n }\n if (addMatch(variable.from, variable.to, variable.className)) {\n appliedVariableRanges.push({ from: variable.from, to: variable.to });\n }\n }\n\n const buttonTextStart = contentStart;\n const buttonTextEnd = fullEnd - 1;\n let cursor = buttonTextStart;\n\n for (const variable of appliedVariableRanges) {\n if (cursor < variable.from) {\n addMatch(cursor, variable.from, \"syntax-button-text\");\n }\n cursor = Math.max(cursor, variable.to);\n }\n if (cursor < buttonTextEnd) {\n addMatch(cursor, buttonTextEnd, \"syntax-button-text\");\n }\n }\n }\n\n // 3. Variables (only if not already decorated; invalid ones stay default outside control blocks)\n broadVariableRegex.lastIndex = 0;\n while ((match = broadVariableRegex.exec(docText)) !== null) {\n const text = match[0];\n const classification = classifyVariable(text);\n if (\n classification.valid &&\n !isCursorInside(match.index, match.index + match[0].length)\n ) {\n addMatch(\n match.index,\n match.index + match[0].length,\n classification.className\n );\n }\n }\n\n // Sort matches by 'from' asc, then 'to' desc (longest first)\n matches.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n return matches;\n}\n\nfunction buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const docText = view.state.doc.toString();\n const matches = collectSyntaxHighlightRanges(docText, (from, to) => {\n return view.state.selection.ranges.some((range) => {\n return range.from >= from && range.to <= to;\n });\n });\n\n for (const m of matches) {\n if (m.from < m.to) {\n try {\n builder.add(m.from, m.to, Decoration.mark({ class: m.className }));\n } catch (e) {\n console.warn(\"SyntaxHighlighter: Failed to add decoration\", m, e);\n }\n }\n }\n\n return builder.finish();\n}\n\nconst SyntaxHighlighter = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (instance) => instance.decorations,\n }\n);\n\nexport default SyntaxHighlighter;\n"],"names":["broadVariableRegex","commentRegex","controlBlockRegex","collectMultilineFixedOutputRanges","docText","ranges","pendingStart","lineStart","newlineIndex","lineEnd","collectSingleLineFixedOutputRanges","commentRanges","commentIndex","isInsideComment","index","range","lineText","markerPositions","searchFrom","markerOffset","markerIndex","i","collectCommentRanges","match","collectOuterBlockRanges","blockRanges","a","b","outerRanges","lastOuter","collectSyntaxHighlightRanges","isCursorInside","matches","occupied","isOverlapping","from","to","addMatch","className","classifyVariable","raw","strictMatch","createVariableExpressionRegexp","valid","fullStart","fullEnd","content","contentStart","contentVariableRegex","firstVariableMatch","percentClass","classification","varFrom","varTo","cursorInsideVar","operatorRanges","variableRanges","appliedTokenRanges","innerRegex","innerMatch","innerVariableMatch","innerVariableRegex","rawVariable","allTokens","token","stringStart","stringEnd","cursor","sortedApplied","appliedVariableRanges","sortedVariables","variable","buttonTextStart","buttonTextEnd","text","buildDecorations","view","builder","RangeSetBuilder","m","Decoration","SyntaxHighlighter","ViewPlugin","update","instance"],"mappings":"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"}
@@ -1,4 +1,24 @@
1
1
  import { DecorationSet, ViewPlugin, ViewUpdate } from '@codemirror/view';
2
+ export interface SyntaxHighlightRange {
3
+ from: number;
4
+ to: number;
5
+ className: string;
6
+ }
7
+ /**
8
+ * Collects non-overlapping fixed-output and comment wrapper ranges.
9
+ *
10
+ * @param docText - Document text to scan.
11
+ * @returns Outer syntax highlight ranges sorted by document position.
12
+ */
13
+ export declare function collectOuterBlockRanges(docText: string): SyntaxHighlightRange[];
14
+ /**
15
+ * Collects all custom syntax highlight ranges for editor decorations.
16
+ *
17
+ * @param docText - Document text to scan.
18
+ * @param isCursorInside - Returns true when the current cursor is inside a range.
19
+ * @returns Non-overlapping syntax highlight ranges sorted by document position.
20
+ */
21
+ export declare function collectSyntaxHighlightRanges(docText: string, isCursorInside?: (from: number, to: number) => boolean): SyntaxHighlightRange[];
2
22
  declare const SyntaxHighlighter: ViewPlugin<{
3
23
  decorations: DecorationSet;
4
24
  update(update: ViewUpdate): void;
@@ -1,139 +1,199 @@
1
- import { ViewPlugin as j, Decoration as q } from "../../../node_modules/@codemirror/view/dist/index.es.js";
2
- import { RangeSetBuilder as z } from "../../../node_modules/@codemirror/state/dist/index.es.js";
3
- import { createVariableExpressionRegexp as G } from "../utils.es.js";
4
- const S = /\{\{.*?\}\}/g, C = /<!--[\s\S]*?-->/g, E = /===.*?===/g, F = /\?\[(.*?)\]/g;
5
- function W(c) {
6
- const k = new z(), h = c.state.doc.toString(), w = [], I = [];
7
- C.lastIndex = 0, E.lastIndex = 0, F.lastIndex = 0;
8
- const M = (t, n) => I.some((a) => !(n <= a.from || t >= a.to)), p = (t, n) => c.state.selection.ranges.some((a) => a.from >= t && a.to <= n), i = (t, n, a) => t >= n || M(t, n) ? !1 : (I.push({ from: t, to: n }), w.push({ from: t, to: n, className: a }), !0), y = (t) => {
9
- if (!t.slice(2, -2).trim()) return { className: "syntax-variable-invalid", valid: !1 };
10
- const r = G().exec(t), m = !!r && r.index === 0 && r[0] === t;
11
- return {
12
- className: m ? "syntax-variable" : "syntax-variable-invalid",
13
- valid: m
14
- };
1
+ import { ViewPlugin as W, Decoration as D } from "../../../node_modules/@codemirror/view/dist/index.es.js";
2
+ import { RangeSetBuilder as P } from "../../../node_modules/@codemirror/state/dist/index.es.js";
3
+ import { createVariableExpressionRegexp as A } from "../utils.es.js";
4
+ const V = /\{\{.*?\}\}/g, M = /<!--[\s\S]*?-->/g, O = /\?\[(.*?)\]/g;
5
+ function L(t) {
6
+ const l = [];
7
+ let c = null, f = 0;
8
+ for (; f <= t.length; ) {
9
+ const s = t.indexOf(`
10
+ `, f), e = s === -1 ? t.length : s;
11
+ if (t.slice(f, e).trim() === "!===" && (c === null ? c = f : (l.push({
12
+ from: c,
13
+ to: e,
14
+ className: "syntax-fixed"
15
+ }), c = null)), s === -1)
16
+ break;
17
+ f = s + 1;
18
+ }
19
+ return l;
20
+ }
21
+ function j(t, l) {
22
+ const c = [];
23
+ let f = 0;
24
+ const s = (u) => {
25
+ for (; f < l.length && l[f].to <= u; )
26
+ f++;
27
+ const m = l[f];
28
+ return !!m && u >= m.from && u < m.to;
15
29
  };
16
- let s;
17
- for (; (s = C.exec(h)) !== null; )
18
- i(s.index, s.index + s[0].length, "syntax-comment");
19
- const B = c.state.doc.lines;
20
- let b = null;
21
- for (let t = 1; t <= B; t++) {
22
- const n = c.state.doc.line(t);
23
- if (n.text.trim() === "!===") {
24
- if (!b) {
25
- b = { from: n.from, line: t };
26
- continue;
27
- }
28
- const r = b.from, m = n.to;
29
- i(r, m, "syntax-fixed"), b = null;
30
+ let e = 0;
31
+ for (; e <= t.length; ) {
32
+ const u = t.indexOf(`
33
+ `, e), m = u === -1 ? t.length : u, n = t.slice(e, m), r = [];
34
+ let x = 0;
35
+ for (; x < n.length; ) {
36
+ const a = n.indexOf("===", x);
37
+ if (a === -1)
38
+ break;
39
+ const g = e + a;
40
+ !(g > 0 && t[g - 1] === "!") && !s(g) && r.push(g), x = a + 3;
30
41
  }
42
+ for (let a = 0; a + 1 < r.length; a += 2)
43
+ c.push({
44
+ from: r[a],
45
+ to: r[a + 1] + 3,
46
+ className: "syntax-fixed"
47
+ });
48
+ if (u === -1)
49
+ break;
50
+ e = u + 1;
31
51
  }
32
- for (; (s = E.exec(h)) !== null; ) {
33
- const t = s.index;
34
- t > 0 && h[t - 1] === "!" || i(t, t + s[0].length, "syntax-fixed");
52
+ return c;
53
+ }
54
+ function q(t) {
55
+ const l = [];
56
+ let c;
57
+ for (M.lastIndex = 0; (c = M.exec(t)) !== null; )
58
+ l.push({
59
+ from: c.index,
60
+ to: c.index + c[0].length,
61
+ className: "syntax-comment"
62
+ });
63
+ return l;
64
+ }
65
+ function z(t) {
66
+ const l = q(t), c = [
67
+ ...L(t),
68
+ ...j(t, l),
69
+ ...l
70
+ ].sort((s, e) => s.from !== e.from ? s.from - e.from : e.to - s.to), f = [];
71
+ for (const s of c) {
72
+ const e = f[f.length - 1];
73
+ (!e || s.from >= e.to) && f.push(s);
35
74
  }
36
- for (S.lastIndex = 0; (s = F.exec(h)) !== null; ) {
37
- const t = s.index, n = s.index + s[0].length, a = s[1], r = t + 2;
38
- if (!M(t, n))
39
- if (i(t, t + 1, "syntax-keyword"), i(t + 1, t + 2, "syntax-bracket"), i(n - 1, n, "syntax-bracket"), a.startsWith("%")) {
40
- const m = /\{\{.*?\}\}/g, d = m.exec(a);
41
- m.lastIndex = 0;
42
- let x = "syntax-percent-invalid";
43
- if (d) {
44
- const e = y(d[0]), l = r + d.index, A = l + d[0].length, P = p(l, A);
45
- x = e.valid && !P ? "syntax-percent-valid" : "syntax-percent-invalid";
75
+ return f;
76
+ }
77
+ function G(t, l = () => !1) {
78
+ const c = [], f = [];
79
+ O.lastIndex = 0;
80
+ const s = (n, r) => f.some((x) => !(r <= x.from || n >= x.to)), e = (n, r, x) => n >= r || s(n, r) ? !1 : (f.push({ from: n, to: r }), c.push({ from: n, to: r, className: x }), !0), u = (n) => {
81
+ if (!n.slice(2, -2).trim()) return { className: "syntax-variable-invalid", valid: !1 };
82
+ const a = A().exec(n), g = !!a && a.index === 0 && a[0] === n;
83
+ return {
84
+ className: g ? "syntax-variable" : "syntax-variable-invalid",
85
+ valid: g
86
+ };
87
+ };
88
+ let m;
89
+ for (const n of z(t))
90
+ e(n.from, n.to, n.className);
91
+ for (; (m = O.exec(t)) !== null; ) {
92
+ const n = m.index, r = m.index + m[0].length, x = m[1], a = n + 2;
93
+ if (!s(n, r))
94
+ if (e(n, n + 1, "syntax-keyword"), e(n + 1, n + 2, "syntax-bracket"), e(r - 1, r, "syntax-bracket"), x.startsWith("%")) {
95
+ const g = /\{\{.*?\}\}/g, p = g.exec(x);
96
+ g.lastIndex = 0;
97
+ let y = "syntax-percent-invalid";
98
+ if (p) {
99
+ const o = u(p[0]), h = a + p.index, C = h + p[0].length, H = l(h, C);
100
+ y = o.valid && !H ? "syntax-percent-valid" : "syntax-percent-invalid";
46
101
  }
47
- i(r, r + 1, x);
48
- const v = [], N = [], R = [], V = /(\|\||\||\.\.\.)/g;
49
- let f;
50
- for (; (f = V.exec(a)) !== null; )
51
- v.push({
52
- from: r + f.index,
53
- to: r + f.index + f[0].length
54
- });
55
- let o;
56
- const u = /\{\{.*?\}\}/g;
57
- for (; (o = u.exec(a)) !== null; ) {
58
- const e = o[0], l = y(e);
102
+ e(a, a + 1, y);
103
+ const N = [], R = [], k = [], w = /(\|\||\||\.\.\.)/g;
104
+ let d;
105
+ for (; (d = w.exec(x)) !== null; )
59
106
  N.push({
60
- from: r + o.index,
61
- to: r + o.index + e.length,
62
- className: l.className
107
+ from: a + d.index,
108
+ to: a + d.index + d[0].length
109
+ });
110
+ let i;
111
+ const b = /\{\{.*?\}\}/g;
112
+ for (; (i = b.exec(x)) !== null; ) {
113
+ const o = i[0], h = u(o);
114
+ R.push({
115
+ from: a + i.index,
116
+ to: a + i.index + o.length,
117
+ className: h.className
63
118
  });
64
119
  }
65
- const D = [
66
- ...v.map((e) => ({
67
- ...e,
120
+ const E = [
121
+ ...N.map((o) => ({
122
+ ...o,
68
123
  className: "syntax-keyword"
69
124
  })),
70
- ...N.map((e) => ({
71
- ...e,
72
- className: e.className
125
+ ...R.map((o) => ({
126
+ ...o,
127
+ className: o.className
73
128
  }))
74
- ].sort((e, l) => e.from !== l.from ? e.from - l.from : e.to - l.to);
75
- for (const e of D)
76
- e.className.startsWith("syntax-variable") && p(e.from, e.to) || i(e.from, e.to, e.className) && R.push({ from: e.from, to: e.to });
77
- const H = r + 1, T = n - 1;
78
- let g = H;
79
- const O = R.sort((e, l) => e.from !== l.from ? e.from - l.from : e.to - l.to);
80
- for (const e of O)
81
- g < e.from && i(g, e.from, "syntax-string"), g = Math.max(g, e.to);
82
- g < T && i(g, T, "syntax-string");
129
+ ].sort((o, h) => o.from !== h.from ? o.from - h.from : o.to - h.to);
130
+ for (const o of E)
131
+ o.className.startsWith("syntax-variable") && l(o.from, o.to) || e(o.from, o.to, o.className) && k.push({ from: o.from, to: o.to });
132
+ const F = a + 1, S = r - 1;
133
+ let v = F;
134
+ const B = k.sort((o, h) => o.from !== h.from ? o.from - h.from : o.to - h.to);
135
+ for (const o of B)
136
+ v < o.from && e(v, o.from, "syntax-string"), v = Math.max(v, o.to);
137
+ v < S && e(v, S, "syntax-string");
83
138
  } else {
84
- const m = [], d = [];
85
- let x;
86
- const v = /\{\{.*?\}\}/g;
87
- for (; (x = v.exec(a)) !== null; ) {
88
- const o = x[0], u = y(o);
89
- m.push({
90
- from: r + x.index,
91
- to: r + x.index + o.length,
92
- className: u.className
139
+ const g = [], p = [];
140
+ let y;
141
+ const N = /\{\{.*?\}\}/g;
142
+ for (; (y = N.exec(x)) !== null; ) {
143
+ const i = y[0], b = u(i);
144
+ g.push({
145
+ from: a + y.index,
146
+ to: a + y.index + i.length,
147
+ className: b.className
93
148
  });
94
149
  }
95
- const N = m.sort((o, u) => o.from !== u.from ? o.from - u.from : o.to - u.to);
96
- for (const o of N)
97
- o.className.startsWith("syntax-variable") && p(o.from, o.to) || i(o.from, o.to, o.className) && d.push({ from: o.from, to: o.to });
98
- const R = r, V = n - 1;
99
- let f = R;
100
- for (const o of d)
101
- f < o.from && i(f, o.from, "syntax-button-text"), f = Math.max(f, o.to);
102
- f < V && i(f, V, "syntax-button-text");
150
+ const R = g.sort((i, b) => i.from !== b.from ? i.from - b.from : i.to - b.to);
151
+ for (const i of R)
152
+ i.className.startsWith("syntax-variable") && l(i.from, i.to) || e(i.from, i.to, i.className) && p.push({ from: i.from, to: i.to });
153
+ const k = a, w = r - 1;
154
+ let d = k;
155
+ for (const i of p)
156
+ d < i.from && e(d, i.from, "syntax-button-text"), d = Math.max(d, i.to);
157
+ d < w && e(d, w, "syntax-button-text");
103
158
  }
104
159
  }
105
- for (S.lastIndex = 0; (s = S.exec(h)) !== null; ) {
106
- const t = s[0], n = y(t);
107
- n.valid && !p(s.index, s.index + s[0].length) && i(
108
- s.index,
109
- s.index + s[0].length,
110
- n.className
160
+ for (V.lastIndex = 0; (m = V.exec(t)) !== null; ) {
161
+ const n = m[0], r = u(n);
162
+ r.valid && !l(m.index, m.index + m[0].length) && e(
163
+ m.index,
164
+ m.index + m[0].length,
165
+ r.className
111
166
  );
112
167
  }
113
- w.sort((t, n) => t.from !== n.from ? t.from - n.from : n.to - t.to);
114
- for (const t of w)
115
- if (t.from < t.to)
168
+ return c.sort((n, r) => n.from !== r.from ? n.from - r.from : r.to - n.to), c;
169
+ }
170
+ function I(t) {
171
+ const l = new P(), c = t.state.doc.toString(), f = G(c, (s, e) => t.state.selection.ranges.some((u) => u.from >= s && u.to <= e));
172
+ for (const s of f)
173
+ if (s.from < s.to)
116
174
  try {
117
- k.add(t.from, t.to, q.mark({ class: t.className }));
118
- } catch (n) {
119
- console.warn("SyntaxHighlighter: Failed to add decoration", t, n);
175
+ l.add(s.from, s.to, D.mark({ class: s.className }));
176
+ } catch (e) {
177
+ console.warn("SyntaxHighlighter: Failed to add decoration", s, e);
120
178
  }
121
- return k.finish();
179
+ return l.finish();
122
180
  }
123
- const Q = j.fromClass(
181
+ const U = W.fromClass(
124
182
  class {
125
- constructor(c) {
126
- this.decorations = W(c);
183
+ constructor(t) {
184
+ this.decorations = I(t);
127
185
  }
128
- update(c) {
129
- (c.docChanged || c.viewportChanged || c.selectionSet) && (this.decorations = W(c.view));
186
+ update(t) {
187
+ (t.docChanged || t.viewportChanged || t.selectionSet) && (this.decorations = I(t.view));
130
188
  }
131
189
  },
132
190
  {
133
- decorations: (c) => c.decorations
191
+ decorations: (t) => t.decorations
134
192
  }
135
193
  );
136
194
  export {
137
- Q as default
195
+ z as collectOuterBlockRanges,
196
+ G as collectSyntaxHighlightRanges,
197
+ U as default
138
198
  };
139
199
  //# sourceMappingURL=SyntaxHighlighter.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyntaxHighlighter.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.ts"],"sourcesContent":["import {\n Decoration,\n DecorationSet,\n EditorView,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport { createVariableExpressionRegexp } from \"../utils\";\n\nconst broadVariableRegex = /\\{\\{.*?\\}\\}/g;\nconst commentRegex = /<!--[\\s\\S]*?-->/g;\nconst fixedOutputRegex = /===.*?===/g;\nconst controlBlockRegex = /\\?\\[(.*?)\\]/g;\n\nfunction buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const docText = view.state.doc.toString();\n\n const matches: { from: number; to: number; className: string }[] = [];\n const occupied: { from: number; to: number }[] = [];\n\n commentRegex.lastIndex = 0;\n fixedOutputRegex.lastIndex = 0;\n controlBlockRegex.lastIndex = 0;\n\n // Prevent overlapping decorations so styling stays deterministic\n const isOverlapping = (from: number, to: number) =>\n occupied.some((range) => !(to <= range.from || from >= range.to));\n\n const isCursorInside = (from: number, to: number) => {\n return view.state.selection.ranges.some((range) => {\n return range.from >= from && range.to <= to;\n });\n };\n\n const addMatch = (from: number, to: number, className: string) => {\n if (from >= to) return false;\n if (isOverlapping(from, to)) return false;\n occupied.push({ from, to });\n matches.push({ from, to, className });\n return true;\n };\n\n const classifyVariable = (raw: string) => {\n const inner = raw.slice(2, -2).trim();\n if (!inner) return { className: \"syntax-variable-invalid\", valid: false };\n const strict = createVariableExpressionRegexp();\n const strictMatch = strict.exec(raw);\n const valid =\n !!strictMatch && strictMatch.index === 0 && strictMatch[0] === raw;\n return {\n className: valid ? \"syntax-variable\" : \"syntax-variable-invalid\",\n valid,\n };\n };\n\n // 1. Comments\n let match;\n while ((match = commentRegex.exec(docText)) !== null) {\n addMatch(match.index, match.index + match[0].length, \"syntax-comment\");\n }\n\n // 2. Fixed Output (Multiline) - only when both markers are alone on their lines\n const lineCount = view.state.doc.lines;\n let pendingStart: { from: number; line: number } | null = null;\n for (let i = 1; i <= lineCount; i++) {\n const lineInfo = view.state.doc.line(i);\n const trimmed = lineInfo.text.trim();\n if (trimmed === \"!===\") {\n if (!pendingStart) {\n pendingStart = { from: lineInfo.from, line: i };\n continue;\n }\n const startFrom = pendingStart.from;\n const endTo = lineInfo.to;\n addMatch(startFrom, endTo, \"syntax-fixed\");\n pendingStart = null;\n }\n }\n\n // 3. Fixed Output (Single line, skip \"!===...!===\")\n while ((match = fixedOutputRegex.exec(docText)) !== null) {\n const startIndex = match.index;\n const isNegated = startIndex > 0 && docText[startIndex - 1] === \"!\";\n if (isNegated) {\n continue;\n }\n addMatch(startIndex, startIndex + match[0].length, \"syntax-fixed\");\n }\n\n // 4. Control Blocks\n broadVariableRegex.lastIndex = 0;\n while ((match = controlBlockRegex.exec(docText)) !== null) {\n const fullStart = match.index;\n const fullEnd = match.index + match[0].length;\n const content = match[1];\n const contentStart = fullStart + 2; // after ?[\n if (isOverlapping(fullStart, fullEnd)) {\n continue;\n }\n\n // Outer brackets and question mark\n addMatch(fullStart, fullStart + 1, \"syntax-keyword\"); // ?\n addMatch(fullStart + 1, fullStart + 2, \"syntax-bracket\"); // [\n addMatch(fullEnd - 1, fullEnd, \"syntax-bracket\"); // ]\n\n if (content.startsWith(\"%\")) {\n // Input / Select\n const contentVariableRegex = /\\{\\{.*?\\}\\}/g;\n const firstVariableMatch = contentVariableRegex.exec(content);\n contentVariableRegex.lastIndex = 0;\n let percentClass = \"syntax-percent-invalid\";\n if (firstVariableMatch) {\n const classification = classifyVariable(firstVariableMatch[0]);\n const varFrom = contentStart + firstVariableMatch.index;\n const varTo = varFrom + firstVariableMatch[0].length;\n const cursorInsideVar = isCursorInside(varFrom, varTo);\n percentClass =\n classification.valid && !cursorInsideVar\n ? \"syntax-percent-valid\"\n : \"syntax-percent-invalid\";\n }\n addMatch(contentStart, contentStart + 1, percentClass); // %\n\n const operatorRanges: { from: number; to: number }[] = [];\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedTokenRanges: { from: number; to: number }[] = [];\n\n // Inner operators | || ...\n const innerRegex = /(\\|\\||\\||\\.\\.\\.)/g;\n let innerMatch;\n while ((innerMatch = innerRegex.exec(content)) !== null) {\n operatorRanges.push({\n from: contentStart + innerMatch.index,\n to: contentStart + innerMatch.index + innerMatch[0].length,\n });\n }\n\n // Variables inside control block content\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const allTokens = [\n ...operatorRanges.map((range) => ({\n ...range,\n className: \"syntax-keyword\",\n })),\n ...variableRanges.map((range) => ({\n ...range,\n className: range.className,\n })),\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of allTokens) {\n if (\n token.className.startsWith(\"syntax-variable\") &&\n isCursorInside(token.from, token.to)\n ) {\n continue;\n }\n if (addMatch(token.from, token.to, token.className)) {\n appliedTokenRanges.push({ from: token.from, to: token.to });\n }\n }\n\n // Content (Dark Blue) for remaining text segments\n const stringStart = contentStart + 1;\n const stringEnd = fullEnd - 1;\n let cursor = stringStart;\n const sortedApplied = appliedTokenRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of sortedApplied) {\n if (cursor < token.from) {\n addMatch(cursor, token.from, \"syntax-string\");\n }\n cursor = Math.max(cursor, token.to);\n }\n if (cursor < stringEnd) {\n addMatch(cursor, stringEnd, \"syntax-string\");\n }\n } else {\n // Button ?[text]\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedVariableRanges: { from: number; to: number }[] = [];\n\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const sortedVariables = variableRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const variable of sortedVariables) {\n if (\n variable.className.startsWith(\"syntax-variable\") &&\n isCursorInside(variable.from, variable.to)\n ) {\n continue;\n }\n if (addMatch(variable.from, variable.to, variable.className)) {\n appliedVariableRanges.push({ from: variable.from, to: variable.to });\n }\n }\n\n const buttonTextStart = contentStart;\n const buttonTextEnd = fullEnd - 1;\n let cursor = buttonTextStart;\n\n for (const variable of appliedVariableRanges) {\n if (cursor < variable.from) {\n addMatch(cursor, variable.from, \"syntax-button-text\");\n }\n cursor = Math.max(cursor, variable.to);\n }\n if (cursor < buttonTextEnd) {\n addMatch(cursor, buttonTextEnd, \"syntax-button-text\");\n }\n }\n }\n\n // 5. Variables (only if not already decorated; invalid ones stay default outside control blocks)\n broadVariableRegex.lastIndex = 0;\n while ((match = broadVariableRegex.exec(docText)) !== null) {\n const text = match[0];\n const classification = classifyVariable(text);\n if (\n classification.valid &&\n !isCursorInside(match.index, match.index + match[0].length)\n ) {\n addMatch(\n match.index,\n match.index + match[0].length,\n classification.className\n );\n }\n }\n\n // Sort matches by 'from' asc, then 'to' desc (longest first)\n matches.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n for (const m of matches) {\n if (m.from < m.to) {\n try {\n builder.add(m.from, m.to, Decoration.mark({ class: m.className }));\n } catch (e) {\n console.warn(\"SyntaxHighlighter: Failed to add decoration\", m, e);\n }\n }\n }\n\n return builder.finish();\n}\n\nconst SyntaxHighlighter = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (instance) => instance.decorations,\n }\n);\n\nexport default SyntaxHighlighter;\n"],"names":["broadVariableRegex","commentRegex","fixedOutputRegex","controlBlockRegex","buildDecorations","view","builder","RangeSetBuilder","docText","matches","occupied","isOverlapping","from","to","range","isCursorInside","addMatch","className","classifyVariable","raw","strictMatch","createVariableExpressionRegexp","valid","match","lineCount","pendingStart","i","lineInfo","startFrom","endTo","startIndex","fullStart","fullEnd","content","contentStart","contentVariableRegex","firstVariableMatch","percentClass","classification","varFrom","varTo","cursorInsideVar","operatorRanges","variableRanges","appliedTokenRanges","innerRegex","innerMatch","innerVariableMatch","innerVariableRegex","rawVariable","allTokens","a","b","token","stringStart","stringEnd","cursor","sortedApplied","appliedVariableRanges","sortedVariables","variable","buttonTextStart","buttonTextEnd","text","m","Decoration","e","SyntaxHighlighter","ViewPlugin","update","instance"],"mappings":"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"}
1
+ {"version":3,"file":"SyntaxHighlighter.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.ts"],"sourcesContent":["import {\n Decoration,\n DecorationSet,\n EditorView,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport { createVariableExpressionRegexp } from \"../utils\";\n\nconst broadVariableRegex = /\\{\\{.*?\\}\\}/g;\nconst commentRegex = /<!--[\\s\\S]*?-->/g;\nconst controlBlockRegex = /\\?\\[(.*?)\\]/g;\n\nexport interface SyntaxHighlightRange {\n from: number;\n to: number;\n className: string;\n}\n\nfunction collectMultilineFixedOutputRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let pendingStart: number | null = null;\n let lineStart = 0;\n\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n\n if (lineText.trim() === \"!===\") {\n if (pendingStart === null) {\n pendingStart = lineStart;\n } else {\n ranges.push({\n from: pendingStart,\n to: lineEnd,\n className: \"syntax-fixed\",\n });\n pendingStart = null;\n }\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectSingleLineFixedOutputRanges(\n docText: string,\n commentRanges: SyntaxHighlightRange[]\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let commentIndex = 0;\n\n const isInsideComment = (index: number) => {\n while (\n commentIndex < commentRanges.length &&\n commentRanges[commentIndex].to <= index\n ) {\n commentIndex++;\n }\n\n const range = commentRanges[commentIndex];\n return !!range && index >= range.from && index < range.to;\n };\n\n let lineStart = 0;\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n const markerPositions: number[] = [];\n let searchFrom = 0;\n\n while (searchFrom < lineText.length) {\n const markerOffset = lineText.indexOf(\"===\", searchFrom);\n if (markerOffset === -1) {\n break;\n }\n\n const markerIndex = lineStart + markerOffset;\n const isNegated = markerIndex > 0 && docText[markerIndex - 1] === \"!\";\n if (!isNegated && !isInsideComment(markerIndex)) {\n markerPositions.push(markerIndex);\n }\n\n searchFrom = markerOffset + 3;\n }\n\n for (let i = 0; i + 1 < markerPositions.length; i += 2) {\n ranges.push({\n from: markerPositions[i],\n to: markerPositions[i + 1] + 3,\n className: \"syntax-fixed\",\n });\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectCommentRanges(docText: string): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let match;\n\n commentRegex.lastIndex = 0;\n while ((match = commentRegex.exec(docText)) !== null) {\n ranges.push({\n from: match.index,\n to: match.index + match[0].length,\n className: \"syntax-comment\",\n });\n }\n\n return ranges;\n}\n\n/**\n * Collects non-overlapping fixed-output and comment wrapper ranges.\n *\n * @param docText - Document text to scan.\n * @returns Outer syntax highlight ranges sorted by document position.\n */\nexport function collectOuterBlockRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const commentRanges = collectCommentRanges(docText);\n const blockRanges = [\n ...collectMultilineFixedOutputRanges(docText),\n ...collectSingleLineFixedOutputRanges(docText, commentRanges),\n ...commentRanges,\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n const outerRanges: SyntaxHighlightRange[] = [];\n\n for (const range of blockRanges) {\n const lastOuter = outerRanges[outerRanges.length - 1];\n if (!lastOuter || range.from >= lastOuter.to) {\n outerRanges.push(range);\n }\n }\n\n return outerRanges;\n}\n\n/**\n * Collects all custom syntax highlight ranges for editor decorations.\n *\n * @param docText - Document text to scan.\n * @param isCursorInside - Returns true when the current cursor is inside a range.\n * @returns Non-overlapping syntax highlight ranges sorted by document position.\n */\nexport function collectSyntaxHighlightRanges(\n docText: string,\n isCursorInside: (from: number, to: number) => boolean = () => false\n): SyntaxHighlightRange[] {\n const matches: SyntaxHighlightRange[] = [];\n const occupied: { from: number; to: number }[] = [];\n\n controlBlockRegex.lastIndex = 0;\n\n // Prevent overlapping decorations so styling stays deterministic\n const isOverlapping = (from: number, to: number) =>\n occupied.some((range) => !(to <= range.from || from >= range.to));\n\n const addMatch = (from: number, to: number, className: string) => {\n if (from >= to) return false;\n if (isOverlapping(from, to)) return false;\n occupied.push({ from, to });\n matches.push({ from, to, className });\n return true;\n };\n\n const classifyVariable = (raw: string) => {\n const inner = raw.slice(2, -2).trim();\n if (!inner) return { className: \"syntax-variable-invalid\", valid: false };\n const strict = createVariableExpressionRegexp();\n const strictMatch = strict.exec(raw);\n const valid =\n !!strictMatch && strictMatch.index === 0 && strictMatch[0] === raw;\n return {\n className: valid ? \"syntax-variable\" : \"syntax-variable-invalid\",\n valid,\n };\n };\n\n let match;\n\n // 1. Outer block ranges win over any syntax inside them.\n for (const range of collectOuterBlockRanges(docText)) {\n addMatch(range.from, range.to, range.className);\n }\n\n // 2. Control Blocks\n while ((match = controlBlockRegex.exec(docText)) !== null) {\n const fullStart = match.index;\n const fullEnd = match.index + match[0].length;\n const content = match[1];\n const contentStart = fullStart + 2; // after ?[\n if (isOverlapping(fullStart, fullEnd)) {\n continue;\n }\n\n // Outer brackets and question mark\n addMatch(fullStart, fullStart + 1, \"syntax-keyword\"); // ?\n addMatch(fullStart + 1, fullStart + 2, \"syntax-bracket\"); // [\n addMatch(fullEnd - 1, fullEnd, \"syntax-bracket\"); // ]\n\n if (content.startsWith(\"%\")) {\n // Input / Select\n const contentVariableRegex = /\\{\\{.*?\\}\\}/g;\n const firstVariableMatch = contentVariableRegex.exec(content);\n contentVariableRegex.lastIndex = 0;\n let percentClass = \"syntax-percent-invalid\";\n if (firstVariableMatch) {\n const classification = classifyVariable(firstVariableMatch[0]);\n const varFrom = contentStart + firstVariableMatch.index;\n const varTo = varFrom + firstVariableMatch[0].length;\n const cursorInsideVar = isCursorInside(varFrom, varTo);\n percentClass =\n classification.valid && !cursorInsideVar\n ? \"syntax-percent-valid\"\n : \"syntax-percent-invalid\";\n }\n addMatch(contentStart, contentStart + 1, percentClass); // %\n\n const operatorRanges: { from: number; to: number }[] = [];\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedTokenRanges: { from: number; to: number }[] = [];\n\n // Inner operators | || ...\n const innerRegex = /(\\|\\||\\||\\.\\.\\.)/g;\n let innerMatch;\n while ((innerMatch = innerRegex.exec(content)) !== null) {\n operatorRanges.push({\n from: contentStart + innerMatch.index,\n to: contentStart + innerMatch.index + innerMatch[0].length,\n });\n }\n\n // Variables inside control block content\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const allTokens = [\n ...operatorRanges.map((range) => ({\n ...range,\n className: \"syntax-keyword\",\n })),\n ...variableRanges.map((range) => ({\n ...range,\n className: range.className,\n })),\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of allTokens) {\n if (\n token.className.startsWith(\"syntax-variable\") &&\n isCursorInside(token.from, token.to)\n ) {\n continue;\n }\n if (addMatch(token.from, token.to, token.className)) {\n appliedTokenRanges.push({ from: token.from, to: token.to });\n }\n }\n\n // Content (Dark Blue) for remaining text segments\n const stringStart = contentStart + 1;\n const stringEnd = fullEnd - 1;\n let cursor = stringStart;\n const sortedApplied = appliedTokenRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of sortedApplied) {\n if (cursor < token.from) {\n addMatch(cursor, token.from, \"syntax-string\");\n }\n cursor = Math.max(cursor, token.to);\n }\n if (cursor < stringEnd) {\n addMatch(cursor, stringEnd, \"syntax-string\");\n }\n } else {\n // Button ?[text]\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedVariableRanges: { from: number; to: number }[] = [];\n\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const sortedVariables = variableRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const variable of sortedVariables) {\n if (\n variable.className.startsWith(\"syntax-variable\") &&\n isCursorInside(variable.from, variable.to)\n ) {\n continue;\n }\n if (addMatch(variable.from, variable.to, variable.className)) {\n appliedVariableRanges.push({ from: variable.from, to: variable.to });\n }\n }\n\n const buttonTextStart = contentStart;\n const buttonTextEnd = fullEnd - 1;\n let cursor = buttonTextStart;\n\n for (const variable of appliedVariableRanges) {\n if (cursor < variable.from) {\n addMatch(cursor, variable.from, \"syntax-button-text\");\n }\n cursor = Math.max(cursor, variable.to);\n }\n if (cursor < buttonTextEnd) {\n addMatch(cursor, buttonTextEnd, \"syntax-button-text\");\n }\n }\n }\n\n // 3. Variables (only if not already decorated; invalid ones stay default outside control blocks)\n broadVariableRegex.lastIndex = 0;\n while ((match = broadVariableRegex.exec(docText)) !== null) {\n const text = match[0];\n const classification = classifyVariable(text);\n if (\n classification.valid &&\n !isCursorInside(match.index, match.index + match[0].length)\n ) {\n addMatch(\n match.index,\n match.index + match[0].length,\n classification.className\n );\n }\n }\n\n // Sort matches by 'from' asc, then 'to' desc (longest first)\n matches.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n return matches;\n}\n\nfunction buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const docText = view.state.doc.toString();\n const matches = collectSyntaxHighlightRanges(docText, (from, to) => {\n return view.state.selection.ranges.some((range) => {\n return range.from >= from && range.to <= to;\n });\n });\n\n for (const m of matches) {\n if (m.from < m.to) {\n try {\n builder.add(m.from, m.to, Decoration.mark({ class: m.className }));\n } catch (e) {\n console.warn(\"SyntaxHighlighter: Failed to add decoration\", m, e);\n }\n }\n }\n\n return builder.finish();\n}\n\nconst SyntaxHighlighter = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (instance) => instance.decorations,\n }\n);\n\nexport default SyntaxHighlighter;\n"],"names":["broadVariableRegex","commentRegex","controlBlockRegex","collectMultilineFixedOutputRanges","docText","ranges","pendingStart","lineStart","newlineIndex","lineEnd","collectSingleLineFixedOutputRanges","commentRanges","commentIndex","isInsideComment","index","range","lineText","markerPositions","searchFrom","markerOffset","markerIndex","i","collectCommentRanges","match","collectOuterBlockRanges","blockRanges","a","b","outerRanges","lastOuter","collectSyntaxHighlightRanges","isCursorInside","matches","occupied","isOverlapping","from","to","addMatch","className","classifyVariable","raw","strictMatch","createVariableExpressionRegexp","valid","fullStart","fullEnd","content","contentStart","contentVariableRegex","firstVariableMatch","percentClass","classification","varFrom","varTo","cursorInsideVar","operatorRanges","variableRanges","appliedTokenRanges","innerRegex","innerMatch","innerVariableMatch","innerVariableRegex","rawVariable","allTokens","token","stringStart","stringEnd","cursor","sortedApplied","appliedVariableRanges","sortedVariables","variable","buttonTextStart","buttonTextEnd","text","buildDecorations","view","builder","RangeSetBuilder","m","Decoration","SyntaxHighlighter","ViewPlugin","update","instance"],"mappings":";;;AAUA,MAAMA,IAAqB,gBACrBC,IAAe,oBACfC,IAAoB;AAQ1B,SAASC,EACPC,GACwB;AACxB,QAAMC,IAAiC,CAAA;AACvC,MAAIC,IAA8B,MAC9BC,IAAY;AAEhB,SAAOA,KAAaH,EAAQ,UAAQ;AAClC,UAAMI,IAAeJ,EAAQ,QAAQ;AAAA,GAAMG,CAAS,GAC9CE,IAAUD,MAAiB,KAAKJ,EAAQ,SAASI;AAgBvD,QAfiBJ,EAAQ,MAAMG,GAAWE,CAAO,EAEpC,KAAA,MAAW,WAClBH,MAAiB,OACnBA,IAAeC,KAEfF,EAAO,KAAK;AAAA,MACV,MAAMC;AAAA,MACN,IAAIG;AAAA,MACJ,WAAW;AAAA,IAAA,CACZ,GACDH,IAAe,QAIfE,MAAiB;AACnB;AAGF,IAAAD,IAAYC,IAAe;AAAA,EAC7B;AAEA,SAAOH;AACT;AAEA,SAASK,EACPN,GACAO,GACwB;AACxB,QAAMN,IAAiC,CAAA;AACvC,MAAIO,IAAe;AAEnB,QAAMC,IAAkB,CAACC,MAAkB;AACzC,WACEF,IAAeD,EAAc,UAC7BA,EAAcC,CAAY,EAAE,MAAME;AAElC,MAAAF;AAGF,UAAMG,IAAQJ,EAAcC,CAAY;AACxC,WAAO,CAAC,CAACG,KAASD,KAASC,EAAM,QAAQD,IAAQC,EAAM;AAAA,EACzD;AAEA,MAAIR,IAAY;AAChB,SAAOA,KAAaH,EAAQ,UAAQ;AAClC,UAAMI,IAAeJ,EAAQ,QAAQ;AAAA,GAAMG,CAAS,GAC9CE,IAAUD,MAAiB,KAAKJ,EAAQ,SAASI,GACjDQ,IAAWZ,EAAQ,MAAMG,GAAWE,CAAO,GAC3CQ,IAA4B,CAAA;AAClC,QAAIC,IAAa;AAEjB,WAAOA,IAAaF,EAAS,UAAQ;AACnC,YAAMG,IAAeH,EAAS,QAAQ,OAAOE,CAAU;AACvD,UAAIC,MAAiB;AACnB;AAGF,YAAMC,IAAcb,IAAYY;AAEhC,MAAI,EADcC,IAAc,KAAKhB,EAAQgB,IAAc,CAAC,MAAM,QAChD,CAACP,EAAgBO,CAAW,KAC5CH,EAAgB,KAAKG,CAAW,GAGlCF,IAAaC,IAAe;AAAA,IAC9B;AAEA,aAASE,IAAI,GAAGA,IAAI,IAAIJ,EAAgB,QAAQI,KAAK;AACnD,MAAAhB,EAAO,KAAK;AAAA,QACV,MAAMY,EAAgBI,CAAC;AAAA,QACvB,IAAIJ,EAAgBI,IAAI,CAAC,IAAI;AAAA,QAC7B,WAAW;AAAA,MAAA,CACZ;AAGH,QAAIb,MAAiB;AACnB;AAGF,IAAAD,IAAYC,IAAe;AAAA,EAC7B;AAEA,SAAOH;AACT;AAEA,SAASiB,EAAqBlB,GAAyC;AACrE,QAAMC,IAAiC,CAAA;AACvC,MAAIkB;AAGJ,OADAtB,EAAa,YAAY,IACjBsB,IAAQtB,EAAa,KAAKG,CAAO,OAAO;AAC9C,IAAAC,EAAO,KAAK;AAAA,MACV,MAAMkB,EAAM;AAAA,MACZ,IAAIA,EAAM,QAAQA,EAAM,CAAC,EAAE;AAAA,MAC3B,WAAW;AAAA,IAAA,CACZ;AAGH,SAAOlB;AACT;AAQO,SAASmB,EACdpB,GACwB;AACxB,QAAMO,IAAgBW,EAAqBlB,CAAO,GAC5CqB,IAAc;AAAA,IAClB,GAAGtB,EAAkCC,CAAO;AAAA,IAC5C,GAAGM,EAAmCN,GAASO,CAAa;AAAA,IAC5D,GAAGA;AAAA,EAAA,EACH,KAAK,CAACe,GAAGC,MACLD,EAAE,SAASC,EAAE,OAAaD,EAAE,OAAOC,EAAE,OAClCA,EAAE,KAAKD,EAAE,EACjB,GAEKE,IAAsC,CAAA;AAE5C,aAAWb,KAASU,GAAa;AAC/B,UAAMI,IAAYD,EAAYA,EAAY,SAAS,CAAC;AACpD,KAAI,CAACC,KAAad,EAAM,QAAQc,EAAU,OACxCD,EAAY,KAAKb,CAAK;AAAA,EAE1B;AAEA,SAAOa;AACT;AASO,SAASE,EACd1B,GACA2B,IAAwD,MAAM,IACtC;AACxB,QAAMC,IAAkC,CAAA,GAClCC,IAA2C,CAAA;AAEjD,EAAA/B,EAAkB,YAAY;AAG9B,QAAMgC,IAAgB,CAACC,GAAcC,MACnCH,EAAS,KAAK,CAAClB,MAAU,EAAEqB,KAAMrB,EAAM,QAAQoB,KAAQpB,EAAM,GAAG,GAE5DsB,IAAW,CAACF,GAAcC,GAAYE,MACtCH,KAAQC,KACRF,EAAcC,GAAMC,CAAE,IAAU,MACpCH,EAAS,KAAK,EAAE,MAAAE,GAAM,IAAAC,EAAA,CAAI,GAC1BJ,EAAQ,KAAK,EAAE,MAAAG,GAAM,IAAAC,GAAI,WAAAE,GAAW,GAC7B,KAGHC,IAAmB,CAACC,MAAgB;AAExC,QAAI,CADUA,EAAI,MAAM,GAAG,EAAE,EAAE,KAAA,EACnB,QAAO,EAAE,WAAW,2BAA2B,OAAO,GAAA;AAElE,UAAMC,IADSC,EAAA,EACY,KAAKF,CAAG,GAC7BG,IACJ,CAAC,CAACF,KAAeA,EAAY,UAAU,KAAKA,EAAY,CAAC,MAAMD;AACjE,WAAO;AAAA,MACL,WAAWG,IAAQ,oBAAoB;AAAA,MACvC,OAAAA;AAAA,IAAA;AAAA,EAEJ;AAEA,MAAIpB;AAGJ,aAAWR,KAASS,EAAwBpB,CAAO;AACjD,IAAAiC,EAAStB,EAAM,MAAMA,EAAM,IAAIA,EAAM,SAAS;AAIhD,UAAQQ,IAAQrB,EAAkB,KAAKE,CAAO,OAAO,QAAM;AACzD,UAAMwC,IAAYrB,EAAM,OAClBsB,IAAUtB,EAAM,QAAQA,EAAM,CAAC,EAAE,QACjCuB,IAAUvB,EAAM,CAAC,GACjBwB,IAAeH,IAAY;AACjC,QAAI,CAAAV,EAAcU,GAAWC,CAAO;AASpC,UAJAR,EAASO,GAAWA,IAAY,GAAG,gBAAgB,GACnDP,EAASO,IAAY,GAAGA,IAAY,GAAG,gBAAgB,GACvDP,EAASQ,IAAU,GAAGA,GAAS,gBAAgB,GAE3CC,EAAQ,WAAW,GAAG,GAAG;AAE3B,cAAME,IAAuB,gBACvBC,IAAqBD,EAAqB,KAAKF,CAAO;AAC5D,QAAAE,EAAqB,YAAY;AACjC,YAAIE,IAAe;AACnB,YAAID,GAAoB;AACtB,gBAAME,IAAiBZ,EAAiBU,EAAmB,CAAC,CAAC,GACvDG,IAAUL,IAAeE,EAAmB,OAC5CI,IAAQD,IAAUH,EAAmB,CAAC,EAAE,QACxCK,IAAkBvB,EAAeqB,GAASC,CAAK;AACrD,UAAAH,IACEC,EAAe,SAAS,CAACG,IACrB,yBACA;AAAA,QACR;AACA,QAAAjB,EAASU,GAAcA,IAAe,GAAGG,CAAY;AAErD,cAAMK,IAAiD,CAAA,GACjDC,IACJ,CAAA,GACIC,IAAqD,CAAA,GAGrDC,IAAa;AACnB,YAAIC;AACJ,gBAAQA,IAAaD,EAAW,KAAKZ,CAAO,OAAO;AACjD,UAAAS,EAAe,KAAK;AAAA,YAClB,MAAMR,IAAeY,EAAW;AAAA,YAChC,IAAIZ,IAAeY,EAAW,QAAQA,EAAW,CAAC,EAAE;AAAA,UAAA,CACrD;AAIH,YAAIC;AACJ,cAAMC,IAAqB;AAC3B,gBAAQD,IAAqBC,EAAmB,KAAKf,CAAO,OAAO,QAAM;AACvE,gBAAMgB,IAAcF,EAAmB,CAAC,GAClCT,IAAiBZ,EAAiBuB,CAAW;AACnD,UAAAN,EAAe,KAAK;AAAA,YAClB,MAAMT,IAAea,EAAmB;AAAA,YACxC,IAAIb,IAAea,EAAmB,QAAQE,EAAY;AAAA,YAC1D,WAAWX,EAAe;AAAA,UAAA,CAC3B;AAAA,QACH;AAEA,cAAMY,IAAY;AAAA,UAChB,GAAGR,EAAe,IAAI,CAACxC,OAAW;AAAA,YAChC,GAAGA;AAAA,YACH,WAAW;AAAA,UAAA,EACX;AAAA,UACF,GAAGyC,EAAe,IAAI,CAACzC,OAAW;AAAA,YAChC,GAAGA;AAAA,YACH,WAAWA,EAAM;AAAA,UAAA,EACjB;AAAA,QAAA,EACF,KAAK,CAACW,GAAGC,MACLD,EAAE,SAASC,EAAE,OAAaD,EAAE,OAAOC,EAAE,OAClCD,EAAE,KAAKC,EAAE,EACjB;AAED,mBAAWqC,KAASD;AAClB,UACEC,EAAM,UAAU,WAAW,iBAAiB,KAC5CjC,EAAeiC,EAAM,MAAMA,EAAM,EAAE,KAIjC3B,EAAS2B,EAAM,MAAMA,EAAM,IAAIA,EAAM,SAAS,KAChDP,EAAmB,KAAK,EAAE,MAAMO,EAAM,MAAM,IAAIA,EAAM,IAAI;AAK9D,cAAMC,IAAclB,IAAe,GAC7BmB,IAAYrB,IAAU;AAC5B,YAAIsB,IAASF;AACb,cAAMG,IAAgBX,EAAmB,KAAK,CAAC/B,GAAGC,MAC5CD,EAAE,SAASC,EAAE,OAAaD,EAAE,OAAOC,EAAE,OAClCD,EAAE,KAAKC,EAAE,EACjB;AAED,mBAAWqC,KAASI;AAClB,UAAID,IAASH,EAAM,QACjB3B,EAAS8B,GAAQH,EAAM,MAAM,eAAe,GAE9CG,IAAS,KAAK,IAAIA,GAAQH,EAAM,EAAE;AAEpC,QAAIG,IAASD,KACX7B,EAAS8B,GAAQD,GAAW,eAAe;AAAA,MAE/C,OAAO;AAEL,cAAMV,IACJ,CAAA,GACIa,IAAwD,CAAA;AAE9D,YAAIT;AACJ,cAAMC,IAAqB;AAC3B,gBAAQD,IAAqBC,EAAmB,KAAKf,CAAO,OAAO,QAAM;AACvE,gBAAMgB,IAAcF,EAAmB,CAAC,GAClCT,IAAiBZ,EAAiBuB,CAAW;AACnD,UAAAN,EAAe,KAAK;AAAA,YAClB,MAAMT,IAAea,EAAmB;AAAA,YACxC,IAAIb,IAAea,EAAmB,QAAQE,EAAY;AAAA,YAC1D,WAAWX,EAAe;AAAA,UAAA,CAC3B;AAAA,QACH;AAEA,cAAMmB,IAAkBd,EAAe,KAAK,CAAC9B,GAAG,MAC1CA,EAAE,SAAS,EAAE,OAAaA,EAAE,OAAO,EAAE,OAClCA,EAAE,KAAK,EAAE,EACjB;AAED,mBAAW6C,KAAYD;AACrB,UACEC,EAAS,UAAU,WAAW,iBAAiB,KAC/CxC,EAAewC,EAAS,MAAMA,EAAS,EAAE,KAIvClC,EAASkC,EAAS,MAAMA,EAAS,IAAIA,EAAS,SAAS,KACzDF,EAAsB,KAAK,EAAE,MAAME,EAAS,MAAM,IAAIA,EAAS,IAAI;AAIvE,cAAMC,IAAkBzB,GAClB0B,IAAgB5B,IAAU;AAChC,YAAIsB,IAASK;AAEb,mBAAWD,KAAYF;AACrB,UAAIF,IAASI,EAAS,QACpBlC,EAAS8B,GAAQI,EAAS,MAAM,oBAAoB,GAEtDJ,IAAS,KAAK,IAAIA,GAAQI,EAAS,EAAE;AAEvC,QAAIJ,IAASM,KACXpC,EAAS8B,GAAQM,GAAe,oBAAoB;AAAA,MAExD;AAAA,EACF;AAIA,OADAzE,EAAmB,YAAY,IACvBuB,IAAQvB,EAAmB,KAAKI,CAAO,OAAO,QAAM;AAC1D,UAAMsE,IAAOnD,EAAM,CAAC,GACd4B,IAAiBZ,EAAiBmC,CAAI;AAC5C,IACEvB,EAAe,SACf,CAACpB,EAAeR,EAAM,OAAOA,EAAM,QAAQA,EAAM,CAAC,EAAE,MAAM,KAE1Dc;AAAA,MACEd,EAAM;AAAA,MACNA,EAAM,QAAQA,EAAM,CAAC,EAAE;AAAA,MACvB4B,EAAe;AAAA,IAAA;AAAA,EAGrB;AAGA,SAAAnB,EAAQ,KAAK,CAACN,GAAGC,MACXD,EAAE,SAASC,EAAE,OAAaD,EAAE,OAAOC,EAAE,OAClCA,EAAE,KAAKD,EAAE,EACjB,GAEMM;AACT;AAEA,SAAS2C,EAAiBC,GAAiC;AACzD,QAAMC,IAAU,IAAIC,EAAA,GACd1E,IAAUwE,EAAK,MAAM,IAAI,SAAA,GACzB5C,IAAUF,EAA6B1B,GAAS,CAAC+B,GAAMC,MACpDwC,EAAK,MAAM,UAAU,OAAO,KAAK,CAAC7D,MAChCA,EAAM,QAAQoB,KAAQpB,EAAM,MAAMqB,CAC1C,CACF;AAED,aAAW2C,KAAK/C;AACd,QAAI+C,EAAE,OAAOA,EAAE;AACb,UAAI;AACF,QAAAF,EAAQ,IAAIE,EAAE,MAAMA,EAAE,IAAIC,EAAW,KAAK,EAAE,OAAOD,EAAE,UAAA,CAAW,CAAC;AAAA,MACnE,SAAS,GAAG;AACV,gBAAQ,KAAK,+CAA+CA,GAAG,CAAC;AAAA,MAClE;AAIJ,SAAOF,EAAQ,OAAA;AACjB;AAEA,MAAMI,IAAoBC,EAAW;AAAA,EACnC,MAAM;AAAA,IAGJ,YAAYN,GAAkB;AAC5B,WAAK,cAAcD,EAAiBC,CAAI;AAAA,IAC1C;AAAA,IAEA,OAAOO,GAAoB;AACzB,OAAIA,EAAO,cAAcA,EAAO,mBAAmBA,EAAO,kBACxD,KAAK,cAAcR,EAAiBQ,EAAO,IAAI;AAAA,IAEnD;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,aAAa,CAACC,MAAaA,EAAS;AAAA,EAAA;AAExC;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../../../../_virtual/index.cjs9.js"),v=require("./constants.cjs.js");var d;function x(){if(d)return c.__exports;d=1,Object.defineProperty(c.__exports,"__esModule",{value:!0}),c.__exports.sanitizeUrl=void 0;var e=v.__require();function m(r){return e.relativeFirstCharacters.indexOf(r[0])>-1}function p(r){var i=r.replace(e.ctrlCharactersRegex,"");return i.replace(e.htmlEntitiesRegex,function(t,a){return String.fromCharCode(a)})}function R(r){return URL.canParse(r)}function l(r){try{return decodeURIComponent(r)}catch{return r}}function f(r){if(!r)return e.BLANK_URL;var i,t=l(r.trim());do t=p(t).replace(e.htmlCtrlEntityRegex,"").replace(e.ctrlCharactersRegex,"").replace(e.whitespaceEscapeCharsRegex,"").trim(),t=l(t),i=t.match(e.ctrlCharactersRegex)||t.match(e.htmlEntitiesRegex)||t.match(e.htmlCtrlEntityRegex)||t.match(e.whitespaceEscapeCharsRegex);while(i&&i.length>0);var a=t;if(!a)return e.BLANK_URL;if(m(a))return a;var u=a.trimStart(),h=u.match(e.urlSchemeRegex);if(!h)return a;var n=h[0].toLowerCase().trim();if(e.invalidProtocolRegex.test(n))return e.BLANK_URL;var s=u.replace(/\\/g,"/");if(n==="mailto:"||n.includes("://"))return s;if(n==="http:"||n==="https:"){if(!R(s))return e.BLANK_URL;var o=new URL(s);return o.protocol=o.protocol.toLowerCase(),o.hostname=o.hostname.toLowerCase(),o.toString()}return s}return c.__exports.sanitizeUrl=f,c.__exports}exports.__require=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("../../../../_virtual/index.cjs8.js"),v=require("./constants.cjs.js");var d;function x(){if(d)return c.__exports;d=1,Object.defineProperty(c.__exports,"__esModule",{value:!0}),c.__exports.sanitizeUrl=void 0;var e=v.__require();function m(r){return e.relativeFirstCharacters.indexOf(r[0])>-1}function p(r){var i=r.replace(e.ctrlCharactersRegex,"");return i.replace(e.htmlEntitiesRegex,function(t,a){return String.fromCharCode(a)})}function R(r){return URL.canParse(r)}function l(r){try{return decodeURIComponent(r)}catch{return r}}function f(r){if(!r)return e.BLANK_URL;var i,t=l(r.trim());do t=p(t).replace(e.htmlCtrlEntityRegex,"").replace(e.ctrlCharactersRegex,"").replace(e.whitespaceEscapeCharsRegex,"").trim(),t=l(t),i=t.match(e.ctrlCharactersRegex)||t.match(e.htmlEntitiesRegex)||t.match(e.htmlCtrlEntityRegex)||t.match(e.whitespaceEscapeCharsRegex);while(i&&i.length>0);var a=t;if(!a)return e.BLANK_URL;if(m(a))return a;var u=a.trimStart(),h=u.match(e.urlSchemeRegex);if(!h)return a;var n=h[0].toLowerCase().trim();if(e.invalidProtocolRegex.test(n))return e.BLANK_URL;var s=u.replace(/\\/g,"/");if(n==="mailto:"||n.includes("://"))return s;if(n==="http:"||n==="https:"){if(!R(s))return e.BLANK_URL;var o=new URL(s);return o.protocol=o.protocol.toLowerCase(),o.hostname=o.hostname.toLowerCase(),o.toString()}return s}return c.__exports.sanitizeUrl=f,c.__exports}exports.__require=x;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1,4 +1,4 @@
1
- import { __exports as c } from "../../../../_virtual/index.es9.js";
1
+ import { __exports as c } from "../../../../_virtual/index.es8.js";
2
2
  import { __require as v } from "./constants.es.js";
3
3
  var m;
4
4
  function g() {
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../_virtual/index.cjs8.js");/*!
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../_virtual/index.cjs9.js");/*!
2
2
  Copyright (c) 2018 Jed Watson.
3
3
  Licensed under the MIT License (MIT), see
4
4
  http://jedwatson.github.io/classnames
@@ -1,4 +1,4 @@
1
- import { __module as s } from "../../_virtual/index.es8.js";
1
+ import { __module as s } from "../../_virtual/index.es9.js";
2
2
  /*!
3
3
  Copyright (c) 2018 Jed Watson.
4
4
  Licensed under the MIT License (MIT), see
package/package.json CHANGED
@@ -174,7 +174,7 @@
174
174
  ]
175
175
  }
176
176
  },
177
- "version": "0.1.126",
177
+ "version": "0.1.128-dev.1",
178
178
  "type": "module",
179
179
  "exports": {
180
180
  ".": {