{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/components/tools/lively-editor.js"],"names":["Strings","Morph","moment","diff","preferences","components","pt","getObjectFor","updateEditors","files","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","editorLoaded","addKeys","cm","toggleWidgets","updateChangeIndicator","lastText","newText","currentEditor","getValue","style","backgroundColor","textChanged","updateOtherEditors","console","warn","getURL","toString","onSaveButton","onLoadButton","loadFile","onVersionsButton","toggleVersions","onLoadVersionButton","currentVersion","onCloseVersionsButton","selection","version","getURLString","CustomEvent","detail","getMountURL","URL","getSubmorph","urlString","href","setText","preserveView","replace","codeMirror","cur","getCursor","scroll","getScrollInfo","isCodeMirror","oldRange","getRange","setValue","resize","updateEditorMode","showEmbeddedWidgets","setScrollInfo","setCursor","setRange","editorComp","changeModeForFile","pathname","log","result","fetch","headers","fileversion","then","response","lastVersion","err","lively","notify","postLoadFile","data","preSaveFile","match","method","window","LastData","lastversion","body","newVersion","conflictVersion","solveConflic","threeWayMerge","a","b","c","dmp","diff_match_patch","diff1","diff_main","diff2","patch1","patch_make","patch2","merge","patch_apply","concat","otherVersion","solvingConflict","parentText","myText","otherText","r","mergedText","showToolbar","display","hideToolbar","remove","editView","myWindow","findWindow","isWindow","overflow","appendChild","showElement","showVersions","setGlobalPosition","getGlobalPosition","addPt","getExtent","parentElement","x","setExtent","zIndex","withEditorObjectDo","func","livelyEditor","livelyCodeMirror","awaitEditor","sleep","info","scrollTo","left","top","find","pattern","tagName","insertDataTransfer","dataTransfer","generateName","items","length","index","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","replaceSelection","navbar","query","update","clipboardData","undefined","stopPropagation","preventDefault","onBrowse","openBrowser","getEnding","codeMirrorComponent","m","matchAll","widgetName","mode","fromIndex","toIndex","from","posFromIndex","to","widget","wrapWidget","border","removeEventListener","padding","setContent","innerHTML","html","fixLinks","querySelectorAll","followPath","hideEmbeddedWidgets","doc","getAllMarks","filter","ea","widgetNode","forEach","clear","allWidgets","livelyExample","lively4url","livelyMigrate","obj"],"mappings":"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","file":"lively-editor.js","sourcesContent":["/*\n * Lively 4 Text Editor\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\n/* \n## EDITOR ... we have to many objects called \"editor\", because the wrap around and FACADE each other...\n\n- (babylonian-programming-editor)\n - lively-editor\n   - lively-code-mirror\n     - cm CodeMirror object\n \n\n*/\n\nimport Strings from \"src/client/strings.js\"\n\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 preferences from 'src/client/preferences.js';\nimport components from \"src/client/morphic/component-loader.js\";\n\nimport {pt} from \"src/client/graphics.js\"\n\nimport {getObjectFor, updateEditors} from \"utils\";\nimport files from \"src/client/files.js\"\n\n\n\nexport default class Editor extends Morph {\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    \n    \n    editor.doSave = text => {\n      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    \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\n    \n    // wait for CodeMirror for adding custom keys\n    await  editor.editorLoaded()\n    editor.addKeys({\n      \"Alt-P\": cm => this.toggleWidgets()\n    })\n  }\n  \n  onTextChanged() {\n    this.updateChangeIndicator();\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      this.get(\"#changeIndicator\").style.backgroundColor = \"rgb(200,200,200)\";\n      this.textChanged = false;\n    }\n  }\n  \n  updateOtherEditors() {\n    console.warn('updateEditors')\n    const url = this.getURL().toString();\n    updateEditors(url, [this]);\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  currentVersion() {\n    var selection = this.get(\"#versions\").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    return new URL(this.getURLString());\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  updateEditorMode() {\n    var url = this.getURL();\n    var editorComp = this.get(\"#editor\");\n    if (editorComp && editorComp.changeModeForFile) {\n      editorComp.changeModeForFile(url.pathname);\n    }\n  }\n  \n  async loadFile(version) {\n    var url = this.getURL();\n    console.log(\"load \" + url);\n    this.updateEditorMode();\n\n    var result = await fetch(url, {\n      headers: {\n        fileversion: version\n      }\n    }).then( response => {\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      return response.text();\n    }).then((text) => {\n       return this.setText(text, true); \n    }, (err) => {\n        lively.notify(\"Could not load file \" + url +\"\\nMaybe next time you are more lucky?\");\n        return \"\"\n    });\n    if (this.postLoadFile) {\n      result = await this.postLoadFile(result) // #TODO babylonian programming requires to adapt editor behavior\n    }\n    return result\n  }\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    \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      await fetch(urlString, {\n        method: 'PUT', \n        body: data,\n        headers: headers\n      }).then((response) => {\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.solveConflic(conflictVersion);\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.updateChangeIndicator();\n        this.updateOtherEditors();\n      }, (err) => {\n         lively.notify(\"Could not save file\" + url +\"\\nMaybe next time you are more lucky?\");\n         throw err;\n      }); // don't catch here... so we can get the error later as needed...\n    }\n  }\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  /*\n   * solveConflict\n   * use three-way-merge\n   */ \n  async solveConflic(otherVersion) {\n    if (this.solvingConflict) {\n      lively.notify(\"Sovling conflict stopped, due to recursion1\")\n      return \n    }\n    \n    lively.notify(\"Solve Conflict: \" + otherVersion);\n    var parentText = this.lastText; // \n    var myText = this.currentEditor().getValue(); // data\n    // load from conflict version\n    var otherText = await fetch(this.getURL(), {\n        headers: {fileversion: otherVersion}\n      }).then( r => r.text()); \n\n    // #TODO do something when actual conflicts occure?\n    var mergedText = this.threeWayMerge(parentText, myText, otherText);\n    this.setText(mergedText, true);\n    this.lastVersion = otherVersion;\n    this.solvingConflict = true // here it can come to infinite recursion....\n    try {\n      await this.saveFile(); \n    } finally {\n      this.solvingConflict = false\n    }\n  }\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      lively.showElement(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  withEditorObjectDo(func) {\n    var editor = this.currentEditor()\n    if (editor) {\n      return func(editor)\n    }    \n  }\n  \n  \n  livelyEditor() {\n    return this  \n  }\n  \n  livelyCodeMirror() {\n    return this.get('#editor')\n  }\n  \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  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  find(pattern) {\n    var editor = this.get('#editor')\n    if (editor) {\n      editor.find(pattern)\n    }\n  }\n  \n  isCodeMirror() {\n    return this.get(\"#editor\").tagName == \"LIVELY-CODE-MIRROR\"\n  }\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  \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    \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)\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    \n    \n    lively.notify(\"uploaded \" + newurl)\n    \n    var navbar = lively.query(this, \"lively-container-navbar\")\n    if (navbar) navbar.update() \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  async showEmbeddedWidgets() {\n    var type = files.getEnding(this.getURL().toString())\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          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            widget.setContent(m[2])    \n            \n          } else {\n            widget.innerHTML = m[2]\n            var container = lively.query(this, \"lively-container\")\n            if (container) {\n              lively.html.fixLinks(widget.querySelectorAll(\"img, a\"), \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  toggleWidgets() {\n    lively.notify(\"yeah...\")\n    var codeMirrorComponent = this.get(\"lively-code-mirror\")\n    if (!codeMirrorComponent) return\n    \n    \n    \n    var allWidgets = codeMirrorComponent.editor.doc.getAllMarks()\n      .filter(ea => ea.widgetNode && ea.widgetNode.querySelector(\".lively-widget\"))\n    if (allWidgets.length == 0) {\n      this.showEmbeddedWidgets()\n    } else {\n      this.hideEmbeddedWidgets()\n    }\n  }\n  \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}"]}