{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/components/widgets/lively-code-mirror.js"],"names":["promisedEvent","through","generateUUID","uuid","debounce","isSet","boundEval","Morph","diff","SyntaxChecker","Preferences","pt","rect","Strings","letsScript","LivelyCodeMirrorWidgetImport","spellCheck","CodeMirror","self","loadPromise","undefined","posEq","a","b","line","ch","LivelyCodeMirror","HTMLElement","mode","getAttribute","val","setAttribute","codeMirrorPath","lively4url","loadModule","path","force","console","warn","code","fetch","then","r","text","eval","e","error","loadCSS","lively","loadCSSThroughDOM","replace","loadModules","System","import","loadTernModules","ternIsLoaded","terndir","loadJavaScriptThroughDOM","ternWrapper","m","ternLoaded","TernCodeMirrorWrapper","initialize","_attrObserver","MutationObserver","mutations","forEach","mutation","type","attributeChangedCallback","attributeName","oldValue","target","observe","attributes","applyAttribute","attr","value","attachedCallback","isLoading","editor","root","shadowRoot","textContent","decodeHTML","editView","event","CustomEvent","dispatchEvent","editorLoaded","container","querySelector","innerHTML","setEditor","lineNumbers","gutters","lint","setupEditor","setOption","setupEditorOptions","on","evt","detail","checkSyntax","_","map","ea","name","addKeys","keymap","keys","ensureExtraKeys","extraKeys","Object","assign","cm","toggleOverwrite","setTimeout","execCommand","focus","fixHintsPosition","getSelectionOrLine","tryBoundEval","inspectIt","c","somethingSelected","indentSelection","doSave","getValue","result","tw","showType","notify","jumpToDefinition","jumpBack","showReferences","registerExtraKeys","options","keyMap","sublime","normalizeKeyMap","showToken","annotateScrollbar","updateArgHints","widgetEnter","cursorHead","getCursor","cursorAnchor","codemirror","closeCharacters","oldVal","newVal","getSelection","length","getLine","getDoitContext","doitContext","setDoitContext","context","getTargetModule","targetModule","setTargetModule","module","str","match","boundEvalPython","log","xterm","document","term","__socket","addEventListener","data","__sendData","sleep","printWidget","wrapWidget","from","to","widget","createElement","classList","add","style","whiteSpace","promise","create","comp","display","backgroundColor","minWidth","minHeight","marker","doc","markText","replacedWith","printResult","obj","isPromise","isAsync","setCursor","replaceSelection","__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","s","resp","isError","window","LastError","handleError","catch","showElement","openInspector","detachedCallback","_attached","_value","setValue","setCustomStyle","source","getCustomStyle","encodeHTML","resize","enableAutocompletion","isJavaScript","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","img","src","title","slice","createTextNode","wrapImports","id","getImportDeclarationRegex","LiteralString","JavaScriptIdentifier","ImportSpecifierPartSimple","ImportSpecifierPartRename","ImportSpecifierPart","ImportSpecifier","ImportDefaultSpecifier","ImportNamespaceSpecifier","anySpecifier","ImportDeclaration","importWidgetForRange","wrapLinks","that","link","lastWidget","input","range","find","keyCode","replaceRange","selectionStart","setSelection","checkForSyntaxErrors","found","split","startPos","indexOf","unsavedChanges"],"mappings":"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","file":"lively-code-mirror.js","sourcesContent":["import { 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, rect} 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';\n\nimport * as spellCheck from \"src/external/codemirror-spellcheck.js\"\n\nimport {isSet} from 'utils'\n\n\nimport CodeMirror from \"src/external/code-mirror/lib/codemirror.js\"\nself.CodeMirror = CodeMirror // for modules\n\nlet loadPromise = undefined;\n\nfunction posEq(a, b) {return a.line == b.line && a.ch == b.ch;}\n\nexport default class LivelyCodeMirror extends HTMLElement {\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 \t\t\tawait this.loadModule(\"addon/search/matchesonscrollbar.js\")\n \t\t\tawait 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.js\");\n      await this.loadModule(\"../eslint-lint.js\", force);\n\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  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  \tthis._attrObserver = new MutationObserver(mutations => {\n\t    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  \tthis.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\n  setEditor(editor) {\n    this.editor = editor\n\t\tthis.setupEditor()\n  }\n\n  setupEditor() {\n  \tvar 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\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  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        \"Alt-F\": \"findPersistent\",\n        // \"Ctrl-F\": \"search\",\n        // #KeyboardShortcut Ctrl-H search and replace\n        \"Insert\": (cm) => {\n          // do nothing... ther INSERT mode is so often actived by accident \n        },\n        \"Ctrl-Insert\": (cm) => {\n          // do nothing... ther INSERT mode is so often actived by accident \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 selelection 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-I 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-Right undo multiselect\n        \"Ctrl-Alt-Left\": \"undoSelection\",\n\n        // #KeyboardShortcut Ctrl-/ indent slelection\n        \"Ctrl-/\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Ctrl-# indent slelection\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.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-C 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      }\n    }\n    return this.extraKeys\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      \tbreak;\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  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(\"\" + 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(\"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(/\\.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      \tthis.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  \tthis.value.split(\"\\n\").forEach((ea, index) => {\n      var startPos = ea.indexOf(str)\n      if (!found && (startPos != -1)) {\n\t    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  \t  }\n    })\n  }\n\n  unsavedChanges() {\n    if (this.editor.getValue() === \"\") return false\n    return  true // workspaces should be treated carefully\n  }\n\n\n}\n\n// LivelyCodeMirror.loadModules()\n\n"]}