{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/components/widgets/lively-code-mirror.js"],"names":["promisedEvent","through","generateUUID","uuid","debounce","isSet","loc","range","boundEval","Morph","diff","SyntaxChecker","Preferences","pt","Strings","letsScript","LivelyCodeMirrorWidgetImport","LivelyCodeMirrorCodeProvider","openMenu","spellCheck","fake","CodeMirror","_","self","loadPromise","undefined","stripErrorString","s","toString","replace","posEq","a","b","line","ch","LivelyCodeMirror","HTMLElement","args","editor","mode","getAttribute","val","setAttribute","codeMirrorPath","lively4url","loadModule","path","force","console","warn","code","fetch","then","r","text","eval","e","error","loadCSS","lively","loadCSSThroughDOM","loadModules","System","import","loadTernModules","ternIsLoaded","terndir","loadJavaScriptThroughDOM","astCapabilities","cm","myASTCapabilities","m","codeProvider","capabilities","default","on","codeChanged","autoCompletion","ternWrapper","ternLoaded","TernCodeMirrorWrapper","initialize","_attrObserver","MutationObserver","mutations","forEach","mutation","type","attributeChangedCallback","attributeName","oldValue","target","observe","attributes","applyAttribute","attr","value","attachedCallback","isLoading","root","shadowRoot","textContent","decodeHTML","editView","event","CustomEvent","dispatchEvent","editorLoaded","container","querySelector","innerHTML","setEditor","lineNumbers","gutters","lint","setupEditor","setOption","setupEditorOptions","evt","detail","checkSyntax","onCursorActivity","map","ea","name","clearHistory","getDoc","addKeys","keymap","keys","ensureExtraKeys","extraKeys","Object","assign","toggleOverwrite","setTimeout","execCommand","focus","fixHintsPosition","getSelectionOrLine","tryBoundEval","inspectIt","c","somethingSelected","indentSelection","doSave","getValue","result","tw","showType","notify","jumpToDefinition","jumpBack","showReferences","ac","expandSelection","reduceSelection","selectNextASTNodeLikeThis","selectNextASTChild","selectNextReference","updateColorPicker","selectDeclaration","rename","extractMethod","generateHTMLAccessors","singalEditorbackNavigation","showAExprDependencyTextMarkers","selection","getSelection","replaceSelection","updateAExprDependencies","complete","altKey","keyCode","isJavaScript","openContextMenu","closeEditor","query","onCancel","sleep","bubbles","cancelable","registerExtraKeys","options","keyMap","sublime","normalizeKeyMap","showToken","annotateScrollbar","updateArgHints","widgetEnter","cursorHead","getCursor","cursorAnchor","codemirror","closeCharacters","oldVal","newVal","length","getLine","getDoitContext","doitContext","setDoitContext","context","getTargetModule","targetModule","setTargetModule","module","str","match","boundEvalPython","log","xterm","document","term","__socket","addEventListener","data","__sendData","printWidget","wrapWidget","from","to","widget","createElement","classList","add","style","whiteSpace","promise","create","comp","display","minWidth","minHeight","marker","doc","markText","replacedWith","printResult","obj","isPromise","isAsync","setCursor","__asyncresult__","promisedWidget","objClass","constructor","call","Array","isMap","mapObj","sort","key","get","isArray","every","Node","String","table","setFromJSO","maxHeight","overflow","index","ensuredPrintString","inspector","inspect","hideWorkspace","span","parentElement","insertBefore","appendChild","border","resp","isError","window","LastError","handleError","catch","showElement","openInspector","detachedCallback","_attached","_value","setValue","setCustomStyle","source","getCustomStyle","encodeHTML","resize","enableAutocompletion","getOption","isMarkdown","isHTML","changeModeForFile","filename","lang","dict","loadDictLang","startSpellCheck","current","livelyPrepareSave","livelyPreMigrate","lastScrollInfo","getScrollInfo","isFocused","activeElement","livelyMigrate","other","composedPath","removeEventListener","scrollTo","left","top","setPosition","scrollingElement","scrollLeft","scrollTop","subPt","getGlobalPosition","addTernFile","url","ternServer","server","addFile","mergeView","originalText","originalLeftText","_mergeView","MergeView","origLeft","orig","scrollbarStyle","highlightDifferences","connect","lineWrapping","collapseIdentical","resizeMergeView","editorHeight","height","mergeViewHeight","Math","max","leftOriginal","rightOriginal","setSize","newHeight","wrap","hideDataURLs","regEx","RegExp","exec","posFromIndex","div","backgroundColor","img","src","title","slice","createTextNode","wrapImports","id","getImportDeclarationRegex","LiteralString","JavaScriptIdentifier","ImportSpecifierPartSimple","ImportSpecifierPartRename","ImportSpecifierPart","ImportSpecifier","ImportDefaultSpecifier","ImportNamespaceSpecifier","anySpecifier","ImportDeclaration","importWidgetForRange","wrapLinks","that","link","lastWidget","input","find","replaceRange","selectionStart","setSelection","checkForSyntaxErrors","found","split","startPos","indexOf","scrollToLine","heightAtLine","unsavedChanges","navbar","onDetailsContentCursorActivity","livelyMinimizedTitle","canParse","hasActiveExpressionsDirective","hideAExprDependencyGutter","resetAExprTextMarkers","resetAExprDependencyTextMarkers","showAExprTextMarkers","showAExprDependencyGutter","showAExprDependencyGutterMarkers","getAllActiveExpressions","node","asCM","mark","css","isAExprTextMarker","getAllMarks","clear","some","filter","isAExprDependencyTextMarker","cursor","aexprPath","getAexprAtCursor","deps","resolveDependencies","Map","lines","dependencies","statement","set","push","aExprs","entries","start","aExpr","clearGutter","drawAExprGutter","setGutterMarker","drawAExprGutterMarker","callback","list","drawAExprDependencyList","depListWrap","append","prepend","width","padding","markerBounds","getBoundingClientRect","wrapBounds","right","dep","state","getSource","description","item"],"mappings":"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","file":"lively-code-mirror.js","sourcesContent":["/*MD \n# CodeMirror\n\nWorkspace / main source code editing component. \n\n![](lively-code-mirror.png){height=200}\n\nMD*/\n\nimport { promisedEvent, through, uuid as generateUUID } from 'utils';\nimport boundEval from 'src/client/bound-eval.js';\nimport Morph from \"src/components/widgets/lively-morph.js\"\nimport diff from 'src/external/diff-match-patch.js';\nimport SyntaxChecker from 'src/client/syntax.js';\nimport { debounce } from \"utils\";\nimport Preferences from 'src/client/preferences.js';\nimport {pt} from 'src/client/graphics.js';\nimport 'src/client/stablefocus.js';\nimport Strings from 'src/client/strings.js';\nimport { letsScript } from 'src/client/vivide/vivide.js';\nimport LivelyCodeMirrorWidgetImport from 'src/components/widgets/lively-code-mirror-widget-import.js';\nimport LivelyCodeMirrorCodeProvider from 'src/components/widgets/lively-code-mirror-code-provider.js';\nimport openMenu from 'src/components/widgets/lively-code-mirror-context-menu.js';\nimport * as spellCheck from \"src/external/codemirror-spellcheck.js\"\nimport {isSet} from 'utils'\nimport fake from \"./lively-code-mirror-fake.js\"\nimport CodeMirror from \"src/external/code-mirror/lib/codemirror.js\"\nself.CodeMirror = CodeMirror // for modules\nlet loadPromise = undefined;\nimport { loc, range } from 'utils';\n\nimport _ from 'src/external/lodash/lodash.js'\n\n\nexport function stripErrorString(s) {\n  return s.toString()\n    .replace(/Error: workspace(js)?:[^:]*:/,\"Error:\")\n    .replace(/\\n {2}Evaluating workspace(js)?:.*/,\"\")\n    .replace(/\\n {2}Loading workspace(js)?:.*/,\"\")\n    .replace(/\\n {2}Instantiating workspace(js)?:.*/,\"\")\n}\n\nfunction posEq(a, b) {return a.line == b.line && a.ch == b.ch;}\n\n\nexport default class LivelyCodeMirror extends HTMLElement {\n\n  fake(...args) {\n    fake(this.editor, ...args)\n  }\n  \n  get mode() {\n    return this.getAttribute('mode');\n  }\n  set mode(val) {\n    return this.setAttribute('mode', val);\n  }\n\n  static get codeMirrorPath() {\n     return  lively4url + \"/src/external/code-mirror/\"\n  }\n\n  static async loadModule(path, force) {\n    if (!self.CodeMirror) {\n      console.warn(\"CodeMirror is missing, could not initialize \" + path )\n      return \n    }\n    var code = await fetch(this.codeMirrorPath + path).then(r => r.text())\n    try {\n      eval(code)\n    } catch(e) {\n      console.error(\"Could not load CodeMirror module \" + path, e)\n    }\n    // return lively.loadJavaScriptThroughDOM(\"codemirror_\"+path.replace(/[^A-Za-z]/g,\"\"),\n    //   this.codeMirrorPath + path, force)\n  }\n\n  static async loadCSS(path) {\n    return lively.loadCSSThroughDOM(\"codemirror_\" + path.replace(/[^A-Za-z]/g,\"\"),\n       this.codeMirrorPath + path)\n  }\n\n  static async loadModules(force) {\n    // console.log(\"loadModules\", loadPromise);\n    if (loadPromise && !force) return loadPromise\n    loadPromise = (async () => {\n\n\n      await this.loadModule(\"addon/fold/foldcode.js\")\n\n      await this.loadModule(\"mode/javascript/javascript.js\")\n      await this.loadModule(\"mode/xml/xml.js\")\n      await this.loadModule(\"mode/css/css.js\")\n      await this.loadModule(\"mode/diff/diff.js\")\n\n      await this.loadModule(\"mode/markdown/markdown.js\")\n      await this.loadModule(\"mode/htmlmixed/htmlmixed.js\")\n      await this.loadModule(\"addon/mode/overlay.js\")\n      await this.loadModule(\"mode/gfm/gfm.js\")\n      await this.loadModule(\"mode/stex/stex.js\")\n      await this.loadModule(\"mode/jsx/jsx.js\")\n      await this.loadModule(\"mode/python/python.js\")\n      await this.loadModule(\"mode/clike/clike.js\")\n      await this.loadModule(\"mode/shell/shell.js\")\n      \n      await this.loadModule(\"addon/edit/matchbrackets.js\")\n      await this.loadModule(\"addon/edit/closetag.js\")\n      await this.loadModule(\"addon/edit/closebrackets.js\")\n      await this.loadModule(\"addon/edit/continuelist.js\")\n      await this.loadModule(\"addon/edit/matchtags.js\")\n      await this.loadModule(\"addon/edit/trailingspace.js\")\n      await this.loadModule(\"addon/hint/show-hint.js\")\n      await this.loadModule(\"addon/hint/javascript-hint.js\")\n      await this.loadModule(\"addon/search/searchcursor.js\")\n      await this.loadModule(\"addon/search/search.js\")\n      await this.loadModule(\"addon/search/jump-to-line.js\")\n      await this.loadModule(\"addon/search/matchesonscrollbar.js\")\n      await this.loadModule(\"addon/search/match-highlighter.js\")\n      await this.loadModule(\"addon/scroll/annotatescrollbar.js\")\n      await this.loadModule(\"addon/comment/comment.js\")\n      await this.loadModule(\"addon/dialog/dialog.js\")\n      await this.loadModule(\"addon/scroll/simplescrollbars.js\")\n\n      //await System.import(\"https://raw.githubusercontent.com/jshint/jshint/master/dist/jshint.js\");\n      //await lively.loadJavaScriptThroughDOM(\"jshintAjax\", \"https://ajax.aspnetcdn.com/ajax/jshint/r07/jshint.js\");\n      //await lively.loadJavaScriptThroughDOM(\"eslint\", \"http://eslint.org/js/app/eslint.js\");\n      await this.loadModule(\"addon/lint/lint.js\");\n      await this.loadModule(\"addon/lint/javascript-lint.js\");\n      await this.loadModule(\"../eslint/eslint.js\");\n      // await this.loadModule(\"../eslint/eslint-lint.js\", force);\n      await System.import(lively4url + '/src/external/eslint/eslint-lint.js');\n      await this.loadModule(\"addon/merge/merge.js\")\n      await this.loadModule(\"addon/selection/mark-selection.js\")\n      await this.loadModule(\"keymap/sublime.js\")\n      await System.import(lively4url + '/src/components/widgets/lively-code-mirror-hint.js')\n\n      this.loadCSS(\"addon/hint/show-hint.css\")\n      this.loadCSS(\"addon/lint/lint.css\")\n      lively.loadCSSThroughDOM(\"CodeMirrorCSS\", lively4url + \"/src/components/widgets/lively-code-mirror.css\")\n    })()\n    return loadPromise\n  }\n\n  // #TODO #Refactor not needed anymore\n  static async loadTernModules() {\n    if (this.ternIsLoaded) return;\n\n    await this.loadModule(\"addon/tern/tern.js\")\n\n    var terndir = lively4url + '/src/external/tern/'\n    await lively.loadJavaScriptThroughDOM(\"tern_acorn\", terndir + 'acorn.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_acorn_loose\", terndir + 'acorn_loose.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_walk\", terndir + 'walk.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_polyfill\", terndir + 'polyfill.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_signal\", terndir + 'signal.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_tern\", terndir + 'tern.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_def\", terndir + 'def.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_comment\", terndir + 'comment.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_infer\", terndir + 'infer.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_plugin_modules\", terndir + 'modules.js')\n    await lively.loadJavaScriptThroughDOM(\"tern_plugin_esmodules\", terndir + 'es_modules.js')\n    this.ternIsLoaded = true;\n  }\n  \n  astCapabilities(cm) {\n    if(!this.myASTCapabilities) {\n      this.myASTCapabilities = System.import('src/components/widgets/ast-capabilities.js')\n        .then(m => {\n          var codeProvider = new LivelyCodeMirrorCodeProvider(this, cm);\n          var capabilities = new m.default(codeProvider);\n          cm.on(\"change\", (() => {\n            capabilities.codeChanged();\n          }).debounce(200));\n          return capabilities;\n        });\n    }\n    \n    return this.myASTCapabilities;\n  }\n  \n  autoCompletion(cm) {\n    return System.import('src/components/widgets/auto-completion.js')\n      .then(m => new m.default(this, cm));\n  }\n  \n  get ternWrapper() {\n    return System.import('src/components/widgets/tern-wrapper.js')\n      .then(m => {\n        this.ternLoaded = true\n        return m.TernCodeMirrorWrapper\n      });\n  }\n\n  initialize() {\n    this._attrObserver = new MutationObserver(mutations => {\n      mutations.forEach(mutation => {\n        if(mutation.type == \"attributes\") {\n          // console.log(\"observation\", mutation.attributeName,mutation.target.getAttribute(mutation.attributeName));\n          this.attributeChangedCallback(\n            mutation.attributeName,\n            mutation.oldValue,\n            mutation.target.getAttribute(mutation.attributeName)\n          )\n        }\n      });\n    });\n    this._attrObserver.observe(this, { attributes: true });\n  }\n\n  applyAttribute(attr) {\n    var value = this.getAttribute(attr)\n    if (value !== undefined) {\n      this.setAttribute(attr, value)\n    }\n  }\n\n  async attachedCallback() {\n    if (this.isLoading || this.editor ) return;\n    this.isLoading = true\n    this.root = this.shadowRoot // used in code mirror to find current element\n    await LivelyCodeMirror.loadModules(); // lazy load modules...\n    \n    if (this.textContent) {\n      var value = this.decodeHTML(this.textContent);\n    } else {\n      value = this.value || \"\";\n    }\n    this.editView(value)\n    this.isLoading = false\n    // console.log(\"[editor] #dispatch editor-loaded\")\n    var event = new CustomEvent(\"editor-loaded\")\n    // event.stopPropagation();\n    this.dispatchEvent(event)\n    this[\"editor-loaded\"] = true // event can sometimes already be fired\n  }\n\n  async editorLoaded() {\n    if(!this[\"editor-loaded\"]) {\n      return promisedEvent(this, \"editor-loaded\");\n    }\n  }\n\n  editView(value) {\n    if (!value) value = this.value || \"\";\n    var container = this.shadowRoot.querySelector(\"#code-mirror-container\")\n    container.innerHTML = \"\"\n    this.setEditor(CodeMirror(container, {\n      value: value,\n      lineNumbers: true,\n      gutters: [\"leftgutter\", \"CodeMirror-linenumbers\", \"rightgutter\", \"CodeMirror-lint-markers\"],\n      lint: true\n    }));\n    \n    //load astCapabilities\n    this.astCapabilities(this.editor);\n  }\n\n  setEditor(editor) {\n    this.editor = editor\n\t\tthis.setupEditor()\n  }\n\n  setupEditor() {\n    var editor = this.editor;\n    if (this.mode) {\n      editor.setOption(\"mode\", this.mode);\n    }\n    this.setupEditorOptions(editor)\n    // edit addons\n    // editor.setOption(\"showTrailingSpace\", true)\n    // editor.setOption(\"matchTags\", true)\n\n    editor.on(\"change\", evt => this.dispatchEvent(new CustomEvent(\"change\", {detail: evt})));\n    editor.on(\"change\", (() => this.checkSyntax()).debounce(500));\n    \n    editor.on(\"cursorActivity\", (() => this.onCursorActivity()).debounce(500));\n    \n\t\t// apply attributes\n    _.map(this.attributes, ea => ea.name).forEach(ea => this.applyAttribute(ea));\n\n    // if(Preferences.get('UseTernInCodeMirror')) {\n    //   this.enableTern();\n    // }\n  }\n  \n  clearHistory() {\n    var cm = this.editor;\n    cm.getDoc().clearHistory()\n  }\n  \n  addKeys(keymap) {\n    var keys = this.ensureExtraKeys()\n    this.extraKeys = Object.assign(keys, keymap)\n  }\n  \n  \n  ensureExtraKeys() {\n    if (!this.extraKeys) {\n      var editor = this.editor\n      this.extraKeys = {\n        // #KeyboardShortcut Ctrl-H search and replace\n        \"Insert\": (cm) => {\n          // do nothing... the INSERT mode is so often activated by accident \n        },\n        \"Ctrl-Insert\": (cm) => {\n          // INSERT mode is so often activated by accident, require CTRL now \n          cm.toggleOverwrite()\n        },\n        \"Ctrl-H\": (cm) => {\n          setTimeout(() => {\n              editor.execCommand(\"replace\");\n              this.shadowRoot.querySelector(\".CodeMirror-search-field\").focus();\n          }, 10)\n        },\n        // #KeyboardShortcut Ctrl-Space auto complete\n        \"Ctrl-Space\": cm => {\n          this.fixHintsPosition()\n          cm.execCommand(\"autocomplete\")\n        },\n        // #KeyboardShortcut Ctrl-Alt-Space auto complete\n        \"Ctrl-Alt-Space\": cm => {\n          this.fixHintsPosition()\n          cm.execCommand(\"autocomplete\")\n        },\n        // #KeyboardShortcut Ctrl-P eval and print selection or line\n        \"Ctrl-P\": (cm) => {\n            let text = this.getSelectionOrLine()\n            this.tryBoundEval(text, true);\n        },\n        // #KeyboardShortcut Ctrl-I eval and inspect selection or line\n        \"Ctrl-I\": (cm) => {\n          let text = this.getSelectionOrLine()\n          this.inspectIt(text)\n        },\n        // #KeyboardShortcut Ctrl-D eval selection or line (do it)\n        \"Ctrl-D\": (cm, b, c) => {\n            let text = this.getSelectionOrLine();\n            this.tryBoundEval(text, false);\n            return true\n        },\n        // #KeyboardShortcut Ctrl-F search\n        \"Ctrl-F\": (cm) => {\n          // something immediately grabs the \"focus\" and we close the search dialog..\n          // #Hack...\n          setTimeout(() => {\n                editor.execCommand(\"findPersistent\");\n                this.shadowRoot.querySelector(\".CodeMirror-search-field\").focus();\n          }, 10)\n          // editor.execCommand(\"find\")\n        },\n        \n        // #KeyboardShortcut Ctrl-Alt-Right multiselect next\n        \"Ctrl-Alt-Right\": \"selectNextOccurrence\",\n        // #KeyboardShortcut Ctrl-Alt-Left undo multiselect\n        \"Ctrl-Alt-Left\": \"undoSelection\",\n\n        // #KeyboardShortcut Ctrl-/ indent selection\n        \"Ctrl-/\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Ctrl-# indent selection\n        \"Ctrl-#\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Tab insert tab or soft indent\n        'Tab': (cm) => {\n          if (cm.somethingSelected()) {\n            cm.indentSelection(\"add\");\n          } else {\n            cm.execCommand('insertSoftTab')\n          }\n        },\n        // #KeyboardShortcut Ctrl-S save content\n        \"Ctrl-S\": (cm) => {\n          this.myASTCapabilities = undefined; // Reload our ASTCapabilities to improve workflow when changing code there\n          this.doSave(cm.getValue());\n        },\n        // #KeyboardShortcut Ctrl-Alt-V eval and open in vivide\n        \"Ctrl-Alt-V\": async cm => {\n          let text = this.getSelectionOrLine();\n          let result = await this.tryBoundEval(text, false);\n          letsScript(result);\n        },\n        // #KeyboardShortcut Ctrl-Alt-I show type using tern\n        \"Ctrl-Alt-I\": cm => {\n          this.ternWrapper.then(tw => tw.showType(cm, this));\n        },\n        // #KeyboardShortcut Alt-. jump to definition using tern\n        \"Alt-.\": cm => {\n          lively.notify(\"try to JUMP TO DEFINITION\")\n          this.ternWrapper.then(tw => tw.jumpToDefinition(cm, this));\n        },\n        // #KeyboardShortcut Alt-, jump back from definition using tern\n        \"Alt-,\": cm => {\n          this.ternWrapper.then(tw => tw.jumpBack(cm, this));\n        },\n        // #KeyboardShortcut Shift-Alt-. show references using tern\n        \"Shift-Alt-.\": cm => {\n          this.ternWrapper.then(tw => tw.showReferences(cm, this));\n        },\n\n        // #AST-Navigation\n        // #KeyboardShortcut Alt-Up Expand selection in ast-aware manner\n        \"Alt-Up\": cm => {\n          this.astCapabilities(cm).then(ac => ac.expandSelection(cm));\n        },\n        // #KeyboardShortcut Alt-Down Reduce selection in ast-aware manner\n        \"Alt-Down\": cm => {\n          this.astCapabilities(cm).then(ac => ac.reduceSelection(cm));\n        },\n        // #KeyboardShortcut Alt-Shift-Up Select previous like this\n        \"Shift-Alt-Up\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTNodeLikeThis(true));\n        },\n        // #KeyboardShortcut Alt-Shift-Down Select next like this\n        \"Shift-Alt-Down\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTNodeLikeThis(false));\n        },\n        // #KeyboardShortcut Alt-Left Select previous element in ast-aware manner\n        \"Alt-Left\": cm => {\n          //lol I was here\n          this.astCapabilities(cm).then(ac => ac.selectNextASTChild(true));\n        },\n        // #KeyboardShortcut Alt-Right Select next element in ast-aware manner\n        \"Alt-Right\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTChild(false));\n        },\n        \n        // #KeyboardShortcut Alt-Shift-Left Select previous reference\n        // #todo find unused keybinding, Alt-Shift-Left is already used by the editor \n        \"Shift-Alt-Left\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextReference(true));\n        },\n        // #KeyboardShortcut Alt-Shift-Right Select next reference\n        // #todo find unused keybinding, Alt-Shift-Right is already used by the editor \n        \"Shift-Alt-Right\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextReference(false));\n        },\n        // #KeyboardShortcut Alt-C Update color picker locations\n        \"Alt-C\": cm => {\n          this.astCapabilities(cm).then(ac => ac.updateColorPicker());\n        },\n        // #KeyboardShortcut Alt-J Jump to declaration of this identifier\n        \"Alt-J\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectDeclaration());\n        },\n        // #KeyboardShortcut Alt-R Rename this identifier\n        \"Alt-R\": cm => {\n          this.astCapabilities(cm).then(ac => ac.rename());\n        },\n        // #KeyboardShortcut Alt-M Extract method\n        \"Alt-M\": cm => {\n          this.astCapabilities(cm).then(ac => ac.extractMethod());\n        },\n        // #KeyboardShortcut Alt-H Generate accessors for tags with id in corresponding .html file\n        \"Alt-H\": cm => {\n          this.astCapabilities(cm).then(ac => ac.generateHTMLAccessors());\n        },\n        \n        // #KeyboardShortcut Alt-Backspace Leave Editor and got to Navigation\n        \"alt-Backspace\": async cm => {\n          this.singalEditorbackNavigation()\n        },\n        // #KeyboardShortcut Shift-Alt-Backspace Leave and Close Editor and got to Navigation\n        \"shift-alt-Backspace\": async cm => {\n          this.singalEditorbackNavigation(true)\n        },\n        // #KeyboardShortcut Alt-A show additional info of this Active Expression\n        \"Alt-A\": async cm => {\n          this.showAExprDependencyTextMarkers();\n        },\n        // #Async #Workspace #Snippet #Workaround missing global async/await support in JavaScript / our Workspaces\n        \"Ctrl-Alt-A\": cm => {\n          var selection = this.editor.getSelection()\n          // #TODO how can we have custom snippets?\n          this.editor.replaceSelection(`var value;\n(async () => {\n  value = ${selection}\n})()`)\n          this.editor.execCommand(`goWordLeft`)\n          this.editor.execCommand(`goCharLeft`)\n        },\n        // #KeyboardShortcut Ctrl-Shift-A Update Active Expression Dependencies\n        \"Ctrl-Shift-A\": cm => {\n          this.updateAExprDependencies();\n        },\n        \n        // #KeyboardShortcut Alt-Q sample shortcut for auto-completion\n        \"Alt-Q\": cm => {\n          this.autoCompletion(cm).then(ac => ac.complete(this, cm));\n        },\n        \n      }\n      // Alt-Enter has to react on key up, so we make an extra rule here\n      // #KeyboardShortcut Alt-Enter ast refactoring/autocomplete menu\n      this.editor.on(\"keyup\", (cm, event) => {\n        if(event.altKey && event.keyCode == 13) {\n          if(this.isJavaScript){\n            this.openContextMenu(cm);\n          } else {\n            lively.warn(\"Context Menu doesn't work outside of js files for now!\");\n          }\n        }\n      })\n      \n      \n    }\n    return this.extraKeys\n  }\n  \n  openContextMenu(cm) {\n    this.astCapabilities(cm).then(ac => {\n      openMenu(ac, cm, this);\n    });\n  }\n  \n  async singalEditorbackNavigation(closeEditor) {\n    var container = lively.query(this, \"lively-container\")\n    if (container) {\n      if (closeEditor) await container.onCancel()\n      await lively.sleep(10)\n      // it seems not to bubble across shadow root boundaries #Bug ?\n      // so we do it manually, but keep it an event\n      container.dispatchEvent(new CustomEvent(\"editorbacknavigation\", {\n        bubbles: true,\n        cancelable: true,\n      }))\n\n    }\n  }\n  \n  registerExtraKeys(options) {\n    if (options) this.addKeys(options)\n    var keys = {}\n    keys = Object.assign(keys, CodeMirror.keyMap.sublime)\n    keys = Object.assign(keys, this.ensureExtraKeys())\n    this.editor.setOption(\"extraKeys\", CodeMirror.normalizeKeyMap(keys));\n  }\n    \n  \n  setupEditorOptions(editor) {\n    editor.setOption(\"matchBrackets\", true)\n    editor.setOption(\"styleSelectedText\", true)\n    editor.setOption(\"autoCloseBrackets\", true)\n    editor.setOption(\"autoCloseTags\", true)\n\t\teditor.setOption(\"scrollbarStyle\", \"simple\")\n\t\teditor.setOption(\"scrollbarStyle\", \"simple\")\n    \n    editor.setOption(\"tabSize\", 2)\n    editor.setOption(\"indentWithTabs\", false)\n\n    editor.setOption(\"highlightSelectionMatches\", {showToken: /\\w/, annotateScrollbar: true})\n\n    // editor.setOption(\"keyMap\",  \"sublime\")\n\t\t\n    editor.on(\"cursorActivity\", cm => {\n      if (this.ternLoaded) {\n        this.ternWrapper.then(tw => tw.updateArgHints(cm, this))\n      }\n    });\n    \n    // http://bl.ocks.org/jasongrout/5378313#fiddle.js\n    editor.on(\"cursorActivity\", cm => {\n      // this.ternWrapper.then(tw => tw.updateArgHints(cm, this));\n      const widgetEnter = cm.widgetEnter;\n      cm.widgetEnter = undefined;\n      if (widgetEnter) {\n        // check to see if movement is purely navigational, or if it\n        // doing something like extending selection\n        var cursorHead = cm.getCursor('head');\n        var cursorAnchor = cm.getCursor('anchor');\n        if (posEq(cursorHead, cursorAnchor)) {\n          widgetEnter();\n        }\n      }\n    });\n    editor.setOption(\"hintOptions\", {\n      container: this.shadowRoot.querySelector(\"#code-mirror-hints\"),\n      codemirror: this,\n      closeCharacters: /\\;/ // we want to keep the hint open when typing spaces and \"{\" in imports...\n    });\n    \n    this.registerExtraKeys()\n  }\n\n  \n  \n  // Fires when an attribute was added, removed, or updated\n  attributeChangedCallback(attr, oldVal, newVal) {\n    if(!this.editor){\n        return false;\n    }\n    switch(attr){\n      // case \"theme\":\n      //     this.editor.setTheme( newVal );\n      //     break;\n      case \"mode\":\n          this.editor.setOption('mode', newVal);\n          break;\n      // case \"fontsize\":\n      //     this.editor.setFontSize( newVal );\n      //     break;\n      // case \"softtabs\":\n      //     this.editor.getSession().setUseSoftTabs( newVal );\n      //     break;\n      // case \"tern\":\n      //   if (newVal)\n      // this.enableTern()\n      //   break;\n\n      case \"tabsize\":\n\t\t\t\tthis.setOption(\"tabSize\", newVal)\n        break;\n      // case \"readonly\":\n      //     this.editor.setReadOnly( newVal );\n      //     break;\n      case \"wrapmode\":\n        this.setOption(\"lineWrapping\", newVal)\n        break;\n    }\n  }\n\n\n  setOption(name, value) {\n    if (!this.editor) return; // we loose...\n    this.editor.setOption(name, value)\n  }\n\n  doSave(text) {\n    this.tryBoundEval(text) // just a default implementation...\n  }\n\n  getSelectionOrLine() {\n    var text = this.editor.getSelection()\n    if (text.length > 0)\n      return text\n    else\n      return this.editor.getLine(this.editor.getCursor(\"end\").line)\n  }\n\n  getDoitContext() {\n    return this.doitContext\n  }\n\n  setDoitContext(context) {\n    return this.doitContext = context;\n  }\n\n  getTargetModule() {\n    // lazily initialize a target module name as fallback\n    return this.targetModule || (this.targetModule = lively4url +'/unnamed_module_' + generateUUID().replace(/-/g, '_')); // make it relative to a real path so that relative modules work\n  }\n\n  setTargetModule(module) {\n    return this.targetModule = module;\n  }\n\n  async boundEval(str) {\n    // console.log(\"bound eval \" + str)\n    var targetModule = this.getTargetModule()\n    \n    if(targetModule.match(/.py$/)) {\n      return this.boundEvalPython(str)\n    }\n    // Ensure target module loaded (for .js files only)\n    if(targetModule.match(/.js$/)) {\n      await System.import(targetModule)\n    }\n    console.log(\"EVAL (CM)\", targetModule);\n    // src, topLevelVariables, thisReference, <- finalStatement\n    return boundEval(str, this.getDoitContext(), targetModule);\n  }\n  \n  async boundEvalPython(str) {\n    var result = \"\"\n    var xterm = document.querySelector(\"lively-xterm.python\")\n    if (xterm) {\n      var term = xterm.term\n      term.__socket.addEventListener('message', function (event) {\n        result += event.data;\n      });\n      // how long do we want to wait?\n\n      term.__sendData(str + \"\\n\")\n\n      while(!result.match(\">>>\")) {\n        // busy wait for the prompt\n        await lively.sleep(50) \n      }\n      // strip input and prompt.... oh what a hack\n      return {value: result.replace(str,\"\").replace(/^[\\r\\n]+/,\"\").replace(/>>> $/,\"\")}     \n    } else {\n      lively.notify(\"no open python terminal session found\")\n    }\n    return {value: \"\"}\n  }\n\n  printWidget(name) {\n    return this.wrapWidget(name, this.editor.getCursor(true), this.editor.getCursor(false))\n  }\n\n  wrapWidget(name, from, to, options) {\n    var widget = document.createElement(\"span\");\n    widget.classList.add(\"lively-widget\")\n    widget.style.whiteSpace = \"normal\";\n    var promise = lively.create(name, widget);\n    promise.then(comp => {\n      Object.assign(comp.style, {\n        display: \"inline\",\n        // backgroundColor: \"rgb(250,250,250)\",\n        display: \"inline-block\",\n        minWidth: \"20px\",\n        minHeight: \"20px\"\n      });\n    });\n    // #TODO, we assume that it will keep the first widget, and further replacements do not work.... and get therefore thrown away\n    var marker = this.editor.doc.markText(from, to, Object.assign({\n      replacedWith: widget\n    }, options));\n    promise.then(comp => comp.marker = marker);\n\n    return promise;\n  }\n\n\n  async printResult(result, obj, isPromise) {\n    var editor = this.editor;\n    var text = result\n    var isAsync = false\n    this.editor.setCursor(this.editor.getCursor(\"end\"))\n    // don't replace existing selection\n    this.editor.replaceSelection(result, \"around\")\n    if (obj && obj.__asyncresult__) {\n      obj = obj.__asyncresult__; // should be handled in bound-eval.js #TODO\n      isAsync = true\n    }\n    var promisedWidget\n    var objClass = (obj && obj.constructor && obj.constructor.name) || (typeof obj)\n    if (isSet.call(obj)) {\n      obj = Array.from(obj)\n    }\n\n    if (_.isMap(obj)) {\n      var mapObj = {}\n      Array.from(obj.keys()).sort().forEach(key => mapObj[key] = obj.get(key))\n      obj = mapObj\n    }\n    if (Array.isArray(obj) && !obj.every(ea => ea instanceof Node)) {\n      if (obj.every(ea => (typeof ea == 'object') && !(ea instanceof String))) {\n        promisedWidget = this.printWidget(\"lively-table\").then( table => {\n          table.setFromJSO(obj)\n          table.style.maxHeight = \"300px\"\n          table.style.overflow = \"auto\"\n          return table\n        })\n      } else {\n        promisedWidget = this.printWidget(\"lively-table\").then( table => {\n          table.setFromJSO(obj.map((ea,index) => {\n            return {\n              index: index,\n              value: this.ensuredPrintString(ea)\n            }\n          }));\n          table.style.maxHeight = \"300px\";\n          table.style.overflow = \"auto\";\n          return table;\n        })\n      }\n    } else if(objClass ==  \"Matrix\") {\n      // obj = obj.toString()\n      debugger\n    } else if ((typeof obj == 'object') && (obj !== null)) {\n      promisedWidget = this.printWidget(\"lively-inspector\").then( inspector => {\n        inspector.inspect(obj)\n        inspector.hideWorkspace()\n        return inspector\n      })\n    }\n    if (promisedWidget) {\n        var widget = await promisedWidget;\n        var span = <span style=\"border-top:2px solid darkgray;color:darkblue\">\n          {isPromise ? \"PROMISED\" : \"\"} <u>:{objClass}</u> </span>\n        widget.parentElement.insertBefore(span, widget)\n        span.appendChild(widget)\n        if (isAsync && promisedWidget) {\n          if (widget) widget.style.border = \"2px dashed blue\"\n        }\n\n    }\n  }\n\n  ensuredPrintString(obj) {\n    var s = \"\";\n    try {\n      s += obj // #HACK some objects cannot be printed any more\n    } catch(e) {\n      s += `UnprintableObject[Error: ${e}]`; // so we print something else\n    }\n    return s\n  }\n  \n\n  async tryBoundEval(str, printResult) {\n    var resp = await this.boundEval(str);\n    if (resp.isError) {\n      var e = resp.value;\n      console.error(e);\n      if (printResult) {\n        window.LastError = e;\n        this.printResult(stripErrorString(\"\" + e));\n      } else {\n        lively.handleError(e);\n      }\n      return e;\n    }\n    var result = resp.value\n\n    if (printResult) {\n      // alaways wait on promises.. when interactively working...\n      if (result && result.then) { //  && result instanceof Promise\n        // we will definitly return a promise on which we can wait here\n        result\n          .then( result => {\n            this.printResult(\"RESOLVED: \" + this.ensuredPrintString(result), result, true)\n          })\n          .catch( error => {\n            console.error(error);\n            // window.LastError = error;\n            this.printResult(stripErrorString(\"Error in Promise: \\n\" +error))\n          })\n      } else {\n        this.printResult(\" \" + this.ensuredPrintString(result), result)\n        if (result instanceof HTMLElement ) {\n          try {\n            lively.showElement(result)\n          } catch(e) {\n            // silent fail... not everything can be shown...\n          }\n        }\n      }\n    }\n    return result\n  }\n\n  async inspectIt(str) {\n    var result =  await this.boundEval(str);\n    if (!result.isError) {\n      result = result.value\n    }\n    if (result.then) {\n      result = await result; // wait on any promise\n    }\n    lively.openInspector(result, undefined, str)\n  }\n\n\n  doSave(text) {\n    this.tryBoundEval(text) // just a default implementation...\n  }\n\n\n  detachedCallback() {\n    this._attached = false;\n  };\n\n  get value() {\n    if (this.editor) {\n      return this.editor.getValue()\n    } else {\n      return this._value\n    }\n  }\n\n  set value(text) {\n    if (this.editor) {\n      this.editor.setValue(text)\n    } else {\n      this._value = text\n    }\n  }\n\n  setCustomStyle(source) {\n    this.shadowRoot.querySelector(\"#customStyle\").textContent = source\n  }\n\n  getCustomStyle(source) {\n    return this.shadowRoot.querySelector(\"#customStyle\").textContent\n  }\n\n  encodeHTML(s) {\n    return s.replace(\"&\", \"&amp;\").replace(\"<\", \"&lt;\")\n  }\n\n  decodeHTML(s) {\n    return s.replace(\"&lt;\", \"<\").replace(\"&amp;\", \"&\")\n  }\n\n  resize() {\n    // #ACE Component compatiblity\n  }\n\n  enableAutocompletion() {\n    // #ACE Component compatiblity\n  }\n\n  get isJavaScript() {\n    if (!this.editor) return false;\n    let mode = this.editor.getOption(\"mode\");\n    return mode === \"javascript\" || mode === 'text/jsx';\n  }\n\n  get isMarkdown() {\n    if (!this.editor) return false;\n    return this.editor.getOption(\"mode\") == \"gfm\";\n  }\n\n  get isHTML() {\n    if (!this.editor) return false;\n    return this.editor.getOption(\"mode\") == \"text/html\";\n  }\n\n\n  async changeModeForFile(filename) {\n    if (!this.editor) return;\n\n    var mode = \"text\"\n    // #TODO there must be some kind of automatching?\n    if (filename.match(/\\.html$/)) {\n      mode = \"text/html\"\n    } else if (filename.match(/\\.md$/)) {\n      mode = \"gfm\"\n    } else if (filename.match(/\\.tex$/)) {\n      mode = \"text/x-stex\"\n    } else if (filename.match(/\\.css$/)) {\n      mode = \"css\"\n    } else if (filename.match(/\\.xml$/)) {\n      mode = \"xml\"\n    } else if (filename.match(/\\.json$/)) {\n      mode = \"javascript\"\n    } else if (filename.match(/\\.js$/)) {\n      mode = \"text/jsx\"\n    } else if (filename.match(/\\.mjs$/)) {\n      mode = \"text/jsx\"\n    } else if (filename.match(/\\.py$/)) {\n      mode = \"text/x-python\"\n    } else if (filename.match(/\\.c$/)) {\n      mode = \"text/x-csrc\"\n    } else if (filename.match(/\\.cpp$/)) {\n      mode = \"text/x-c++src\"\n    } else if (filename.match(/\\.h$/)) {\n      mode = \"text/x-c++src\"\n    } else if (filename.match(/\\.sh$/)) {\n      mode = \"text/x-sh\"\n    }\n    \n    \n    this.mode = mode\n    this.editor.setOption(\"mode\", mode)\n    if (mode == \"gfm\" || mode == \"text/x-stex\") {\n      // #TODO make language customizable\n      var m = this.value.match(/^.*lang\\:(.._..)/)\n      if (m) {\n        var lang = m[1]\n        var dict = await spellCheck.loadDictLang(lang)\n        if (dict) {\n          lively.notify(\"start spell checking lang: \" + lang)\n          spellCheck.startSpellCheck(this.editor, dict)\n        } else {\n          console.log(\"spellchecking language not found: \" + lang)\n        }\n      } else {\n        spellCheck.startSpellCheck(this.editor, await spellCheck.current())\n      }\n    }\n\n  }\n\n  livelyPrepareSave() {\n    if(!this.editor) { return; }\n    this.textContent = this.encodeHTML(this.editor.getValue())\n  }\n\n  livelyPreMigrate() {\n    if (this.editor) {\n      this.lastScrollInfo = this.editor.getScrollInfo(); // #Example #PreserveContext\n    }\n  }\n\n  focus() {\n    if(this.editor) this.editor.focus()\n  }\n\n  isFocused(doc) {\n    doc = doc || document\n    if (doc.activeElement === this) return true\n    // search recursively in shadowDoms\n    if (doc.activeElement && doc.activeElement.shadowRoot) {\n\t\t\treturn this.isFocused(doc.activeElement.shadowRoot)\n    }\n    return false\n  }\n\n  async livelyMigrate(other) {\n    lively.addEventListener(\"Migrate\", this, \"editor-loaded\", evt => {\n      if (evt.composedPath()[0] !== this) return; // bubbled from another place... that is not me!\n      lively.removeEventListener(\"Migrate\", this, \"editor-loaded\") // make sure we migrate only once\n      this.value = other.value;\n      if (other.lastScrollInfo) {\n        this.editor.scrollTo(other.lastScrollInfo.left, other.lastScrollInfo.top)\n      }\n    })\n  }\n\n  fixHintsPosition() {\n    lively.setPosition(this.shadowRoot.querySelector(\"#code-mirror-hints\"),\n  pt(-document.scrollingElement.scrollLeft,-document.scrollingElement.scrollTop).subPt(lively.getGlobalPosition(this)))\n  }\n\n\n//   async enableTern() {\n//     await LivelyCodeMirror.loadTernModules()\n\n//     var ecmascriptdefs = await fetch(lively4url + \"/src/external/tern/ecmascript.json\").then(r => r.json())\n//     var browserdefs = await fetch(lively4url + \"/src/external/tern/browser.json\").then(r => r.json())\n//     // var chaidefs = await fetch(lively4url + \"/src/external/tern/chai.json\").then(r => r.json())\n\n//     // Options supported (all optional):\n//     // * defs: An array of JSON definition data structures.\n//     // * plugins: An object mapping plugin names to configuration\n//     //   options.\n//     // * getFile: A function(name, c) that can be used to access files in\n//     //   the project that haven't been loaded yet. Simply do c(null) to\n//     //   indicate that a file is not available.\n//     // * fileFilter: A function(value, docName, doc) that will be applied\n//     //   to documents before passing them on to Tern.\n//     // * switchToDoc: A function(name, doc) that should, when providing a\n//     //   multi-file view, switch the view or focus to the named file.\n//     // * showError: A function(editor, message) that can be used to\n//     //   override the way errors are displayed.\n//     // * completionTip: Customize the content in tooltips for completions.\n//     //   Is passed a single argument the completion's data as returned by\n//     //   Tern and may return a string, DOM node, or null to indicate that\n//     //   no tip should be shown. By default the docstring is shown.\n//     // * typeTip: Like completionTip, but for the tooltips shown for type\n//     //   queries.\n//     // * responseFilter: A function(doc, query, request, error, data) that\n//     //   will be applied to the Tern responses before treating them\n\n//     // It is possible to run the Tern server in a web worker by specifying\n//     // these additional options:\n//     // * useWorker: Set to true to enable web worker mode. You'll probably\n//     //   want to feature detect the actual value you use here, for example\n//     //   !!window.Worker.\n//     // * workerScript: The main script of the worker. Point this to\n//     //   wherever you are hosting worker.js from this directory.\n//     // * workerDeps: An array of paths pointing (relative to workerScript)\n//     //   to the Acorn and Tern libraries and any Tern plugins you want to\n//     //   load. Or, if you minified those into a single script and included\n//     //   them in the workerScript, simply leave this undefined.\n\n//     this.ternServer = new CodeMirror.TernServer({\n//       defs: [ecmascriptdefs, browserdefs], // chaidefs\n//       plugins: {\n//         es_modules: {}\n//       },\n//       getFile: (name, c) => {\n//         lively.notify(\"get file \" + name)\n//         c(null)\n//       },\n//       // responseFilter: (doc, query, request, error, data) => {\n//       //  return data\n//       // }\n\n//     });\n\n//     this.editor.setOption(\"extraKeys\", Object.assign({},\n//       this.editor.getOption(\"extraKeys\"),\n//       {\n//         \"Ctrl-Space\": (cm) => {\n//           this.fixHintsPosition();\n//           this.ternServer.complete(cm);\n//         },\n//         \"Ctrl-Alt-I\": (cm) => { this.ternServer.showType(cm); },\n//         \"Ctrl-O\": (cm) => { this.ternServer.showDocs(cm); },\n//         \"Alt-.\": (cm) => { this.ternServer.jumpToDef(cm); },\n//         \"Alt-,\": (cm) => { this.ternServer.jumpBack(cm); },\n//         \"Ctrl-Q\": (cm) => { this.ternServer.rename(cm); },\n//         \"Ctrl-.\": (cm) => { this.ternServer.selectName(cm); }\n//       }))\n\n//     this.editor.on(\"cursorActivity\", (cm) => { this.ternServer.updateArgHints(cm); });\n//   }\n\n\n  async addTernFile(name, url, text) {\n    if (!this.ternServer) return\n    url = url || name;\n    text = text || await fetch(url).then(r => r.text())\n    this.ternServer.server.addFile(name, text)\n  }\n\n  mergeView(originalText, originalLeftText) {\n    debugger\n    var target = this.shadowRoot.querySelector(\"#code-mirror-container\")\n    target.innerHTML = \"\";\n    this._mergeView =  CodeMirror.MergeView(target, {\n      value: this.value,\n      origLeft: originalLeftText,\n      orig: originalText,\n      lineNumbers: true,\n      mode: this.editor.getOption('mode'),\n      scrollbarStyle: this.editor.getOption('scrollbarStyle'),\n      highlightDifferences: true,\n      connect: \"align\",\n      lineWrapping: true,\n      collapseIdentical: false\n    });\n    // if (this._mergeView.right) {\n    // this.setEditor(this._mergeView.right.edit)\n    // }\n    this.setEditor(this._mergeView.editor())\n    // this.resizeMergeView(this._mergeView)\n  }\n\n  resizeMergeView(mergeView) {\n    function editorHeight(editor) {\n      if (!editor) return 0;\n      return editor.getScrollInfo().height;\n    }\n\n    function mergeViewHeight(mergeView) {\n      return Math.max(editorHeight(mergeView.leftOriginal()),\n                      editorHeight(mergeView.editor()),\n                      editorHeight(mergeView.rightOriginal()));\n    }\n    var height = mergeViewHeight(mergeView);\n    for(;;) {\n      if (mergeView.leftOriginal())\n        mergeView.leftOriginal().setSize(null, height);\n      mergeView.editor().setSize(null, height);\n      if (mergeView.rightOriginal())\n        mergeView.rightOriginal().setSize(null, height);\n\n      var newHeight = mergeViewHeight(mergeView);\n      if (newHeight >= height) break;\n      else height = newHeight;\n    }\n    mergeView.wrap.style.height = height + \"px\";\n  }\n\n  async hideDataURLs() {\n    var regEx = new RegExp(\"[\\\"\\'](data:[^\\\"\\']*)[\\\"\\']\", \"g\");\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        var from = m.index\n        var to = m.index + m[0].length\n        await this.wrapWidget(\"span\", this.editor.posFromIndex(from),\n                              this.editor.posFromIndex(to)).then( div => {\n          div.style.backgroundColor = \"rgb(240,240,240)\"\n\n          if (m[1].match(/^data:image/)) {\n            var img = document.createElement(\"img\")\n            img.src = m[1]\n            img.title = m[1].slice(0,50) + \"...\"\n            img.style.maxHeight = \"100px\"\n\n            div.appendChild(document.createTextNode(\"\\\"\"))\n            div.appendChild(img)\n            div.appendChild(document.createTextNode(\"\\\"\"))\n          } else {\n            div.innerHTML = \"\\\"\"+ m[1].slice(0,50) + \"...\" + \"\\\"\"\n          }\n        })\n\n      }\n    } while (m);\n  }\n\n//    async wrapImageLinks() {\n//     var regEx = new RegExp(\"\\!\\[\\]\\(([A-Za-z0-9_ .]\\.((jpg)|(png)))$\\)\", \"g\");\n//     do {\n//       var m = regEx.exec(this.value);\n//       if (m) {\n//         var from = m.index\n//         var to = m.index + m[0].length\n//         var url = m[1]\n//         await this.wrapWidget(\"span\", this.editor.posFromIndex(from),\n//                               this.editor.posFromIndex(to)).then( div => {\n//           div.style.backgroundColor = \"rgb(240,240,240)\"\n\n//           if (m[1].match(/^data:image/)) {\n//             var img = document.createElement(\"img\")\n//             img.src = m[1]\n//             img.title = m[1].slice(0,50) + \"...\"\n//             img.style.maxHeight = \"100px\"\n\n//             div.appendChild(document.createTextNode(\"\\\"\"))\n//             div.appendChild(img)\n//             div.appendChild(document.createTextNode(\"\\\"\"))\n//           } else {\n//             div.innerHTML = \"\\\"\"+ m[1].slice(0,50) + \"...\" + \"\\\"\"\n//           }\n//         })\n\n//       }\n//     } while (m);\n//   }\n\n\n  async wrapImports() {\n    // dev mode alternative to #DevLayers, a #S3Pattern: add code the scopes your dev example inline while developing\n    if(this.id !== 'spike') {\n      // lively.warn('skip because id is not spike')\n      return;\n    }\n    // lively.success('wrap imports in spike')\n\n    const getImportDeclarationRegex = () => {\n      const LiteralString = `([\"][^\"\\\\n\\\\r]*[\"]|['][^'\\\\n\\\\r]*['])`;\n      const JavaScriptIdentifier = '([a-zA-Z$_][a-zA-Z0-9$_]*)'\n\n      const ImportSpecifierPartSimple = `(${JavaScriptIdentifier})`;\n      const ImportSpecifierPartRename = `(${JavaScriptIdentifier}\\\\s+as\\\\s+${JavaScriptIdentifier})`;\n      const ImportSpecifierPart = `(${ImportSpecifierPartSimple}|${ImportSpecifierPartRename})`;\n      // ImportSpecifier: {foo} or {foo as bar}\n      const ImportSpecifier = `({\\\\s*((${ImportSpecifierPart}\\\\s*\\\\,\\\\s*)*${ImportSpecifierPart}\\\\,?)?\\\\s*})`;\n      // ImportDefaultSpecifier: foo\n      const ImportDefaultSpecifier = `(${JavaScriptIdentifier})`;\n      // ImportNamespaceSpecifier: * as foo\n      const ImportNamespaceSpecifier = `(\\\\*\\\\s*as\\\\s+${JavaScriptIdentifier})`;\n      const anySpecifier = `(${ImportSpecifier}|${ImportDefaultSpecifier}|${ImportNamespaceSpecifier})`;\n      // ImportDeclaration: import [any] from Literal\n      const ImportDeclaration = `import\\\\s*(${anySpecifier}\\\\s*\\\\,\\\\s*)*${anySpecifier}\\\\s*from\\\\s*${LiteralString}(\\\\s*\\\\;)?`;\n\n      return ImportDeclaration;\n    };\n\n    var regEx = new RegExp(getImportDeclarationRegex(), 'g');\n\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        await LivelyCodeMirrorWidgetImport.importWidgetForRange(this, m);\n      }\n    } while (m);\n  }\n\n   async wrapLinks() {\n    // dev mode\n    if(this !== window.that) {\n      return;\n    }\n    var regEx = new RegExp(\"\\<([a-zA-Z0-9]+\\:\\/\\/[^ ]+)\\>\", \"g\");\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        lively.warn(\"wrap link: \" + m[0])\n        var from = m.index\n        var to = m.index + m[0].length\n        var link = m[1]\n        // #TODO check for an existing widget and reuse / update it...\n        await this.wrapWidget(\"span\", this.editor.posFromIndex(from),\n                              this.editor.posFromIndex(to)).then(widget => {\n          window.lastWidget = widget\n\n          widget.style.backgroundColor = \"rgb(120,120, 240)\"\n          var input = <input></input>\n          input.value = m[0]\n\n          lively.warn(\"new input \" + input)\n\n\n          input.addEventListener(\"keydown\", evt => {\n            var range = widget.marker.find()\n            if (evt.keyCode == 13) { // ENTER\n              // #TODO how to replace // update text without replacing widgets\n              this.editor.replaceRange(input.value, range.from, range.to) // @Stefan, your welcome! ;-)\n              this.wrapLinks() // don't wait and do what you can now\n            }\n            if (evt.keyCode == 37) { // Left\n              if (input.selectionStart == 0) {\n                this.editor.setSelection(range.from, range.from)\n                this.focus()\n              }\n            }\n\n            if (evt.keyCode == 39) { // Right\n              if (input.selectionStart == input.value.length) {\n                this.editor.setSelection(range.to, range.to)\n                this.focus()\n              }\n            }\n          })\n\n          widget.appendChild(input)\n          // widget.appendChild(<button click={e => {\n          //   lively.openBrowser(link)  // #TODO fix browse and open browser...\n          // }}>browse</button>)\n        })\n\n      }\n    } while (m);\n  }\n\n  checkSyntax() {\n    if (this.isJavaScript) {\n      SyntaxChecker.checkForSyntaxErrors(this.editor);\n      this.wrapImports();\n      this.wrapLinks();\n    }\n    if (this.isMarkdown || this.isHTML) {\n      this.hideDataURLs()\n    }\n  }\n\n\n  find(str) {\n    // #TODO this is horrible... Why is there not a standard method for this?\n\tif (!this.editor) return;\n    var found = false;\n    this.value.split(\"\\n\").forEach((ea, index) => {\n      var startPos = ea.indexOf(str)\n      if (!found && (startPos != -1)) {\n        this.editor.setCursor(index + 20, 10000);// line end ;-)\n        this.editor.focus()\n        this.editor.setSelection({line: index, ch: startPos }, {line: index, ch: startPos + str.length})\n        found = ea;\n      }\n    })\n  }\n  \n  scrollToLine(line) { \n    this.editor.scrollTo(null, this.editor.heightAtLine(line - 1, \"local\"));\n  }\n\n  unsavedChanges() {\n    if (this.editor.getValue() === \"\") return false\n    return  true // workspaces should be treated carefully\n   }\n\n  onCursorActivity() {\n    var container = lively.query(this, \"lively-container\")\n    if (!container) return;\n    var navbar = lively.query(this, \"lively-container-navbar\")\n    if (!navbar) return;\n      navbar.onDetailsContentCursorActivity(this.editor, \n        this.editor.getCursor(\"start\"), this.editor.getCursor(\"end\"))\n    }\n\n    livelyMinimizedTitle() {\n      return this.value.slice(0,80)\n    }\n  \n  /*MD ## Active Expression Support MD*/\n  async updateAExprDependencies() {\n    await this.editor;\n    const capabilities = await this.astCapabilities(this.editor);\n    if (!capabilities.canParse || !capabilities.hasActiveExpressionsDirective) {\n      this.hideAExprDependencyGutter();\n      this.resetAExprTextMarkers();\n      this.resetAExprDependencyTextMarkers();\n      return;\n    }\n    this.showAExprTextMarkers();\n    await this.showAExprDependencyGutter();\n    this.showAExprDependencyGutterMarkers();\n  }\n\n  async showAExprTextMarkers() {\n    const editor = await this.editor;\n    await this.resetAExprTextMarkers();\n    const capabilities = await this.astCapabilities(this.editor);\n    capabilities.getAllActiveExpressions().forEach(path => {\n      const r = range(path.node.loc).asCM();\n      const mark = this.editor.markText(r[0], r[1], {\n        css: \"background-color: #3BEDED\",\n      });\n      mark.isAExprTextMarker = true;\n    })\n  }\n\n  async resetAExprTextMarkers() {\n    const editor = await this.editor;\n    editor.getAllMarks().forEach(mark => {\n      if (mark.isAExprTextMarker) {\n        mark.clear();\n      }\n    });\n  }\n\n  async showAExprDependencyGutter() {\n    const id = \"activeExpressionGutter\";\n    const editor = await this.editor;\n    let gutters = editor.getOption(\"gutters\");\n    if (!gutters.some(marker => marker === id)) {\n      editor.setOption('gutters', [...gutters, id]);\n    };\n  }\n  \n  async hideAExprDependencyGutter() {\n    const id = \"activeExpressionGutter\";\n    const editor = await this.editor;\n    let gutters = editor.getOption(\"gutters\");\n    gutters = gutters.filter(marker => marker !== id);\n    editor.setOption('gutters', gutters);\n  }\n\n  async resetAExprDependencyTextMarkers() {\n    const editor = await this.editor;\n    editor.getAllMarks().forEach(mark => {\n      if (mark.isAExprDependencyTextMarker) {\n        mark.clear();\n      }\n    });\n  }\n\n  async showAExprDependencyTextMarkers() {\n    await this.editor;\n    await this.resetAExprDependencyTextMarkers();\n    const cursor = this.editor.getCursor();\n    const capabilities = await this.astCapabilities(this.editor);\n    const aexprPath = capabilities.getAexprAtCursor(cursor);\n    if (!aexprPath) return;\n    const deps = capabilities.resolveDependencies(aexprPath.get(\"arguments\")[0]);\n    deps.forEach((path) => {\n      const r = range(path.node.loc).asCM();\n      const mark = this.editor.markText(r[0], r[1], {\n        css: \"background-color: orange\",\n      });\n      mark.isAExprDependencyTextMarker = true;\n    });\n  }\n  \n  async showAExprDependencyGutterMarkers() {\n    const dict = new Map();\n    const lines = [];\n    \n    await this.editor;\n    const capabilities = await this.astCapabilities(this.editor);\n    capabilities.getAllActiveExpressions().forEach(path => {\n      const dependencies = capabilities.resolveDependencies(path.get(\"arguments\")[0]);\n\n      dependencies.forEach(statement => {\n        if (!dict.get(statement)) {\n          dict.set(statement, []);\n        }\n        dict.get(statement).push(path);\n      });\n    });\n  \n    for (const [statement,aExprs] of dict.entries()){\n      const line = statement.node.loc.start.line - 1; \n      if (!lines[line]) {\n        lines[line] = [];\n      }\n      for (let aExpr of aExprs ){\n        lines[line].push(aExpr);\n      }\n    }\n    \n    this.editor.doc.clearGutter('activeExpressionGutter');\n    lines.forEach((deps, line) => {\n      this.drawAExprGutter(line, deps);\n    })\n  }\n  \n  drawAExprGutter(line, dependencies) {\n    this.editor.doc.setGutterMarker(\n      line,\n      'activeExpressionGutter',\n      this.drawAExprGutterMarker(dependencies));\n  }\n\n  drawAExprGutterMarker(dependencies) {\n    const callback = async (evt) => {\n      const list = this.drawAExprDependencyList(dependencies);\n      const depListWrap = <div class=\"aexprDependencies\"></div>;\n      depListWrap.append(list);\n      this.prepend(depListWrap);\n      \n      depListWrap.style.height = \"100px\";\n      depListWrap.style.width = \"100px\";\n      const padding = 5;\n      const markerBounds = evt.target.getBoundingClientRect();\n      const wrapBounds = depListWrap.getBoundingClientRect();\n      console.error(markerBounds, wrapBounds);\n      console.error(evt.target, depListWrap);\n      const top = markerBounds.top - (wrapBounds.height + padding);\n      console.error(`${markerBounds.top} - ${wrapBounds.height + padding} === ${top}`);\n      depListWrap.style.top = `${top}px`;\n      depListWrap.style.right = `${markerBounds.left}px`;\n    }\n    \n    // TODO render this without the \"0\"\n    return <div class=\"activeExpressionGutter-marker\" click={callback}>\n      {dependencies.length}\n    </div>\n  }\n\n  drawAExprDependencyList(dependencies) {\n    const list = <div style=\"display:flex;flex-direction:column;width:fit-content;height:fit-content;\"></div>;\n    dependencies.forEach(dep => {\n      const state = dep.get(\"arguments.0.body\").getSource();\n      const line = dep.node.loc.start.line;\n      const description = `${line} : ${state}`;\n      const item = <div style=\"width:fit-content;height:fit-content;\">{description}</div>;\n      list.append(item);\n    });\n\n    return list;\n  }\n}"]}