markdown-flow-ui 0.2.36-dev.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +12 -12
  2. package/dist/_virtual/index.es4.js +5 -5
  3. package/dist/_virtual/index.es5.js +5 -5
  4. package/dist/_virtual/index4.cjs +1 -1
  5. package/dist/_virtual/index5.cjs +1 -1
  6. package/dist/_virtual/variable-marker.cjs +2 -0
  7. package/dist/_virtual/variable-marker.cjs.map +1 -0
  8. package/dist/_virtual/variable-marker.es.js +5 -0
  9. package/dist/_virtual/variable-marker.es.js.map +1 -0
  10. package/dist/components/ContentRender/ContentRender.cjs +2 -2
  11. package/dist/components/ContentRender/ContentRender.cjs.map +1 -1
  12. package/dist/components/ContentRender/ContentRender.es.js +206 -205
  13. package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
  14. package/dist/components/ContentRender/utils/inline-code-ranges.cjs +9 -9
  15. package/dist/components/ContentRender/utils/inline-code-ranges.cjs.map +1 -1
  16. package/dist/components/ContentRender/utils/inline-code-ranges.d.ts +3 -0
  17. package/dist/components/ContentRender/utils/inline-code-ranges.es.js +185 -161
  18. package/dist/components/ContentRender/utils/inline-code-ranges.es.js.map +1 -1
  19. package/dist/components/ContentRender/utils/mermaid-parse.cjs +4 -4
  20. package/dist/components/ContentRender/utils/mermaid-parse.cjs.map +1 -1
  21. package/dist/components/ContentRender/utils/mermaid-parse.es.js +53 -48
  22. package/dist/components/ContentRender/utils/mermaid-parse.es.js.map +1 -1
  23. package/dist/components/ContentRender/utils/split-content.cjs +6 -6
  24. package/dist/components/ContentRender/utils/split-content.cjs.map +1 -1
  25. package/dist/components/ContentRender/utils/split-content.d.ts +1 -0
  26. package/dist/components/ContentRender/utils/split-content.es.js +361 -313
  27. package/dist/components/ContentRender/utils/split-content.es.js.map +1 -1
  28. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
  29. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
  30. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +278 -283
  31. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
  32. package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +1 -1
  33. package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +1 -1
  34. package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +57 -58
  35. package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +1 -1
  36. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +1 -1
  37. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +1 -1
  38. package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +1 -1
  39. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.cjs +1 -1
  40. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.d.ts +1 -1
  41. package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js +19 -19
  42. package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
  43. package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +1 -1
  44. package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +5 -5
  45. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +1 -1
  46. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +1 -1
  47. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +1 -1
  48. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.cjs +1 -1
  49. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.d.ts +1 -1
  50. package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js +15 -15
  51. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
  52. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +1 -1
  53. package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +13 -13
  54. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.cjs +1 -1
  55. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.d.ts +1 -1
  56. package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js +1 -1
  57. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +1 -1
  58. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +1 -1
  59. package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +1 -1
  60. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.cjs +1 -1
  61. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.d.ts +1 -1
  62. package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js +1 -1
  63. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.cjs +1 -1
  64. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.d.ts +1 -1
  65. package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js +15 -15
  66. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
  67. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +1 -1
  68. package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +1 -1
  69. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
  70. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
  71. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +177 -176
  72. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
  73. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs +2 -1
  74. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs.map +1 -1
  75. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.d.ts +3 -1
  76. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js +38 -55
  77. package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js.map +1 -1
  78. package/dist/components/MarkdownFlowEditor/utils.cjs +1 -1
  79. package/dist/components/MarkdownFlowEditor/utils.cjs.map +1 -1
  80. package/dist/components/MarkdownFlowEditor/utils.d.ts +2 -2
  81. package/dist/components/MarkdownFlowEditor/utils.es.js +34 -31
  82. package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
  83. package/dist/components/ui/inputGroup/textarea.cjs +1 -1
  84. package/dist/components/ui/inputGroup/textarea.es.js +1 -1
  85. package/dist/lib/interaction-defaults.cjs +1 -1
  86. package/dist/lib/interaction-defaults.cjs.map +1 -1
  87. package/dist/lib/interaction-defaults.es.js +124 -133
  88. package/dist/lib/interaction-defaults.es.js.map +1 -1
  89. package/dist/lib/interaction-defaults.failure.test.d.ts +1 -0
  90. package/dist/node_modules/rc-input/es/BaseInput.cjs +1 -1
  91. package/dist/node_modules/rc-input/es/BaseInput.es.js +1 -1
  92. package/dist/node_modules/rc-textarea/es/ResizableTextArea.cjs +1 -1
  93. package/dist/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
  94. package/dist/node_modules/rc-textarea/es/TextArea.cjs +1 -1
  95. package/dist/node_modules/rc-textarea/es/TextArea.es.js +1 -1
  96. package/dist/node_modules/rc-textarea/es/index.cjs +1 -1
  97. package/dist/node_modules/rc-textarea/es/index.es.js +1 -1
  98. package/dist/node_modules/remark-flow/dist/escaping.cjs +2 -2
  99. package/dist/node_modules/remark-flow/dist/escaping.cjs.map +1 -1
  100. package/dist/node_modules/remark-flow/dist/escaping.es.js +128 -63
  101. package/dist/node_modules/remark-flow/dist/escaping.es.js.map +1 -1
  102. package/dist/node_modules/remark-flow/dist/index.cjs +1 -1
  103. package/dist/node_modules/remark-flow/dist/index.cjs.map +1 -1
  104. package/dist/node_modules/remark-flow/dist/index.es.js +49 -37
  105. package/dist/node_modules/remark-flow/dist/index.es.js.map +1 -1
  106. package/dist/node_modules/remark-flow/dist/interaction-parser.cjs +1 -1
  107. package/dist/node_modules/remark-flow/dist/interaction-parser.cjs.map +1 -1
  108. package/dist/node_modules/remark-flow/dist/interaction-parser.es.js +260 -255
  109. package/dist/node_modules/remark-flow/dist/interaction-parser.es.js.map +1 -1
  110. package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs +1 -1
  111. package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs.map +1 -1
  112. package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js +71 -42
  113. package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js.map +1 -1
  114. package/dist/node_modules/remark-flow/dist/interaction-syntax.cjs +1 -1
  115. package/dist/node_modules/remark-flow/dist/interaction-syntax.cjs.map +1 -1
  116. package/dist/node_modules/remark-flow/dist/interaction-syntax.es.js +501 -46
  117. package/dist/node_modules/remark-flow/dist/interaction-syntax.es.js.map +1 -1
  118. package/dist/node_modules/remark-flow/dist/variable-marker.cjs +2 -0
  119. package/dist/node_modules/remark-flow/dist/variable-marker.cjs.map +1 -0
  120. package/dist/node_modules/remark-flow/dist/variable-marker.es.js +77 -0
  121. package/dist/node_modules/remark-flow/dist/variable-marker.es.js.map +1 -0
  122. package/dist/node_modules/remark-flow/dist/variable-name.cjs +14 -1
  123. package/dist/node_modules/remark-flow/dist/variable-name.cjs.map +1 -1
  124. package/dist/node_modules/remark-flow/dist/variable-name.es.js +742 -25
  125. package/dist/node_modules/remark-flow/dist/variable-name.es.js.map +1 -1
  126. package/dist/node_modules/unified/lib/index.cjs +1 -1
  127. package/dist/node_modules/unified/lib/index.es.js +1 -1
  128. package/package.json +2 -2
