{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-augment/src/components/tools/lively-editor.js"],"names":["Strings","Morph","moment","diff","components","pt","getObjectFor","updateEditors","files","AnnotatedText","Annotation","AnnotationSet","default","ContextMenu","Editor","initialize","container","get","versionControl","shadowRoot","querySelector","editor","document","createElement","id","openIn","setAttribute","doSave","text","saveFile","addEventListener","evt","onDrop","registerButtons","input","event","keyCode","onFilenameEntered","value","url","getAttribute","setURL","dispatchEvent","Event","onTextChanged","onPaste","onContextMenu","editorLoaded","registerExtraKeys","cm","toggleWidgets","currentEditor","replaceSelection","execCommand","updateChangeIndicator","lastText","newText","getValue","style","backgroundColor","textChanged","annotatedText","equals","lastAnnotatedText","updateOtherEditors","console","warn","getURL","toString","updateEditorMode","editorComp","changeModeForFile","pathname","onSaveButton","onLoadButton","loadFile","onVersionsButton","toggleVersions","onLoadVersionButton","currentVersion","onCloseVersionsButton","insertDataTransfer","clipboardData","undefined","stopPropagation","preventDefault","onBrowse","lively","openBrowser","getURLString","dataTransfer","shiftKey","menu","enableAnnotations","onAnnotationsMarkColor","onAnnotationsClear","body","getVersionWidget","myWindow","findWindow","selection","version","CustomEvent","detail","getMountURL","URL","e","getSubmorph","urlString","href","setText","preserveView","replace","codeMirror","cur","getCursor","scroll","getScrollInfo","isCodeMirror","oldRange","getRange","setValue","resize","showEmbeddedWidgets","setScrollInfo","setCursor","setRange","getText","withEditorObjectDo","info","scrollTo","left","top","tagName","livelyEditor","livelyCodeMirror","func","awaitEditor","sleep","response","fetch","headers","fileversion","lastVersion","result","notify","checkAndLoadAnnotations","postLoadFile","exists","getAnnotationsURL","disableAnnotations","data","preSaveFile","match","method","window","LastData","lastversion","newVersion","conflictVersion","solveConflict","stats","Error","threeWayMerge","a","b","c","dmp","diff_match_patch","diff1","diff_main","diff2","patch1","patch_make","patch2","merge","patch_apply","concat","highlightChanges","otherText","myText","d","index","ea","change","highlightChange","toPos","marker","widget","targetColor","posFromIndex","length","markText","replacedWith","setBookmark","animation","animate","background","color","duration","onfinish","clear","otherVersion","conflictId","solvingConflict","error","parentText","then","r","mergedText","mergedVersion","showToolbar","display","hideToolbar","remove","editView","isWindow","overflow","appendChild","showVersions","setGlobalPosition","getGlobalPosition","addPt","getExtent","parentElement","x","setExtent","zIndex","find","pattern","generateName","items","item","kind","pasteFile","type","getAsString","element","localName","pasteDataUrlAs","name","fileItem","file","getAsFile","Date","format","getSelection","filename","prompt","newurl","dataURL","readBlobAsDataURL","blob","encodeURIComponent","isVideo","isPicture","coords","coordsChar","clientX","scrollX","clientY","scrollY","setSelection","navbar","query","update","getEnding","codeMirrorComponent","m","matchAll","widgetName","mode","fromIndex","toIndex","from","to","wrapWidget","classList","add","removeEventListener","setContent","html","fixLinks","querySelectorAll","followPath","innerHTML","hideEmbeddedWidgets","doc","getAllMarks","filter","widgetNode","forEach","allWidgets","solveAnnotationConflict","newAnnotationsVersion","conflictingAnnotationsVersion","solvingAnnotationConflict","parentAnnotations","annotations","otherAnnotationsSource","otherAnnotations","fromJSONL","myAnnotations","mergedAnnotations","renderCodeMirrorMarks","saveAnnotations","textVersion","toJSONL","conflictAnnotationsVersion","indexFromPos","annotation","codeMirrorMark","removeFromTo","loadAnnotations","fromURL","clone","clearCodeMirrorMarks","livelyExample","lively4url","livelyMigrate","obj"],"mappings":"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","file":"lively-editor.js","sourcesContent":["/*MD\n# Lively 4 Text Editor\n\n[doc](../../../doc/tools/editor.md)\n\n - simple load/save/navigate UI, that can be disabled to use elsewhere, e.g. container\n - updates change indicator while when editting,loading, and saving\n \n![](lively-editor.png){height=200} \n \n \nWe have to many objects called \"editor\", because they wrap around and FACADE each other.\n\n- (babylonian-programming-editor)\n - lively-editor\n   - lively-code-mirror\n     - cm CodeMirror object\n \n![](../../../doc/figures/editors.drawio)\n\nMD*/\n\nimport Strings from \"src/client/strings.js\"\nimport Morph from 'src/components/widgets/lively-morph.js'\nimport moment from \"src/external/moment.js\"\nimport diff from 'src/external/diff-match-patch.js'\nimport components from \"src/client/morphic/component-loader.js\"\nimport {pt} from \"src/client/graphics.js\"\nimport {getObjectFor, updateEditors} from \"utils\";\nimport files from \"src/client/files.js\"\n\nimport {AnnotatedText, Annotation, default as AnnotationSet} from \"src/client/annotations.js\"\nimport ContextMenu from 'src/client/contextmenu.js'\n\nexport default class Editor extends Morph {\n\n  /*MD ## Setup MD*/\n  \n  async initialize() {\n    var container = this.get(\".container\");\n\t\tthis.versionControl = this.shadowRoot.querySelector(\"#versionControl\");\n    \n    var editor = document.createElement(\"lively-code-mirror\")\n    editor.id = \"editor\"; // this is important to do before opening \n    await components.openIn(container, editor);\n    editor.setAttribute(\"overscroll\", \"contain\")\n    editor.setAttribute(\"wrapmode\", true)\n    editor.setAttribute(\"tabsize\", 2)\n\n    editor.doSave = async (text) => {\n      await this.saveFile(); // CTRL+S does not come through...    \n    };\n    \n    \n    this.addEventListener(\"drop\", evt => {\n      this.onDrop(evt)\n    })       \n    \n    this.get(\"lively-version-control\").editor = editor\n\n    this.registerButtons();\n    var input = this.get(\"#filename\");\n    \n    input.addEventListener(\"keyup\", event => {\n      if (event.keyCode == 13) { // ENTER\n        this.onFilenameEntered(input.value);\n      }\n    });\n    var url = this.getAttribute(\"url\") \n    if (url) {\n      this.setURL(url)\n    }\n    \n    container.dispatchEvent(new Event(\"initialized\"));   \n    editor.addEventListener('change', () => {\n      this.onTextChanged();\n    });\n    \n    this.addEventListener(\"paste\", evt => this.onPaste(evt))\n    this.addEventListener('contextmenu', evt => this.onContextMenu(evt), false);  \n    \n    // wait for CodeMirror for adding custom keys\n    await  editor.editorLoaded()\n    editor.registerExtraKeys({\n      \"Alt-P\": cm => {\n        // lively.notify(\"toggle widgets\")\n        this.toggleWidgets();\n      },\n      \n      \"Ctrl-Alt-P\": cm => {\n        // #TODO how can we have custom snippets?\n        this.currentEditor().replaceSelection(`/*MD MD*/`)\n        this.currentEditor().execCommand(`goWordLeft`)\n      }\n\n    })\n  }\n\n  updateChangeIndicator() {\n    if (!this.lastText) return;\n    var newText = this.currentEditor().getValue();\n    if (newText != this.lastText) {\n      this.get(\"#changeIndicator\").style.backgroundColor = \"rgb(220,30,30)\";\n      this.textChanged = true;\n    } else {\n      if (this.annotatedText && !this.annotatedText.equals(this.lastAnnotatedText)) {\n        this.get(\"#changeIndicator\").style.backgroundColor = \"rgb(20,20,220)\";  \n        this.textChanged = false;\n      } else {\n        this.get(\"#changeIndicator\").style.backgroundColor = \"rgb(200,200,200)\";\n        this.textChanged = false;\n      }\n    }\n  }\n  \n  updateOtherEditors() {\n    console.warn('updateEditors')\n    const url = this.getURL().toString();\n    updateEditors(url, [this]);\n  }\n  \n  updateEditorMode() {\n    var url = this.getURL();\n    if (!url) return;\n    var editorComp = this.get(\"#editor\");\n    if (editorComp && editorComp.changeModeForFile) {\n      editorComp.changeModeForFile(url.pathname);\n    }\n  }\n  /*MD ## Event Handlers MD*/\n  \n  onTextChanged() {\n    this.updateChangeIndicator();\n  }\n\n  onSaveButton() {\n    this.saveFile();\n  }\n  \n  onLoadButton() {\n    this.loadFile();\n  }\n  \n  onVersionsButton() {\n    this.toggleVersions();\n  }\n  \n  onLoadVersionButton() {\n    this.loadFile(this.currentVersion());\n  }\n\n  onCloseVersionsButton() {\n    this.toggleVersions()\n  }\n  \n  \n  onPaste(evt) {\n    if(this.insertDataTransfer(evt.clipboardData, undefined, true)) {\n      evt.stopPropagation()\n      evt.preventDefault();\n    }\n  }\n  \n  async onBrowse() {\n    lively.openBrowser(this.getURLString())\n  }\n  \n  async onDrop(evt) {\n    \n    if(this.insertDataTransfer(evt.dataTransfer, evt, false)) {\n      evt.stopPropagation()\n      evt.preventDefault();\n    }\n  }\n  \n  onContextMenu(evt) {\n    if (!evt.shiftKey) {\n      evt.stopPropagation();\n      evt.preventDefault();\n      var menu = new ContextMenu(this, [\n          [\"<b>Annotations</b>\", this.annotatedText ? () => this.enableAnnotations() : null],\n          [\"mark <span style='background-color: yellow'>yellow</span>\", () => this.onAnnotationsMarkColor(\"yellow\")],\n          [\"mark <span style='background-color: blue'>blue</span>\", () => this.onAnnotationsMarkColor(\"blue\")],\n          [\"mark <span style='background-color: red'>red</span>\", () => this.onAnnotationsMarkColor(\"red\")],\n          [\"clear\", () => this.onAnnotationsClear()],\n        ]);\n      menu.openIn(document.body, evt, this);\n      return \n    }\n  }\n  \n  /*MD ## Getters/Setters MD*/\n  \n  getVersionWidget() {\n    var myWindow = lively.findWindow(this)\n    if (myWindow) {\n      var versionControl = myWindow.querySelector(\"#versionControl\")\n    }\n    return versionControl.get(\"#versions\")  \n  }\n  \n  currentVersion() {\n    var selection = this.getVersionWidget().selection;\n    if (selection) return selection.version;\n  }\n  \n  async onFilenameEntered() {\n    this.setAttribute(\"url\", this.getURLString())\n    await this.loadFile();\n    this.dispatchEvent(new CustomEvent(\"url-changed\", {detail: { url: this.getURLString() }}));\n  }\n\n  getMountURL() {\n    return \"https://lively4/sys/fs/mount\";\n  }\n\n  currentEditor() {\n    return this.get('#editor').editor;\n  }\n  \n  getURL() {\n    try {\n      return new URL(this.getURLString());\n    } catch(e) {\n      return undefined\n    }\n  }\n\n  getURLString() {\n    return this.getSubmorph('#filename').value;\n  }\n\n  setURL(urlString) {\n    if (!urlString) {\n      this.getSubmorph(\"#filename\").value = \"\";\n    } else {\n      var url = new URL(urlString);\n      this.getSubmorph(\"#filename\").value = url.href;\n    }\n    \n    this.dispatchEvent(new CustomEvent(\"url-changed\", {detail: {url: urlString}}))\n  }\n\n  setText(text, preserveView) {\n    text = text.replace(/\\r\\n/g, \"\\n\") // code mirror changes it anyway\n    this.lastText = text;\n    var codeMirror = this.currentEditor();\n    var cur = this.getCursor()\n    var scroll = this.getScrollInfo()\n\n    \n    if (codeMirror) {\n      if (!this.isCodeMirror()) {\n          var oldRange = this.currentEditor().selection.getRange()\n      }\n\n      this.updateChangeIndicator();\n      codeMirror.setValue(text);\n      if (codeMirror.resize) codeMirror.resize();\n      this.updateEditorMode();\n      \n      this.showEmbeddedWidgets()\n      \n    } else {\n      // Code Mirror\n      this.get('#editor').value = text\n    }\n    \n    if (preserveView) {\n      this.setScrollInfo(scroll)\n      this.setCursor(cur)\n      if (!this.isCodeMirror()) {\n        this.currentEditor().selection.setRange(oldRange)\n      }\n    }\n    return text\n  }\n  \n  getText() {\n    return this.get('#editor').value \n  }\n  \n  getScrollInfo() {\n    if (!this.isCodeMirror()) return \n    return this.withEditorObjectDo(editor => editor.getScrollInfo())\n  }\n  \n  setScrollInfo(info) {\n    if (!this.isCodeMirror()) return \n    return this.withEditorObjectDo(editor => editor.scrollTo(info.left, info.top))\n  }\n  \n  getCursor() {\n    if (!this.isCodeMirror()) return \n    return this.withEditorObjectDo(editor => editor.getCursor())\n  }\n  \n  setCursor(cur) {\n    if (!cur || !this.isCodeMirror()) return \n    return this.withEditorObjectDo(editor => editor.setCursor(cur))\n  }  \n  \n  isCodeMirror() {\n    return this.get(\"#editor\").tagName == \"LIVELY-CODE-MIRROR\"\n  }\n  \n  /*MD ## Get UI Elements MD*/\n  \n  livelyEditor() {\n    return this  \n  }\n  \n  livelyCodeMirror() {\n    return this.get('#editor')\n  }\n  \n  // #deprecated\n  withEditorObjectDo(func) {\n    var editor = this.currentEditor()\n    if (editor) {\n      return func(editor)\n    }    \n  }\n\n  // #refactor #generalize?\n  async awaitEditor() {\n    while(!editor) {\n      var editor = this.currentEditor()\n      if (!editor) {\n        await lively.sleep(10) // busy wait\n      }\n    }\n    return editor\n  }\n\n  /*MD ## Files MD*/\n  \n  async loadFile(version) {\n    var url = this.getURL();\n    \n    // console.log(\"load \" + url);\n    this.updateEditorMode();\n\n    try {\n      var response = await fetch(url, {\n        headers: {\n          fileversion: version\n        }\n      })\n      // remember the commit hash (or similar version information) if loaded resource\n      this.lastVersion = response.headers.get(\"fileversion\");\n        // lively.notify(\"loaded version \" + this.lastVersion);\n      var text = await response.text();\n      var result =  this.setText(text, true); \n    } catch(e) {\n        lively.notify(\"Could not load file \" + url +\"\\nMaybe next time you are more lucky?\");\n        return \"\"\n    }\n    this.dispatchEvent(new CustomEvent(\"loaded-file\", {detail: {\n          \"url\": url,\n          \"text\": result,\n          \"version\": this.lastVersion}})); \n    \n\n    await this.checkAndLoadAnnotations()\n    \n    if (this.postLoadFile) {\n      result = await this.postLoadFile(result) // #TODO babylonian programming requires to adapt editor behavior\n    }\n    \n    return result\n  }\n\n  async checkAndLoadAnnotations() {\n    if(await lively.files.exists(this.getAnnotationsURL())) {\n      this.enableAnnotations()   \n    } else {\n      this.disableAnnotations()   \n    }\n  }\n  async saveFile() {\n    var url = this.getURL();\n    // console.log(\"save \" + url + \"!\");\n    // console.log(\"version \" + this.latestVersion);\n    var data = this.currentEditor().getValue();\n    if (this.preSaveFile) {\n      data = await this.preSaveFile(data)\n    }\n  \n    var urlString = url.toString();\n    if (urlString.match(/\\/$/)) {\n      return fetch(urlString, {method: 'MKCOL'});\n    } else {\n      window.LastData = data\n      \n      var headers = {}\n      if (this.lastVersion) {\n        headers.lastversion = this.lastVersion\n      }\n      if (urlString.match(/\\.svg$/)) {\n        headers['Content-Type'] = 'image/svg+xml'\n      }\n      \n      \n        /*MD ### Example \n```javascript\n  fetch(\"https://lively-kernel.org/lively4/lively4-dummy/foo/hello2.txt\", {\n  method: \"PUT\",\n  body: \"hello world\"\n}).then(r => r.text())\n```\n  ```\n {\n  \"type\": \"file\",\n  \"name\": \"foo/hello2.txt\",\n  \"size\": 11,\n  \"version\": \"716c0289ecba04604307d33734285314ab783235\",\n  \"modified\": \"2020-02-19 14:21:03\"\n}\n  ```\n  MD*/\n      try {\n        var response = await fetch(urlString, {\n          method: 'PUT', \n          body: data,\n          headers: headers\n        })\n        // console.log(\"edited file \" + url + \" written.\");\n        var newVersion = response.headers.get(\"fileversion\");\n        var conflictVersion = response.headers.get(\"conflictversion\");\n        // lively.notify(\"LAST: \" + this.lastVersion + \" NEW: \" + newVersion + \" CONFLICT:\" + conflictVersion)\n        if (conflictVersion) {\n          return this.solveConflict(conflictVersion, newVersion);\n        }\n        if (newVersion) {\n          // lively.notify(\"new version \" + newVersion);\n          this.lastVersion = newVersion;\n        }\n        lively.notify(\"saved file\", url );\n        this.lastText = data;\n        this.lastAnnotatedText = this.annotatedText\n        this.updateChangeIndicator();\n        this.updateOtherEditors();\n\n        var stats = {version: newVersion}\n\n        this.dispatchEvent(new CustomEvent(\"saved-file\", {detail: {\n          \"url\": urlString,\n          \"text\": data,\n          \"version\": this.lastVersion}})); \n        \n        return stats\n\n      } catch(e) {\n         lively.notify(\"Could not save file\" + url +\"\\nMaybe next time you are more lucky?:\", response);\n         throw new Error(\"LivelyEditor save failed:\" + e);\n        // don't catch here... so we can get the error later as needed...\n      }\n    }\n  }\n  \n  /*MD ## Merging MD*/\n  \n  threeWayMerge(a,b,c) {\n    var dmp = new diff.diff_match_patch();\n    var diff1 = dmp.diff_main(a, b);\n    var diff2 = dmp.diff_main(a, c);\n    \n    var patch1 = dmp.patch_make(diff1);\n    var patch2 = dmp.patch_make(diff2);\n    var merge = dmp.patch_apply(patch1.concat(patch2), a);\n    // #TODO handle conflicts detected in merge\n    return merge[0];\n  }\n\n  highlightChanges(otherText) {\n    var editor = this.currentEditor();\n    var myText = editor.getValue(); // data\n    var dmp = new diff.diff_match_patch();\n    var d = dmp.diff_main(otherText, myText);\n    var index = 0;\n    for (var ea of d) {\n      var change = ea[0];\n      var text = ea[1];\n      index = this.highlightChange(change, editor, text, index);\n    }\n  }  \n\n  highlightChange(change, editor, text, index) {\n    if (change != 0) {\n      var cm = editor;\n      var toPos;\n      var backgroundColor;\n      let marker;\n      let widget = <span>{text}</span>;\n      let targetColor = \"black\";\n      if (change == 1) {\n        // Added \n        toPos = cm.posFromIndex(index + text.length);\n        backgroundColor = \"green\";\n        try {\n          marker = cm.markText(cm.posFromIndex(index), toPos, { replacedWith: widget });\n        } catch(e) {\n          console.warn(\"[lively-editor] Could not mark change\");\n        }\n      } else {\n        backgroundColor = \"red\";\n        targetColor = \"transparent\";\n        try {\n          marker = cm.setBookmark(cm.posFromIndex(index), { widget: widget });\n        } catch(e) {\n          console.warn(\"[lively-editor] Could not set bookmark\");\n        }\n      }\n      var animation = widget.animate([{ background: backgroundColor, color: \"black\" }, { background: \"transparent\", color: targetColor }], {\n        duration: 3000\n      });\n      animation.onfinish = () => marker.clear();\n    } else {\n\n      index += text.length;\n    }\n\n    return index;\n  }\n\n  \n  /*\n   * solveConflict\n   * use three-way-merge\n   */\n  async solveConflict(otherVersion, newVersion) {\n    var conflictId = `conflic-${otherVersion}-${newVersion}`;\n    if (this.solvingConflict == conflictId) {\n      lively.error(\"Sovling conflict stopped\", \"due to recursion: \" + this.solvingConflict);\n      return;\n    }\n    if (this.solvingConflict) {\n      lively.warn(\"Recursive Solving Conflict\", \"\" + this.solvingConflict + \" and now: \" + conflictId);\n      return;\n    }\n\n    lively.notify(\"Solve Conflict between: \" + otherVersion + `and ` + newVersion);\n    var parentText = this.lastText; // \n    // load from conflict version\n    let url = this.getURL();\n    var otherText = await fetch(url, {\n      headers: { fileversion: otherVersion }\n    }).then(r => r.text());\n    var myText = this.currentEditor().getValue(); // data\n\n    // #TODO do something when actual conflicts occure?\n    var mergedText = this.threeWayMerge(parentText, myText, otherText);\n    this.setText(mergedText, true);\n    this.highlightChanges(myText);\n    this.lastVersion = otherVersion;\n    this.solvingConflict = conflictId;\n    let stats = {}\n    try {\n      // here it can come to infinite recursion....\n      stats = await this.saveFile();\n    } finally {\n      this.solvingConflict = false;\n    }\n    if (stats) {\n      var mergedVersion = stats.version\n      this.dispatchEvent(new CustomEvent(\"solved-conflict\", {detail: {\n        \"url\": url,\n        \"other-version\": otherVersion,\n        \"other-text\": otherText,\n        \"my-version\": newVersion,\n        \"my-text\": myText,\n        \"text\": mergedText,\n        \"version\": mergedVersion}}));      \n    } else {\n      // could not save file... :-(\n    }\n    \n  }\n  \n  /*MD ## Editor MD*/\n\n  showToolbar() {\n    this.getSubmorph(\"#toolbar\").style.display = \"\";\n  }\n  \n  hideToolbar() {\n    this.getSubmorph(\"#toolbar\").style.display = \"none\";\n  }\n\n  toggleVersions() {\n    var editor = this.shadowRoot.querySelector(\"#editor\");\n\n    if (this.versionControl.style.display == \"block\") {\n      this.versionControl.remove()\n      this.versionControl.style.display = \"none\";\n      if (editor.editView) {\n        editor.editView(); // go back into normal editing...\n      }\n    } else {\n      var myWindow = lively.findWindow(this)\n      if (myWindow.isWindow) {\n        myWindow.get(\".window-content\").style.overflow = \"visible\"\n      }\n      myWindow.appendChild(this.versionControl)\n\n      this.versionControl.style.display = \"block\";\n      this.versionControl.style.backgroundColor = \"gray\";\n            \n      this.versionControl.querySelector(\"#versions\").showVersions(this.getURL());\n      lively.setGlobalPosition(this.versionControl, \n        lively.getGlobalPosition(this).addPt(pt(lively.getExtent(this.parentElement).x,0)));\n      // we use \"parentElement\" because the extent of lively-editor is broken #TODO\n      lively.setExtent(this.versionControl, pt(400, 500))\n      this.versionControl.style.zIndex = 10000;\n\n    }\n  }\n  \n  find(pattern) {\n    var editor = this.get('#editor')\n    if (editor) {\n      editor.find(pattern)\n    }\n  }\n  /*MD ## Copy and Paste MD*/\n  \n  insertDataTransfer(dataTransfer, evt, generateName) {\n    // #CopyAndPaste mild code duplication with #Clipboard \n    \n    var items = dataTransfer.items;\n    if (items.length> 0) {\n      for (var index in items) {\n        var item = items[index];\n        if (item.kind === 'file') {\n          this.pasteFile(item, evt, generateName) \n          return true\n        }\n        if (item.type == 'lively/element') {\n          \n          item.getAsString(data => {\n            var element = getObjectFor(data)\n            if (element.localName == \"lively-file\") {\n              this.pasteDataUrlAs(element.url, \n                                  this.getURLString().replace(/[^/]*$/,\"\") + element.name, \n                                  element.name, \n                                  evt)\n            }\n            \n            // lively.showElement(element)\n          })\n          \n          return true\n        }\n      }\n    }\n  }\n\n  async pasteFile(fileItem, evt, generateName) {\n    var editor = this.currentEditor()\n    if (!editor) return;\n    var file = fileItem.getAsFile();\n    if (generateName) {\n      var name = \"file_\" + moment(new Date()).format(\"YYMMDD_hhmmss\")\n      var selection = editor.getSelection()\n      if (selection.length > 0 ) name = selection;\n      var filename = name + \".\" + fileItem.type.replace(/.*\\//,\"\")\n      filename = await lively.prompt(\"paste as... \", filename)\n      \n    } else {\n      filename = fileItem.getAsFile().name\n      if (filename.match(/\\.((md)|(txt))/)) return // are handle by code mirror to inline text // #Content vs #Container alt: value vs reference? #Journal\n      \n    }\n    if (!filename) return\n    \n    var newurl = this.getURLString().replace(/[^/]*$/,\"\") + filename \n    \n    var dataURL = await files.readBlobAsDataURL(file)  \n    this.pasteDataUrlAs(dataURL, newurl, filename, evt)\n  }\n  \n  async pasteDataUrlAs(dataURL, newurl, filename, evt) {\n\n    var blob = await fetch(dataURL).then(r => r.blob())\n    await files.saveFile(newurl, blob)\n    \n    this.withEditorObjectDo(editor => {\n      var text = encodeURIComponent(filename).replace(/%2F/g,\"/\")\n      if (this.getURLString().match(/\\.md/)) {\n        if (files.isVideo(filename)){\n          text = `<video autoplay controls><source src=\"${text}\" type=\"video/mp4\"></video>`\n        } else if (files.isPicture(filename)){\n          text = \"![](\" + text + \")\" // #ContextSpecificBehavior ?  \n        } else {\n          text = `[${text.replace(/.*\\//,\"\")}](${text})`\n          \n        }\n      }  \n\n      // #Hack... this is ugly... but seems the official way to do it\n      if (evt) {\n        var coords = editor.coordsChar({\n          left:   evt.clientX + window.scrollX,\n          top: evt.clientY + window.scrollY\n        });\n        editor.setSelection(coords)        \n      }\n      editor.replaceSelection(text, \"around\")      \n    })\n\n    lively.notify(\"uploaded \" + newurl)\n    \n    var navbar = lively.query(this, \"lively-container-navbar\")\n    if (navbar) navbar.update() \n  }\n  \n  /*MD ## Widgets MD*/\n  \n  async showEmbeddedWidgets() {\n    var url = this.getURL()\n    if (!url) return\n    var type = files.getEnding(url)\n    var codeMirrorComponent = this.get(\"lively-code-mirror\")\n    if (!codeMirrorComponent) return\n\n    if (type == \"js\") {\n      for(let m of Strings.matchAll(/\\/\\*((?:HTML)|(?:MD))(.*?)\\1\\*\\//, codeMirrorComponent.value)) {\n          var widgetName = \"div\"\n          var mode = m[1]\n          if (mode == \"MD\") {\n            widgetName = \"lively-markdown\"\n          }\n          let cm = codeMirrorComponent.editor,\n            // cursorIndex = cm.doc.indexFromPos(cm.getCursor()),\n            fromIndex = m.index,\n            toIndex = m.index + m[0].length\n                           \n          // if (cursorIndex > fromIndex && cursorIndex < toIndex) continue;\n          var from = cm.posFromIndex(fromIndex)\n          var to = cm.posFromIndex(toIndex)\n          let widget = await codeMirrorComponent.wrapWidget(widgetName, from, to)\n          // widget.style.border = \"2px dashed orange \"\n          widget.classList.add('inline-embedded-widget');\n          lively.removeEventListener('widget', widget)\n          // widget.style.padding = \"5px\"\n//           lively.addEventListener(\"context\", widget, \"contextmenu\", evt => {\n//             if (!evt.shiftKey) {\n//                const menuElements = [\n//                 [\"edit source\", () =>  widget.marker.clear()],\n//               ];\n//               const menu = new lively.contextmenu(this, menuElements)\n//               menu.openIn(document.body, evt, this)\n              \n//               evt.stopPropagation();\n//               evt.preventDefault();\n//               return true;\n//             }\n//           })\n        \n          if (mode == \"MD\") {\n            await widget.setContent(m[2])    \n            let container = lively.query(this, \"lively-container\")\n            if (container) {\n              lively.html.fixLinks(widget.shadowRoot.querySelectorAll(\"[href],[src]\"), \n                                    this.getURLString().replace(/[^/]*$/,\"\"),\n                                    url => container.followPath(url))\n            }\n          } else {\n            widget.innerHTML = m[2]\n            let container = lively.query(this, \"lively-container\")\n            if (container) {\n              lively.html.fixLinks(widget.querySelectorAll(\"[href],[src]\"), \n                                    this.getURL().toString().replace(/[^/]*$/,\"\"),\n                                    url => container.followPath(url))\n            }\n            \n          }\n      }\n     \n    }\n  }\n  \n  async hideEmbeddedWidgets() {\n    var codeMirrorComponent = this.get(\"lively-code-mirror\")\n    if (!codeMirrorComponent) return\n    codeMirrorComponent.editor.doc.getAllMarks()\n      .filter(ea => ea.widgetNode && ea.widgetNode.querySelector(\".lively-widget\")).forEach(ea => ea.clear())\n  }\n  \n  async toggleWidgets() {\n    var codeMirrorComponent = this.get(\"lively-code-mirror\")\n    if (!codeMirrorComponent) return\n    \n    // var cm = codeMirrorComponent.editor\n    // var cursorPos = cm.getCursor()\n    \n    var allWidgets = codeMirrorComponent.editor.doc.getAllMarks()\n      .filter(ea => ea.widgetNode && ea.widgetNode.querySelector(\".lively-widget\"))\n    if (allWidgets.length == 0) {\n      await this.showEmbeddedWidgets()\n    } else {\n      await this.hideEmbeddedWidgets()\n    }\n    \n    // scroll back into view...\n    // #TODO make it stable...\n    // await lively.sleep(1000)\n    // cm.setCursor(cursorPos)\n    // cm.scrollTo(null, cm.charCoords(cursorPos).top)\n  }\n  \n  async solveAnnotationConflict(newAnnotationsVersion, conflictingAnnotationsVersion) {\n    var cm = await this.awaitEditor()\n    // solveConflict\n    var lastText = this.lastAnnotatedText\n    var text = this.annotatedText\n    \n    if (this.solvingAnnotationConflict) {\n      lively.warn(\"prevent endless recursion in solving conflict?\")\n      return\n    }\n    lively.notify(\"Conflicting Annotations: \" + conflictingAnnotationsVersion)\n    \n    var parentAnnotations = lastText.annotations\n    var otherAnnotationsSource = await fetch(this.getAnnotationsURL(), {\n      headers: { fileversion: conflictingAnnotationsVersion }\n    }).then(r => r.text());\n    var otherAnnotations = AnnotationSet.fromJSONL(otherAnnotationsSource)\n  \n    var myAnnotations = text.annotations\n    \n    // only when no text diff.....\n    var mergedAnnotations =   myAnnotations.merge(otherAnnotations, parentAnnotations)\n      \n    text.annotations = mergedAnnotations\n    text.annotations.renderCodeMirrorMarks(cm)\n    text.annotations.lastVersion = conflictingAnnotationsVersion  // is not textVersion\n    \n    this.solvingAnnotationConflict = true;\n    try {\n      await this.saveAnnotations()\n    } finally {\n      this.solvingAnnotationConflict = false;\n    }\n  }\n  \n  /*MD ## Annotations MD*/\n  \n  getAnnotationsURL() {\n    return this.getURLString() + \".l4a\"\n  } \n  \n  async saveAnnotations(textVersion=this.lastVersion) {\n    var cm = await this.awaitEditor()\n    var text = this.annotatedText\n    text.setText(this.getText(), textVersion)\n    var response = await fetch(this.getAnnotationsURL(), {\n      method: 'PUT', \n      body: text.annotations.toJSONL(),\n      headers: {lastversion: this.annotatedText.annotations.lastVersion}\n    })\n    var newAnnotationsVersion = response.headers.get(\"fileversion\");\n    var conflictAnnotationsVersion = response.headers.get(\"conflictversion\");  \n    if (conflictAnnotationsVersion) {\n        await this.solveAnnotationConflict(newAnnotationsVersion, conflictAnnotationsVersion)\n    } else {\n      this.annotatedText.annotations.lastVersion = newAnnotationsVersion \n    } \n    \n    this.annotatedText.annotations.renderCodeMirrorMarks(cm)\n  }\n  \n  async onAnnotationsMarkColor(color=\"yellow\") {\n    if (!this.annotatedText) {\n      await this.enableAnnotations()\n    }\n    \n    var cm = await this.awaitEditor()\n    var from  = cm.indexFromPos(cm.getCursor(\"from\"))\n    var to  = cm.indexFromPos(cm.getCursor(\"to\"))  \n    var annotation = new Annotation({from: from, to: to, name: \"color\", color: color})\n    this.annotatedText.setText(this.getText())\n    this.annotatedText.annotations.add(annotation)\n    annotation.codeMirrorMark(cm)\n    this.updateChangeIndicator()\n  }\n  \n  async onAnnotationsClear() {\n    var cm = await this.awaitEditor()\n    var from  = cm.indexFromPos(cm.getCursor(\"from\"))\n    var to  = cm.indexFromPos(cm.getCursor(\"to\"))\n    this.annotatedText.annotations.removeFromTo(from, to)\n    this.annotatedText.annotations.renderCodeMirrorMarks(cm) \n    this.updateChangeIndicator()\n  }  \n  \n  async loadAnnotations(text, version) {\n    var cm = await this.awaitEditor()\n    // load annotated text in the version that was  last annotated\n    this.annotatedText  = await AnnotatedText.fromURL(this.getURLString(), this.getAnnotationsURL())\n    // set current text and version, and update annotations accordingly \n    this.annotatedText.setText(text, version)\n    this.annotatedText.annotations.renderCodeMirrorMarks(cm)\n    this.lastAnnotatedText = this.annotatedText.clone()\n  }\n  \n  async disableAnnotations() { \n    if (this.annotatedText) {\n      this.annotatedText.clearCodeMirrorMarks(await this.awaitEditor())\n    }\n    lively.removeEventListener(\"annotations\", this)\n    delete this.annotatedText\n  }\n  \n  async enableAnnotations() { \n    lively.removeEventListener(\"annotations\", this)\n    lively.addEventListener(\"annotations\", this, \"loaded-file\", async evt => {\n      this.loadAnnotations(evt.detail.text, evt.detail.version) \n    })\n    lively.addEventListener(\"annotations\", this, \"saved-file\", async evt => {\n      this.saveAnnotations(evt.detail.version)\n    })\n    // lively.addEventListener(\"annotations\", this, \"solved-conflict\", evt => {\n    //   // we can ignore this, since it will be solved... by the editor\n    //   lively.notify(\"TEXT CONFLICT \" + evt.detail.version )\n    // })\n    await this.loadAnnotations(this.getText(), this.lastVersion) \n  }\n  \n  \n  /*MD ## Hooks MD*/\n\n  livelyExample() {\n    this.setURL(lively4url + \"/README.md\");\n    this.loadFile()\n  }\n  \n  livelyMigrate(obj) {\n\t\tif (obj.versionControl) obj.versionControl.remove();\n    this.setURL(obj.getURL());\n    this.loadFile();\n  }\n}"]}