markdown-flow-ui 0.2.26 → 0.2.28-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/_virtual/escaping.cjs +2 -0
  2. package/dist/_virtual/escaping.cjs.map +1 -0
  3. package/dist/_virtual/escaping.es.js +5 -0
  4. package/dist/_virtual/escaping.es.js.map +1 -0
  5. package/dist/_virtual/index.es3.js +5 -4
  6. package/dist/_virtual/index.es3.js.map +1 -1
  7. package/dist/_virtual/index.es4.js +4 -5
  8. package/dist/_virtual/index.es4.js.map +1 -1
  9. package/dist/_virtual/index.es8.js +2 -2
  10. package/dist/_virtual/index.es9.js +2 -2
  11. package/dist/_virtual/index3.cjs +1 -1
  12. package/dist/_virtual/index4.cjs +1 -1
  13. package/dist/_virtual/index8.cjs +1 -1
  14. package/dist/_virtual/index9.cjs +1 -1
  15. package/dist/components/ContentRender/locales/contentRender.json.cjs +1 -1
  16. package/dist/components/ContentRender/locales/contentRender.json.d.ts +17 -0
  17. package/dist/components/ContentRender/locales/contentRender.json.es.js +2 -1
  18. package/dist/components/ContentRender/locales/contentRender.json.es.js.map +1 -1
  19. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
  20. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
  21. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +27 -26
  22. package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
  23. package/dist/components/MarkdownFlowEditor/editorI18n.cjs +1 -1
  24. package/dist/components/MarkdownFlowEditor/editorI18n.cjs.map +1 -1
  25. package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +139 -0
  26. package/dist/components/MarkdownFlowEditor/editorI18n.es.js +16 -14
  27. package/dist/components/MarkdownFlowEditor/editorI18n.es.js.map +1 -1
  28. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +2 -0
  29. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs.map +1 -0
  30. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +72 -0
  31. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +140 -0
  32. package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js.map +1 -0
  33. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
  34. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
  35. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +131 -117
  36. package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
  37. package/dist/components/Slide/locales/slide.json.cjs +1 -1
  38. package/dist/components/Slide/locales/slide.json.d.ts +42 -0
  39. package/dist/components/Slide/locales/slide.json.es.js +2 -1
  40. package/dist/components/Slide/locales/slide.json.es.js.map +1 -1
  41. package/dist/components/ui/inputGroup/textarea.cjs +1 -1
  42. package/dist/components/ui/inputGroup/textarea.es.js +1 -1
  43. package/dist/lib/interaction-defaults.cjs +1 -1
  44. package/dist/lib/interaction-defaults.cjs.map +1 -1
  45. package/dist/lib/interaction-defaults.es.js +25 -23
  46. package/dist/lib/interaction-defaults.es.js.map +1 -1
  47. package/dist/lib/locale.cjs +1 -1
  48. package/dist/lib/locale.cjs.map +1 -1
  49. package/dist/lib/locale.d.ts +1 -1
  50. package/dist/lib/locale.es.js +14 -12
  51. package/dist/lib/locale.es.js.map +1 -1
  52. package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs +1 -1
  53. package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  54. package/dist/node_modules/classnames/index.cjs +1 -1
  55. package/dist/node_modules/classnames/index.es.js +1 -1
  56. package/dist/node_modules/rc-input/es/BaseInput.cjs +1 -1
  57. package/dist/node_modules/rc-input/es/BaseInput.es.js +1 -1
  58. package/dist/node_modules/rc-textarea/es/ResizableTextArea.cjs +1 -1
  59. package/dist/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
  60. package/dist/node_modules/rc-textarea/es/TextArea.cjs +1 -1
  61. package/dist/node_modules/rc-textarea/es/TextArea.es.js +1 -1
  62. package/dist/node_modules/rc-textarea/es/index.cjs +1 -1
  63. package/dist/node_modules/rc-textarea/es/index.es.js +1 -1
  64. package/dist/node_modules/remark-flow/dist/escaping.cjs +3 -0
  65. package/dist/node_modules/remark-flow/dist/escaping.cjs.map +1 -0
  66. package/dist/node_modules/remark-flow/dist/escaping.es.js +96 -0
  67. package/dist/node_modules/remark-flow/dist/escaping.es.js.map +1 -0
  68. package/dist/node_modules/remark-flow/dist/index.cjs +1 -1
  69. package/dist/node_modules/remark-flow/dist/index.cjs.map +1 -1
  70. package/dist/node_modules/remark-flow/dist/index.es.js +46 -25
  71. package/dist/node_modules/remark-flow/dist/index.es.js.map +1 -1
  72. package/dist/node_modules/remark-flow/dist/interaction-parser.cjs +1 -1
  73. package/dist/node_modules/remark-flow/dist/interaction-parser.cjs.map +1 -1
  74. package/dist/node_modules/remark-flow/dist/interaction-parser.es.js +123 -106
  75. package/dist/node_modules/remark-flow/dist/interaction-parser.es.js.map +1 -1
  76. package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs +1 -1
  77. package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs.map +1 -1
  78. package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js +19 -18
  79. package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js.map +1 -1
  80. package/package.json +2 -2
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../../../_virtual/escaping.cjs");var u;function o(){return u||(u=1,(function(i){Object.defineProperty(i,"__esModule",{value:!0}),i.INTERACTION_CONTENT_SOURCE=i.splitOnEllipsis=i.splitOnSingleUnescapedPipe=i.splitUnescaped=i.findUnescaped=i.unescapeInteractionText=i.escapeInteractionText=i.isEscape=i.ESCAPABLE=void 0,i.ESCAPABLE="|/.]";const t=(n,s)=>s+1<n.length&&n[s]==="\\"&&i.ESCAPABLE.includes(n[s+1]);i.isEscape=t;const p=n=>{let s="",c=0;for(;c<n.length;){const e=n[c];if(e==="."){let l=0;for(;n[c+l]===".";)l+=1;s+=l>=3?"\\.".repeat(l):".".repeat(l),c+=l;continue}i.ESCAPABLE.includes(e)&&(s+="\\"),s+=e,c+=1}return s};i.escapeInteractionText=p;const d=n=>{let s="",c=0;for(;c<n.length;){if((0,i.isEscape)(n,c)){s+=n[c+1],c+=2;continue}s+=n[c],c+=1}return s};i.unescapeInteractionText=d;const r=(n,s,c=0)=>{let e=c;for(;e<n.length;){if((0,i.isEscape)(n,e)){e+=2;continue}if(n.startsWith(s,e))return e;e+=1}return-1};i.findUnescaped=r;const E=(n,s)=>{const c=[];let e=0;for(;;){const l=(0,i.findUnescaped)(n,s,e);if(l<0)return c.push(n.slice(e)),c;c.push(n.slice(e,l)),e=l+s.length}};i.splitUnescaped=E;const f=n=>{const s=[];let c=0,e=0;for(;e<n.length;){if((0,i.isEscape)(n,e)){e+=2;continue}if(n[e]==="|"){if(n.startsWith("||",e)){e+=2;continue}if(e>0&&n[e-1]==="|"&&!(0,i.isEscape)(n,e-1)){e+=1;continue}s.push(n.slice(c,e)),c=e+1}e+=1}return s.push(n.slice(c)),s};i.splitOnSingleUnescapedPipe=f;const h=n=>{const s=n.split(`
2
+ `,1)[0],c=(0,i.findUnescaped)(s,"...");return c<0?null:[s.slice(0,c),s.slice(c+3)]};i.splitOnEllipsis=h,i.INTERACTION_CONTENT_SOURCE="(?:\\\\[|/.\\]]|\\\\(?![|/.\\]])|[^\\]\\\\])*"})(a.__exports)),a.__exports}exports.__require=o;
3
+ //# sourceMappingURL=escaping.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escaping.cjs","sources":["../../../../node_modules/remark-flow/dist/escaping.js"],"sourcesContent":["\"use strict\";\n/**\n * Backslash escapes for the delimiters inside an interaction's brackets.\n *\n * `?[A|B]` gives `|`, `//`, `...` and `]` structural meaning, so option text that contains one of\n * them is reshaped: a bar splits one choice into two, a double slash gives half the display away\n * to the stored value, an ellipsis turns the rest into a text box, and a bracket ends the\n * interaction early. An option carrying a URL or a regular expression could not be written at all.\n *\n * A backslash before one of those characters now makes it ordinary text.\n *\n * The escape is deliberately *selective*: a backslash is an escape only when the character after\n * it is a delimiter, and is literal text everywhere else. `\\\\` is not an escape either. That\n * matters for content that already exists: of 110,685 interactions in published courses, 97\n * contain a backslash and every one of them is LaTeX -- `$\\pi_\\theta$`, `\\beta`, `\\nabla`, and\n * `\\\\` as a line break. A general \"backslash escapes the next character\" rule would render those\n * as `$pi_theta$`. Under this rule, none of them change.\n *\n * The cost is that a literal backslash cannot sit immediately before a literal delimiter: `\\|` is\n * an escaped bar, not a backslash and a separator.\n *\n * This mirrors `markdown_flow/escaping.py` in markdown-flow-agent-py character for character.\n * The two must agree: the backend renders an interaction, parses its own output with the Python\n * parser to prove the meaning survived, and then this parser is what the browser reads it with.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.INTERACTION_CONTENT_SOURCE = exports.splitOnEllipsis = exports.splitOnSingleUnescapedPipe = exports.splitUnescaped = exports.findUnescaped = exports.unescapeInteractionText = exports.escapeInteractionText = exports.isEscape = exports.ESCAPABLE = void 0;\n/** The characters a backslash may make ordinary. `/` covers `//`, `.` covers `...`. */\nexports.ESCAPABLE = '|/.]';\n/** Whether the backslash at `index` escapes the character after it. */\nconst isEscape = (text, index) => index + 1 < text.length &&\n text[index] === '\\\\' &&\n exports.ESCAPABLE.includes(text[index + 1]);\nexports.isEscape = isEscape;\n/**\n * Make `text` safe to write inside `?[...]`, keeping every character it has.\n *\n * A dot is escaped only inside a run of three or more, because only `...` is a delimiter and a\n * single period ends most sentences: escaping every one turns `Yes, I agree.` into\n * `Yes, I agree\\.` in everything that stores or shows the raw interaction. Two dots cannot become\n * three on their own, and the run is escaped whole so it cannot be read as one.\n *\n * Bars, brackets and slashes are escaped wherever they appear. They are rare in option text, and\n * escaping them unconditionally removes the need to reason about what a neighbouring character\n * might combine with once the option is written next to a separator.\n *\n * Escaping the delimiters rather than the backslashes as well is what keeps existing content\n * readable: a script that writes `$\\pi$` in an option still writes `$\\pi$` afterwards.\n */\nconst escapeInteractionText = (text) => {\n let out = '';\n let index = 0;\n while (index < text.length) {\n const char = text[index];\n if (char === '.') {\n let run = 0;\n while (text[index + run] === '.') {\n run += 1;\n }\n out += run >= 3 ? '\\\\.'.repeat(run) : '.'.repeat(run);\n index += run;\n continue;\n }\n if (exports.ESCAPABLE.includes(char)) {\n out += '\\\\';\n }\n out += char;\n index += 1;\n }\n return out;\n};\nexports.escapeInteractionText = escapeInteractionText;\n/** Resolve the escapes in one option's text, leaving every other backslash alone. */\nconst unescapeInteractionText = (text) => {\n let out = '';\n let index = 0;\n while (index < text.length) {\n if ((0, exports.isEscape)(text, index)) {\n out += text[index + 1];\n index += 2;\n continue;\n }\n out += text[index];\n index += 1;\n }\n return out;\n};\nexports.unescapeInteractionText = unescapeInteractionText;\n/**\n * Index of the first `needle` that is not escaped and does not begin inside an escape, or -1.\n *\n * `needle` is matched whole: a `//` whose first slash is escaped is not a separator even though\n * its second slash is bare, because that second slash is the escaped character of the pair.\n */\nconst findUnescaped = (text, needle, start = 0) => {\n let index = start;\n while (index < text.length) {\n if ((0, exports.isEscape)(text, index)) {\n index += 2;\n continue;\n }\n if (text.startsWith(needle, index)) {\n return index;\n }\n index += 1;\n }\n return -1;\n};\nexports.findUnescaped = findUnescaped;\n/** Split on every unescaped `separator`, leaving the escapes themselves in place. */\nconst splitUnescaped = (text, separator) => {\n const parts = [];\n let start = 0;\n for (;;) {\n const found = (0, exports.findUnescaped)(text, separator, start);\n if (found < 0) {\n parts.push(text.slice(start));\n return parts;\n }\n parts.push(text.slice(start, found));\n start = found + separator.length;\n }\n};\nexports.splitUnescaped = splitUnescaped;\n/** Split on unescaped single bars, leaving `||` joined as the multi-select separator. */\nconst splitOnSingleUnescapedPipe = (text) => {\n const parts = [];\n let start = 0;\n let index = 0;\n while (index < text.length) {\n if ((0, exports.isEscape)(text, index)) {\n index += 2;\n continue;\n }\n if (text[index] === '|') {\n if (text.startsWith('||', index)) {\n index += 2;\n continue;\n }\n if (index > 0 && text[index - 1] === '|' && !(0, exports.isEscape)(text, index - 1)) {\n index += 1;\n continue;\n }\n parts.push(text.slice(start, index));\n start = index + 1;\n }\n index += 1;\n }\n parts.push(text.slice(start));\n return parts;\n};\nexports.splitOnSingleUnescapedPipe = splitOnSingleUnescapedPipe;\n/**\n * Split an interaction's content at the `...` that opens its text box, or null.\n *\n * Two details are inherited rather than chosen, because changing either would rewrite questions\n * in courses that are already published:\n *\n * - the ellipsis counts only on the first line. The regex this replaces was anchored and its `.`\n * did not cross a newline, so `A\\n| ...hint` has always been read as two buttons, one of them\n * named `...hint`.\n * - the *first* ellipsis on that line wins, which is what the lazy group matched. (The Python\n * parser takes the last one instead -- a difference that predates escapes and is left alone\n * here; with options escaping their own dots, only the real marker is ever unescaped, so the\n * two agree on everything a producer writes.)\n *\n * What is new is only that an escaped ellipsis no longer counts.\n */\nconst splitOnEllipsis = (content) => {\n const head = content.split('\\n', 1)[0];\n const at = (0, exports.findUnescaped)(head, '...');\n if (at < 0) {\n return null;\n }\n return [head.slice(0, at), head.slice(at + 3)];\n};\nexports.splitOnEllipsis = splitOnEllipsis;\n/**\n * The bracket content of an interaction, as a regex source fragment.\n *\n * The three alternatives are mutually exclusive on purpose: a backslash before a delimiter can\n * only be read as an escape, so the pattern cannot backtrack into reading it as plain text and\n * then closing on the very bracket it escapes. Without that, this regex and a left-to-right\n * scanner disagree about `?[a\\\\]`, and two parsers of one grammar must not.\n */\nexports.INTERACTION_CONTENT_SOURCE = '(?:\\\\\\\\[|/.\\\\]]|\\\\\\\\(?![|/.\\\\]])|[^\\\\]\\\\\\\\])*';\n//# sourceMappingURL=escaping.js.map"],"names":["exports","isEscape","text","index","escapeInteractionText","out","char","run","unescapeInteractionText","findUnescaped","needle","start","splitUnescaped","separator","parts","found","splitOnSingleUnescapedPipe","splitOnEllipsis","content","head","at"],"mappings":"iLAyBA,OAAO,eAAcA,EAAU,aAAc,CAAE,MAAO,GAAM,EAC5DA,EAAA,2BAAqCA,EAAA,gBAA0BA,6BAAqCA,EAAA,eAAyBA,EAAA,cAAwBA,0BAAkCA,EAAA,sBAAgCA,EAAA,SAAmBA,EAAA,UAAoB,OAE9PA,EAAA,UAAoB,OAEpB,MAAMC,EAAW,CAACC,EAAMC,IAAUA,EAAQ,EAAID,EAAK,QAC/CA,EAAKC,CAAK,IAAM,MAChBH,EAAQ,UAAU,SAASE,EAAKC,EAAQ,CAAC,CAAC,EAC9CH,EAAA,SAAmBC,EAgBnB,MAAMG,EAAyBF,GAAS,CACpC,IAAIG,EAAM,GACNF,EAAQ,EACZ,KAAOA,EAAQD,EAAK,QAAQ,CACxB,MAAMI,EAAOJ,EAAKC,CAAK,EACvB,GAAIG,IAAS,IAAK,CACd,IAAIC,EAAM,EACV,KAAOL,EAAKC,EAAQI,CAAG,IAAM,KACzBA,GAAO,EAEXF,GAAOE,GAAO,EAAI,MAAM,OAAOA,CAAG,EAAI,IAAI,OAAOA,CAAG,EACpDJ,GAASI,EACT,QACZ,CACYP,EAAQ,UAAU,SAASM,CAAI,IAC/BD,GAAO,MAEXA,GAAOC,EACPH,GAAS,CACjB,CACI,OAAOE,CACX,EACAL,EAAA,sBAAgCI,EAEhC,MAAMI,EAA2BN,GAAS,CACtC,IAAIG,EAAM,GACNF,EAAQ,EACZ,KAAOA,EAAQD,EAAK,QAAQ,CACxB,MAAQF,EAAQ,UAAUE,EAAMC,CAAK,EAAG,CACpCE,GAAOH,EAAKC,EAAQ,CAAC,EACrBA,GAAS,EACT,QACZ,CACQE,GAAOH,EAAKC,CAAK,EACjBA,GAAS,CACjB,CACI,OAAOE,CACX,EACAL,EAAA,wBAAkCQ,EAOlC,MAAMC,EAAgB,CAACP,EAAMQ,EAAQC,EAAQ,IAAM,CAC/C,IAAIR,EAAQQ,EACZ,KAAOR,EAAQD,EAAK,QAAQ,CACxB,MAAQF,EAAQ,UAAUE,EAAMC,CAAK,EAAG,CACpCA,GAAS,EACT,QACZ,CACQ,GAAID,EAAK,WAAWQ,EAAQP,CAAK,EAC7B,OAAOA,EAEXA,GAAS,CACjB,CACI,MAAO,EACX,EACAH,EAAA,cAAwBS,EAExB,MAAMG,EAAiB,CAACV,EAAMW,IAAc,CACxC,MAAMC,EAAQ,CAAA,EACd,IAAIH,EAAQ,EACZ,OAAS,CACL,MAAMI,KAAYf,EAAQ,eAAeE,EAAMW,EAAWF,CAAK,EAC/D,GAAII,EAAQ,EACR,OAAAD,EAAM,KAAKZ,EAAK,MAAMS,CAAK,CAAC,EACrBG,EAEXA,EAAM,KAAKZ,EAAK,MAAMS,EAAOI,CAAK,CAAC,EACnCJ,EAAQI,EAAQF,EAAU,MAClC,CACA,EACAb,EAAA,eAAyBY,EAEzB,MAAMI,EAA8Bd,GAAS,CACzC,MAAMY,EAAQ,CAAA,EACd,IAAIH,EAAQ,EACRR,EAAQ,EACZ,KAAOA,EAAQD,EAAK,QAAQ,CACxB,MAAQF,EAAQ,UAAUE,EAAMC,CAAK,EAAG,CACpCA,GAAS,EACT,QACZ,CACQ,GAAID,EAAKC,CAAK,IAAM,IAAK,CACrB,GAAID,EAAK,WAAW,KAAMC,CAAK,EAAG,CAC9BA,GAAS,EACT,QAChB,CACY,GAAIA,EAAQ,GAAKD,EAAKC,EAAQ,CAAC,IAAM,KAAO,IAAKH,EAAQ,UAAUE,EAAMC,EAAQ,CAAC,EAAG,CACjFA,GAAS,EACT,QAChB,CACYW,EAAM,KAAKZ,EAAK,MAAMS,EAAOR,CAAK,CAAC,EACnCQ,EAAQR,EAAQ,CAC5B,CACQA,GAAS,CACjB,CACI,OAAAW,EAAM,KAAKZ,EAAK,MAAMS,CAAK,CAAC,EACrBG,CACX,EACAd,EAAA,2BAAqCgB,EAiBrC,MAAMC,EAAmBC,GAAY,CACjC,MAAMC,EAAOD,EAAQ,MAAM;AAAA,EAAM,CAAC,EAAE,CAAC,EAC/BE,KAASpB,EAAQ,eAAemB,EAAM,KAAK,EACjD,OAAIC,EAAK,EACE,KAEJ,CAACD,EAAK,MAAM,EAAGC,CAAE,EAAGD,EAAK,MAAMC,EAAK,CAAC,CAAC,CACjD,EACApB,EAAA,gBAA0BiB,EAS1BjB,EAAA,2BAAqC","x_google_ignoreList":[0]}
@@ -0,0 +1,96 @@
1
+ import { __exports as a } from "../../../_virtual/escaping.es.js";
2
+ var u;
3
+ function O() {
4
+ return u ? a : (u = 1, (function(e) {
5
+ Object.defineProperty(e, "__esModule", { value: !0 }), e.INTERACTION_CONTENT_SOURCE = e.splitOnEllipsis = e.splitOnSingleUnescapedPipe = e.splitUnescaped = e.findUnescaped = e.unescapeInteractionText = e.escapeInteractionText = e.isEscape = e.ESCAPABLE = void 0, e.ESCAPABLE = "|/.]";
6
+ const t = (n, s) => s + 1 < n.length && n[s] === "\\" && e.ESCAPABLE.includes(n[s + 1]);
7
+ e.isEscape = t;
8
+ const p = (n) => {
9
+ let s = "", c = 0;
10
+ for (; c < n.length; ) {
11
+ const i = n[c];
12
+ if (i === ".") {
13
+ let l = 0;
14
+ for (; n[c + l] === "."; )
15
+ l += 1;
16
+ s += l >= 3 ? "\\.".repeat(l) : ".".repeat(l), c += l;
17
+ continue;
18
+ }
19
+ e.ESCAPABLE.includes(i) && (s += "\\"), s += i, c += 1;
20
+ }
21
+ return s;
22
+ };
23
+ e.escapeInteractionText = p;
24
+ const d = (n) => {
25
+ let s = "", c = 0;
26
+ for (; c < n.length; ) {
27
+ if ((0, e.isEscape)(n, c)) {
28
+ s += n[c + 1], c += 2;
29
+ continue;
30
+ }
31
+ s += n[c], c += 1;
32
+ }
33
+ return s;
34
+ };
35
+ e.unescapeInteractionText = d;
36
+ const E = (n, s, c = 0) => {
37
+ let i = c;
38
+ for (; i < n.length; ) {
39
+ if ((0, e.isEscape)(n, i)) {
40
+ i += 2;
41
+ continue;
42
+ }
43
+ if (n.startsWith(s, i))
44
+ return i;
45
+ i += 1;
46
+ }
47
+ return -1;
48
+ };
49
+ e.findUnescaped = E;
50
+ const f = (n, s) => {
51
+ const c = [];
52
+ let i = 0;
53
+ for (; ; ) {
54
+ const l = (0, e.findUnescaped)(n, s, i);
55
+ if (l < 0)
56
+ return c.push(n.slice(i)), c;
57
+ c.push(n.slice(i, l)), i = l + s.length;
58
+ }
59
+ };
60
+ e.splitUnescaped = f;
61
+ const r = (n) => {
62
+ const s = [];
63
+ let c = 0, i = 0;
64
+ for (; i < n.length; ) {
65
+ if ((0, e.isEscape)(n, i)) {
66
+ i += 2;
67
+ continue;
68
+ }
69
+ if (n[i] === "|") {
70
+ if (n.startsWith("||", i)) {
71
+ i += 2;
72
+ continue;
73
+ }
74
+ if (i > 0 && n[i - 1] === "|" && !(0, e.isEscape)(n, i - 1)) {
75
+ i += 1;
76
+ continue;
77
+ }
78
+ s.push(n.slice(c, i)), c = i + 1;
79
+ }
80
+ i += 1;
81
+ }
82
+ return s.push(n.slice(c)), s;
83
+ };
84
+ e.splitOnSingleUnescapedPipe = r;
85
+ const h = (n) => {
86
+ const s = n.split(`
87
+ `, 1)[0], c = (0, e.findUnescaped)(s, "...");
88
+ return c < 0 ? null : [s.slice(0, c), s.slice(c + 3)];
89
+ };
90
+ e.splitOnEllipsis = h, e.INTERACTION_CONTENT_SOURCE = "(?:\\\\[|/.\\]]|\\\\(?![|/.\\]])|[^\\]\\\\])*";
91
+ })(a), a);
92
+ }
93
+ export {
94
+ O as __require
95
+ };
96
+ //# sourceMappingURL=escaping.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escaping.es.js","sources":["../../../../node_modules/remark-flow/dist/escaping.js"],"sourcesContent":["\"use strict\";\n/**\n * Backslash escapes for the delimiters inside an interaction's brackets.\n *\n * `?[A|B]` gives `|`, `//`, `...` and `]` structural meaning, so option text that contains one of\n * them is reshaped: a bar splits one choice into two, a double slash gives half the display away\n * to the stored value, an ellipsis turns the rest into a text box, and a bracket ends the\n * interaction early. An option carrying a URL or a regular expression could not be written at all.\n *\n * A backslash before one of those characters now makes it ordinary text.\n *\n * The escape is deliberately *selective*: a backslash is an escape only when the character after\n * it is a delimiter, and is literal text everywhere else. `\\\\` is not an escape either. That\n * matters for content that already exists: of 110,685 interactions in published courses, 97\n * contain a backslash and every one of them is LaTeX -- `$\\pi_\\theta$`, `\\beta`, `\\nabla`, and\n * `\\\\` as a line break. A general \"backslash escapes the next character\" rule would render those\n * as `$pi_theta$`. Under this rule, none of them change.\n *\n * The cost is that a literal backslash cannot sit immediately before a literal delimiter: `\\|` is\n * an escaped bar, not a backslash and a separator.\n *\n * This mirrors `markdown_flow/escaping.py` in markdown-flow-agent-py character for character.\n * The two must agree: the backend renders an interaction, parses its own output with the Python\n * parser to prove the meaning survived, and then this parser is what the browser reads it with.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.INTERACTION_CONTENT_SOURCE = exports.splitOnEllipsis = exports.splitOnSingleUnescapedPipe = exports.splitUnescaped = exports.findUnescaped = exports.unescapeInteractionText = exports.escapeInteractionText = exports.isEscape = exports.ESCAPABLE = void 0;\n/** The characters a backslash may make ordinary. `/` covers `//`, `.` covers `...`. */\nexports.ESCAPABLE = '|/.]';\n/** Whether the backslash at `index` escapes the character after it. */\nconst isEscape = (text, index) => index + 1 < text.length &&\n text[index] === '\\\\' &&\n exports.ESCAPABLE.includes(text[index + 1]);\nexports.isEscape = isEscape;\n/**\n * Make `text` safe to write inside `?[...]`, keeping every character it has.\n *\n * A dot is escaped only inside a run of three or more, because only `...` is a delimiter and a\n * single period ends most sentences: escaping every one turns `Yes, I agree.` into\n * `Yes, I agree\\.` in everything that stores or shows the raw interaction. Two dots cannot become\n * three on their own, and the run is escaped whole so it cannot be read as one.\n *\n * Bars, brackets and slashes are escaped wherever they appear. They are rare in option text, and\n * escaping them unconditionally removes the need to reason about what a neighbouring character\n * might combine with once the option is written next to a separator.\n *\n * Escaping the delimiters rather than the backslashes as well is what keeps existing content\n * readable: a script that writes `$\\pi$` in an option still writes `$\\pi$` afterwards.\n */\nconst escapeInteractionText = (text) => {\n let out = '';\n let index = 0;\n while (index < text.length) {\n const char = text[index];\n if (char === '.') {\n let run = 0;\n while (text[index + run] === '.') {\n run += 1;\n }\n out += run >= 3 ? '\\\\.'.repeat(run) : '.'.repeat(run);\n index += run;\n continue;\n }\n if (exports.ESCAPABLE.includes(char)) {\n out += '\\\\';\n }\n out += char;\n index += 1;\n }\n return out;\n};\nexports.escapeInteractionText = escapeInteractionText;\n/** Resolve the escapes in one option's text, leaving every other backslash alone. */\nconst unescapeInteractionText = (text) => {\n let out = '';\n let index = 0;\n while (index < text.length) {\n if ((0, exports.isEscape)(text, index)) {\n out += text[index + 1];\n index += 2;\n continue;\n }\n out += text[index];\n index += 1;\n }\n return out;\n};\nexports.unescapeInteractionText = unescapeInteractionText;\n/**\n * Index of the first `needle` that is not escaped and does not begin inside an escape, or -1.\n *\n * `needle` is matched whole: a `//` whose first slash is escaped is not a separator even though\n * its second slash is bare, because that second slash is the escaped character of the pair.\n */\nconst findUnescaped = (text, needle, start = 0) => {\n let index = start;\n while (index < text.length) {\n if ((0, exports.isEscape)(text, index)) {\n index += 2;\n continue;\n }\n if (text.startsWith(needle, index)) {\n return index;\n }\n index += 1;\n }\n return -1;\n};\nexports.findUnescaped = findUnescaped;\n/** Split on every unescaped `separator`, leaving the escapes themselves in place. */\nconst splitUnescaped = (text, separator) => {\n const parts = [];\n let start = 0;\n for (;;) {\n const found = (0, exports.findUnescaped)(text, separator, start);\n if (found < 0) {\n parts.push(text.slice(start));\n return parts;\n }\n parts.push(text.slice(start, found));\n start = found + separator.length;\n }\n};\nexports.splitUnescaped = splitUnescaped;\n/** Split on unescaped single bars, leaving `||` joined as the multi-select separator. */\nconst splitOnSingleUnescapedPipe = (text) => {\n const parts = [];\n let start = 0;\n let index = 0;\n while (index < text.length) {\n if ((0, exports.isEscape)(text, index)) {\n index += 2;\n continue;\n }\n if (text[index] === '|') {\n if (text.startsWith('||', index)) {\n index += 2;\n continue;\n }\n if (index > 0 && text[index - 1] === '|' && !(0, exports.isEscape)(text, index - 1)) {\n index += 1;\n continue;\n }\n parts.push(text.slice(start, index));\n start = index + 1;\n }\n index += 1;\n }\n parts.push(text.slice(start));\n return parts;\n};\nexports.splitOnSingleUnescapedPipe = splitOnSingleUnescapedPipe;\n/**\n * Split an interaction's content at the `...` that opens its text box, or null.\n *\n * Two details are inherited rather than chosen, because changing either would rewrite questions\n * in courses that are already published:\n *\n * - the ellipsis counts only on the first line. The regex this replaces was anchored and its `.`\n * did not cross a newline, so `A\\n| ...hint` has always been read as two buttons, one of them\n * named `...hint`.\n * - the *first* ellipsis on that line wins, which is what the lazy group matched. (The Python\n * parser takes the last one instead -- a difference that predates escapes and is left alone\n * here; with options escaping their own dots, only the real marker is ever unescaped, so the\n * two agree on everything a producer writes.)\n *\n * What is new is only that an escaped ellipsis no longer counts.\n */\nconst splitOnEllipsis = (content) => {\n const head = content.split('\\n', 1)[0];\n const at = (0, exports.findUnescaped)(head, '...');\n if (at < 0) {\n return null;\n }\n return [head.slice(0, at), head.slice(at + 3)];\n};\nexports.splitOnEllipsis = splitOnEllipsis;\n/**\n * The bracket content of an interaction, as a regex source fragment.\n *\n * The three alternatives are mutually exclusive on purpose: a backslash before a delimiter can\n * only be read as an escape, so the pattern cannot backtrack into reading it as plain text and\n * then closing on the very bracket it escapes. Without that, this regex and a left-to-right\n * scanner disagree about `?[a\\\\]`, and two parsers of one grammar must not.\n */\nexports.INTERACTION_CONTENT_SOURCE = '(?:\\\\\\\\[|/.\\\\]]|\\\\\\\\(?![|/.\\\\]])|[^\\\\]\\\\\\\\])*';\n//# sourceMappingURL=escaping.js.map"],"names":["exports","isEscape","text","index","escapeInteractionText","out","char","run","unescapeInteractionText","findUnescaped","needle","start","splitUnescaped","separator","parts","found","splitOnSingleUnescapedPipe","splitOnEllipsis","content","head","at"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../../../_virtual/index2.cjs"),_=require("./remark-custom-variable.cjs"),l=require("./remark-flow.cjs"),f=require("./remark-interaction.cjs"),m=require("./interaction-parser.cjs");var u;function s(){return u||(u=1,(function(e){var n=r.__exports&&r.__exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.remarkInteraction=e.remarkFlow=e.remarkCustomVariable=e.InteractionType=e.InteractionParser=e.createInteractionParser=void 0;const c=n(_.__require());e.remarkCustomVariable=c.default;const o=n(l.__require());e.remarkFlow=o.default;const i=n(f.__require());e.remarkInteraction=i.default;var a=m.__require();Object.defineProperty(e,"createInteractionParser",{enumerable:!0,get:function(){return a.createInteractionParser}}),Object.defineProperty(e,"InteractionParser",{enumerable:!0,get:function(){return a.InteractionParser}}),Object.defineProperty(e,"InteractionType",{enumerable:!0,get:function(){return a.InteractionType}}),e.default=i.default})(r.__exports)),r.__exports}exports.__require=s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("../../../_virtual/index2.cjs"),_=require("./remark-custom-variable.cjs"),f=require("./remark-flow.cjs"),s=require("./remark-interaction.cjs"),d=require("./interaction-parser.cjs"),b=require("./escaping.cjs");var c;function p(){return c||(c=1,(function(e){var i=n.__exports&&n.__exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.remarkInteraction=e.remarkFlow=e.remarkCustomVariable=e.unescapeInteractionText=e.splitUnescaped=e.splitOnSingleUnescapedPipe=e.splitOnEllipsis=e.isEscape=e.INTERACTION_CONTENT_SOURCE=e.findUnescaped=e.escapeInteractionText=e.ESCAPABLE=e.InteractionType=e.InteractionParser=e.createInteractionParser=void 0;const l=i(_.__require());e.remarkCustomVariable=l.default;const o=i(f.__require());e.remarkFlow=o.default;const u=i(s.__require());e.remarkInteraction=u.default;var a=d.__require();Object.defineProperty(e,"createInteractionParser",{enumerable:!0,get:function(){return a.createInteractionParser}}),Object.defineProperty(e,"InteractionParser",{enumerable:!0,get:function(){return a.InteractionParser}}),Object.defineProperty(e,"InteractionType",{enumerable:!0,get:function(){return a.InteractionType}});var r=b.__require();Object.defineProperty(e,"ESCAPABLE",{enumerable:!0,get:function(){return r.ESCAPABLE}}),Object.defineProperty(e,"escapeInteractionText",{enumerable:!0,get:function(){return r.escapeInteractionText}}),Object.defineProperty(e,"findUnescaped",{enumerable:!0,get:function(){return r.findUnescaped}}),Object.defineProperty(e,"INTERACTION_CONTENT_SOURCE",{enumerable:!0,get:function(){return r.INTERACTION_CONTENT_SOURCE}}),Object.defineProperty(e,"isEscape",{enumerable:!0,get:function(){return r.isEscape}}),Object.defineProperty(e,"splitOnEllipsis",{enumerable:!0,get:function(){return r.splitOnEllipsis}}),Object.defineProperty(e,"splitOnSingleUnescapedPipe",{enumerable:!0,get:function(){return r.splitOnSingleUnescapedPipe}}),Object.defineProperty(e,"splitUnescaped",{enumerable:!0,get:function(){return r.splitUnescaped}}),Object.defineProperty(e,"unescapeInteractionText",{enumerable:!0,get:function(){return r.unescapeInteractionText}}),e.default=u.default})(n.__exports)),n.__exports}exports.__require=p;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../node_modules/remark-flow/dist/index.js"],"sourcesContent":["\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.remarkInteraction = exports.remarkFlow = exports.remarkCustomVariable = exports.InteractionType = exports.InteractionParser = exports.createInteractionParser = void 0;\nconst remark_custom_variable_1 = __importDefault(require(\"./remark-custom-variable\"));\nexports.remarkCustomVariable = remark_custom_variable_1.default;\nconst remark_flow_1 = __importDefault(require(\"./remark-flow\"));\nexports.remarkFlow = remark_flow_1.default;\nconst remark_interaction_1 = __importDefault(require(\"./remark-interaction\"));\nexports.remarkInteraction = remark_interaction_1.default;\nvar interaction_parser_1 = require(\"./interaction-parser\");\nObject.defineProperty(exports, \"createInteractionParser\", { enumerable: true, get: function () { return interaction_parser_1.createInteractionParser; } });\nObject.defineProperty(exports, \"InteractionParser\", { enumerable: true, get: function () { return interaction_parser_1.InteractionParser; } });\nObject.defineProperty(exports, \"InteractionType\", { enumerable: true, get: function () { return interaction_parser_1.InteractionType; } });\nexports.default = remark_interaction_1.default;\n//# sourceMappingURL=index.js.map"],"names":["__importDefault","this","mod","exports","remark_custom_variable_1","require$$0","remark_flow_1","require$$1","remark_interaction_1","require$$2","interaction_parser_1","require$$3"],"mappings":"oUACA,IAAIA,EAAmBC,EAAAA,WAAQA,EAAAA,UAAK,iBAAoB,SAAUC,EAAK,CACnE,OAAQA,GAAOA,EAAI,WAAcA,EAAM,CAAE,QAAWA,CAAG,CAC3D,EACA,OAAO,eAAcC,EAAU,aAAc,CAAE,MAAO,GAAM,EAC5DA,EAAA,kBAA4BA,aAAqBA,EAAA,qBAA+BA,EAAA,gBAA0BA,EAAA,kBAA4BA,EAAA,wBAAkC,OACxK,MAAMC,EAA2BJ,EAAgBK,EAAAA,WAAmC,EACpFF,EAAA,qBAA+BC,EAAyB,QACxD,MAAME,EAAgBN,EAAgBO,EAAAA,WAAwB,EAC9DJ,EAAA,WAAqBG,EAAc,QACnC,MAAME,EAAuBR,EAAgBS,EAAAA,WAA+B,EAC5EN,EAAA,kBAA4BK,EAAqB,QACjD,IAAIE,EAAuBC,EAAAA,UAAA,EAC3B,OAAO,eAAeR,EAAS,0BAA2B,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOO,EAAqB,uBAAwB,CAAE,CAAE,EACzJ,OAAO,eAAeP,EAAS,oBAAqB,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOO,EAAqB,iBAAkB,CAAE,CAAE,EAC7I,OAAO,eAAeP,EAAS,kBAAmB,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOO,EAAqB,eAAgB,CAAE,CAAE,EACzIP,EAAA,QAAkBK,EAAqB","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../node_modules/remark-flow/dist/index.js"],"sourcesContent":["\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.remarkInteraction = exports.remarkFlow = exports.remarkCustomVariable = exports.unescapeInteractionText = exports.splitUnescaped = exports.splitOnSingleUnescapedPipe = exports.splitOnEllipsis = exports.isEscape = exports.INTERACTION_CONTENT_SOURCE = exports.findUnescaped = exports.escapeInteractionText = exports.ESCAPABLE = exports.InteractionType = exports.InteractionParser = exports.createInteractionParser = void 0;\nconst remark_custom_variable_1 = __importDefault(require(\"./remark-custom-variable\"));\nexports.remarkCustomVariable = remark_custom_variable_1.default;\nconst remark_flow_1 = __importDefault(require(\"./remark-flow\"));\nexports.remarkFlow = remark_flow_1.default;\nconst remark_interaction_1 = __importDefault(require(\"./remark-interaction\"));\nexports.remarkInteraction = remark_interaction_1.default;\nvar interaction_parser_1 = require(\"./interaction-parser\");\nObject.defineProperty(exports, \"createInteractionParser\", { enumerable: true, get: function () { return interaction_parser_1.createInteractionParser; } });\nObject.defineProperty(exports, \"InteractionParser\", { enumerable: true, get: function () { return interaction_parser_1.InteractionParser; } });\nObject.defineProperty(exports, \"InteractionType\", { enumerable: true, get: function () { return interaction_parser_1.InteractionType; } });\n// The grammar's escape rule, so that anything else scanning for `?[...]` -- an editor's syntax\n// highlighting, a shortcode reader -- uses the same definition of where an interaction ends\n// rather than a second copy of it that an escaped bracket would fool.\nvar escaping_1 = require(\"./escaping\");\nObject.defineProperty(exports, \"ESCAPABLE\", { enumerable: true, get: function () { return escaping_1.ESCAPABLE; } });\nObject.defineProperty(exports, \"escapeInteractionText\", { enumerable: true, get: function () { return escaping_1.escapeInteractionText; } });\nObject.defineProperty(exports, \"findUnescaped\", { enumerable: true, get: function () { return escaping_1.findUnescaped; } });\nObject.defineProperty(exports, \"INTERACTION_CONTENT_SOURCE\", { enumerable: true, get: function () { return escaping_1.INTERACTION_CONTENT_SOURCE; } });\nObject.defineProperty(exports, \"isEscape\", { enumerable: true, get: function () { return escaping_1.isEscape; } });\nObject.defineProperty(exports, \"splitOnEllipsis\", { enumerable: true, get: function () { return escaping_1.splitOnEllipsis; } });\nObject.defineProperty(exports, \"splitOnSingleUnescapedPipe\", { enumerable: true, get: function () { return escaping_1.splitOnSingleUnescapedPipe; } });\nObject.defineProperty(exports, \"splitUnescaped\", { enumerable: true, get: function () { return escaping_1.splitUnescaped; } });\nObject.defineProperty(exports, \"unescapeInteractionText\", { enumerable: true, get: function () { return escaping_1.unescapeInteractionText; } });\nexports.default = remark_interaction_1.default;\n//# sourceMappingURL=index.js.map"],"names":["__importDefault","this","mod","exports","remark_custom_variable_1","require$$0","remark_flow_1","require$$1","remark_interaction_1","require$$2","interaction_parser_1","require$$3","escaping_1","require$$4"],"mappings":"gWACA,IAAIA,EAAmBC,EAAAA,WAAQA,EAAAA,UAAK,iBAAoB,SAAUC,EAAK,CACnE,OAAQA,GAAOA,EAAI,WAAcA,EAAM,CAAE,QAAWA,CAAG,CAC3D,EACA,OAAO,eAAcC,EAAU,aAAc,CAAE,MAAO,GAAM,EAC5DA,EAAA,kBAA4BA,EAAA,WAAqBA,EAAA,qBAA+BA,EAAA,wBAAkCA,EAAA,eAAyBA,6BAAqCA,EAAA,gBAA0BA,EAAA,SAAmBA,EAAA,2BAAqCA,EAAA,cAAwBA,wBAAgCA,EAAA,UAAoBA,EAAA,gBAA0BA,EAAA,kBAA4BA,EAAA,wBAAkC,OACta,MAAMC,EAA2BJ,EAAgBK,EAAAA,WAAmC,EACpFF,EAAA,qBAA+BC,EAAyB,QACxD,MAAME,EAAgBN,EAAgBO,EAAAA,WAAwB,EAC9DJ,EAAA,WAAqBG,EAAc,QACnC,MAAME,EAAuBR,EAAgBS,EAAAA,WAA+B,EAC5EN,EAAA,kBAA4BK,EAAqB,QACjD,IAAIE,EAAuBC,EAAAA,UAAA,EAC3B,OAAO,eAAeR,EAAS,0BAA2B,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOO,EAAqB,uBAAwB,CAAE,CAAE,EACzJ,OAAO,eAAeP,EAAS,oBAAqB,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOO,EAAqB,iBAAkB,CAAE,CAAE,EAC7I,OAAO,eAAeP,EAAS,kBAAmB,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOO,EAAqB,eAAgB,CAAE,CAAE,EAIzI,IAAIE,EAAaC,EAAAA,UAAA,EACjB,OAAO,eAAeV,EAAS,YAAa,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,SAAU,CAAE,CAAE,EACnH,OAAO,eAAeT,EAAS,wBAAyB,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,qBAAsB,CAAE,CAAE,EAC3I,OAAO,eAAeT,EAAS,gBAAiB,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,aAAc,CAAE,CAAE,EAC3H,OAAO,eAAeT,EAAS,6BAA8B,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,0BAA2B,CAAE,CAAE,EACrJ,OAAO,eAAeT,EAAS,WAAY,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,QAAS,CAAE,CAAE,EACjH,OAAO,eAAeT,EAAS,kBAAmB,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,eAAgB,CAAE,CAAE,EAC/H,OAAO,eAAeT,EAAS,6BAA8B,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,0BAA2B,CAAE,CAAE,EACrJ,OAAO,eAAeT,EAAS,iBAAkB,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,cAAe,CAAE,CAAE,EAC7H,OAAO,eAAeT,EAAS,0BAA2B,CAAE,WAAY,GAAM,IAAK,UAAY,CAAE,OAAOS,EAAW,uBAAwB,CAAE,CAAE,EAC/IT,EAAA,QAAkBK,EAAqB","x_google_ignoreList":[0]}
@@ -1,32 +1,53 @@
1
- import { __exports as e } from "../../../_virtual/index.es2.js";
2
- import { __require as _ } from "./remark-custom-variable.es.js";
1
+ import { __exports as n } from "../../../_virtual/index.es2.js";
2
+ import { __require as o } from "./remark-custom-variable.es.js";
3
3
  import { __require as m } from "./remark-flow.es.js";