@@ -1,70 +1,53 @@
1
- import { MatchDecorator as f, Decoration as l, ViewPlugin as u, EditorView as x } from "../../../node_modules/@codemirror/view/dist/index.es.js";
2
- import { SelectedOption as g } from "../types.es.js";
3
- import b from "./PlaceholderWidget.es.js";
4
- import { createVariableExpressionRegexp as c } from "../utils.es.js";
5
- const m = c(), a = (e) => {
6
- const t = e.state.doc.toString();
7
- if (!t) return !1;
8
- const n = c();
9
- let r;
10
- for (; (r = n.exec(t)) !== null; ) {
11
- const o = r.index ?? 0, i = o + r[0].length;
12
- if (d(e, o, i))
13
- return !0;
14
- n.lastIndex === r.index && n.lastIndex++;
15
- }
16
- return !1;
17
- }, d = (e, t, n) => {
18
- const r = t + 2, o = n - 2;
19
- return o < r ? !1 : e.state.selection.ranges.some((i) => {
20
- const h = i.anchor >= r && i.anchor <= o, p = i.head >= r && i.head <= o;
21
- return h || p;
1
+ import { ViewPlugin as g, EditorView as u, Decoration as o } from "../../../node_modules/@codemirror/view/dist/index.es.js";
2
+ import { SelectedOption as m } from "../types.es.js";
3
+ import p from "./PlaceholderWidget.es.js";
4
+ import { d as a } from "../../../_virtual/index.es.js";
5
+ const d = (e, s, r) => {
6
+ const t = s + 2, n = r - 2;
7
+ return n < t ? !1 : e.state.selection.ranges.some((i) => {
8
+ const h = i.anchor >= t && i.anchor <= n, f = i.head >= t && i.head <= n;
9
+ return h || f;
22
10
  });
23
- }, s = new f({
24
- regexp: m,
25
- decoration: (e, t, n) => {
26
- const r = e?.[0];
27
- if (!r)
28
- return null;
29
- const o = n + r.length;
30
- return d(t, n, o) ? null : l.replace({
31
- widget: new b(
32
- r,
33
- {
34
- tag: "variable",
35
- title: e?.[1]
36
- },
37
- "tag-variable",
38
- g.Variable,
39
- t
40
- )
41
- });
42
- }
43
- }), v = u.fromClass(
11
+ }, c = (e, s) => {
12
+ const r = e.state.doc.toString();
13
+ return o.set(
14
+ s.flatMap((t) => {
15
+ const n = r.slice(t.start, t.end);
16
+ return t.name === null || // CodeMirror inline widgets cannot replace line breaks in marker padding.
17
+ n.includes(`
18
+ `) || d(e, t.start, t.end) ? [] : [
19
+ o.replace({
20
+ widget: new p(
21
+ n,
22
+ { tag: "variable", title: t.name },
23
+ "tag-variable",
24
+ m.Variable,
25
+ e
26
+ )
27
+ }).range(t.start, t.end)
28
+ ];
29
+ })
30
+ );
31
+ }, l = (e, s) => s.filter(
32
+ (r) => d(e, r.start, r.end)
33
+ ).map((r) => r.start).join(","), x = g.fromClass(
44
34
  class {
45
35
  constructor(e) {
46
- this.selectionInsideVariable = a(e), this.placeholders = s.createDeco(e);
36
+ this.markers = a.findDocumentVariableMarkers(e.state.doc.toString()), this.selectionSignature = l(e, this.markers), this.placeholders = c(e, this.markers);
47
37
  }
48
38
  update(e) {
49
- if (e.selectionSet || e.docChanged) {
50
- const t = a(e.view);
51
- if (t !== this.selectionInsideVariable) {
52
- this.selectionInsideVariable = t, this.placeholders = s.createDeco(e.view);
53
- return;
54
- }
39
+ if (e.docChanged && (this.markers = a.findDocumentVariableMarkers(e.state.doc.toString())), e.docChanged || e.selectionSet) {
40
+ const s = l(e.view, this.markers);
41
+ (e.docChanged || s !== this.selectionSignature) && (this.selectionSignature = s, this.placeholders = c(e.view, this.markers));
55
42
  }
56
- this.placeholders = s.updateDeco(
57
- e,
58
- this.placeholders
59
- );
60
43
  }
61
44
  },
62
45
  {
63
46
  decorations: (e) => e.placeholders,
64
- provide: (e) => x.atomicRanges.of((t) => t.plugin(e)?.placeholders || l.none)
47
+ provide: (e) => u.atomicRanges.of((s) => s.plugin(e)?.placeholders || o.none)
65
48
  }
66
49
  );
67
50
  export {
68
- v as default
51
+ x as default
69
52
  };
70
53
  //# sourceMappingURL=VariablePlaceholder.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VariablePlaceholder.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/VariablePlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\nimport { createVariableExpressionRegexp } from \"../utils\";\n\nconst variableContextRegexp = createVariableExpressionRegexp();\n\nconst selectionInsideAnyVariable = (view: EditorView) => {\n const docText = view.state.doc.toString();\n if (!docText) return false;\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n while ((match = regexp.exec(docText)) !== null) {\n const from = match.index ?? 0;\n const to = from + match[0].length;\n if (selectionInsideVariableExpression(view, from, to)) {\n return true;\n }\n if (regexp.lastIndex === match.index) {\n regexp.lastIndex++;\n }\n }\n return false;\n};\n\nconst selectionInsideVariableExpression = (\n view: EditorView,\n from: number,\n to: number\n) => {\n const innerStart = from + 2;\n const innerEnd = to - 2;\n if (innerEnd < innerStart) {\n return false;\n }\n return view.state.selection.ranges.some((range) => {\n const isAnchorInside =\n range.anchor >= innerStart && range.anchor <= innerEnd;\n const isHeadInside = range.head >= innerStart && range.head <= innerEnd;\n return isAnchorInside || isHeadInside;\n });\n};\n\nconst variableUrlMatcher = new MatchDecorator({\n regexp: variableContextRegexp,\n decoration: (match, view, from) => {\n const rawMatch = match?.[0];\n if (!rawMatch) {\n return null;\n }\n const to = from + rawMatch.length;\n if (selectionInsideVariableExpression(view, from, to)) {\n return null;\n }\n return Decoration.replace({\n widget: new PlaceholderWidget(\n rawMatch,\n {\n tag: \"variable\",\n title: match?.[1],\n },\n \"tag-variable\",\n SelectedOption.Variable,\n view\n ),\n });\n },\n});\n\nconst VariablePlaceholder = ViewPlugin.fromClass(\n class {\n placeholders: DecorationSet;\n selectionInsideVariable: boolean;\n constructor(view: EditorView) {\n this.selectionInsideVariable = selectionInsideAnyVariable(view);\n this.placeholders = variableUrlMatcher.createDeco(view);\n }\n update(update: ViewUpdate) {\n if (update.selectionSet || update.docChanged) {\n const insideNow = selectionInsideAnyVariable(update.view);\n if (insideNow !== this.selectionInsideVariable) {\n this.selectionInsideVariable = insideNow;\n this.placeholders = variableUrlMatcher.createDeco(update.view);\n return;\n }\n }\n this.placeholders = variableUrlMatcher.updateDeco(\n update,\n this.placeholders\n );\n }\n },\n {\n decorations: (instance) => instance.placeholders,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.placeholders || Decoration.none;\n }),\n }\n);\n\nexport default VariablePlaceholder;\n"],"names":["variableContextRegexp","createVariableExpressionRegexp","selectionInsideAnyVariable","view","docText","regexp","match","from","to","selectionInsideVariableExpression","innerStart","innerEnd","range","isAnchorInside","isHeadInside","variableUrlMatcher","MatchDecorator","rawMatch","Decoration","PlaceholderWidget","SelectedOption","VariablePlaceholder","ViewPlugin","update","insideNow","instance","plugin","EditorView"],"mappings":";;;;AAYA,MAAMA,IAAwBC,EAAA,GAExBC,IAA6B,CAACC,MAAqB;AACvD,QAAMC,IAAUD,EAAK,MAAM,IAAI,SAAA;AAC/B,MAAI,CAACC,EAAS,QAAO;AACrB,QAAMC,IAASJ,EAAA;AACf,MAAIK;AACJ,UAAQA,IAAQD,EAAO,KAAKD,CAAO,OAAO,QAAM;AAC9C,UAAMG,IAAOD,EAAM,SAAS,GACtBE,IAAKD,IAAOD,EAAM,CAAC,EAAE;AAC3B,QAAIG,EAAkCN,GAAMI,GAAMC,CAAE;AAClD,aAAO;AAET,IAAIH,EAAO,cAAcC,EAAM,SAC7BD,EAAO;AAAA,EAEX;AACA,SAAO;AACT,GAEMI,IAAoC,CACxCN,GACAI,GACAC,MACG;AACH,QAAME,IAAaH,IAAO,GACpBI,IAAWH,IAAK;AACtB,SAAIG,IAAWD,IACN,KAEFP,EAAK,MAAM,UAAU,OAAO,KAAK,CAACS,MAAU;AACjD,UAAMC,IACJD,EAAM,UAAUF,KAAcE,EAAM,UAAUD,GAC1CG,IAAeF,EAAM,QAAQF,KAAcE,EAAM,QAAQD;AAC/D,WAAOE,KAAkBC;AAAA,EAC3B,CAAC;AACH,GAEMC,IAAqB,IAAIC,EAAe;AAAA,EAC5C,QAAQhB;AAAA,EACR,YAAY,CAACM,GAAOH,GAAMI,MAAS;AACjC,UAAMU,IAAWX,IAAQ,CAAC;AAC1B,QAAI,CAACW;AACH,aAAO;AAET,UAAMT,IAAKD,IAAOU,EAAS;AAC3B,WAAIR,EAAkCN,GAAMI,GAAMC,CAAE,IAC3C,OAEFU,EAAW,QAAQ;AAAA,MACxB,QAAQ,IAAIC;AAAA,QACVF;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAOX,IAAQ,CAAC;AAAA,QAAA;AAAA,QAElB;AAAA,QACAc,EAAe;AAAA,QACfjB;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EACH;AACF,CAAC,GAEKkB,IAAsBC,EAAW;AAAA,EACrC,MAAM;AAAA,IAGJ,YAAYnB,GAAkB;AAC5B,WAAK,0BAA0BD,EAA2BC,CAAI,GAC9D,KAAK,eAAeY,EAAmB,WAAWZ,CAAI;AAAA,IACxD;AAAA,IACA,OAAOoB,GAAoB;AACzB,UAAIA,EAAO,gBAAgBA,EAAO,YAAY;AAC5C,cAAMC,IAAYtB,EAA2BqB,EAAO,IAAI;AACxD,YAAIC,MAAc,KAAK,yBAAyB;AAC9C,eAAK,0BAA0BA,GAC/B,KAAK,eAAeT,EAAmB,WAAWQ,EAAO,IAAI;AAC7D;AAAA,QACF;AAAA,MACF;AACA,WAAK,eAAeR,EAAmB;AAAA,QACrCQ;AAAA,QACA,KAAK;AAAA,MAAA;AAAA,IAET;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,aAAa,CAACE,MAAaA,EAAS;AAAA,IACpC,SAAS,CAACC,MACRC,EAAW,aAAa,GAAG,CAACxB,MACnBA,EAAK,OAAOuB,CAAM,GAAG,gBAAgBR,EAAW,IACxD;AAAA,EAAA;AAEP;"}
1
+ {"version":3,"file":"VariablePlaceholder.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/VariablePlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\nimport { findDocumentVariableMarkers } from \"../utils\";\n\nconst selectionInsideVariableExpression = (\n view: EditorView,\n from: number,\n to: number\n) => {\n const innerStart = from + 2;\n const innerEnd = to - 2;\n if (innerEnd < innerStart) {\n return false;\n }\n return view.state.selection.ranges.some((range) => {\n const isAnchorInside =\n range.anchor >= innerStart && range.anchor <= innerEnd;\n const isHeadInside = range.head >= innerStart && range.head <= innerEnd;\n return isAnchorInside || isHeadInside;\n });\n};\n\nconst buildPlaceholders = (\n view: EditorView,\n markers: ReturnType<typeof findDocumentVariableMarkers>\n): DecorationSet => {\n const text = view.state.doc.toString();\n return Decoration.set(\n markers.flatMap((marker) => {\n const rawMarker = text.slice(marker.start, marker.end);\n if (\n marker.name === null ||\n // CodeMirror inline widgets cannot replace line breaks in marker padding.\n rawMarker.includes(\"\\n\") ||\n selectionInsideVariableExpression(view, marker.start, marker.end)\n ) {\n return [];\n }\n return [\n Decoration.replace({\n widget: new PlaceholderWidget(\n rawMarker,\n { tag: \"variable\", title: marker.name },\n \"tag-variable\",\n SelectedOption.Variable,\n view\n ),\n }).range(marker.start, marker.end),\n ];\n })\n );\n};\n\nconst selectedMarkers = (\n view: EditorView,\n markers: ReturnType<typeof findDocumentVariableMarkers>\n) =>\n markers\n .filter((marker) =>\n selectionInsideVariableExpression(view, marker.start, marker.end)\n )\n .map((marker) => marker.start)\n .join(\",\");\n\nconst VariablePlaceholder = ViewPlugin.fromClass(\n class {\n placeholders: DecorationSet;\n markers: ReturnType<typeof findDocumentVariableMarkers>;\n selectionSignature: string;\n constructor(view: EditorView) {\n this.markers = findDocumentVariableMarkers(view.state.doc.toString());\n this.selectionSignature = selectedMarkers(view, this.markers);\n this.placeholders = buildPlaceholders(view, this.markers);\n }\n update(update: ViewUpdate) {\n if (update.docChanged)\n this.markers = findDocumentVariableMarkers(update.state.doc.toString());\n if (update.docChanged || update.selectionSet) {\n const signature = selectedMarkers(update.view, this.markers);\n if (update.docChanged || signature !== this.selectionSignature) {\n this.selectionSignature = signature;\n this.placeholders = buildPlaceholders(update.view, this.markers);\n }\n }\n }\n },\n {\n decorations: (instance) => instance.placeholders,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.placeholders || Decoration.none;\n }),\n }\n);\n\nexport default VariablePlaceholder;\n"],"names":["selectionInsideVariableExpression","view","from","to","innerStart","innerEnd","range","isAnchorInside","isHeadInside","buildPlaceholders","markers","text","Decoration","marker","rawMarker","PlaceholderWidget","SelectedOption","selectedMarkers","VariablePlaceholder","ViewPlugin","findDocumentVariableMarkers","update","signature","instance","plugin","EditorView"],"mappings":";;;;AAWA,MAAMA,IAAoC,CACxCC,GACAC,GACAC,MACG;AACH,QAAMC,IAAaF,IAAO,GACpBG,IAAWF,IAAK;AACtB,SAAIE,IAAWD,IACN,KAEFH,EAAK,MAAM,UAAU,OAAO,KAAK,CAACK,MAAU;AACjD,UAAMC,IACJD,EAAM,UAAUF,KAAcE,EAAM,UAAUD,GAC1CG,IAAeF,EAAM,QAAQF,KAAcE,EAAM,QAAQD;AAC/D,WAAOE,KAAkBC;AAAA,EAC3B,CAAC;AACH,GAEMC,IAAoB,CACxBR,GACAS,MACkB;AAClB,QAAMC,IAAOV,EAAK,MAAM,IAAI,SAAA;AAC5B,SAAOW,EAAW;AAAA,IAChBF,EAAQ,QAAQ,CAACG,MAAW;AAC1B,YAAMC,IAAYH,EAAK,MAAME,EAAO,OAAOA,EAAO,GAAG;AACrD,aACEA,EAAO,SAAS;AAAA,MAEhBC,EAAU,SAAS;AAAA,CAAI,KACvBd,EAAkCC,GAAMY,EAAO,OAAOA,EAAO,GAAG,IAEzD,CAAA,IAEF;AAAA,QACLD,EAAW,QAAQ;AAAA,UACjB,QAAQ,IAAIG;AAAA,YACVD;AAAA,YACA,EAAE,KAAK,YAAY,OAAOD,EAAO,KAAA;AAAA,YACjC;AAAA,YACAG,EAAe;AAAA,YACff;AAAA,UAAA;AAAA,QACF,CACD,EAAE,MAAMY,EAAO,OAAOA,EAAO,GAAG;AAAA,MAAA;AAAA,IAErC,CAAC;AAAA,EAAA;AAEL,GAEMI,IAAkB,CACtBhB,GACAS,MAEAA,EACG;AAAA,EAAO,CAACG,MACPb,EAAkCC,GAAMY,EAAO,OAAOA,EAAO,GAAG;AAClE,EACC,IAAI,CAACA,MAAWA,EAAO,KAAK,EAC5B,KAAK,GAAG,GAEPK,IAAsBC,EAAW;AAAA,EACrC,MAAM;AAAA,IAIJ,YAAYlB,GAAkB;AAC5B,WAAK,UAAUmB,8BAA4BnB,EAAK,MAAM,IAAI,UAAU,GACpE,KAAK,qBAAqBgB,EAAgBhB,GAAM,KAAK,OAAO,GAC5D,KAAK,eAAeQ,EAAkBR,GAAM,KAAK,OAAO;AAAA,IAC1D;AAAA,IACA,OAAOoB,GAAoB;AAGzB,UAFIA,EAAO,eACT,KAAK,UAAUD,8BAA4BC,EAAO,MAAM,IAAI,UAAU,IACpEA,EAAO,cAAcA,EAAO,cAAc;AAC5C,cAAMC,IAAYL,EAAgBI,EAAO,MAAM,KAAK,OAAO;AAC3D,SAAIA,EAAO,cAAcC,MAAc,KAAK,wBAC1C,KAAK,qBAAqBA,GAC1B,KAAK,eAAeb,EAAkBY,EAAO,MAAM,KAAK,OAAO;AAAA,MAEnE;AAAA,IACF;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,aAAa,CAACE,MAAaA,EAAS;AAAA,IACpC,SAAS,CAACC,MACRC,EAAW,aAAa,GAAG,CAACxB,MACnBA,EAAK,OAAOuB,CAAM,GAAG,gBAAgBZ,EAAW,IACxD;AAAA,EAAA;AAEP;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./types.cjs"),$=require("./utils/video.cjs"),m=require("../../_virtual/index.cjs"),s="===",x=()=>m.distExports.createVariableExpressionRegex("gu"),f=(t,e)=>{switch(t){case d.SelectedOption.Image:return{resourceUrl:e.url,resourceTitle:e.title,scalePercent:e.scalePercent};case d.SelectedOption.Video:return{resourceUrl:e.url,resourceTitle:e.title};case d.SelectedOption.Variable:return{variableName:e.title};default:return{resourceUrl:e.url??"",resourceTitle:e.title??""}}};function w(t,e){return o=>{const n=o.matchBefore(/\/(\w*)$/);if(!n)return null;const c=(r,a,i,l,u)=>{r.dispatch({changes:{from:i,to:l,insert:""}}),t(u)};return{from:n.from,to:n.to,options:[{label:e?.variable??"Variable",apply:(r,a,i,l)=>{c(r,a,i,l,d.SelectedOption.Variable)}},{label:e?.image??"Image",apply:(r,a,i,l)=>{c(r,a,i,l,d.SelectedOption.Image)}},{label:e?.video??"Video",apply:(r,a,i,l)=>{c(r,a,i,l,d.SelectedOption.Video)}}],filter:!1}}}const b=t=>$.getVideoEmbedUrl(t),p=t=>t.replace(/&/g,"&amp;").replace(/"/g,"&quot;"),h=t=>t.replace(/([\[\]\\])/g,"\\$1"),V=t=>Math.max(1,Math.min(1e3,Math.round(t))),g=t=>{const e=t.trim();return e?new RegExp(`^${s}\\s*[\\s\\S]*?\\s*${s}$`).test(e)?e:`${s} ${e} ${s}`:`${s}${s}`},S=t=>{const e=t.trim(),o=new RegExp(`^${s}\\s*([\\s\\S]*?)\\s*${s}$`);return(e.match(o)?.[1]??e).trim()},E=({resourceUrl:t,resourceTitle:e,scalePercent:o})=>{const n=typeof o=="number"?V(o):void 0,c=p(t),r=e?p(e):void 0,a=e?h(e):"",i=typeof n=="number"&&n!==100?` width="${n}%"`:"",l=r?` alt="${r}" title="${r}"`:"",u=!n||n===100?`![${a}](${t})`:`<img src="${c}"${l}${i} />`;return g(u)},I=(t,e)=>{const o=b(t),n=e?p(e):"",c=p(t),r=p(o),a=`<iframe data-tag="video" data-title="${n}" data-url="${c}" class="w-full aspect-video rounded-lg border-0" src="${r}" allowfullscreen="" allow="autoplay; encrypted-media"></iframe>`;return g(a)};exports.createSlashCommands=w;exports.createVariableExpressionRegexp=x;exports.extractVariableNames=m.distExports.extractVariableNames;exports.getEmbedUrl=b;exports.getImageContentToInsert=E;exports.getVideoContentToInsert=I;exports.normalizeVariableName=m.distExports.normalizeVariableName;exports.parseContentInfo=f;exports.unwrapFixedOutput=S;exports.wrapWithFixedOutput=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./types.cjs"),g=require("./utils/video.cjs"),d=require("../../_virtual/index.cjs"),s="===",$=(t,e)=>{switch(t){case m.SelectedOption.Image:return{resourceUrl:e.url,resourceTitle:e.title,scalePercent:e.scalePercent};case m.SelectedOption.Video:return{resourceUrl:e.url,resourceTitle:e.title};case m.SelectedOption.Variable:return{variableName:d.distExports.normalizeVariableName(e.title??"")??void 0};default:return{resourceUrl:e.url??"",resourceTitle:e.title??""}}};function V(t,e){return i=>{const a=i.matchBefore(/\/(\w*)$/);if(!a)return null;const c=(r,n,o,l,u)=>{r.dispatch({changes:{from:o,to:l,insert:""}}),t(u)};return{from:a.from,to:a.to,options:[{label:e?.variable??"Variable",apply:(r,n,o,l)=>{c(r,n,o,l,m.SelectedOption.Variable)}},{label:e?.image??"Image",apply:(r,n,o,l)=>{c(r,n,o,l,m.SelectedOption.Image)}},{label:e?.video??"Video",apply:(r,n,o,l)=>{c(r,n,o,l,m.SelectedOption.Video)}}],filter:!1}}}const f=t=>g.getVideoEmbedUrl(t),p=t=>t.replace(/&/g,"&amp;").replace(/"/g,"&quot;"),w=t=>t.replace(/([\[\]\\])/g,"\\$1"),h=t=>Math.max(1,Math.min(1e3,Math.round(t))),b=t=>{const e=t.trim();return e?new RegExp(`^${s}\\s*[\\s\\S]*?\\s*${s}$`).test(e)?e:`${s} ${e} ${s}`:`${s}${s}`},x=t=>{const e=t.trim(),i=new RegExp(`^${s}\\s*([\\s\\S]*?)\\s*${s}$`);return(e.match(i)?.[1]??e).trim()},E=({resourceUrl:t,resourceTitle:e,scalePercent:i})=>{const a=typeof i=="number"?h(i):void 0,c=p(t),r=e?p(e):void 0,n=e?w(e):"",o=typeof a=="number"&&a!==100?` width="${a}%"`:"",l=r?` alt="${r}" title="${r}"`:"",u=!a||a===100?`![${n}](${t})`:`<img src="${c}"${l}${o} />`;return b(u)},S=(t,e)=>{const i=f(t),a=e?p(e):"",c=p(t),r=p(i),n=`<iframe data-tag="video" data-title="${a}" data-url="${c}" class="w-full aspect-video rounded-lg border-0" src="${r}" allowfullscreen="" allow="autoplay; encrypted-media"></iframe>`;return b(n)};exports.createSlashCommands=V;exports.extractVariableNames=d.distExports.extractVariableNames;exports.findDocumentVariableMarkers=d.distExports.findDocumentVariableMarkers;exports.findVariableMarkers=d.distExports.findVariableMarkers;exports.formatVariableReference=d.distExports.formatVariableReference;exports.getEmbedUrl=f;exports.getImageContentToInsert=E;exports.getVideoContentToInsert=S;exports.normalizeVariableName=d.distExports.normalizeVariableName;exports.parseContentInfo=$;exports.trimVariablePadding=d.distExports.trimVariablePadding;exports.unwrapFixedOutput=x;exports.wrapWithFixedOutput=b;
2
2
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nimport {\n createVariableExpressionRegex,\n extractVariableNames,\n isValidVariableName,\n normalizeVariableName,\n} from \"remark-flow\";\n\nconst FIXED_OUTPUT_MARKER = \"===\";\nconst createVariableExpressionRegexp = () =>\n createVariableExpressionRegex(\"gu\");\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: dataset.title,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.variable ?? \"Variable\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n normalizeVariableName,\n extractVariableNames,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["FIXED_OUTPUT_MARKER","createVariableExpressionRegexp","createVariableExpressionRegex","parseContentInfo","type","dataset","SelectedOption","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","content","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nimport {\n createVariableExpressionRegex,\n extractVariableNames,\n findVariableMarkers,\n findDocumentVariableMarkers,\n formatVariableReference,\n formatVariableAssignment,\n isValidVariableName,\n normalizeVariableName,\n trimVariablePadding,\n} from \"remark-flow\";\n\nconst FIXED_OUTPUT_MARKER = \"===\";\nconst createVariableExpressionRegexp = () =>\n createVariableExpressionRegex(\"gu\");\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: normalizeVariableName(dataset.title ?? \"\") ?? undefined,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.variable ?? \"Variable\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n normalizeVariableName,\n trimVariablePadding,\n extractVariableNames,\n findVariableMarkers,\n findDocumentVariableMarkers,\n formatVariableReference,\n formatVariableAssignment,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["FIXED_OUTPUT_MARKER","parseContentInfo","type","dataset","SelectedOption","normalizeVariableName","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","content","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { CompletionContext, CompletionResult } from '@codemirror/autocomplete';
2
2
  import { SelectedOption } from './types.js';
3
- import { extractVariableNames, isValidVariableName, normalizeVariableName } from 'remark-flow';
3
+ import { extractVariableNames, findVariableMarkers, findDocumentVariableMarkers, formatVariableReference, formatVariableAssignment, isValidVariableName, normalizeVariableName, trimVariablePadding } from 'remark-flow';
4
4
  declare const createVariableExpressionRegexp: () => RegExp;
5
5
  declare const parseContentInfo: (type: SelectedOption, dataset: {
6
6
  title?: string;
@@ -38,4 +38,4 @@ declare const getImageContentToInsert: ({ resourceUrl, resourceTitle, scalePerce
38
38
  scalePercent?: number;
39
39
  }) => string;
40
40
  declare const getVideoContentToInsert: (resourceUrl: string, resourceTitle: string) => string;
41
- export { createSlashCommands, parseContentInfo, getEmbedUrl, getImageContentToInsert, getVideoContentToInsert, isValidVariableName, normalizeVariableName, extractVariableNames, createVariableExpressionRegexp, wrapWithFixedOutput, unwrapFixedOutput, };
41
+ export { createSlashCommands, parseContentInfo, getEmbedUrl, getImageContentToInsert, getVideoContentToInsert, isValidVariableName, normalizeVariableName, trimVariablePadding, extractVariableNames, findVariableMarkers, findDocumentVariableMarkers, formatVariableReference, formatVariableAssignment, createVariableExpressionRegexp, wrapWithFixedOutput, unwrapFixedOutput, };
@@ -1,22 +1,22 @@
1
- import { SelectedOption as m } from "./types.es.js";
2
- import { getVideoEmbedUrl as b } from "./utils/video.es.js";
3
- import { d as u } from "../../_virtual/index.es.js";
4
- const c = "===", E = () => u.createVariableExpressionRegex("gu"), z = (t, e) => {
1
+ import { SelectedOption as d } from "./types.es.js";
2
+ import { getVideoEmbedUrl as f } from "./utils/video.es.js";
3
+ import { d as m } from "../../_virtual/index.es.js";
4
+ const c = "===", x = (t, e) => {
5
5
  switch (t) {
6
- case m.Image:
6
+ case d.Image:
7
7
  return {
8
8
  resourceUrl: e.url,
9
9
  resourceTitle: e.title,
10
10
  scalePercent: e.scalePercent
11
11
  };
12
- case m.Video:
12
+ case d.Video:
13
13
  return {
14
14
  resourceUrl: e.url,
15
15
  resourceTitle: e.title
16
16
  };
17
- case m.Variable:
17
+ case d.Variable:
18
18
  return {
19
- variableName: e.title
19
+ variableName: m.normalizeVariableName(e.title ?? "") ?? void 0
20
20
  };
21
21
  default:
22
22
  return {
@@ -25,14 +25,14 @@ const c = "===", E = () => u.createVariableExpressionRegex("gu"), z = (t, e) =>
25
25
  };
26
26
  }
27
27
  };
28
- function U(t, e) {
28
+ function z(t, e) {
29
29
  return (o) => {
30
30
  const a = o.matchBefore(/\/(\w*)$/);
31
31
  if (!a) return null;
32
- const s = (r, n, i, l, d) => {
32
+ const s = (r, n, i, l, u) => {
33
33
  r.dispatch({
34
34
  changes: { from: i, to: l, insert: "" }
35
- }), t(d);
35
+ }), t(u);
36
36
  };
37
37
  return {
38
38
  from: a.from,
@@ -53,19 +53,19 @@ function U(t, e) {
53
53
  {
54
54
  label: e?.variable ?? "Variable",
55
55
  apply: (r, n, i, l) => {
56
- s(r, n, i, l, m.Variable);
56
+ s(r, n, i, l, d.Variable);
57
57
  }
58
58
  },
59
59
  {
60
60
  label: e?.image ?? "Image",
61
61
  apply: (r, n, i, l) => {
62
- s(r, n, i, l, m.Image);
62
+ s(r, n, i, l, d.Image);
63
63
  }
64
64
  },
65
65
  {
66
66
  label: e?.video ?? "Video",
67
67
  apply: (r, n, i, l) => {
68
- s(r, n, i, l, m.Video);
68
+ s(r, n, i, l, d.Video);
69
69
  }
70
70
  }
71
71
  ],
@@ -73,7 +73,7 @@ function U(t, e) {
73
73
  };
74
74
  };
75
75
  }
76
- const g = (t) => b(t), p = (t) => t.replace(/&/g, "&amp;").replace(/"/g, "&quot;"), f = (t) => t.replace(/([\[\]\\])/g, "\\$1"), w = (t) => Math.max(1, Math.min(1e3, Math.round(t))), $ = (t) => {
76
+ const $ = (t) => f(t), p = (t) => t.replace(/&/g, "&amp;").replace(/"/g, "&quot;"), g = (t) => t.replace(/([\[\]\\])/g, "\\$1"), V = (t) => Math.max(1, Math.min(1e3, Math.round(t))), b = (t) => {
77
77
  const e = t.trim();
78
78
  return e ? new RegExp(
79
79
  `^${c}\\s*[\\s\\S]*?\\s*${c}$`
@@ -83,27 +83,30 @@ const g = (t) => b(t), p = (t) => t.replace(/&/g, "&amp;").replace(/"/g, "&quot;
83
83
  `^${c}\\s*([\\s\\S]*?)\\s*${c}$`
84
84
  );
85
85
  return (e.match(o)?.[1] ?? e).trim();
86
- }, I = ({
86
+ }, U = ({
87
87
  resourceUrl: t,
88
88
  resourceTitle: e,
89
89
  scalePercent: o
90
90
  }) => {
91
- const a = typeof o == "number" ? w(o) : void 0, s = p(t), r = e ? p(e) : void 0, n = e ? f(e) : "", i = typeof a == "number" && a !== 100 ? ` width="${a}%"` : "", l = r ? ` alt="${r}" title="${r}"` : "", d = !a || a === 100 ? `![${n}](${t})` : `<img src="${s}"${l}${i} />`;
92
- return $(d);
93
- }, T = (t, e) => {
94
- const o = g(t), a = e ? p(e) : "", s = p(t), r = p(o), n = `<iframe data-tag="video" data-title="${a}" data-url="${s}" class="w-full aspect-video rounded-lg border-0" src="${r}" allowfullscreen="" allow="autoplay; encrypted-media"></iframe>`;
95
- return $(n);
96
- }, y = u.extractVariableNames, M = u.normalizeVariableName;
91
+ const a = typeof o == "number" ? V(o) : void 0, s = p(t), r = e ? p(e) : void 0, n = e ? g(e) : "", i = typeof a == "number" && a !== 100 ? ` width="${a}%"` : "", l = r ? ` alt="${r}" title="${r}"` : "", u = !a || a === 100 ? `![${n}](${t})` : `<img src="${s}"${l}${i} />`;
92
+ return b(u);
93
+ }, k = (t, e) => {
94
+ const o = $(t), a = e ? p(e) : "", s = p(t), r = p(o), n = `<iframe data-tag="video" data-title="${a}" data-url="${s}" class="w-full aspect-video rounded-lg border-0" src="${r}" allowfullscreen="" allow="autoplay; encrypted-media"></iframe>`;
95
+ return b(n);
96
+ }, E = m.extractVariableNames, I = m.findDocumentVariableMarkers, P = m.findVariableMarkers, T = m.formatVariableReference, y = m.normalizeVariableName, R = m.trimVariablePadding;
97
97
  export {
98
- U as createSlashCommands,
99
- E as createVariableExpressionRegexp,
100
- y as extractVariableNames,
101
- g as getEmbedUrl,
102
- I as getImageContentToInsert,
103
- T as getVideoContentToInsert,
104
- M as normalizeVariableName,
105
- z as parseContentInfo,
98
+ z as createSlashCommands,
99
+ E as extractVariableNames,
100
+ I as findDocumentVariableMarkers,
101
+ P as findVariableMarkers,
102
+ T as formatVariableReference,
103
+ $ as getEmbedUrl,
104
+ U as getImageContentToInsert,
105
+ k as getVideoContentToInsert,
106
+ y as normalizeVariableName,
107
+ x as parseContentInfo,
108
+ R as trimVariablePadding,
106
109
  v as unwrapFixedOutput,
107
- $ as wrapWithFixedOutput
110
+ b as wrapWithFixedOutput
108
111
  };
109
112
  //# sourceMappingURL=utils.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.es.js","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nimport {\n createVariableExpressionRegex,\n extractVariableNames,\n isValidVariableName,\n normalizeVariableName,\n} from \"remark-flow\";\n\nconst FIXED_OUTPUT_MARKER = \"===\";\nconst createVariableExpressionRegexp = () =>\n createVariableExpressionRegex(\"gu\");\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: dataset.title,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.variable ?? \"Variable\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n normalizeVariableName,\n extractVariableNames,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["FIXED_OUTPUT_MARKER","createVariableExpressionRegexp","createVariableExpressionRegex","parseContentInfo","type","dataset","SelectedOption","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","content","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
1
+ {"version":3,"file":"utils.es.js","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nimport {\n createVariableExpressionRegex,\n extractVariableNames,\n findVariableMarkers,\n findDocumentVariableMarkers,\n formatVariableReference,\n formatVariableAssignment,\n isValidVariableName,\n normalizeVariableName,\n trimVariablePadding,\n} from \"remark-flow\";\n\nconst FIXED_OUTPUT_MARKER = \"===\";\nconst createVariableExpressionRegexp = () =>\n createVariableExpressionRegex(\"gu\");\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: normalizeVariableName(dataset.title ?? \"\") ?? undefined,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.variable ?? \"Variable\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? `![${markdownTitle}](${resourceUrl})`\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n normalizeVariableName,\n trimVariablePadding,\n extractVariableNames,\n findVariableMarkers,\n findDocumentVariableMarkers,\n formatVariableReference,\n formatVariableAssignment,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["FIXED_OUTPUT_MARKER","parseContentInfo","type","dataset","SelectedOption","normalizeVariableName","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","content","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),d=require("react"),u=require("../../../node_modules/rc-textarea/es/TextArea.cjs");require("../../../_virtual/index4.cjs");require("../../../node_modules/rc-resize-observer/es/index.cjs");require("../../../node_modules/rc-util/es/hooks/useLayoutEffect.cjs");require("../../../node_modules/rc-util/es/raf.cjs");const s=require("../../../lib/utils.cjs");function c(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const l=c(d),i=l.forwardRef(({className:e,autoSize:t={minRows:1},style:r,...a},n)=>o.jsx(u.default,{ref:n,autoSize:t,className:s.cn("border-input placeholder:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 w-full rounded-md border bg-transparent pl-3 py-1.5 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50","resize-none",e),style:{whiteSpace:"pre-wrap",wordBreak:"break-word",...r},...a}));i.displayName="Textarea";exports.Textarea=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),d=require("react"),u=require("../../../node_modules/rc-textarea/es/TextArea.cjs");require("../../../_virtual/index5.cjs");require("../../../node_modules/rc-resize-observer/es/index.cjs");require("../../../node_modules/rc-util/es/hooks/useLayoutEffect.cjs");require("../../../node_modules/rc-util/es/raf.cjs");const s=require("../../../lib/utils.cjs");function c(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const l=c(d),i=l.forwardRef(({className:e,autoSize:t={minRows:1},style:r,...a},n)=>o.jsx(u.default,{ref:n,autoSize:t,className:s.cn("border-input placeholder:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 w-full rounded-md border bg-transparent pl-3 py-1.5 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50","resize-none",e),style:{whiteSpace:"pre-wrap",wordBreak:"break-word",...r},...a}));i.displayName="Textarea";exports.Textarea=i;
2
2
  //# sourceMappingURL=textarea.cjs.map
@@ -1,7 +1,7 @@
1
1
  import { jsx as i } from "react/jsx-runtime";
2
2
  import * as d from "react";
3
3
  import n from "../../../node_modules/rc-textarea/es/TextArea.es.js";
4
- import "../../../_virtual/index.es4.js";
4
+ import "../../../_virtual/index.es5.js";
5
5
  import "../../../node_modules/rc-resize-observer/es/index.es.js";
6
6
  import "../../../node_modules/rc-util/es/hooks/useLayoutEffect.es.js";
7
7
  import "../../../node_modules/rc-util/es/raf.es.js";
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("../_virtual/index.cjs"),b=d.distExports.createInteractionParser(),I=/<custom-variable\b/i,T=new RegExp(`\\?\\[(?:%${d.distExports.createVariableExpressionRegex().source})?(${d.distExports.INTERACTION_CONTENT_SOURCE})\\]`),g=/^[\[{]/,v=/^[\s,,\n]+/,E=t=>{if(!t)return null;const n=t.match(T),s=n?.[1]?d.distExports.normalizeVariableName(n[1])??void 0:void 0,e=n?.[2]?.trim();if(!e)return null;const r=e.includes("||"),l=r?"||":"|",i=e.split(l).map(a=>a.trim()).filter(Boolean);if(!i.length)return null;const u=[],o=[];let c;return i.forEach(a=>{if(a.startsWith("...")){const p=a.replace(/^\.\.\./,"").trim();p&&(c=p);return}u.push(a),o.push(a)}),{variableName:s,buttonTexts:u.length?u:void 0,buttonValues:o.length?o:void 0,placeholder:c,isMultiSelect:r}},V=t=>{if(!t)return null;try{return b.parseToRemarkFormat(t)}catch(n){console.warn("Failed to parse interaction block",n)}return E(t)},h=(t,n)=>{if(!t)return null;const s=t.trim(),e=n.buttonValues||[],r=n.buttonTexts||[],l=e.indexOf(s);if(l>-1)return{value:e[l],display:r[l]};const i=r.indexOf(s);return i>-1?{value:e[i]||r[i],display:r[i]}:null},R=t=>t.split(/[,,\n]/).map(n=>n.trim()).filter(Boolean),f=t=>t.replace(v,""),S=t=>{const n=t.buttonValues||[],s=t.buttonTexts||[],e=[],r=new Set;return n.forEach((l,i)=>{const u=`${l??""}`.trim(),o=`${s[i]??""}`.trim();[u,o].forEach(c=>{if(!c)return;const a=`${c}::${u||c}`;r.has(a)||(r.add(a),e.push({token:c,value:u||c}))})}),e.sort((l,i)=>i.token.length-l.token.length)},N=(t,n)=>{const s=f(t),e=S(n);for(const r of e){if(!s.startsWith(r.token))continue;const l=s[r.token.length];if(!(l&&!/[\s,,\n]/.test(l)))return r}return null},A=(t,n)=>{const s=R(t);if(!s.length)return{};const e=[],r=[];return s.forEach(l=>{const i=h(l,n);if(i){e.push(i.value);return}if(n.placeholder){r.push(l);return}e.push(l)}),{selectedValues:e.length?e:void 0,inputText:r.length?r.join(", "):void 0}},O=(t,n)=>{const s=[];let e=t.trim();for(;e;){const l=N(e,n);if(!l)break;s.push(l.value);const i=f(e);e=f(i.slice(l.token.length))}if(s.length>0)return{selectedValues:s,inputText:n.placeholder&&e.trim()?e.trim():void 0};const r=A(t,n);return r.selectedValues?.length?r:n.placeholder?{inputText:t.trim()}:r},D=t=>{if(!t||Array.isArray(t))return null;const n=Array.isArray(t.selectedValues)?t.selectedValues.map(r=>`${r??""}`.trim()).filter(Boolean):void 0,s=`${t.buttonText??""}`.trim(),e=typeof t.inputText=="string"?t.inputText:void 0;return!n?.length&&!s&&!e?null:{buttonText:s||void 0,inputText:e,selectedValues:n?.length?n:void 0}},C=t=>{if(!t||!g.test(t.trim()))return null;try{const n=JSON.parse(t);return D(n)}catch{return null}},P=t=>!!(t&&(I.test(t)||T.test(t))),m=(t,n,s,e)=>e?.resolveDefaultValues?.({content:t,rawValue:n,interactionInfo:s})??null,x=(t,n,s)=>{const e=n?.toString().trim();if(!e)return{};const r=C(e);if(r)return r;const l=m(t,e,null,s);if(l)return l;if(!P(t))return{buttonText:e,inputText:e};const i=V(t),u=m(t,e,i,s);if(u)return u;if(!i)return{buttonText:e,inputText:e};if(i.isMultiSelect)return O(e,i);const o=h(e,i);return o?{buttonText:o.value||o.display||e}:i.placeholder?{inputText:e}:{buttonText:e,inputText:e}},_=(t,n,s)=>{const e=x(t,n,s);return e.selectedValues?e.selectedValues:n?n.split(",").map(r=>r.trim()).filter(Boolean):void 0};exports.getInteractionDefaultSelectedValues=_;exports.getInteractionDefaultValues=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("../_virtual/index.cjs"),b=require("../components/ContentRender/utils/inline-code-ranges.cjs"),p=u.distExports.createInteractionParser(),g=/<custom-variable\b/i,E=new RegExp(`\\?\\[(${u.distExports.INTERACTION_CONTENT_SOURCE})\\](?!\\()`),V=/^[\[{]/,m=t=>{if(t.type==="flowInteraction"&&"value"in t)return typeof t.value=="string"?t.value:null;if(t.children)for(const e of t.children){const r=m(e);if(r!==null)return r}return null},I=t=>{if(!t)return null;try{const e=m(b.getMarkdownSourceAnalysis(t).tree)??(g.test(t)?t:null);return e===null||p.parse(e).error?null:p.parseToRemarkFormat(e)}catch(e){console.warn("Failed to parse interaction block",e)}return null},T=(t,e)=>{if(!t)return null;const r=u.distExports.trimVariablePadding(t),n=e.buttonValues||[],i=e.buttonTexts||[],s=n.indexOf(r);if(s>-1)return{value:n[s],display:i[s]};const l=i.indexOf(r);return l>-1?{value:n[l]||i[l],display:i[l]}:null},v=t=>t.split(/[,,\n]/).map(e=>u.distExports.trimVariablePadding(e)).filter(Boolean),d=t=>{let e=0;for(;e<t.length&&(t[e]===","||t[e]===","||u.distExports.trimVariablePadding(t[e])==="");)e+=1;return t.slice(e)},P=t=>{const e=t.buttonValues||[],r=t.buttonTexts||[],n=[],i=new Set;return e.forEach((s,l)=>{const a=u.distExports.trimVariablePadding(`${s??""}`),o=u.distExports.trimVariablePadding(`${r[l]??""}`);[a,o].forEach(c=>{if(!c)return;const f=`${c}::${a||c}`;i.has(f)||(i.add(f),n.push({token:c,value:a||c}))})}),n.sort((s,l)=>l.token.length-s.token.length)},S=(t,e)=>{const r=d(t),n=P(e);for(const i of n){if(!r.startsWith(i.token))continue;const s=r[i.token.length];if(!(s&&s!==","&&s!==","&&u.distExports.trimVariablePadding(s)!==""))return i}return null},D=(t,e)=>{const r=v(t);if(!r.length)return{};const n=[],i=[];return r.forEach(s=>{const l=T(s,e);if(l){n.push(l.value);return}if(e.placeholder){i.push(s);return}n.push(s)}),{selectedValues:n.length?n:void 0,inputText:i.length?i.join(", "):void 0}},R=(t,e)=>{const r=[];let n=u.distExports.trimVariablePadding(t);for(;n;){const s=S(n,e);if(!s)break;r.push(s.value);const l=d(n);n=d(l.slice(s.token.length))}if(r.length>0)return{selectedValues:r,inputText:e.placeholder&&n.trim()?n.trim():void 0};const i=D(t,e);return i.selectedValues?.length?i:e.placeholder?{inputText:t.trim()}:i},O=t=>{if(!t||Array.isArray(t))return null;const e=Array.isArray(t.selectedValues)?t.selectedValues.map(i=>u.distExports.trimVariablePadding(`${i??""}`)).filter(Boolean):void 0,r=u.distExports.trimVariablePadding(`${t.buttonText??""}`),n=typeof t.inputText=="string"?t.inputText:void 0;return!e?.length&&!r&&!n?null:{buttonText:r||void 0,inputText:n,selectedValues:e?.length?e:void 0}},A=t=>{if(!t||!V.test(u.distExports.trimVariablePadding(t)))return null;try{const e=JSON.parse(t);return O(e)}catch{return null}},N=t=>!!(t&&(g.test(t)||E.test(t))),x=(t,e,r,n)=>n?.resolveDefaultValues?.({content:t,rawValue:e,interactionInfo:r})??null,h=(t,e,r)=>{const n=e==null?void 0:u.distExports.trimVariablePadding(e.toString());if(!n)return{};const i=A(n);if(i)return i;const s=x(t,n,null,r);if(s)return s;if(!N(t))return{buttonText:n,inputText:n};const l=I(t),a=x(t,n,l,r);if(a)return a;if(!l)return{buttonText:n,inputText:n};if(l.isMultiSelect)return R(n,l);const o=T(n,l);return o?{buttonText:o.value||o.display||n}:l.placeholder?{inputText:n}:{buttonText:n,inputText:n}},C=(t,e,r)=>{const n=h(t,e,r);return n.selectedValues?n.selectedValues:e?e.split(",").map(i=>u.distExports.trimVariablePadding(i)).filter(Boolean):void 0};exports.getInteractionDefaultSelectedValues=C;exports.getInteractionDefaultValues=h;
2
2
  //# sourceMappingURL=interaction-defaults.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"interaction-defaults.cjs","sources":["../../src/lib/interaction-defaults.ts"],"sourcesContent":["import {\n createInteractionParser,\n createVariableExpressionRegex,\n normalizeVariableName,\n INTERACTION_CONTENT_SOURCE,\n} from \"remark-flow\";\n\nexport interface InteractionParseResult {\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n variableName?: string;\n isMultiSelect?: boolean;\n}\n\nexport interface InteractionDefaultValues {\n buttonText?: string;\n inputText?: string;\n selectedValues?: string[];\n}\n\nexport interface InteractionDefaultResolverParams {\n content?: string | null;\n rawValue?: string | null;\n interactionInfo?: InteractionParseResult | null;\n}\n\nexport type InteractionDefaultResolver = (\n params: InteractionDefaultResolverParams\n) => InteractionDefaultValues | null | undefined;\n\nexport interface InteractionDefaultValueOptions {\n resolveDefaultValues?: InteractionDefaultResolver;\n}\n\ninterface StructuredInteractionPayload {\n buttonText?: unknown;\n inputText?: unknown;\n selectedValues?: unknown;\n}\n\nconst interactionParser = createInteractionParser();\nconst INTERACTION_TAG_PATTERN = /<custom-variable\\b/i;\n// Same definition of where an interaction ends as the parser uses, so an option carrying a\n// `\\]` is read whole instead of being cut at its first bracket. A variable assignment is optional.\nconst INTERACTION_SHORTCODE_PATTERN = new RegExp(\n `\\\\?\\\\[(?:%${createVariableExpressionRegex().source})?(${INTERACTION_CONTENT_SOURCE})\\\\]`\n);\nconst JSON_LIKE_VALUE_PATTERN = /^[\\[{]/;\nconst INTERACTION_VALUE_SEPARATOR_PATTERN = /^[\\s,,\\n]+/;\n\ninterface InteractionOptionCandidate {\n token: string;\n value: string;\n}\n\nconst parseInteractionShortcode = (\n content?: string | null\n): InteractionParseResult | null => {\n if (!content) {\n return null;\n }\n\n const matched = content.match(INTERACTION_SHORTCODE_PATTERN);\n const variableName = matched?.[1]\n ? (normalizeVariableName(matched[1]) ?? undefined)\n : undefined;\n const interactionBody = matched?.[2]?.trim();\n\n if (!interactionBody) {\n return null;\n }\n\n const isMultiSelect = interactionBody.includes(\"||\");\n const separator = isMultiSelect ? \"||\" : \"|\";\n const rawOptions = interactionBody\n .split(separator)\n .map((item) => item.trim())\n .filter(Boolean);\n\n if (!rawOptions.length) {\n return null;\n }\n\n const buttonTexts: string[] = [];\n const buttonValues: string[] = [];\n let placeholder: string | undefined;\n\n rawOptions.forEach((option) => {\n if (option.startsWith(\"...\")) {\n const normalizedPlaceholder = option.replace(/^\\.\\.\\./, \"\").trim();\n if (normalizedPlaceholder) {\n placeholder = normalizedPlaceholder;\n }\n return;\n }\n\n buttonTexts.push(option);\n buttonValues.push(option);\n });\n\n return {\n variableName,\n buttonTexts: buttonTexts.length ? buttonTexts : undefined,\n buttonValues: buttonValues.length ? buttonValues : undefined,\n placeholder,\n isMultiSelect,\n };\n};\n\nconst parseInteractionBlock = (\n content?: string | null\n): InteractionParseResult | null => {\n if (!content) {\n return null;\n }\n\n try {\n return interactionParser.parseToRemarkFormat(\n content\n ) as InteractionParseResult;\n } catch (error) {\n console.warn(\"Failed to parse interaction block\", error);\n }\n\n return parseInteractionShortcode(content);\n};\n\nconst normalizeButtonValue = (\n token: string,\n info: InteractionParseResult\n): { value: string; display?: string } | null => {\n if (!token) {\n return null;\n }\n\n const cleaned = token.trim();\n const buttonValues = info.buttonValues || [];\n const buttonTexts = info.buttonTexts || [];\n const valueIndex = buttonValues.indexOf(cleaned);\n\n if (valueIndex > -1) {\n return {\n value: buttonValues[valueIndex],\n display: buttonTexts[valueIndex],\n };\n }\n\n const textIndex = buttonTexts.indexOf(cleaned);\n\n if (textIndex > -1) {\n return {\n value: buttonValues[textIndex] || buttonTexts[textIndex],\n display: buttonTexts[textIndex],\n };\n }\n\n return null;\n};\n\nconst splitPresetValues = (raw: string) => {\n return raw\n .split(/[,,\\n]/)\n .map((item) => item.trim())\n .filter(Boolean);\n};\n\nconst trimLeadingInteractionSeparators = (raw: string) =>\n raw.replace(INTERACTION_VALUE_SEPARATOR_PATTERN, \"\");\n\nconst buildInteractionOptionCandidates = (\n info: InteractionParseResult\n): InteractionOptionCandidate[] => {\n const buttonValues = info.buttonValues || [];\n const buttonTexts = info.buttonTexts || [];\n const candidates: InteractionOptionCandidate[] = [];\n const seenCandidates = new Set<string>();\n\n buttonValues.forEach((buttonValue, index) => {\n const normalizedValue = `${buttonValue ?? \"\"}`.trim();\n const normalizedText = `${buttonTexts[index] ?? \"\"}`.trim();\n\n [normalizedValue, normalizedText].forEach((token) => {\n if (!token) {\n return;\n }\n\n const candidateKey = `${token}::${normalizedValue || token}`;\n if (seenCandidates.has(candidateKey)) {\n return;\n }\n\n seenCandidates.add(candidateKey);\n candidates.push({\n token,\n value: normalizedValue || token,\n });\n });\n });\n\n return candidates.sort(\n (left, right) => right.token.length - left.token.length\n );\n};\n\nconst matchInteractionOptionPrefix = (\n raw: string,\n info: InteractionParseResult\n): InteractionOptionCandidate | null => {\n const normalizedRaw = trimLeadingInteractionSeparators(raw);\n const candidates = buildInteractionOptionCandidates(info);\n\n for (const candidate of candidates) {\n if (!normalizedRaw.startsWith(candidate.token)) {\n continue;\n }\n\n const trailingChar = normalizedRaw[candidate.token.length];\n if (trailingChar && !/[\\s,,\\n]/.test(trailingChar)) {\n continue;\n }\n\n return candidate;\n }\n\n return null;\n};\n\nconst resolveMultiSelectFallbackDefaults = (\n raw: string,\n info: InteractionParseResult\n): InteractionDefaultValues => {\n const tokens = splitPresetValues(raw);\n\n if (!tokens.length) {\n return {};\n }\n\n const selectedValues: string[] = [];\n const customInputs: string[] = [];\n\n tokens.forEach((token) => {\n const mapped = normalizeButtonValue(token, info);\n\n if (mapped) {\n selectedValues.push(mapped.value);\n return;\n }\n\n if (info.placeholder) {\n customInputs.push(token);\n return;\n }\n\n selectedValues.push(token);\n });\n\n return {\n selectedValues: selectedValues.length ? selectedValues : undefined,\n inputText: customInputs.length ? customInputs.join(\", \") : undefined,\n };\n};\n\nconst resolveMultiSelectInteractionDefaults = (\n raw: string,\n info: InteractionParseResult\n): InteractionDefaultValues => {\n const selectedValues: string[] = [];\n let remainingRaw = raw.trim();\n\n // Prefer option-aware prefix matching before delimiter splitting so\n // option labels that contain commas can still round-trip correctly.\n while (remainingRaw) {\n const matchedCandidate = matchInteractionOptionPrefix(remainingRaw, info);\n\n if (!matchedCandidate) {\n break;\n }\n\n selectedValues.push(matchedCandidate.value);\n const normalizedRemainingRaw =\n trimLeadingInteractionSeparators(remainingRaw);\n remainingRaw = trimLeadingInteractionSeparators(\n normalizedRemainingRaw.slice(matchedCandidate.token.length)\n );\n }\n\n if (selectedValues.length > 0) {\n return {\n selectedValues,\n inputText:\n info.placeholder && remainingRaw.trim()\n ? remainingRaw.trim()\n : undefined,\n };\n }\n\n const fallbackDefaults = resolveMultiSelectFallbackDefaults(raw, info);\n\n if (fallbackDefaults.selectedValues?.length) {\n return fallbackDefaults;\n }\n\n if (info.placeholder) {\n return {\n inputText: raw.trim(),\n };\n }\n\n return fallbackDefaults;\n};\n\nconst normalizeStructuredInteractionDefaults = (\n payload?: StructuredInteractionPayload | null\n): InteractionDefaultValues | null => {\n if (!payload || Array.isArray(payload)) {\n return null;\n }\n\n const selectedValues = Array.isArray(payload.selectedValues)\n ? payload.selectedValues\n .map((item) => `${item ?? \"\"}`.trim())\n .filter(Boolean)\n : undefined;\n const buttonText = `${payload.buttonText ?? \"\"}`.trim();\n const inputText =\n typeof payload.inputText === \"string\" ? payload.inputText : undefined;\n\n if (!selectedValues?.length && !buttonText && !inputText) {\n return null;\n }\n\n return {\n buttonText: buttonText || undefined,\n inputText,\n selectedValues: selectedValues?.length ? selectedValues : undefined,\n };\n};\n\nconst parseStructuredInteractionDefaults = (rawValue?: string | null) => {\n if (!rawValue) {\n return null;\n }\n\n if (!JSON_LIKE_VALUE_PATTERN.test(rawValue.trim())) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(rawValue) as StructuredInteractionPayload;\n return normalizeStructuredInteractionDefaults(parsed);\n } catch {\n return null;\n }\n};\n\nconst hasPotentialInteractionBlock = (content?: string | null) =>\n Boolean(\n content &&\n (INTERACTION_TAG_PATTERN.test(content) ||\n INTERACTION_SHORTCODE_PATTERN.test(content))\n );\n\nconst resolveCustomInteractionDefaults = (\n content?: string | null,\n rawValue?: string | null,\n interactionInfo?: InteractionParseResult | null,\n options?: InteractionDefaultValueOptions\n) => {\n return (\n options?.resolveDefaultValues?.({\n content,\n rawValue,\n interactionInfo,\n }) ?? null\n );\n};\n\nexport const getInteractionDefaultValues = (\n content?: string | null,\n rawValue?: string | null,\n options?: InteractionDefaultValueOptions\n): InteractionDefaultValues => {\n const normalized = rawValue?.toString().trim();\n\n if (!normalized) {\n return {};\n }\n\n const structuredDefaults = parseStructuredInteractionDefaults(normalized);\n\n if (structuredDefaults) {\n return structuredDefaults;\n }\n\n const customDefaults = resolveCustomInteractionDefaults(\n content,\n normalized,\n null,\n options\n );\n\n if (customDefaults) {\n return customDefaults;\n }\n\n if (!hasPotentialInteractionBlock(content)) {\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n }\n\n const interactionInfo = parseInteractionBlock(content);\n const customDefaultsWithInteraction = resolveCustomInteractionDefaults(\n content,\n normalized,\n interactionInfo,\n options\n );\n\n if (customDefaultsWithInteraction) {\n return customDefaultsWithInteraction;\n }\n\n if (!interactionInfo) {\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n }\n\n if (interactionInfo.isMultiSelect) {\n return resolveMultiSelectInteractionDefaults(normalized, interactionInfo);\n }\n\n const mapped = normalizeButtonValue(normalized, interactionInfo);\n\n if (mapped) {\n return {\n buttonText: mapped.value || mapped.display || normalized,\n };\n }\n\n if (interactionInfo.placeholder) {\n return {\n inputText: normalized,\n };\n }\n\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n};\n\nexport const getInteractionDefaultSelectedValues = (\n content?: string | null,\n rawValue?: string | null,\n options?: InteractionDefaultValueOptions\n) => {\n const defaults = getInteractionDefaultValues(content, rawValue, options);\n\n if (defaults.selectedValues) {\n return defaults.selectedValues;\n }\n\n return rawValue\n ? rawValue\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean)\n : undefined;\n};\n"],"names":["interactionParser","createInteractionParser","INTERACTION_TAG_PATTERN","INTERACTION_SHORTCODE_PATTERN","createVariableExpressionRegex","INTERACTION_CONTENT_SOURCE","JSON_LIKE_VALUE_PATTERN","INTERACTION_VALUE_SEPARATOR_PATTERN","parseInteractionShortcode","content","matched","variableName","normalizeVariableName","interactionBody","isMultiSelect","separator","rawOptions","item","buttonTexts","buttonValues","placeholder","option","normalizedPlaceholder","parseInteractionBlock","error","normalizeButtonValue","token","info","cleaned","valueIndex","textIndex","splitPresetValues","raw","trimLeadingInteractionSeparators","buildInteractionOptionCandidates","candidates","seenCandidates","buttonValue","index","normalizedValue","normalizedText","candidateKey","left","right","matchInteractionOptionPrefix","normalizedRaw","candidate","trailingChar","resolveMultiSelectFallbackDefaults","tokens","selectedValues","customInputs","mapped","resolveMultiSelectInteractionDefaults","remainingRaw","matchedCandidate","normalizedRemainingRaw","fallbackDefaults","normalizeStructuredInteractionDefaults","payload","buttonText","inputText","parseStructuredInteractionDefaults","rawValue","parsed","hasPotentialInteractionBlock","resolveCustomInteractionDefaults","interactionInfo","options","getInteractionDefaultValues","normalized","structuredDefaults","customDefaults","customDefaultsWithInteraction","getInteractionDefaultSelectedValues","defaults","value"],"mappings":"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"}
1
+ {"version":3,"file":"interaction-defaults.cjs","sources":["../../src/lib/interaction-defaults.ts"],"sourcesContent":["import {\n createInteractionParser,\n trimVariablePadding,\n INTERACTION_CONTENT_SOURCE,\n} from \"remark-flow\";\nimport type { Node } from \"unist\";\nimport { getMarkdownSourceAnalysis } from \"../components/ContentRender/utils/inline-code-ranges\";\n\nexport interface InteractionParseResult {\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n variableName?: string;\n isMultiSelect?: boolean;\n}\n\nexport interface InteractionDefaultValues {\n buttonText?: string;\n inputText?: string;\n selectedValues?: string[];\n}\n\nexport interface InteractionDefaultResolverParams {\n content?: string | null;\n rawValue?: string | null;\n interactionInfo?: InteractionParseResult | null;\n}\n\nexport type InteractionDefaultResolver = (\n params: InteractionDefaultResolverParams\n) => InteractionDefaultValues | null | undefined;\n\nexport interface InteractionDefaultValueOptions {\n resolveDefaultValues?: InteractionDefaultResolver;\n}\n\ninterface StructuredInteractionPayload {\n buttonText?: unknown;\n inputText?: unknown;\n selectedValues?: unknown;\n}\n\nconst interactionParser = createInteractionParser();\nconst INTERACTION_TAG_PATTERN = /<custom-variable\\b/i;\n// Same definition of where an interaction ends as the parser uses, so an option carrying a\n// `\\]` is read whole instead of being cut at its first bracket. A variable assignment is optional.\nconst INTERACTION_SHORTCODE_PATTERN = new RegExp(\n `\\\\?\\\\[(${INTERACTION_CONTENT_SOURCE})\\\\](?!\\\\()`\n);\nconst JSON_LIKE_VALUE_PATTERN = /^[\\[{]/;\n\ninterface InteractionOptionCandidate {\n token: string;\n value: string;\n}\n\nconst findInteractionSource = (\n node: Node & { value?: unknown; children?: readonly Node[] }\n): string | null => {\n if (node.type === \"flowInteraction\" && \"value\" in node)\n return typeof node.value === \"string\" ? node.value : null;\n if (node.children) {\n for (const child of node.children) {\n const source = findInteractionSource(child);\n if (source !== null) return source;\n }\n }\n return null;\n};\n\nconst parseInteractionBlock = (\n content?: string | null\n): InteractionParseResult | null => {\n if (!content) {\n return null;\n }\n\n try {\n // Read a grammar-owned interaction, so a syntax example cannot supply its key\n // or swallow a later real control. Keep the existing serialized-tag path.\n const source =\n findInteractionSource(getMarkdownSourceAnalysis(content).tree) ??\n (INTERACTION_TAG_PATTERN.test(content) ? content : null);\n if (source === null) return null;\n // The compatibility formatter turns invalid source into a text-input placeholder.\n // Defaults must retain plain replay behavior instead of inventing an interaction.\n if (interactionParser.parse(source).error) return null;\n return interactionParser.parseToRemarkFormat(\n source\n ) as InteractionParseResult;\n } catch (error) {\n console.warn(\"Failed to parse interaction block\", error);\n }\n\n return null;\n};\n\nconst normalizeButtonValue = (\n token: string,\n info: InteractionParseResult\n): { value: string; display?: string } | null => {\n if (!token) {\n return null;\n }\n\n const cleaned = trimVariablePadding(token);\n const buttonValues = info.buttonValues || [];\n const buttonTexts = info.buttonTexts || [];\n const valueIndex = buttonValues.indexOf(cleaned);\n\n if (valueIndex > -1) {\n return {\n value: buttonValues[valueIndex],\n display: buttonTexts[valueIndex],\n };\n }\n\n const textIndex = buttonTexts.indexOf(cleaned);\n\n if (textIndex > -1) {\n return {\n value: buttonValues[textIndex] || buttonTexts[textIndex],\n display: buttonTexts[textIndex],\n };\n }\n\n return null;\n};\n\nconst splitPresetValues = (raw: string) => {\n return raw\n .split(/[,,\\n]/)\n .map((item) => trimVariablePadding(item))\n .filter(Boolean);\n};\n\nconst trimLeadingInteractionSeparators = (raw: string) => {\n let index = 0;\n while (\n index < raw.length &&\n (raw[index] === \",\" ||\n raw[index] === \",\" ||\n trimVariablePadding(raw[index]) === \"\")\n )\n index += 1;\n return raw.slice(index);\n};\n\nconst buildInteractionOptionCandidates = (\n info: InteractionParseResult\n): InteractionOptionCandidate[] => {\n const buttonValues = info.buttonValues || [];\n const buttonTexts = info.buttonTexts || [];\n const candidates: InteractionOptionCandidate[] = [];\n const seenCandidates = new Set<string>();\n\n buttonValues.forEach((buttonValue, index) => {\n const normalizedValue = trimVariablePadding(`${buttonValue ?? \"\"}`);\n const normalizedText = trimVariablePadding(`${buttonTexts[index] ?? \"\"}`);\n\n [normalizedValue, normalizedText].forEach((token) => {\n if (!token) {\n return;\n }\n\n const candidateKey = `${token}::${normalizedValue || token}`;\n if (seenCandidates.has(candidateKey)) {\n return;\n }\n\n seenCandidates.add(candidateKey);\n candidates.push({\n token,\n value: normalizedValue || token,\n });\n });\n });\n\n return candidates.sort(\n (left, right) => right.token.length - left.token.length\n );\n};\n\nconst matchInteractionOptionPrefix = (\n raw: string,\n info: InteractionParseResult\n): InteractionOptionCandidate | null => {\n const normalizedRaw = trimLeadingInteractionSeparators(raw);\n const candidates = buildInteractionOptionCandidates(info);\n\n for (const candidate of candidates) {\n if (!normalizedRaw.startsWith(candidate.token)) {\n continue;\n }\n\n const trailingChar = normalizedRaw[candidate.token.length];\n if (\n trailingChar &&\n trailingChar !== \",\" &&\n trailingChar !== \",\" &&\n trimVariablePadding(trailingChar) !== \"\"\n ) {\n continue;\n }\n\n return candidate;\n }\n\n return null;\n};\n\nconst resolveMultiSelectFallbackDefaults = (\n raw: string,\n info: InteractionParseResult\n): InteractionDefaultValues => {\n const tokens = splitPresetValues(raw);\n\n if (!tokens.length) {\n return {};\n }\n\n const selectedValues: string[] = [];\n const customInputs: string[] = [];\n\n tokens.forEach((token) => {\n const mapped = normalizeButtonValue(token, info);\n\n if (mapped) {\n selectedValues.push(mapped.value);\n return;\n }\n\n if (info.placeholder) {\n customInputs.push(token);\n return;\n }\n\n selectedValues.push(token);\n });\n\n return {\n selectedValues: selectedValues.length ? selectedValues : undefined,\n inputText: customInputs.length ? customInputs.join(\", \") : undefined,\n };\n};\n\nconst resolveMultiSelectInteractionDefaults = (\n raw: string,\n info: InteractionParseResult\n): InteractionDefaultValues => {\n const selectedValues: string[] = [];\n let remainingRaw = trimVariablePadding(raw);\n\n // Prefer option-aware prefix matching before delimiter splitting so\n // option labels that contain commas can still round-trip correctly.\n while (remainingRaw) {\n const matchedCandidate = matchInteractionOptionPrefix(remainingRaw, info);\n\n if (!matchedCandidate) {\n break;\n }\n\n selectedValues.push(matchedCandidate.value);\n const normalizedRemainingRaw =\n trimLeadingInteractionSeparators(remainingRaw);\n remainingRaw = trimLeadingInteractionSeparators(\n normalizedRemainingRaw.slice(matchedCandidate.token.length)\n );\n }\n\n if (selectedValues.length > 0) {\n return {\n selectedValues,\n inputText:\n info.placeholder && remainingRaw.trim()\n ? remainingRaw.trim()\n : undefined,\n };\n }\n\n const fallbackDefaults = resolveMultiSelectFallbackDefaults(raw, info);\n\n if (fallbackDefaults.selectedValues?.length) {\n return fallbackDefaults;\n }\n\n if (info.placeholder) {\n return {\n inputText: raw.trim(),\n };\n }\n\n return fallbackDefaults;\n};\n\nconst normalizeStructuredInteractionDefaults = (\n payload?: StructuredInteractionPayload | null\n): InteractionDefaultValues | null => {\n if (!payload || Array.isArray(payload)) {\n return null;\n }\n\n const selectedValues = Array.isArray(payload.selectedValues)\n ? payload.selectedValues\n .map((item) => trimVariablePadding(`${item ?? \"\"}`))\n .filter(Boolean)\n : undefined;\n const buttonText = trimVariablePadding(`${payload.buttonText ?? \"\"}`);\n const inputText =\n typeof payload.inputText === \"string\" ? payload.inputText : undefined;\n\n if (!selectedValues?.length && !buttonText && !inputText) {\n return null;\n }\n\n return {\n buttonText: buttonText || undefined,\n inputText,\n selectedValues: selectedValues?.length ? selectedValues : undefined,\n };\n};\n\nconst parseStructuredInteractionDefaults = (rawValue?: string | null) => {\n if (!rawValue) {\n return null;\n }\n\n if (!JSON_LIKE_VALUE_PATTERN.test(trimVariablePadding(rawValue))) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(rawValue) as StructuredInteractionPayload;\n return normalizeStructuredInteractionDefaults(parsed);\n } catch {\n return null;\n }\n};\n\nconst hasPotentialInteractionBlock = (content?: string | null) =>\n Boolean(\n content &&\n (INTERACTION_TAG_PATTERN.test(content) ||\n INTERACTION_SHORTCODE_PATTERN.test(content))\n );\n\nconst resolveCustomInteractionDefaults = (\n content?: string | null,\n rawValue?: string | null,\n interactionInfo?: InteractionParseResult | null,\n options?: InteractionDefaultValueOptions\n) => {\n return (\n options?.resolveDefaultValues?.({\n content,\n rawValue,\n interactionInfo,\n }) ?? null\n );\n};\n\nexport const getInteractionDefaultValues = (\n content?: string | null,\n rawValue?: string | null,\n options?: InteractionDefaultValueOptions\n): InteractionDefaultValues => {\n const normalized =\n rawValue === null || rawValue === undefined\n ? undefined\n : trimVariablePadding(rawValue.toString());\n\n if (!normalized) {\n return {};\n }\n\n const structuredDefaults = parseStructuredInteractionDefaults(normalized);\n\n if (structuredDefaults) {\n return structuredDefaults;\n }\n\n const customDefaults = resolveCustomInteractionDefaults(\n content,\n normalized,\n null,\n options\n );\n\n if (customDefaults) {\n return customDefaults;\n }\n\n if (!hasPotentialInteractionBlock(content)) {\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n }\n\n const interactionInfo = parseInteractionBlock(content);\n const customDefaultsWithInteraction = resolveCustomInteractionDefaults(\n content,\n normalized,\n interactionInfo,\n options\n );\n\n if (customDefaultsWithInteraction) {\n return customDefaultsWithInteraction;\n }\n\n if (!interactionInfo) {\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n }\n\n if (interactionInfo.isMultiSelect) {\n return resolveMultiSelectInteractionDefaults(normalized, interactionInfo);\n }\n\n const mapped = normalizeButtonValue(normalized, interactionInfo);\n\n if (mapped) {\n return {\n buttonText: mapped.value || mapped.display || normalized,\n };\n }\n\n if (interactionInfo.placeholder) {\n return {\n inputText: normalized,\n };\n }\n\n return {\n buttonText: normalized,\n inputText: normalized,\n };\n};\n\nexport const getInteractionDefaultSelectedValues = (\n content?: string | null,\n rawValue?: string | null,\n options?: InteractionDefaultValueOptions\n) => {\n const defaults = getInteractionDefaultValues(content, rawValue, options);\n\n if (defaults.selectedValues) {\n return defaults.selectedValues;\n }\n\n return rawValue\n ? rawValue\n .split(\",\")\n .map((value) => trimVariablePadding(value))\n .filter(Boolean)\n : undefined;\n};\n"],"names":["interactionParser","createInteractionParser","INTERACTION_TAG_PATTERN","INTERACTION_SHORTCODE_PATTERN","INTERACTION_CONTENT_SOURCE","JSON_LIKE_VALUE_PATTERN","findInteractionSource","node","child","source","parseInteractionBlock","content","getMarkdownSourceAnalysis","error","normalizeButtonValue","token","info","cleaned","trimVariablePadding","buttonValues","buttonTexts","valueIndex","textIndex","splitPresetValues","raw","item","trimLeadingInteractionSeparators","index","buildInteractionOptionCandidates","candidates","seenCandidates","buttonValue","normalizedValue","normalizedText","candidateKey","left","right","matchInteractionOptionPrefix","normalizedRaw","candidate","trailingChar","resolveMultiSelectFallbackDefaults","tokens","selectedValues","customInputs","mapped","resolveMultiSelectInteractionDefaults","remainingRaw","matchedCandidate","normalizedRemainingRaw","fallbackDefaults","normalizeStructuredInteractionDefaults","payload","buttonText","inputText","parseStructuredInteractionDefaults","rawValue","parsed","hasPotentialInteractionBlock","resolveCustomInteractionDefaults","interactionInfo","options","getInteractionDefaultValues","normalized","structuredDefaults","customDefaults","customDefaultsWithInteraction","getInteractionDefaultSelectedValues","defaults","value"],"mappings":"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"}