{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-petrinet/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","lastScrollLeft","lastScrollTop","scrollingElement","scrollTop","scrollLeft","items","source","getText","hasGitMergeConflict","push","autoResolveMergeConflicts","onAnnotationsMarkColor","onAnnotationsClear","onDeleteAllAnnotations","enableAnnotations","menu","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","clearHistory","setScrollInfo","setCursor","setRange","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","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","writeResult","conflictAnnotationsVersion","indexFromPos","annotation","codeMirrorMark","removeFromTo","annotationsURL","confirm","loadAnnotations","fromURL","clone","clearCodeMirrorMarks","versions","extractGitMergeConflictVersions","versionA","versionB","versionBase","getGitMergeBase","serverURL","repositoryName","livelyExample","lively4url","livelyMigrate","obj"],"mappings":"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","file":"lively-editor.js","sourcesContent":["/*MD\n# Lively 4 Text Editor\n\n[doc](browse://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      \n      // #Hack #Workaround weired browser scrolling behavior\n      if (lively.lastScrollLeft || lively.lastScrollTop) {\n        document.scrollingElement.scrollTop = lively.lastScrollTop;\n        document.scrollingElement.scrollLeft = lively.lastScrollLeft;\n      }\n      var items = []\n      \n      var source = this.getText()\n      if (lively.files.hasGitMergeConflict(source)) {\n        // there is as git merge conflict here we have to deal with\n        items.push(...[\n            [\"(Auto) Resolve Merge Conglicts\", () => this.autoResolveMergeConflicts()],\n          ])\n      } else if (this.annotatedText) {\n        items.push(...[\n            [\"<b>Annotations</b>\"],\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            [\"delete all anntations\", () => this.onDeleteAllAnnotations()],\n          ])\n      } else {\n        items.push(...[\n            [\"<b>Enable Annotations</b>\", () => this.enableAnnotations()],\n          ])\n      }      \n      \n      \n      \n      var menu = new ContextMenu(this, items);\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    // To solve \"empty editor after Ctrl+Z\" bug clear undo history of Codemirror after initial file loading \n    this.clearHistory()\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  clearHistory() {\n    this.livelyCodeMirror().clearHistory()\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    \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    debugger\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    \n    \n    var response = await fetch(this.getAnnotationsURL(), {\n      method: 'PUT', \n      body: text.annotations.toJSONL(),\n      headers: {lastversion: this.annotatedText.annotations.lastVersion}\n    })\n    \n    var writeResult = await response.text()\n    lively.notify(\"save annotations: \" + writeResult)\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 onDeleteAllAnnotations() {\n    var cm = await this.awaitEditor()\n    this.annotatedText.annotations.removeFromTo(0, this.getText().length)\n    this.annotatedText.annotations.renderCodeMirrorMarks(cm) \n    this.updateChangeIndicator()\n    \n    // an now delete file...\n    var file = this.annotatedText.annotations.annotationsURL\n    if (await lively.confirm(\"delete all the annotations? <br><code>\"  + file +\"</code>\")) {\n      await fetch(file, {method: \"DELETE\"})\n    }\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(), version, true)\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    debugger\n    await this.loadAnnotations(this.getText(), this.lastVersion) \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  }\n  \n  // lets try to resolve the merge, that git could not resolve!\n  async autoResolveMergeConflicts() {\n    var source = this.getText()\n    \n    if (this.getURLString().match(/.l4a$/)) {\n      lively.notify(\"not supported yet... #TODO\")\n      \n      // use solveAnnotationConflict\n      return\n    }\n    \n     var versions = lively.files.extractGitMergeConflictVersions(source) \n    if (versions.length == 0) return // nothing to do\n    \n    if (versions.length != 2) throw new Error(\"merge  != 2 not support yet\")\n    var versionA= versions[0]\n    var versionB = versions[1]\n    var versionBase = await this.getGitMergeBase(serverURL, repositoryName, versionA, versionB)\n    \n    \n    lively.notify(\"yeah... here we go\")\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}"]}