4
- import { __require as f } from "./remark-interaction.es.js";
5
- import { __require as l } from "./interaction-parser.es.js";
6
- var u;
7
- function q() {
8
- return u ? e : (u = 1, (function(r) {
9
- var a = e && e.__importDefault || function(t) {
4
+ import { __require as _ } from "./remark-interaction.es.js";
5
+ import { __require as s } from "./interaction-parser.es.js";
6
+ import { __require as d } from "./escaping.es.js";
7
+ var c;
8
+ function T() {
9
+ return c ? n : (c = 1, (function(e) {
10
+ var i = n && n.__importDefault || function(t) {
10
11
  return t && t.__esModule ? t : { default: t };
11
12
  };
12
- Object.defineProperty(r, "__esModule", { value: !0 }), r.remarkInteraction = r.remarkFlow = r.remarkCustomVariable = r.InteractionType = r.InteractionParser = r.createInteractionParser = void 0;
13
- const o = a(_());
14
- r.remarkCustomVariable = o.default;
15
- const c = a(m());
16
- r.remarkFlow = c.default;
17
- const i = a(f());
18
- r.remarkInteraction = i.default;
19
- var n = l();
20
- Object.defineProperty(r, "createInteractionParser", { enumerable: !0, get: function() {
21
- return n.createInteractionParser;
22
- } }), Object.defineProperty(r, "InteractionParser", { enumerable: !0, get: function() {
23
- return n.InteractionParser;
24
- } }), Object.defineProperty(r, "InteractionType", { enumerable: !0, get: function() {
25
- return n.InteractionType;
26
- } }), r.default = i.default;
27
- })(e), e);
13
+ Object.defineProperty(e, "__esModule", { value: !0 }), e.remarkInteraction = e.remarkFlow = e.remarkCustomVariable = e.unescapeInteractionText = e.splitUnescaped = e.splitOnSingleUnescapedPipe = e.splitOnEllipsis = e.isEscape = e.INTERACTION_CONTENT_SOURCE = e.findUnescaped = e.escapeInteractionText = e.ESCAPABLE = e.InteractionType = e.InteractionParser = e.createInteractionParser = void 0;
14
+ const l = i(o());
15
+ e.remarkCustomVariable = l.default;
16
+ const f = i(m());
17
+ e.remarkFlow = f.default;
18
+ const u = i(_());
19
+ e.remarkInteraction = u.default;
20
+ var a = s();
21
+ Object.defineProperty(e, "createInteractionParser", { enumerable: !0, get: function() {
22
+ return a.createInteractionParser;
23
+ } }), Object.defineProperty(e, "InteractionParser", { enumerable: !0, get: function() {
24
+ return a.InteractionParser;
25
+ } }), Object.defineProperty(e, "InteractionType", { enumerable: !0, get: function() {
26
+ return a.InteractionType;
27
+ } });
28
+ var r = d();
29
+ Object.defineProperty(e, "ESCAPABLE", { enumerable: !0, get: function() {
30
+ return r.ESCAPABLE;
31
+ } }), Object.defineProperty(e, "escapeInteractionText", { enumerable: !0, get: function() {
32
+ return r.escapeInteractionText;
33
+ } }), Object.defineProperty(e, "findUnescaped", { enumerable: !0, get: function() {
34
+ return r.findUnescaped;
35
+ } }), Object.defineProperty(e, "INTERACTION_CONTENT_SOURCE", { enumerable: !0, get: function() {
36
+ return r.INTERACTION_CONTENT_SOURCE;
37
+ } }), Object.defineProperty(e, "isEscape", { enumerable: !0, get: function() {
38
+ return r.isEscape;
39
+ } }), Object.defineProperty(e, "splitOnEllipsis", { enumerable: !0, get: function() {
40
+ return r.splitOnEllipsis;
41
+ } }), Object.defineProperty(e, "splitOnSingleUnescapedPipe", { enumerable: !0, get: function() {
42
+ return r.splitOnSingleUnescapedPipe;
43
+ } }), Object.defineProperty(e, "splitUnescaped", { enumerable: !0, get: function() {
44
+ return r.splitUnescaped;
45
+ } }), Object.defineProperty(e, "unescapeInteractionText", { enumerable: !0, get: function() {
46
+ return r.unescapeInteractionText;
47
+ } }), e.default = u.default;
48
+ })(n), n);
28
49
  }
29
50
  export {
30
- q as __require
51
+ T as __require
31
52
  };
32
53
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../../../node_modules/remark-flow/dist/index.js"],"sourcesContent":["\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.remarkInteraction = exports.remarkFlow = exports.remarkCustomVariable = exports.InteractionType = exports.InteractionParser = exports.createInteractionParser = void 0;\nconst remark_custom_variable_1 = __importDefault(require(\"./remark-custom-variable\"));\nexports.remarkCustomVariable = remark_custom_variable_1.default;\nconst remark_flow_1 = __importDefault(require(\"./remark-flow\"));\nexports.remarkFlow = remark_flow_1.default;\nconst remark_interaction_1 = __importDefault(require(\"./remark-interaction\"));\nexports.remarkInteraction = remark_interaction_1.default;\nvar interaction_parser_1 = require(\"./interaction-parser\");\nObject.defineProperty(exports, \"createInteractionParser\", { enumerable: true, get: function () { return interaction_parser_1.createInteractionParser; } });\nObject.defineProperty(exports, \"InteractionParser\", { enumerable: true, get: function () { return interaction_parser_1.InteractionParser; } });\nObject.defineProperty(exports, \"InteractionType\", { enumerable: true, get: function () { return interaction_parser_1.InteractionType; } });\nexports.default = remark_interaction_1.default;\n//# sourceMappingURL=index.js.map"],"names":["__importDefault","this","mod","exports","remark_custom_variable_1","require$$0","remark_flow_1","require$$1","remark_interaction_1","require$$2","interaction_parser_1","require$$3"],"mappings":";;;;;;;;AACA,QAAIA,IAAmBC,KAAQA,EAAK,mBAAoB,SAAUC,GAAK;AACnE,aAAQA,KAAOA,EAAI,aAAcA,IAAM,EAAE,SAAWA,EAAG;AAAA,IAC3D;AACA,WAAO,eAAcC,GAAU,cAAc,EAAE,OAAO,IAAM,GAC5DA,EAAA,oBAA4BA,eAAqBA,EAAA,uBAA+BA,EAAA,kBAA0BA,EAAA,oBAA4BA,EAAA,0BAAkC;AACxK,UAAMC,IAA2BJ,EAAgBK,GAAmC;AACpF,IAAAF,EAAA,uBAA+BC,EAAyB;AACxD,UAAME,IAAgBN,EAAgBO,GAAwB;AAC9D,IAAAJ,EAAA,aAAqBG,EAAc;AACnC,UAAME,IAAuBR,EAAgBS,GAA+B;AAC5E,IAAAN,EAAA,oBAA4BK,EAAqB;AACjD,QAAIE,IAAuBC,EAAA;AAC3B,WAAO,eAAeR,GAAS,2BAA2B,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOO,EAAqB;AAAA,IAAwB,EAAE,CAAE,GACzJ,OAAO,eAAeP,GAAS,qBAAqB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOO,EAAqB;AAAA,IAAkB,EAAE,CAAE,GAC7I,OAAO,eAAeP,GAAS,mBAAmB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOO,EAAqB;AAAA,IAAgB,EAAE,CAAE,GACzIP,EAAA,UAAkBK,EAAqB;AAAA;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.es.js","sources":["../../../../node_modules/remark-flow/dist/index.js"],"sourcesContent":["\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.remarkInteraction = exports.remarkFlow = exports.remarkCustomVariable = exports.unescapeInteractionText = exports.splitUnescaped = exports.splitOnSingleUnescapedPipe = exports.splitOnEllipsis = exports.isEscape = exports.INTERACTION_CONTENT_SOURCE = exports.findUnescaped = exports.escapeInteractionText = exports.ESCAPABLE = exports.InteractionType = exports.InteractionParser = exports.createInteractionParser = void 0;\nconst remark_custom_variable_1 = __importDefault(require(\"./remark-custom-variable\"));\nexports.remarkCustomVariable = remark_custom_variable_1.default;\nconst remark_flow_1 = __importDefault(require(\"./remark-flow\"));\nexports.remarkFlow = remark_flow_1.default;\nconst remark_interaction_1 = __importDefault(require(\"./remark-interaction\"));\nexports.remarkInteraction = remark_interaction_1.default;\nvar interaction_parser_1 = require(\"./interaction-parser\");\nObject.defineProperty(exports, \"createInteractionParser\", { enumerable: true, get: function () { return interaction_parser_1.createInteractionParser; } });\nObject.defineProperty(exports, \"InteractionParser\", { enumerable: true, get: function () { return interaction_parser_1.InteractionParser; } });\nObject.defineProperty(exports, \"InteractionType\", { enumerable: true, get: function () { return interaction_parser_1.InteractionType; } });\n// The grammar's escape rule, so that anything else scanning for `?[...]` -- an editor's syntax\n// highlighting, a shortcode reader -- uses the same definition of where an interaction ends\n// rather than a second copy of it that an escaped bracket would fool.\nvar escaping_1 = require(\"./escaping\");\nObject.defineProperty(exports, \"ESCAPABLE\", { enumerable: true, get: function () { return escaping_1.ESCAPABLE; } });\nObject.defineProperty(exports, \"escapeInteractionText\", { enumerable: true, get: function () { return escaping_1.escapeInteractionText; } });\nObject.defineProperty(exports, \"findUnescaped\", { enumerable: true, get: function () { return escaping_1.findUnescaped; } });\nObject.defineProperty(exports, \"INTERACTION_CONTENT_SOURCE\", { enumerable: true, get: function () { return escaping_1.INTERACTION_CONTENT_SOURCE; } });\nObject.defineProperty(exports, \"isEscape\", { enumerable: true, get: function () { return escaping_1.isEscape; } });\nObject.defineProperty(exports, \"splitOnEllipsis\", { enumerable: true, get: function () { return escaping_1.splitOnEllipsis; } });\nObject.defineProperty(exports, \"splitOnSingleUnescapedPipe\", { enumerable: true, get: function () { return escaping_1.splitOnSingleUnescapedPipe; } });\nObject.defineProperty(exports, \"splitUnescaped\", { enumerable: true, get: function () { return escaping_1.splitUnescaped; } });\nObject.defineProperty(exports, \"unescapeInteractionText\", { enumerable: true, get: function () { return escaping_1.unescapeInteractionText; } });\nexports.default = remark_interaction_1.default;\n//# sourceMappingURL=index.js.map"],"names":["__importDefault","this","mod","exports","remark_custom_variable_1","require$$0","remark_flow_1","require$$1","remark_interaction_1","require$$2","interaction_parser_1","require$$3","escaping_1","require$$4"],"mappings":";;;;;;;;;AACA,QAAIA,IAAmBC,KAAQA,EAAK,mBAAoB,SAAUC,GAAK;AACnE,aAAQA,KAAOA,EAAI,aAAcA,IAAM,EAAE,SAAWA,EAAG;AAAA,IAC3D;AACA,WAAO,eAAcC,GAAU,cAAc,EAAE,OAAO,IAAM,GAC5DA,EAAA,oBAA4BA,EAAA,aAAqBA,EAAA,uBAA+BA,EAAA,0BAAkCA,EAAA,iBAAyBA,+BAAqCA,EAAA,kBAA0BA,EAAA,WAAmBA,EAAA,6BAAqCA,EAAA,gBAAwBA,0BAAgCA,EAAA,YAAoBA,EAAA,kBAA0BA,EAAA,oBAA4BA,EAAA,0BAAkC;AACta,UAAMC,IAA2BJ,EAAgBK,GAAmC;AACpF,IAAAF,EAAA,uBAA+BC,EAAyB;AACxD,UAAME,IAAgBN,EAAgBO,GAAwB;AAC9D,IAAAJ,EAAA,aAAqBG,EAAc;AACnC,UAAME,IAAuBR,EAAgBS,GAA+B;AAC5E,IAAAN,EAAA,oBAA4BK,EAAqB;AACjD,QAAIE,IAAuBC,EAAA;AAC3B,WAAO,eAAeR,GAAS,2BAA2B,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOO,EAAqB;AAAA,IAAwB,EAAE,CAAE,GACzJ,OAAO,eAAeP,GAAS,qBAAqB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOO,EAAqB;AAAA,IAAkB,EAAE,CAAE,GAC7I,OAAO,eAAeP,GAAS,mBAAmB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOO,EAAqB;AAAA,IAAgB,EAAE,CAAE;AAIzI,QAAIE,IAAaC,EAAA;AACjB,WAAO,eAAeV,GAAS,aAAa,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAAU,EAAE,CAAE,GACnH,OAAO,eAAeT,GAAS,yBAAyB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAAsB,EAAE,CAAE,GAC3I,OAAO,eAAeT,GAAS,iBAAiB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAAc,EAAE,CAAE,GAC3H,OAAO,eAAeT,GAAS,8BAA8B,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAA2B,EAAE,CAAE,GACrJ,OAAO,eAAeT,GAAS,YAAY,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAAS,EAAE,CAAE,GACjH,OAAO,eAAeT,GAAS,mBAAmB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAAgB,EAAE,CAAE,GAC/H,OAAO,eAAeT,GAAS,8BAA8B,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAA2B,EAAE,CAAE,GACrJ,OAAO,eAAeT,GAAS,kBAAkB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAAe,EAAE,CAAE,GAC7H,OAAO,eAAeT,GAAS,2BAA2B,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,aAAOS,EAAW;AAAA,IAAwB,EAAE,CAAE,GAC/IT,EAAA,UAAkBK,EAAqB;AAAA;;","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("../../../_virtual/interaction-parser.cjs");var f;function E(){return f||(f=1,(function(u){Object.defineProperty(u,"__esModule",{value:!0}),u.InteractionParser=u.COMPILED_REGEXES=u.InteractionType=void 0,u.parseInteractionFormat=T,u.createInteractionParser=S;var a;(function(l){l.TEXT_ONLY="text_only",l.BUTTONS_ONLY="buttons_only",l.BUTTONS_WITH_TEXT="buttons_with_text",l.BUTTONS_MULTI_SELECT="buttons_multi_select",l.BUTTONS_MULTI_WITH_TEXT="buttons_multi_with_text",l.NON_ASSIGNMENT_BUTTON="non_assignment_button"})(a||(u.InteractionType=a={})),u.COMPILED_REGEXES={LAYER1_INTERACTION:/\?\[([^\]]*)\](?!\()/,LAYER2_VARIABLE:/^%\{\{\s*([a-zA-Z0-9_\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff]+)\s*\}\}(.*)$/,LAYER3_ELLIPSIS:/^(.*?)\.\.\.(.*)/,LAYER3_SINGLE_PIPE_SPLIT:new RegExp("(?<!\\|)\\|(?!\\|)")};class o{constructor(){}parse(t){try{const e=this._layer1ValidateFormat(t);if(e===null)return this._createErrorResult(`Invalid interaction format: ${t}`);const[r,i,s]=this._layer2DetectVariable(e);return r&&i?this._layer3ParseVariableInteraction(i,s):this._layer3ParseDisplayButtons(e)}catch(e){return this._createErrorResult(`Parsing error: ${e instanceof Error?e.message:"Unknown error"}`)}}parseToRemarkFormat(t){const e=this.parse(t);if(e.error)return{placeholder:t.trim()};const r={};if(e.type===a.NON_ASSIGNMENT_BUTTON){const i=e;i.buttons.length>0&&(r.buttonTexts=i.buttons.map(s=>s.display),r.buttonValues=i.buttons.map(s=>s.value)),i.question!==void 0&&(r.placeholder=i.question),i.isMultiSelect!==void 0&&(r.isMultiSelect=i.isMultiSelect)}else if(e.type!==null){const i=e;r.variableName=i.variable,i.buttons&&(r.buttonTexts=i.buttons.map(s=>s.display),r.buttonValues=i.buttons.map(s=>s.value)),i.question!==void 0&&(r.placeholder=i.question),i.isMultiSelect!==void 0&&(r.isMultiSelect=i.isMultiSelect)}return r}_layer1ValidateFormat(t){t=t.trim();const e=u.COMPILED_REGEXES.LAYER1_INTERACTION.exec(t);return!e||e[0].trim()!==t?null:e[1]}_layer2DetectVariable(t){const e=u.COMPILED_REGEXES.LAYER2_VARIABLE.exec(t);if(!e)return[!1,null,t];const r=e[1].trim(),i=e[2].trim();return[!0,r,i]}_parseContentShape(t){const e=u.COMPILED_REGEXES.LAYER3_ELLIPSIS.exec(t);if(e){const r=e[1].trim(),i=e[2].trim();if(r){const[s,n]=this._parseButtons(r);return{buttons:s,question:i,isMultiSelect:n,hasTextInput:!0}}return{buttons:[],question:i,isMultiSelect:!1,hasTextInput:!0}}if(/\|/.test(t)){const[r,i]=this._parseButtons(t);return{buttons:r,isMultiSelect:i,hasTextInput:!1}}return t?{buttons:[this._parseSingleButton(t)],isMultiSelect:!1,hasTextInput:!1}:{buttons:[],question:"",isMultiSelect:!1,hasTextInput:!0}}_layer3ParseVariableInteraction(t,e){const r=this._parseContentShape(e);return r.hasTextInput?r.buttons.length>0?{type:r.isMultiSelect?a.BUTTONS_MULTI_WITH_TEXT:a.BUTTONS_WITH_TEXT,variable:t,buttons:r.buttons,question:r.question,isMultiSelect:r.isMultiSelect}:{type:a.TEXT_ONLY,variable:t,question:r.question??"",isMultiSelect:!1}:{type:r.isMultiSelect?a.BUTTONS_MULTI_SELECT:a.BUTTONS_ONLY,variable:t,buttons:r.buttons,isMultiSelect:r.isMultiSelect}}_layer3ParseDisplayButtons(t){if(!t)return{type:a.NON_ASSIGNMENT_BUTTON,buttons:[{display:"",value:""}]};const e=this._parseContentShape(t),r={type:a.NON_ASSIGNMENT_BUTTON,buttons:e.buttons,isMultiSelect:e.isMultiSelect};return e.hasTextInput&&(r.question=e.question),r}_parseButtons(t){if(!t||typeof t!="string")return[[],!1];const[e,r]=this._detectSeparatorType(t),i=[];try{let s;r?s=t.split("||"):s=t.split(u.COMPILED_REGEXES.LAYER3_SINGLE_PIPE_SPLIT);for(const n of s){const c=n.trim();if(c){const p=this._parseSingleButton(c);i.push(p)}}}catch{return[[{display:t.trim(),value:t.trim()}],!1]}return!i.length&&(t.trim()==="||"||t.trim()==="|")?[[],r]:(!i.length&&t.trim()&&i.push({display:t.trim(),value:t.trim()}),[i,r])}_parseSingleButton(t){t=t.trim();const e=t.indexOf("//");return e>0&&e+2<t.length?{display:t.slice(0,e).trim(),value:t.slice(e+2).trim()}:{display:t,value:t}}_detectSeparatorType(t){if(!t||typeof t!="string")return["|",!1];const e=t.indexOf("|"),r=t.indexOf("||");return e===-1?["|",!1]:r===-1?["|",!1]:r<=e?["||",!0]:["|",!1]}_createErrorResult(t){return{type:null,error:t}}}u.InteractionParser=o;function T(l){const e=new o().parse(l);if(e.error)return[a.TEXT_ONLY,{question:l.trim()}];const r=e.type,i={};if(e.type!==a.NON_ASSIGNMENT_BUTTON){const n=e;n.variable!==void 0&&(i.variable=n.variable),n.buttons!==void 0&&(i.buttons=n.buttons),n.question!==void 0&&(i.question=n.question),n.isMultiSelect!==void 0&&(i.isMultiSelect=n.isMultiSelect)}else{const n=e;n.buttons!==void 0&&(i.buttons=n.buttons)}return[r||a.TEXT_ONLY,i]}function S(){return new o}})(_.__exports)),_.__exports}exports.__require=E;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("../../../_virtual/interaction-parser.cjs"),d=require("./escaping.cjs");var p;function I(){return p||(p=1,(function(l){Object.defineProperty(l,"__esModule",{value:!0}),l.InteractionParser=l.COMPILED_REGEXES=l.InteractionType=void 0,l.parseInteractionFormat=T,l.createInteractionParser=S;const a=d.__require();var u;(function(o){o.TEXT_ONLY="text_only",o.BUTTONS_ONLY="buttons_only",o.BUTTONS_WITH_TEXT="buttons_with_text",o.BUTTONS_MULTI_SELECT="buttons_multi_select",o.BUTTONS_MULTI_WITH_TEXT="buttons_multi_with_text",o.NON_ASSIGNMENT_BUTTON="non_assignment_button"})(u||(l.InteractionType=u={})),l.COMPILED_REGEXES={LAYER1_INTERACTION:new RegExp(`\\?\\[(${a.INTERACTION_CONTENT_SOURCE})\\](?!\\()`),LAYER2_VARIABLE:/^%\{\{\s*([a-zA-Z0-9_\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff]+)\s*\}\}(.*)$/,LAYER3_ELLIPSIS:/^(.*?)\.\.\.(.*)/,LAYER3_SINGLE_PIPE_SPLIT:/\|(?!\|)/g};class c{constructor(){}parse(e){try{const t=this._layer1ValidateFormat(e);if(t===null)return this._createErrorResult(`Invalid interaction format: ${e}`);const[r,s,i]=this._layer2DetectVariable(t);return r&&s?this._layer3ParseVariableInteraction(s,i):this._layer3ParseDisplayButtons(t)}catch(t){return this._createErrorResult(`Parsing error: ${t instanceof Error?t.message:"Unknown error"}`)}}parseToRemarkFormat(e){const t=this.parse(e);if(t.error)return{placeholder:e.trim()};const r={};if(t.type===u.NON_ASSIGNMENT_BUTTON){const s=t;s.buttons.length>0&&(r.buttonTexts=s.buttons.map(i=>i.display),r.buttonValues=s.buttons.map(i=>i.value)),s.question!==void 0&&(r.placeholder=s.question),s.isMultiSelect!==void 0&&(r.isMultiSelect=s.isMultiSelect)}else if(t.type!==null){const s=t;r.variableName=s.variable,s.buttons&&(r.buttonTexts=s.buttons.map(i=>i.display),r.buttonValues=s.buttons.map(i=>i.value)),s.question!==void 0&&(r.placeholder=s.question),s.isMultiSelect!==void 0&&(r.isMultiSelect=s.isMultiSelect)}return r}_layer1ValidateFormat(e){e=e.trim();const t=l.COMPILED_REGEXES.LAYER1_INTERACTION.exec(e);return!t||t[0].trim()!==e?null:t[1]}_layer2DetectVariable(e){const t=l.COMPILED_REGEXES.LAYER2_VARIABLE.exec(e);if(!t)return[!1,null,e];const r=t[1].trim(),s=t[2].trim();return[!0,r,s]}_parseContentShape(e){const t=(0,a.splitOnEllipsis)(e);if(t){const r=t[0].trim(),s=(0,a.unescapeInteractionText)(t[1]).trim();if(r){const[i,n]=this._parseButtons(r);return{buttons:i,question:s,isMultiSelect:n,hasTextInput:!0}}return{buttons:[],question:s,isMultiSelect:!1,hasTextInput:!0}}if((0,a.findUnescaped)(e,"|")>=0){const[r,s]=this._parseButtons(e);return{buttons:r,isMultiSelect:s,hasTextInput:!1}}return e?{buttons:[this._parseSingleButton(e)],isMultiSelect:!1,hasTextInput:!1}:{buttons:[],question:"",isMultiSelect:!1,hasTextInput:!0}}_layer3ParseVariableInteraction(e,t){const r=this._parseContentShape(t);return r.hasTextInput?r.buttons.length>0?{type:r.isMultiSelect?u.BUTTONS_MULTI_WITH_TEXT:u.BUTTONS_WITH_TEXT,variable:e,buttons:r.buttons,question:r.question,isMultiSelect:r.isMultiSelect}:{type:u.TEXT_ONLY,variable:e,question:r.question??"",isMultiSelect:!1}:{type:r.isMultiSelect?u.BUTTONS_MULTI_SELECT:u.BUTTONS_ONLY,variable:e,buttons:r.buttons,isMultiSelect:r.isMultiSelect}}_layer3ParseDisplayButtons(e){if(!e)return{type:u.NON_ASSIGNMENT_BUTTON,buttons:[{display:"",value:""}]};const t=this._parseContentShape(e),r={type:u.NON_ASSIGNMENT_BUTTON,buttons:t.buttons,isMultiSelect:t.isMultiSelect};return t.hasTextInput&&(r.question=t.question),r}_parseButtons(e){if(!e||typeof e!="string")return[[],!1];const[t,r]=this._detectSeparatorType(e),s=[];try{let i;r?i=(0,a.splitUnescaped)(e,"||"):i=(0,a.splitOnSingleUnescapedPipe)(e);for(const n of i){const f=n.trim();if(f){const E=this._parseSingleButton(f);s.push(E)}}}catch{const i=(0,a.unescapeInteractionText)(e).trim();return[[{display:i,value:i}],!1]}if(!s.length&&(e.trim()==="||"||e.trim()==="|"))return[[],r];if(!s.length&&e.trim()){const i=(0,a.unescapeInteractionText)(e).trim();s.push({display:i,value:i})}return[s,r]}_parseSingleButton(e){e=e.trim();const t=(0,a.findUnescaped)(e,"//");if(t>0&&t+2<e.length)return{display:(0,a.unescapeInteractionText)(e.slice(0,t)).trim(),value:(0,a.unescapeInteractionText)(e.slice(t+2)).trim()};const r=(0,a.unescapeInteractionText)(e);return{display:r,value:r}}_detectSeparatorType(e){if(!e||typeof e!="string")return["|",!1];const t=(0,a.findUnescaped)(e,"|"),r=(0,a.findUnescaped)(e,"||");return t===-1?["|",!1]:r===-1?["|",!1]:r<=t?["||",!0]:["|",!1]}_createErrorResult(e){return{type:null,error:e}}}l.InteractionParser=c;function T(o){const t=new c().parse(o);if(t.error)return[u.TEXT_ONLY,{question:o.trim()}];const r=t.type,s={};if(t.type!==u.NON_ASSIGNMENT_BUTTON){const n=t;n.variable!==void 0&&(s.variable=n.variable),n.buttons!==void 0&&(s.buttons=n.buttons),n.question!==void 0&&(s.question=n.question),n.isMultiSelect!==void 0&&(s.isMultiSelect=n.isMultiSelect)}else{const n=t;n.buttons!==void 0&&(s.buttons=n.buttons)}return[r||u.TEXT_ONLY,s]}function S(){return new c}})(_.__exports)),_.__exports}exports.__require=I;
2
2
  //# sourceMappingURL=interaction-parser.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"interaction-parser.cjs","sources":["../../../../node_modules/remark-flow/dist/interaction-parser.js"],"sourcesContent":["\"use strict\";\n/**\n * MarkdownFlow Interactive Block Layered Parser - TypeScript Version\n *\n * Uses a three-layer analysis architecture:\n * Layer 1: ?[] format validation\n * Layer 2: Variable detection and pattern classification\n * Layer 3: Specific content parsing\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InteractionParser = exports.COMPILED_REGEXES = exports.InteractionType = void 0;\nexports.parseInteractionFormat = parseInteractionFormat;\nexports.createInteractionParser = createInteractionParser;\n// Interaction input type enumeration\nvar InteractionType;\n(function (InteractionType) {\n InteractionType[\"TEXT_ONLY\"] = \"text_only\";\n InteractionType[\"BUTTONS_ONLY\"] = \"buttons_only\";\n InteractionType[\"BUTTONS_WITH_TEXT\"] = \"buttons_with_text\";\n InteractionType[\"BUTTONS_MULTI_SELECT\"] = \"buttons_multi_select\";\n InteractionType[\"BUTTONS_MULTI_WITH_TEXT\"] = \"buttons_multi_with_text\";\n InteractionType[\"NON_ASSIGNMENT_BUTTON\"] = \"non_assignment_button\";\n})(InteractionType || (exports.InteractionType = InteractionType = {}));\n// Pre-compiled regex constants\nexports.COMPILED_REGEXES = {\n // Layer 1: Basic format validation - matches ?[content] but excludes ?[text](url) format\n LAYER1_INTERACTION: /\\?\\[([^\\]]*)\\](?!\\()/,\n // Layer 2: Variable detection - matches %{{variable}}content format\n // (supports letters, numbers, underscores, Chinese characters, Japanese\n // kana, with optional spaces inside the braces). Superset of both the\n // repo history and the published 0.1.6 behavior.\n LAYER2_VARIABLE: /^%\\{\\{\\s*([a-zA-Z0-9_\\u4e00-\\u9fa5\\u3040-\\u309f\\u30a0-\\u30ff]+)\\s*\\}\\}(.*)$/,\n // Layer 3: Split content before and after ...\n LAYER3_ELLIPSIS: /^(.*?)\\.\\.\\.(.*)/,\n // Layer 3: Split on single | but not ||\n LAYER3_SINGLE_PIPE_SPLIT: /(?<!\\|)\\|(?!\\|)/,\n};\n/**\n * Layered interaction parser class\n */\nclass InteractionParser {\n constructor() {\n // Constructor is intentionally empty - no initialization needed\n }\n /**\n * Main parsing method\n *\n * @param content - Raw content of interaction block\n * @returns Standardized parse result\n */\n parse(content) {\n try {\n // Layer 1: Validate basic format\n const innerContent = this._layer1ValidateFormat(content);\n if (innerContent === null) {\n return this._createErrorResult(`Invalid interaction format: ${content}`);\n }\n // Layer 2: Variable detection and pattern classification\n const [hasVariable, variableName, remainingContent] = this._layer2DetectVariable(innerContent);\n // Layer 3: Specific content parsing\n if (hasVariable && variableName) {\n return this._layer3ParseVariableInteraction(variableName, remainingContent);\n }\n else {\n return this._layer3ParseDisplayButtons(innerContent);\n }\n }\n catch (error) {\n return this._createErrorResult(`Parsing error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n /**\n * Parse and convert to remark-compatible format\n *\n * @param content - Raw content of interaction block\n * @returns remark-compatible result object\n */\n parseToRemarkFormat(content) {\n const result = this.parse(content);\n if (result.error) {\n // Compatibility handling when parsing fails\n return { placeholder: content.trim() };\n }\n // Convert to remark-compatible format\n const remarkResult = {};\n if (result.type === InteractionType.NON_ASSIGNMENT_BUTTON) {\n // Non-assignment interaction (no variableName in the output)\n const nonAssignmentResult = result;\n if (nonAssignmentResult.buttons.length > 0) {\n remarkResult.buttonTexts = nonAssignmentResult.buttons.map(b => b.display);\n remarkResult.buttonValues = nonAssignmentResult.buttons.map(b => b.value);\n }\n if (nonAssignmentResult.question !== undefined) {\n remarkResult.placeholder = nonAssignmentResult.question;\n }\n if (nonAssignmentResult.isMultiSelect !== undefined) {\n remarkResult.isMultiSelect = nonAssignmentResult.isMultiSelect;\n }\n }\n else if (result.type !== null) {\n // Variable interaction\n const variableResult = result;\n remarkResult.variableName = variableResult.variable;\n if (variableResult.buttons) {\n remarkResult.buttonTexts = variableResult.buttons.map(b => b.display);\n remarkResult.buttonValues = variableResult.buttons.map(b => b.value);\n }\n if (variableResult.question !== undefined) {\n remarkResult.placeholder = variableResult.question;\n }\n if (variableResult.isMultiSelect !== undefined) {\n remarkResult.isMultiSelect = variableResult.isMultiSelect;\n }\n }\n return remarkResult;\n }\n /**\n * Layer 1: Validate ?[] format and extract content\n *\n * @param content - Raw content\n * @returns Extracted bracket content, returns null if validation fails\n */\n _layer1ValidateFormat(content) {\n content = content.trim();\n const match = exports.COMPILED_REGEXES.LAYER1_INTERACTION.exec(content);\n if (!match) {\n return null;\n }\n // Ensure the match is the complete content (no other text)\n const matchedText = match[0];\n if (matchedText.trim() !== content) {\n return null;\n }\n return match[1];\n }\n /**\n * Layer 2: Detect variables and perform pattern classification\n *\n * @param innerContent - Content extracted from layer 1\n * @returns [hasVariable, variableName, remainingContent]\n */\n _layer2DetectVariable(innerContent) {\n const match = exports.COMPILED_REGEXES.LAYER2_VARIABLE.exec(innerContent);\n if (!match) {\n // No variable, entire content used for display button parsing\n return [false, null, innerContent];\n }\n const variableName = match[1].trim();\n const remainingContent = match[2].trim();\n return [true, variableName, remainingContent];\n }\n /**\n * Parse the structural shape of interaction content: buttons, optional\n * `...question` text input, multi-select flag. Shared by the variable and\n * non-assignment branches, which only differ in how they map the shape\n * into their result types.\n *\n * @param content - Content after the (optional) variable\n * @returns The parsed content shape\n */\n _parseContentShape(content) {\n const ellipsisMatch = exports.COMPILED_REGEXES.LAYER3_ELLIPSIS.exec(content);\n if (ellipsisMatch) {\n const beforeEllipsis = ellipsisMatch[1].trim();\n const question = ellipsisMatch[2].trim();\n if (beforeEllipsis) {\n // Button group + text input: ?[Button1 | Button2 | ...question]\n const [buttons, isMultiSelect] = this._parseButtons(beforeEllipsis);\n return { buttons, question, isMultiSelect, hasTextInput: true };\n }\n // Pure text input: ?[...question]\n return {\n buttons: [],\n question,\n isMultiSelect: false,\n hasTextInput: true,\n };\n }\n if (/\\|/.test(content)) {\n // Button group: ?[Button1 | Button2] or ?[Button1 || Button2]\n const [buttons, isMultiSelect] = this._parseButtons(content);\n return { buttons, isMultiSelect, hasTextInput: false };\n }\n if (content) {\n // Single button: ?[Button1] or ?[Button1//id1]\n return {\n buttons: [this._parseSingleButton(content)],\n isMultiSelect: false,\n hasTextInput: false,\n };\n }\n // Empty content: pure text input with no prompt\n return {\n buttons: [],\n question: '',\n isMultiSelect: false,\n hasTextInput: true,\n };\n }\n /**\n * Layer 3: Parse variable interaction (variable assignment type)\n *\n * @param variableName - Variable name\n * @param content - Content after variable\n * @returns Parse result\n */\n _layer3ParseVariableInteraction(variableName, content) {\n const shape = this._parseContentShape(content);\n if (shape.hasTextInput) {\n if (shape.buttons.length > 0) {\n // Button group + text input: ?[%{{var}} Button1 | Button2 | ...question]\n return {\n type: shape.isMultiSelect\n ? InteractionType.BUTTONS_MULTI_WITH_TEXT\n : InteractionType.BUTTONS_WITH_TEXT,\n variable: variableName,\n buttons: shape.buttons,\n question: shape.question,\n isMultiSelect: shape.isMultiSelect,\n };\n }\n // Pure text input: ?[%{{var}}...question] or ?[%{{var}}]\n return {\n type: InteractionType.TEXT_ONLY,\n variable: variableName,\n question: shape.question ?? '',\n isMultiSelect: false,\n };\n }\n // Button group or single button: ?[%{{var}} Button1 | Button2]\n return {\n type: shape.isMultiSelect\n ? InteractionType.BUTTONS_MULTI_SELECT\n : InteractionType.BUTTONS_ONLY,\n variable: variableName,\n buttons: shape.buttons,\n isMultiSelect: shape.isMultiSelect,\n };\n }\n /**\n * Layer 3: Parse non-assignment interactions (no variable). Same shapes as\n * the variable branch; the answer is not assigned to a variable.\n *\n * @param content - Content\n * @returns Parse result\n */\n _layer3ParseDisplayButtons(content) {\n if (!content) {\n // Empty content: ?[]\n return {\n type: InteractionType.NON_ASSIGNMENT_BUTTON,\n buttons: [{ display: '', value: '' }],\n };\n }\n const shape = this._parseContentShape(content);\n const result = {\n type: InteractionType.NON_ASSIGNMENT_BUTTON,\n buttons: shape.buttons,\n isMultiSelect: shape.isMultiSelect,\n };\n if (shape.hasTextInput) {\n result.question = shape.question;\n }\n return result;\n }\n /**\n * Parse button group with fault tolerance\n *\n * @param content - Button content, separated by | or ||\n * @returns [button list, isMultiSelect]\n */\n _parseButtons(content) {\n if (!content || typeof content !== 'string') {\n return [[], false];\n }\n const [_separator, isMultiSelect] = this._detectSeparatorType(content);\n const buttons = [];\n try {\n // Use different splitting logic based on separator type\n let buttonTexts;\n if (isMultiSelect) {\n // Multi-select mode: split on ||, preserve single |\n buttonTexts = content.split('||');\n }\n else {\n // Single-select mode: split on single |, but preserve ||\n // Use pre-compiled regex from constants\n buttonTexts = content.split(exports.COMPILED_REGEXES.LAYER3_SINGLE_PIPE_SPLIT);\n }\n for (const buttonText of buttonTexts) {\n const trimmed = buttonText.trim();\n if (trimmed) {\n const button = this._parseSingleButton(trimmed);\n buttons.push(button);\n }\n }\n }\n catch {\n // Fallback to treating entire content as single button\n return [[{ display: content.trim(), value: content.trim() }], false];\n }\n // For empty content (like just separators), return empty list\n if (!buttons.length &&\n (content.trim() === '||' || content.trim() === '|')) {\n return [[], isMultiSelect];\n }\n // Ensure at least one button exists (but only if there's actual content)\n if (!buttons.length && content.trim()) {\n buttons.push({ display: content.trim(), value: content.trim() });\n }\n return [buttons, isMultiSelect];\n }\n /**\n * Parse single button, supports Button//value format\n *\n * @param buttonText - Button text\n * @returns {display: display text, value: actual value}\n */\n _parseSingleButton(buttonText) {\n buttonText = buttonText.trim();\n // Detect Button//value format: split at the first \"//\" with a non-empty\n // display before it and a non-empty value after it. (indexOf instead of\n // a lazy/greedy regex, whose backtracking is super-linear.)\n const separatorIndex = buttonText.indexOf('//');\n if (separatorIndex > 0 && separatorIndex + 2 < buttonText.length) {\n return {\n display: buttonText.slice(0, separatorIndex).trim(),\n value: buttonText.slice(separatorIndex + 2).trim(),\n };\n }\n return { display: buttonText, value: buttonText };\n }\n /**\n * Detect separator type and whether it's multi-select\n *\n * Logic: The first separator type encountered determines the parsing mode:\n * - If first separator is |, then || is treated as part of the value\n * - If first separator is ||, then single | is treated as part of the value\n *\n * @param content - Button content to analyze\n * @returns [separator, isMultiSelect] where separator is '|' or '||'\n */\n _detectSeparatorType(content) {\n if (!content || typeof content !== 'string') {\n return ['|', false];\n }\n // Find the position of first single pipe and first double pipe\n const singlePipePos = content.indexOf('|');\n const doublePipePos = content.indexOf('||');\n // If no pipes found\n if (singlePipePos === -1) {\n return ['|', false];\n }\n // If no double pipe found, definitely single-select\n if (doublePipePos === -1) {\n return ['|', false];\n }\n // Both found - check which comes first\n // If double pipe comes first or at the same position (which means\n // the single pipe is part of the double pipe), it's multi-select mode\n if (doublePipePos <= singlePipePos) {\n return ['||', true];\n }\n // If single pipe comes first, it's single-select mode\n return ['|', false];\n }\n /**\n * Create error result\n *\n * @param errorMessage - Error message\n * @returns Error result\n */\n _createErrorResult(errorMessage) {\n return {\n type: null,\n error: errorMessage,\n };\n }\n}\nexports.InteractionParser = InteractionParser;\n/**\n * Convenience function for parsing interaction format\n *\n * Supported formats:\n * 1. ?[%{{var}}...question] - Pure text input\n * 2. ?[%{{var}} option1|option2] - Pure button group (supports display//value format)\n * 3. ?[%{{var}} option1|option2|...question] - Button group + text input\n * 4. ?[%{{var}} option1||option2] - Multi-select button group\n * 5. ?[%{{var}} option1||option2||...question] - Multi-select button group + text input\n * 6. ?[%{{var}} single option] - Single button selection\n * 7. ?[Continue] or ?[Continue|Cancel] - Non-assignment button\n *\n * @param content - Raw content of interaction block\n * @returns [interaction type, parsed data]\n */\nfunction parseInteractionFormat(content) {\n // Use new layered parser\n const parser = new InteractionParser();\n const result = parser.parse(content);\n // Handle parse errors\n if (result.error) {\n // Compatibility handling when parsing fails\n return [InteractionType.TEXT_ONLY, { question: content.trim() }];\n }\n // Extract parse result and convert to original return format\n const interactionType = result.type;\n // Build return data dictionary for backward compatibility\n const returnData = {};\n if (result.type !== InteractionType.NON_ASSIGNMENT_BUTTON) {\n const variableResult = result;\n if (variableResult.variable !== undefined) {\n returnData.variable = variableResult.variable;\n }\n if (variableResult.buttons !== undefined) {\n returnData.buttons = variableResult.buttons;\n }\n if (variableResult.question !== undefined) {\n returnData.question = variableResult.question;\n }\n if (variableResult.isMultiSelect !== undefined) {\n returnData.isMultiSelect = variableResult.isMultiSelect;\n }\n }\n else {\n const buttonResult = result;\n if (buttonResult.buttons !== undefined) {\n returnData.buttons = buttonResult.buttons;\n }\n }\n // Ensure we have a valid interaction type, fallback to TEXT_ONLY if null\n const finalType = interactionType || InteractionType.TEXT_ONLY;\n return [finalType, returnData];\n}\n/**\n * Factory function to create parser instance\n */\nfunction createInteractionParser() {\n return new InteractionParser();\n}\n//# sourceMappingURL=interaction-parser.js.map"],"names":["exports","parseInteractionFormat","createInteractionParser","InteractionType","InteractionParser","content","innerContent","hasVariable","variableName","remainingContent","error","result","remarkResult","nonAssignmentResult","b","variableResult","match","ellipsisMatch","beforeEllipsis","question","buttons","isMultiSelect","shape","_separator","buttonTexts","buttonText","trimmed","button","separatorIndex","singlePipePos","doublePipePos","errorMessage","interactionType","returnData","buttonResult"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"interaction-parser.cjs","sources":["../../../../node_modules/remark-flow/dist/interaction-parser.js"],"sourcesContent":["\"use strict\";\n/**\n * MarkdownFlow Interactive Block Layered Parser - TypeScript Version\n *\n * Uses a three-layer analysis architecture:\n * Layer 1: ?[] format validation\n * Layer 2: Variable detection and pattern classification\n * Layer 3: Specific content parsing\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InteractionParser = exports.COMPILED_REGEXES = exports.InteractionType = void 0;\nexports.parseInteractionFormat = parseInteractionFormat;\nexports.createInteractionParser = createInteractionParser;\nconst escaping_1 = require(\"./escaping\");\n// Interaction input type enumeration\nvar InteractionType;\n(function (InteractionType) {\n InteractionType[\"TEXT_ONLY\"] = \"text_only\";\n InteractionType[\"BUTTONS_ONLY\"] = \"buttons_only\";\n InteractionType[\"BUTTONS_WITH_TEXT\"] = \"buttons_with_text\";\n InteractionType[\"BUTTONS_MULTI_SELECT\"] = \"buttons_multi_select\";\n InteractionType[\"BUTTONS_MULTI_WITH_TEXT\"] = \"buttons_multi_with_text\";\n InteractionType[\"NON_ASSIGNMENT_BUTTON\"] = \"non_assignment_button\";\n})(InteractionType || (exports.InteractionType = InteractionType = {}));\n// Pre-compiled regex constants\nexports.COMPILED_REGEXES = {\n // Layer 1: Basic format validation - matches ?[content] but excludes ?[text](url) format.\n // The content accepts an escaped delimiter as one unit, so a `\\]` inside an option does not\n // end the interaction. See ./escaping.\n LAYER1_INTERACTION: new RegExp(`\\\\?\\\\[(${escaping_1.INTERACTION_CONTENT_SOURCE})\\\\](?!\\\\()`),\n // Layer 2: Variable detection - matches %{{variable}}content format\n // (supports letters, numbers, underscores, Chinese characters, Japanese\n // kana, with optional spaces inside the braces). Superset of both the\n // repo history and the published 0.1.6 behavior.\n LAYER2_VARIABLE: /^%\\{\\{\\s*([a-zA-Z0-9_\\u4e00-\\u9fa5\\u3040-\\u309f\\u30a0-\\u30ff]+)\\s*\\}\\}(.*)$/,\n // Layer 3: Split content before and after ...\n LAYER3_ELLIPSIS: /^(.*?)\\.\\.\\.(.*)/,\n // Kept for consumers that inspect the exported regex collection. Exact\n // single-pipe splitting requires context that Safari-safe regexes cannot\n // express without consuming adjacent text, and now also has to skip a bar\n // an option escaped, so the parser uses the scanner in ./escaping instead.\n LAYER3_SINGLE_PIPE_SPLIT: /\\|(?!\\|)/g,\n};\n/**\n * Layered interaction parser class\n */\nclass InteractionParser {\n constructor() {\n // Constructor is intentionally empty - no initialization needed\n }\n /**\n * Main parsing method\n *\n * @param content - Raw content of interaction block\n * @returns Standardized parse result\n */\n parse(content) {\n try {\n // Layer 1: Validate basic format\n const innerContent = this._layer1ValidateFormat(content);\n if (innerContent === null) {\n return this._createErrorResult(`Invalid interaction format: ${content}`);\n }\n // Layer 2: Variable detection and pattern classification\n const [hasVariable, variableName, remainingContent] = this._layer2DetectVariable(innerContent);\n // Layer 3: Specific content parsing\n if (hasVariable && variableName) {\n return this._layer3ParseVariableInteraction(variableName, remainingContent);\n }\n else {\n return this._layer3ParseDisplayButtons(innerContent);\n }\n }\n catch (error) {\n return this._createErrorResult(`Parsing error: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n /**\n * Parse and convert to remark-compatible format\n *\n * @param content - Raw content of interaction block\n * @returns remark-compatible result object\n */\n parseToRemarkFormat(content) {\n const result = this.parse(content);\n if (result.error) {\n // Compatibility handling when parsing fails\n return { placeholder: content.trim() };\n }\n // Convert to remark-compatible format\n const remarkResult = {};\n if (result.type === InteractionType.NON_ASSIGNMENT_BUTTON) {\n // Non-assignment interaction (no variableName in the output)\n const nonAssignmentResult = result;\n if (nonAssignmentResult.buttons.length > 0) {\n remarkResult.buttonTexts = nonAssignmentResult.buttons.map(b => b.display);\n remarkResult.buttonValues = nonAssignmentResult.buttons.map(b => b.value);\n }\n if (nonAssignmentResult.question !== undefined) {\n remarkResult.placeholder = nonAssignmentResult.question;\n }\n if (nonAssignmentResult.isMultiSelect !== undefined) {\n remarkResult.isMultiSelect = nonAssignmentResult.isMultiSelect;\n }\n }\n else if (result.type !== null) {\n // Variable interaction\n const variableResult = result;\n remarkResult.variableName = variableResult.variable;\n if (variableResult.buttons) {\n remarkResult.buttonTexts = variableResult.buttons.map(b => b.display);\n remarkResult.buttonValues = variableResult.buttons.map(b => b.value);\n }\n if (variableResult.question !== undefined) {\n remarkResult.placeholder = variableResult.question;\n }\n if (variableResult.isMultiSelect !== undefined) {\n remarkResult.isMultiSelect = variableResult.isMultiSelect;\n }\n }\n return remarkResult;\n }\n /**\n * Layer 1: Validate ?[] format and extract content\n *\n * @param content - Raw content\n * @returns Extracted bracket content, returns null if validation fails\n */\n _layer1ValidateFormat(content) {\n content = content.trim();\n const match = exports.COMPILED_REGEXES.LAYER1_INTERACTION.exec(content);\n if (!match) {\n return null;\n }\n // Ensure the match is the complete content (no other text)\n const matchedText = match[0];\n if (matchedText.trim() !== content) {\n return null;\n }\n return match[1];\n }\n /**\n * Layer 2: Detect variables and perform pattern classification\n *\n * @param innerContent - Content extracted from layer 1\n * @returns [hasVariable, variableName, remainingContent]\n */\n _layer2DetectVariable(innerContent) {\n const match = exports.COMPILED_REGEXES.LAYER2_VARIABLE.exec(innerContent);\n if (!match) {\n // No variable, entire content used for display button parsing\n return [false, null, innerContent];\n }\n const variableName = match[1].trim();\n const remainingContent = match[2].trim();\n return [true, variableName, remainingContent];\n }\n /**\n * Parse the structural shape of interaction content: buttons, optional\n * `...question` text input, multi-select flag. Shared by the variable and\n * non-assignment branches, which only differ in how they map the shape\n * into their result types.\n *\n * @param content - Content after the (optional) variable\n * @returns The parsed content shape\n */\n _parseContentShape(content) {\n const ellipsis = (0, escaping_1.splitOnEllipsis)(content);\n if (ellipsis) {\n const beforeEllipsis = ellipsis[0].trim();\n const question = (0, escaping_1.unescapeInteractionText)(ellipsis[1]).trim();\n if (beforeEllipsis) {\n // Button group + text input: ?[Button1 | Button2 | ...question]\n const [buttons, isMultiSelect] = this._parseButtons(beforeEllipsis);\n return { buttons, question, isMultiSelect, hasTextInput: true };\n }\n // Pure text input: ?[...question]\n return {\n buttons: [],\n question,\n isMultiSelect: false,\n hasTextInput: true,\n };\n }\n if ((0, escaping_1.findUnescaped)(content, '|') >= 0) {\n // Button group: ?[Button1 | Button2] or ?[Button1 || Button2]\n const [buttons, isMultiSelect] = this._parseButtons(content);\n return { buttons, isMultiSelect, hasTextInput: false };\n }\n if (content) {\n // Single button: ?[Button1] or ?[Button1//id1]\n return {\n buttons: [this._parseSingleButton(content)],\n isMultiSelect: false,\n hasTextInput: false,\n };\n }\n // Empty content: pure text input with no prompt\n return {\n buttons: [],\n question: '',\n isMultiSelect: false,\n hasTextInput: true,\n };\n }\n /**\n * Layer 3: Parse variable interaction (variable assignment type)\n *\n * @param variableName - Variable name\n * @param content - Content after variable\n * @returns Parse result\n */\n _layer3ParseVariableInteraction(variableName, content) {\n const shape = this._parseContentShape(content);\n if (shape.hasTextInput) {\n if (shape.buttons.length > 0) {\n // Button group + text input: ?[%{{var}} Button1 | Button2 | ...question]\n return {\n type: shape.isMultiSelect\n ? InteractionType.BUTTONS_MULTI_WITH_TEXT\n : InteractionType.BUTTONS_WITH_TEXT,\n variable: variableName,\n buttons: shape.buttons,\n question: shape.question,\n isMultiSelect: shape.isMultiSelect,\n };\n }\n // Pure text input: ?[%{{var}}...question] or ?[%{{var}}]\n return {\n type: InteractionType.TEXT_ONLY,\n variable: variableName,\n question: shape.question ?? '',\n isMultiSelect: false,\n };\n }\n // Button group or single button: ?[%{{var}} Button1 | Button2]\n return {\n type: shape.isMultiSelect\n ? InteractionType.BUTTONS_MULTI_SELECT\n : InteractionType.BUTTONS_ONLY,\n variable: variableName,\n buttons: shape.buttons,\n isMultiSelect: shape.isMultiSelect,\n };\n }\n /**\n * Layer 3: Parse non-assignment interactions (no variable). Same shapes as\n * the variable branch; the answer is not assigned to a variable.\n *\n * @param content - Content\n * @returns Parse result\n */\n _layer3ParseDisplayButtons(content) {\n if (!content) {\n // Empty content: ?[]\n return {\n type: InteractionType.NON_ASSIGNMENT_BUTTON,\n buttons: [{ display: '', value: '' }],\n };\n }\n const shape = this._parseContentShape(content);\n const result = {\n type: InteractionType.NON_ASSIGNMENT_BUTTON,\n buttons: shape.buttons,\n isMultiSelect: shape.isMultiSelect,\n };\n if (shape.hasTextInput) {\n result.question = shape.question;\n }\n return result;\n }\n /**\n * Parse button group with fault tolerance\n *\n * @param content - Button content, separated by | or ||\n * @returns [button list, isMultiSelect]\n */\n _parseButtons(content) {\n if (!content || typeof content !== 'string') {\n return [[], false];\n }\n const [_separator, isMultiSelect] = this._detectSeparatorType(content);\n const buttons = [];\n try {\n // Use different splitting logic based on separator type\n let buttonTexts;\n if (isMultiSelect) {\n // Multi-select mode: split on ||, preserve single |\n buttonTexts = (0, escaping_1.splitUnescaped)(content, '||');\n }\n else {\n // Single-select mode: split on single |, but preserve ||\n buttonTexts = (0, escaping_1.splitOnSingleUnescapedPipe)(content);\n }\n for (const buttonText of buttonTexts) {\n const trimmed = buttonText.trim();\n if (trimmed) {\n const button = this._parseSingleButton(trimmed);\n buttons.push(button);\n }\n }\n }\n catch {\n // Fallback to treating entire content as single button\n const whole = (0, escaping_1.unescapeInteractionText)(content).trim();\n return [[{ display: whole, value: whole }], false];\n }\n // For empty content (like just separators), return empty list\n if (!buttons.length &&\n (content.trim() === '||' || content.trim() === '|')) {\n return [[], isMultiSelect];\n }\n // Ensure at least one button exists (but only if there's actual content)\n if (!buttons.length && content.trim()) {\n const whole = (0, escaping_1.unescapeInteractionText)(content).trim();\n buttons.push({ display: whole, value: whole });\n }\n return [buttons, isMultiSelect];\n }\n /**\n * Parse single button, supports Button//value format\n *\n * @param buttonText - Button text\n * @returns {display: display text, value: actual value}\n */\n _parseSingleButton(buttonText) {\n buttonText = buttonText.trim();\n // Detect Button//value format: split at the first \"//\" with a non-empty\n // display before it and a non-empty value after it. (indexOf instead of\n // a lazy/greedy regex, whose backtracking is super-linear.)\n const separatorIndex = (0, escaping_1.findUnescaped)(buttonText, '//');\n if (separatorIndex > 0 && separatorIndex + 2 < buttonText.length) {\n return {\n display: (0, escaping_1.unescapeInteractionText)(buttonText.slice(0, separatorIndex)).trim(),\n value: (0, escaping_1.unescapeInteractionText)(buttonText.slice(separatorIndex + 2)).trim(),\n };\n }\n const resolved = (0, escaping_1.unescapeInteractionText)(buttonText);\n return { display: resolved, value: resolved };\n }\n /**\n * Detect separator type and whether it's multi-select\n *\n * Logic: The first separator type encountered determines the parsing mode:\n * - If first separator is |, then || is treated as part of the value\n * - If first separator is ||, then single | is treated as part of the value\n *\n * @param content - Button content to analyze\n * @returns [separator, isMultiSelect] where separator is '|' or '||'\n */\n _detectSeparatorType(content) {\n if (!content || typeof content !== 'string') {\n return ['|', false];\n }\n // Find the position of first single pipe and first double pipe.\n // A bar an option escaped is not a separator.\n const singlePipePos = (0, escaping_1.findUnescaped)(content, '|');\n const doublePipePos = (0, escaping_1.findUnescaped)(content, '||');\n // If no pipes found\n if (singlePipePos === -1) {\n return ['|', false];\n }\n // If no double pipe found, definitely single-select\n if (doublePipePos === -1) {\n return ['|', false];\n }\n // Both found - check which comes first\n // If double pipe comes first or at the same position (which means\n // the single pipe is part of the double pipe), it's multi-select mode\n if (doublePipePos <= singlePipePos) {\n return ['||', true];\n }\n // If single pipe comes first, it's single-select mode\n return ['|', false];\n }\n /**\n * Create error result\n *\n * @param errorMessage - Error message\n * @returns Error result\n */\n _createErrorResult(errorMessage) {\n return {\n type: null,\n error: errorMessage,\n };\n }\n}\nexports.InteractionParser = InteractionParser;\n/**\n * Convenience function for parsing interaction format\n *\n * Supported formats:\n * 1. ?[%{{var}}...question] - Pure text input\n * 2. ?[%{{var}} option1|option2] - Pure button group (supports display//value format)\n * 3. ?[%{{var}} option1|option2|...question] - Button group + text input\n * 4. ?[%{{var}} option1||option2] - Multi-select button group\n * 5. ?[%{{var}} option1||option2||...question] - Multi-select button group + text input\n * 6. ?[%{{var}} single option] - Single button selection\n * 7. ?[Continue] or ?[Continue|Cancel] - Non-assignment button\n *\n * @param content - Raw content of interaction block\n * @returns [interaction type, parsed data]\n */\nfunction parseInteractionFormat(content) {\n // Use new layered parser\n const parser = new InteractionParser();\n const result = parser.parse(content);\n // Handle parse errors\n if (result.error) {\n // Compatibility handling when parsing fails\n return [InteractionType.TEXT_ONLY, { question: content.trim() }];\n }\n // Extract parse result and convert to original return format\n const interactionType = result.type;\n // Build return data dictionary for backward compatibility\n const returnData = {};\n if (result.type !== InteractionType.NON_ASSIGNMENT_BUTTON) {\n const variableResult = result;\n if (variableResult.variable !== undefined) {\n returnData.variable = variableResult.variable;\n }\n if (variableResult.buttons !== undefined) {\n returnData.buttons = variableResult.buttons;\n }\n if (variableResult.question !== undefined) {\n returnData.question = variableResult.question;\n }\n if (variableResult.isMultiSelect !== undefined) {\n returnData.isMultiSelect = variableResult.isMultiSelect;\n }\n }\n else {\n const buttonResult = result;\n if (buttonResult.buttons !== undefined) {\n returnData.buttons = buttonResult.buttons;\n }\n }\n // Ensure we have a valid interaction type, fallback to TEXT_ONLY if null\n const finalType = interactionType || InteractionType.TEXT_ONLY;\n return [finalType, returnData];\n}\n/**\n * Factory function to create parser instance\n */\nfunction createInteractionParser() {\n return new InteractionParser();\n}\n//# sourceMappingURL=interaction-parser.js.map"],"names":["exports","parseInteractionFormat","createInteractionParser","escaping_1","require$$0","InteractionType","InteractionParser","content","innerContent","hasVariable","variableName","remainingContent","error","result","remarkResult","nonAssignmentResult","b","variableResult","match","ellipsis","beforeEllipsis","question","buttons","isMultiSelect","shape","_separator","buttonTexts","buttonText","trimmed","button","whole","separatorIndex","resolved","singlePipePos","doublePipePos","errorMessage","interactionType","returnData","buttonResult"],"mappings":"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","x_google_ignoreList":[0]}