{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-synctool/src/components/widgets/lively-code-mirror-modes.js"],"names":["Preferences","Morph","toTitleCase","comparePos","a","b","line","ch","Mode","constructor","cmm","data","enter","exit","CommandMode","InsertMode","CaseMode","PsychMode","KillMode","GenerateMode","LivelyMode","CodeMirrorModes","lcm","cm","stack","inputModes","defaultMode","commandModeAsDefault","get","type","getMode","length","last","withASTCapabilities","callback","astCapabilities","then","handleKeyEvent","evt","circumventMode","completion","state","completionActive","key","digit","split","find","ea","cancelDefaultEvent","pick","parseInt","shiftKey","execCommand","noModifier","altKey","ctrlKey","popMode","preventDefault","codemirrorIgnore","includes","getCursor","lineContent","getLine","match","endOfCondition","index","singlePlainCursor","somethingSelected","listSelections","lastChar","at","insertions","replaceSelection","altRight","selections","getSelections","replaceSelections","ctrlRight","ac","insertArrowFunction","chars","map","head","setSelections","i","pos","anchor","reverse","forEach","anchorLine","headLine","startLine","endLine","start","content","getRange","replaceRange","æ","unifiedKeyDescription","alt","ctrl","shift","shiftRight","repeat","transformCase","transformer","word","findWordAt","addSelection","multi","operations","z","Enter","Space","m","c","text","camelCase","C","capitalize","k","kebabCase","l","lowerFirst","L","toLower","lowerCase","s","snakeCase","S","startCase","u","upperFirst","U","toUpper","upperCase","t","operation","lively","notify","command","inclusive","e","inlineLocalVariable","pushMode","generateIf","v","extractExpressionIntoLocalVariable","test","newlineAndIndent","ensureMode","n","livelyNotify","lively4url","cursor","setCursor","j","o","push","dispatchMode","renderModeStack","pop","modeMap","Map","set","mode","warn","modeContainer","prototype","getSubmorph","innerHTML","append","self","__CodeMirrorModes__"],"mappings":"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","file":"lively-code-mirror-modes.js","sourcesContent":["\nimport Preferences from 'src/client/preferences.js';\nimport Morph from \"src/components/widgets/lively-morph.js\";\nimport 'src/client/modifiers-right.js';\n\nimport toTitleCase from \"src/external/title-case.js\";\n\nfunction comparePos(a, b) {\n  return a.line - b.line || a.ch - b.ch;\n}\n\nclass Mode {\n  constructor(cmm, data) {\n    this.cmm = cmm;\n    this.data = data;\n  }\n  enter() {}\n  exit() {}\n}\n\nclass CommandMode extends Mode {}\n\n// the standard editor mode\nclass InsertMode extends Mode {}\n\n// special-purpose modes\nclass CaseMode extends Mode {}\nclass PsychMode extends Mode {}\nclass KillMode extends Mode {}\nclass GenerateMode extends Mode {}\nclass LivelyMode extends Mode {}\n\nclass CodeMirrorModes {\n\n  constructor(lcm, cm) {\n    this.lcm = lcm;\n    this.cm = cm;\n  }\n\n  get stack() {\n    if (!this.lcm.inputModes) {\n      this.lcm.inputModes = [];\n    }\n    return this.lcm.inputModes;\n  }\n\n  get defaultMode() {\n    const commandModeAsDefault = Preferences.get('CommandModeAsDefault');\n    return {\n      type: commandModeAsDefault ? 'command' : 'insert',\n      data: {}\n    };\n  }\n\n  getMode() {\n    return this.stack.length > 0 ? this.stack.last : this.defaultMode;\n  }\n\n  withASTCapabilities(callback) {\n    this.lcm.astCapabilities(this.cm).then(callback);\n  }\n\n  handleKeyEvent(evt) {\n    // Use this option in context menu to toggle off mode-specific behavior in case you shot yourself in the foot\n    const circumventMode = Preferences.get('CircumventCodeMirrorModes');\n    if (circumventMode) {\n      return;\n    }\n\n    const completion = this.cm.state.completionActive;\n    if (completion) {\n      if (evt.key === 'Escape') {\n        // use default behavior, i.e. close the completion\n        return;\n      }\n\n      const digit = '0123456789'.split('').find(ea => ea === evt.key);\n      if (digit) {\n        cancelDefaultEvent();\n        completion.pick(completion.data, parseInt(digit));\n      }\n    }\n\n    // #KeyboardShortcut Shift-Escape clear multi-selection\n    if (evt.key === 'Escape' && evt.shiftKey) {\n      cancelDefaultEvent();\n      this.cm.execCommand('singleSelection');\n      return;\n    }\n\n    const { type, data } = this.getMode();\n\n    // leave any mode with `Escape`\n    const noModifier = !evt.altKey && !evt.ctrlKey && !evt.shiftKey;\n    if (evt.key === 'Escape' && noModifier) {\n      cancelDefaultEvent();\n      if (this.stack.length === 0 && type === 'insert') {\n        this.cm.execCommand('singleSelection');\n      } else {\n        this.popMode();\n      }\n      return;\n    }\n\n    if (evt.key === 'Tab') {\n      cancelDefaultEvent();\n      this.cm.execCommand(evt.ctrlKey ? 'indentAuto' : evt.shiftKey ? 'indentLess' : 'indentMore');\n      return;\n    }\n\n    function cancelDefaultEvent() {\n      evt.preventDefault();\n      evt.codemirrorIgnore = true;\n    }\n\n    if (type === 'insert') {\n      const cm = this.cm;\n\n      // #KeyboardShortcut = insert ' === ' at end of if condition\n      if ('=!<>&|'.split('').includes(evt.key)) {\n        const { line, ch } = cm.getCursor();\n        const lineContent = cm.getLine(line);\n        const match = lineContent.match(/\\s*\\bif\\s*\\(.+\\)/);\n        const endOfCondition = match && match.index + match[0].length - 1 === ch;\n\n        const singlePlainCursor = !cm.somethingSelected() && cm.listSelections().length === 1;\n        \n        if (singlePlainCursor && endOfCondition) {\n          const lastChar = match[0].at(-2);\n\n          const insertions = {\n            '='() {\n              return {\n                '<': '= ',\n                '>': '= ',\n                '!': '== ',\n                ' ': '=== ',\n              }[lastChar] || ' === ';\n            },\n            '!'() {\n              return {\n                ' ': '!== ',\n              }[lastChar] || ' !== ';\n            },\n            '<'() {\n              return {\n                ' ': '<',\n              }[lastChar] || ' <';\n            },\n            '>'() {\n              return {\n                ' ': '> ',\n              }[lastChar] || ' > ';\n            },\n            '&'() {\n              return {\n                ' ': '&& ',\n              }[lastChar] || ' && ';\n            },\n            '|'() {\n              return {\n                ' ': '|| ',\n              }[lastChar] || ' || ';\n            },\n          }\n          cm.replaceSelection(insertions[evt.key]());\n\n          cancelDefaultEvent();\n        }\n      }\n\n      // #KeyboardShortcut AltRight-A insert arrow function with 0 arguments\n      if (evt.key === 'a' && evt.altRight) {\n        const cm = this.cm;\n\n        const selections = cm.getSelections();\n        cm.replaceSelection('() => ');\n        cm.replaceSelections(selections, 'around');\n        cancelDefaultEvent();\n      }\n\n      // #KeyboardShortcut CtrlRight-A insert arrow function with 1 argument\n      if (evt.key === 'a' && evt.ctrlRight) {\n        this.withASTCapabilities(ac => {\n          ac.insertArrowFunction(1);\n        });\n        \n        cancelDefaultEvent();\n      }\n\n      // #KeyboardShortcut AltRight-K kill line(s)\n      if (evt.key === 'k' && evt.altRight) {\n        const cm = this.cm;\n\n        const chars = cm.listSelections().map(({ head }) => head.ch);\n        this.cm.execCommand('deleteLine');\n        cm.setSelections(cm.listSelections().map(({ head }, i) => {\n          const pos = { line: head.line, ch: chars[i] };\n          return { anchor: pos, head: pos };\n        }));\n\n        cancelDefaultEvent();\n      }\n\n      // #TODO: need to merge selections, if there are multiple on the same line\n      // #KeyboardShortcut AltRight-D duplicate line(s)\n      if (evt.key === 'd' && evt.altRight) {\n        const cm = this.cm;\n\n        cm.listSelections().reverse().forEach(({ anchor, head }) => {\n          const anchorLine = anchor.line;\n          const headLine = head.line;\n\n          const startLine = anchorLine > headLine ? headLine : anchorLine;\n          const endLine = anchorLine > headLine ? anchorLine : headLine;\n\n          const start = { line: startLine, ch: 0 };\n          const content = cm.getRange(start, { line: endLine + 1, ch: 0 });\n          cm.replaceRange(content, start, start);\n        });\n        cancelDefaultEvent();\n      }\n\n      return;\n    }\n\n    var æ = type;\n\n    const unifiedKeyDescription = evt => {\n      const alt = evt.altKey ? evt.altRight ? '>^' : '^' : '';\n      const ctrl = evt.ctrlKey ? evt.ctrlRight ? '>!' : '!' : '';\n      const shift = evt.shiftKey ? evt.shiftRight ? '>+' : '+' : '';\n      return ctrl + shift + alt + evt.key;\n    };\n\n    if (type === 'case' && !evt.repeat) {\n      const transformCase = transformer => {\n        // extend collapsed selections to words\n        this.cm.listSelections().forEach(({ anchor, head }) => {\n          if (comparePos(anchor, head) === 0) {\n            const word = this.cm.findWordAt(anchor);\n            this.cm.addSelection(word.anchor, word.head);\n          }\n        });\n\n        const selections = this.cm.getSelections();\n        this.cm.replaceSelections(selections.map(transformer), 'around');\n\n        if (!data.multi) {\n          this.popMode();\n        }\n      };\n\n      const operations = {\n        // #KeyboardShortcut z (case mode) undo\n        z: () => this.cm.execCommand('undo'),\n        // #KeyboardShortcut Enter (case mode) exit case mode\n        Enter: () => this.popMode(),\n        // #KeyboardShortcut Space (case mode) exit case mode\n        Space: () => this.popMode(),\n        // #KeyboardShortcut m (case mode) chain multiple case transformations\n        m: () => data.multi = !data.multi,\n        // #KeyboardShortcut c (case mode) camelCase\n        c: () => transformCase(text => text.camelCase()),\n        // #KeyboardShortcut C (case mode) Capitalize\n        C: () => transformCase(text => text.capitalize()),\n        // #KeyboardShortcut k (case mode) kebab-case\n        k: () => transformCase(text => text.kebabCase()),\n        // #KeyboardShortcut l (case mode) lOWERFIRST\n        l: () => transformCase(text => text.lowerFirst()),\n        // #KeyboardShortcut L (case mode) tolower\n        L: () => transformCase(text => text.toLower()),\n        // #KeyboardShortcut Ctrl-l (case mode) lower case\n        '^l': () => transformCase(text => text.lowerCase()),\n        // #KeyboardShortcut s (case mode) snake_case\n        s: () => transformCase(text => text.snakeCase()),\n        // #KeyboardShortcut S (case mode) Start Case\n        S: () => transformCase(text => text.startCase()),\n        // #KeyboardShortcut u (case mode) Upperfirst\n        u: () => transformCase(text => text.upperFirst()),\n        // #KeyboardShortcut U (case mode) TOUPPER\n        U: () => transformCase(text => text.toUpper()),\n        // #KeyboardShortcut Ctrl-u (case mode) UPPER CASE\n        '^u': () => transformCase(text => text.upperCase()),\n        // #KeyboardShortcut t (case mode) To Title Case\n        t: () => transformCase(text => toTitleCase(text))\n      };\n\n      const operation = operations[(evt.ctrlKey ? '^' : '') + evt.key];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(evt.key);\n      }\n      return;\n    }\n\n    if (type === 'psych' && !evt.repeat) {\n      if (evt.key.length === 1 || evt.key === 'Enter') {\n        const { command, inclusive } = data;\n\n        cancelDefaultEvent();\n        this.popMode();\n\n        this.withASTCapabilities(ac => ac[command](evt.key, inclusive));\n        return;\n      }\n    }\n\n    if (type === 'command' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        i: () => {\n          this.withASTCapabilities(ac => ac.inlineLocalVariable());\n        },\n        Enter: () => {\n          this.pushMode('insert');\n        },\n        k: () => {\n          this.pushMode('kill');\n        },\n        'Shift-K': () => {\n          this.cm.execCommand('deleteLine');\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'generate' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        // #KeyboardShortcut i wrap in if-statement\n        i: () => {\n          this.withASTCapabilities(ac => ac.generateIf('if'));\n          this.popMode();\n        },\n        // #KeyboardShortcut v declare variable\n        v: () => {\n          this.withASTCapabilities(ac => {\n            if (this.cm.somethingSelected()) {\n              ac.extractExpressionIntoLocalVariable();\n            } else {\n              const line = this.cm.getLine(this.cm.getCursor().line);\n\n              if (/\\S/.test(line)) {\n                ac.newlineAndIndent(true);\n              }\n              this.cm.execCommand('indentAuto');\n\n              this.cm.replaceSelection('const ');\n              this.cm.replaceSelection(' = $hole$;', 'start');\n              this.cm.replaceSelection('name', 'around');\n\n              this.popMode();\n              this.ensureMode('insert');\n            }\n          });\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'select' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {};\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'lively' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        // #KeyboardShortcut Alt-N wrap selection in lively notify\n        n: () => this.withASTCapabilities(ac => ac.livelyNotify()),\n        // #KeyboardShortcut Alt-U insert lively4url\n        u: () => this.withASTCapabilities(ac => ac.lively4url())\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n\n    if (type === 'kill' && !evt.repeat) {\n      const unifiedKeyDescription = e => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      };\n\n      const operations = {\n        k: () => {\n          const cursor = this.cm.getCursor();\n          this.cm.execCommand('deleteLine');\n          this.cm.setCursor(cursor);\n          this.popMode();\n        },\n        l: () => {\n          this.cm.execCommand('killLine'); // cursor to end of line\n          this.popMode();\n        },\n        j: () => {\n          this.cm.execCommand('delLineLeft');\n          this.popMode();\n        },\n        o: () => {\n          this.cm.execCommand('delWrappedLineRight');\n          this.popMode();\n        },\n        u: () => {\n          this.cm.execCommand('delWrappedLineLeft');\n          this.popMode();\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        cancelDefaultEvent();\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this.lcm, this.cm, evt]);\n      }\n    }\n  }\n\n  ensureMode(type, data = {}) {\n    if (this.getMode().type === type) {\n      return;\n    }\n\n    this.pushMode(type, data);\n  }\n\n  pushMode(type, data = {}) {\n    this.stack.push({ type, data });\n    this.dispatchMode(type, data).enter();\n    this.renderModeStack();\n  }\n\n  popMode() {\n    if (this.stack.length === 0) {\n      lively.notify('no mode to pop');\n      return;\n    }\n    const { type, data } = this.stack.last;\n    this.dispatchMode(type, data).exit();\n    this.stack.pop();\n    this.renderModeStack();\n  }\n\n  dispatchMode(type, data) {\n    const modeMap = new Map();\n    modeMap.set('case', CaseMode);\n    modeMap.set('psych', PsychMode);\n    modeMap.set('command', CommandMode);\n    modeMap.set('insert', InsertMode);\n    modeMap.set('kill', KillMode);\n    modeMap.set('generate', GenerateMode);\n    modeMap.set('lively', LivelyMode);\n\n    let mode = modeMap.get(type);\n    if (!mode) {\n      lively.warn('No mode found for ' + type);\n      mode = Mode;\n    }\n    return new mode(this, data);\n  }\n\n  renderModeStack() {\n    const modeContainer = this.lcm::Morph.prototype.getSubmorph('#modes-indicator');\n    modeContainer.innerHTML = '';\n    modeContainer.append(...this.stack.map(({ type }) => <div style=\"background: aliceblue; color: cornflowerblue; border-top: 0.5px solid blue;\">{type}</div>).reverse());\n  }\n}\n\nself.__CodeMirrorModes__ = function __CodeMirrorModes__(lcm, cm) {\n  return new CodeMirrorModes(lcm, cm);\n};"]}