{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-event-sourcing/src/components/tools/lively-container.js"],"names":["Morph","highlight","pt","ContextMenu","SyntaxChecker","components","cop","Favorites","files","Strings","Clipboard","fileEnding","replaceFileEndingWith","updateEditors","ViewNav","Upndown","AnnotatedText","Annotation","AnnotationSet","default","indentationWidth","isTestFile","ScopedScripts","Container","target","childNodes","initialize","getAttribute","setAttribute","windowTitle","isSearchBrowser","contentChangedDelay","checkForContentChanges","debounce","lively","addEventListener","evt","onMouseDown","html","addDeepMousePressed","get","history","url","unwindAndFollowHistoryUntil","forwardHistory","unwindAndFollowForwardHistoryUntil","dispatchEvent","CustomEvent","path","edit","useBrowserHistory","viewOrEditPath","input","code","onPathEntered","value","altKey","focusFiles","onclick","e","onFullscreen","registerButtons","onContextMenu","onKeyDown","onClick","hideCancelAndSave","hideControls","withAttributeDo","style","flex","onEditorBackNavigation","livelyContentLoaded","editFile","followPath","toString","match","normalizeURL","unsavedChanges","confirm","scrollToAnchor","m","innerHTML","appendChild","options","fetch","method","then","r","json","window","location","host","clearLoadingInfo","open","donotfollowpath","lastPath","_","last","startsWith","replace","push","opts","isFullscreen","isEditing","pushState","followInline","pathname","setPath","getPath","encodeURI","shadowRoot","querySelector","donotrender","display","isdir","URL","other","paths","normalize","type","container","preserveContentScroll","scrollTop","markdown","presentation","currentSlideNumber","lastPage","wasContentEditable","contentEditable","setPathAttributeAndInput","anchorMatch","anchor","console","log","overflow","getURL","resolvedURL","swxURL","content","showNavbar","sourceContent","render","lastVersion","renderTimeStamp","Date","now","format","getEnding","protocol","listingForDirectory","isPicture","appendHtml","isVideo","isAudio","headers","lively4url","resp","clear","contentType","status","getContentRoot","statusText","preventDefault","GitHub","System","import","gh","loadCredentials","lively4github","text","appendMarkdown","appendLivelyMD","appendCSV","sourceCountent","length","updateFavInfo","catch","err","notify","_history","_forwardHistory","getSourceCode","editor","currentEditor","getValue","getBaseURL","getDir","isURL","getEditor","editorType","currentEditorType","livelyEditor","localName","remove","Promise","resolve","create","id","awaitEditor","hideToolbar","livelyCodeMirror","Error","tagName","enableAutocompletion","getDoitContext","doSave","onSave","on","cm","onEditorCursorActivity","getOtherContainers","editing","document","body","querySelectorAll","filter","ea","otherURL","otherContainer","script","that","getLivelyCodeMirror","decodeURI","asyncGet","selector","maxtime","startTime","reject","check","found","setTimeout","isTemplate","filename","foundTemplate","searchTemplateFilename","contentIsTemplate","sourceCode","contentIsEditable","reloadModule","urlString","unloadModule","title","color","resetLoadingFailed","error","loadingFailed","loadTestModule","testRunner","group","scrollContainer","clearTests","resetMocha","runTests","sleep","groupEnd","loadModule","module","modules","lastLoadingFailed","b","border","moduleName","slice","details","openTemplateInstance","name","comp","openComponentInWindow","livelyExample","urlInHistory","pop","deleteFile","urls","includes","allURLs","Set","has","add","endsWith","newfile","walkDir","Array","from","sortBy","reverse","prefix","longestCommonPrefix","map","names","customDialog","dialog","messageDiv","maxHeight","backgroundColor","msg","join","result","update","renameFile","followFile","proposedNewName","base","newName","prompt","newURL","moveFile","newFile","ending","fileName","s","select","setSelectionRange","index","saveFile","showCancelAndSave","focus","newDirectory","char","String","fromCharCode","keyCode","charCode","ctrlKey","metaKey","shiftKey","onAccept","stopPropagation","key","switchBetweenJSAndHTML","composedPath","find","elements","onMarkdownContextMenu","onMarkdownClick","toggleControls","parentElement","isMaximized","toggleMaximize","zIndex","onToggleOptions","classList","contains","onFavorite","toggle","onBeautify","lastText","beautifulText","global","js_beautify","css_beautify","html_beautify","setText","onDelete","onApply","openBrowser","onSpawnTestRunner","warn","pos","getPosition","setTestPath","loadTests","onHome","clearNavbar","onSync","compWindow","openInWindow","w","setPosition","serverURL","setServerURL","repo","setRepository","sync","onEdit","onCancel","onUp","onBack","lastBackButtonClicked","halo","onBodyMouseDown","onForward","onBrowse","onDependencies","tree","dataName","d","setTreeData","findDependedModulesGraph","setExtent","focusDetails","onSaveAs","newPath","undefined","saveEditsInView","buildLatex","dir","pdf","buildPath","makeURL","logUniqId","show","showElement","mode","pdfContainers","queryAll","forEach","page","getCurrentPage","setURL","pdfLoaded","setCurrentPage","doNotQuit","__ignoreUpdates","LastURL","updateCSS","templateSourceCode","updateTemplate","m2","updateOtherContainers","testRegexp","checked","findDependedModules","onNewfile","onNewdirectory","onVersions","toggleVersions","onTextChanged","onHTMLMutation","mutations","observer","isPersisting","record","indicator","onMarkdownEditorCursorActivity","md","bind","setContent","startPresentation","gotoSlideAt","contentRoot","markdownCheckCheckboxAndSave","appendScript","scriptElement","layers","openPromises","root","createElement","beGlobal","src","onload","all","beNotGlobal","onerror","textContent","withLayers","d3","loadJavaScriptThroughDOM","ScopedD3","updateCurrentBodyAndURLFrom","nodes","parseHTML","appendTemplate","fixLinks","block","highlightBlock","comment","markdownMatch","updateView","whiteSpace","loadUnresolved","clipboard","initializeElements","resetContentChanges","observeHTMLChanges","table","setFromCSV","node","createComponent","loadByName","hideNavbar","getExtent","navbar","x","contextURL","navigateToName","data","showsControls","showControls","containerContent","containerEditor","codeMirror","session","setOptions","tabSize","useSoftTabs","changeModeForFile","checkAndLoadAnnotations","selection","moveCursorTo","lineWidth","setWrapLimit","renderer","setPrintMarginColumn","setTargetModule","getHTMLSource","livelyPrepareSave","saveSource","source","saveHTML","saveMarkdown","htmlAsMarkdownSource","contentElement","livelySource","contentChanged","textChanged","lastChecked","oldActiveElement","activeElement","currentSource","lastSource","updateChangeIndicator","baseURL","encodeURIComponent","nextURL","start","posFromIndex","end","setSelection","rect","getWrapperElement","getBoundingClientRect","topVisibleLine","lineAtHeight","top","bottomVisibleLine","bottom","line","scrollToLine","visibleLines","each","visibility","targetURLString","existingContainer","gotoWindow","browser","starIcon","mutationObserver","disconnect","MutationObserver","observe","childList","subtree","characterData","attributes","allElements","head","Object","values","templates","template","href","parent","fillTemplateStyle","waitOnQuerySelector","item","detailItems","onDetailsItemClick","pageNumberMatch","parseInt","element","allTextNodes","escapeRegExp","previousElementSibling","slide","allParents","setSlide","offset","getGlobalPosition","subPt","y","becomeMainContainer","hideTitlebar","onpopstate","event","state","preferences","getURLParameter","editPath","search","fullscreen","createLink","link","thumbnailFor","statFile","JSON","parse","contents","fileBrowser","openIn","setMainAction","setMainDirectoryAction","menuItems","showMarkdownElement","editMarkdownElement","showMarkdownAnnotations","checkbox","menu","removeAttribute","elementToMarkdown","range","getMarkdownRange","saveRegionWithEditor","sourceLine","split","n","parseFloat","setMarkdownRange","getCursor","highlights","lastEditCursorHighlight","borderColor","setGlobalPosition","markdownElements","first","containerShowMarkdownElement","markdownConverter","tabindent","bullet","convert","outerHTML","keepHtml","rangeOffset","lastMarkdownWorkspace","targetElement","workspace","insertBefore","editorLoaded","registerExtraKeys","Enter","renderMarkdown","tmpRange","annotationURL","exists","annotatedText","fromURL","renderedText","annotations","annotateInDOM","loadFile","lines","lastRangeLine","ch","replaceSelection","newRangeHeight","livleyEditor","livleyCodeMirror","localizePosition","offsetBounds","left","livelyAllowsSelection","livelyAcceptsDrop","livelyPreMigrate","oldContentScroll","oldScrollInfo","getScrollInfo","oldCursor","oldFocused","livelyTarget","markdownElement","livelyMigrate","isMigrating","otherCodeMirror","getRange","getScrollTop","thisCodeMirror","setScrollTop","setRange","setScrollInfo","setCursor"],"mappings":"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","file":"lively-container.js","sourcesContent":["/*MD # Lively Container \n\n[doc](browse://doc/tools/container.md)\n\n![](lively-container.png){height=400px}\n\nMD*/\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport highlight from 'src/external/highlight.js';\nimport {pt} from 'src/client/graphics.js';\nimport ContextMenu from 'src/client/contextmenu.js';\nimport SyntaxChecker from 'src/client/syntax.js';\nimport components from \"src/client/morphic/component-loader.js\";\nimport * as cop  from \"src/client/ContextJS/src/contextjs.js\";\nimport Favorites from 'src/client/favorites.js';\nimport files from \"src/client/files.js\"\nimport Strings from \"src/client/strings.js\"\nlet ScopedScripts; // lazy load this... #TODO fix #ContextJS #Bug actual stack overflow\nimport Clipboard from \"src/client/clipboard.js\"\nimport {fileEnding, replaceFileEndingWith, updateEditors} from \"utils\"\nimport ViewNav from \"src/client/viewnav.js\"\nimport Upndown from 'src/external/upndown.js'\nimport {AnnotatedText, Annotation, default as AnnotationSet} from \"src/client/annotations.js\"\nimport indentationWidth from 'src/components/widgets/indent.js';\nimport { isTestFile } from 'src/components/tools/lively-testrunner.js';\n\n/*MD\n\n![](lively-container.drawio)\n\nMD*/\n\n\nexport default class Container extends Morph {\n  \n  get target() { return this.childNodes[0] }\n  /*MD ## Setup MD*/\n  initialize() {\n    \n    // this.shadowRoot.querySelector(\"livelyStyle\").innerHTML = '{color: red}'\n\n    // there seems to be no <link ..> tag allowed to reference css inside of templates\n    // files.loadFile(lively4url + \"/templates/livelystyle.css\").then(css => {\n    //   this.shadowRoot.querySelector(\"#livelySt\\yle\").innerHTML = css\n    // })\n    if (!this.getAttribute(\"mode\")) {\n      this.setAttribute(\"mode\", \"show\")\n    }\n\n    this.windowTitle = \"Browser\";\n    if (this.isSearchBrowser) {\n      this.windowTitle = \"Search Browser\";\n    }\n\n    this.contentChangedDelay = (() => {\n      this.checkForContentChanges()\n    }).debounce(1000)\n\n    lively.addEventListener(\"Container\", this, \"mousedown\", evt => this.onMouseDown(evt));\n    \n    lively.html.addDeepMousePressed(this.get(\"#back\"), () => this.history(), (evt, url) => {\n      this.unwindAndFollowHistoryUntil(url)\n    })\n    lively.html.addDeepMousePressed(this.get(\"#forward\"), () => this.forwardHistory(), (evt, url) => {\n      this.unwindAndFollowForwardHistoryUntil(url)\n    })\n    \n    this.addEventListener(\"extent-changed\", function(evt) {\n      if (this.target) {\n        this.target.dispatchEvent(new CustomEvent(\"extent-changed\"));\n      }\n    });\n    \n    let path, edit;\n    if (!this.useBrowserHistory()) {\n    \tpath = this.getAttribute(\"src\");\n    \tedit = this.getAttribute(\"mode\") == \"edit\"\n    }\n    this.viewOrEditPath(path, edit)\n   \n    \n    // #TODO very ugly... I want to hide that level of JavaScript and just connect \"onEnter\" of the input field with my code\n    var input = this.get(\"#container-path\");\n    input.addEventListener(\"keyup\", evt => {\n      if (evt.code == \"Enter\") { \n        this.onPathEntered(input.value);\n      }\n      if (evt.altKey && evt.code == \"ArrowDown\") {\n        this.get(\"lively-container-navbar\").focusFiles()\n      }\n    });\n    this.get(\"#fullscreenInline\").onclick = (e) => this.onFullscreen(e);\n\n    this.registerButtons();\n\n    this.addEventListener('contextmenu',  evt => this.onContextMenu(evt), false);\n    this.addEventListener('keydown',   evt => this.onKeyDown(evt));\n    this.setAttribute(\"tabindex\", 0);\n    this.addEventListener('click',   evt => this.onClick(evt));\n    this.hideCancelAndSave();\n\n    if(this.getAttribute(\"controls\") ==\"hidden\") {\n      this.hideControls()\n    }\n    this.withAttributeDo(\"leftpane-flex\", value =>\n      this.get(\"#container-leftpane\").style.flex = value)\n    this.withAttributeDo(\"rightpane-flex\", value =>\n      this.get(\"#container-rightpane\").style.flex = value)\n    \n    this.addEventListener(\"editorbacknavigation\", (evt) => {\n      this.onEditorBackNavigation(evt)\n    }) \n  }\n  /*MD ## Navigation MD*/\n  // #private\n  viewOrEditPath(path, edit) {\n     if (path) {\n      if (edit) {\n        this.livelyContentLoaded = this.editFile(path);\n      } else {    \n        this.livelyContentLoaded = this.followPath(path)\n      }      \n    }\n  }\n  \n  // #important #api\n  async followPath(path) {\n    if (path.toString().match(/^https?:\\/\\//)) {\n      path = this.normalizeURL(path);\n    }\n    \n    if (this.unsavedChanges()) {\n      if (!await lively.confirm(\"You will lose unsaved changes, continue anyway?\")) {\n        return;\n      }\n    }\n    \n    if (path.match(/^#/)) {\n      // just anchor navigation\n      return this.scrollToAnchor(path)\n    }\n    \n\n    var m = path.match(/start\\.html\\?load=(.*)/);\n    if (m) {\n      return this.followPath(m[1]);\n    }\n    \n    this.get(\"#container-info\").innerHTML = \"\"\n    this.get(\"#container-info\").appendChild(<div id=\"loading-info\">Loading {path}</div>)\n    \n    \n    \n    try {\n      var options = await fetch(path, {method: \"OPTIONS\"}).then(r => r.json())\n    } catch(e) {\n      // no options... found\n    }\n    // this check could happen later\n    if (path.match(/^https?:\\/\\//) \n        && !path.match(\"https://lively4\") && !path.match(/http:?\\/\\/localhost/)\n        && !path.match(window.location.host)\n        && !path.match(\"https://www.draw.io/\")\n      ) {\n      if (!options) {\n        this.clearLoadingInfo()\n        return window.open(path);\n      }\n    }\n    if (options && options.donotfollowpath) {\n      fetch(path) // e.g. open://my-component\n      this.clearLoadingInfo()\n      return ;\n    }\n\n    var lastPath = _.last(this.history())\n    if (lastPath !== path) {\n      if (lastPath && path && path.startsWith(lastPath) && lastPath.match(/\\.md\\/?$/)) {\n        // we have a #Bundle here... and the navigation is already in the history\n      } else if(lastPath && path && (path.replace(/\\/index\\.((html)|(md))$/,\"\") == lastPath.replace(/\\/?$/,\"\"))) {\n        // we have a index file redirection here...\n      } else {\n        this.history().push(path);\n      }\n    }\n\n    var opts = \"\"\n    if (this.useBrowserHistory() && this.isFullscreen()) {\n      opts=\"&fullscreen=true\"\n    }\n    \n    if (this.isEditing() && (!path.match(/\\/$/) || path.match(/\\.((md)|(l4d))\\//))) {\n      if (this.useBrowserHistory())\n        window.history.pushState({ followInline: true, path: path },\n          'view ' + path, window.location.pathname + \"?edit=\"+path  + opts);\n      return this.setPath(path, true).then(() => this.editFile());\n    } else {\n      if (this.useBrowserHistory())\n        window.history.pushState({ followInline: true, path: path },\n          'view ' + path, window.location.pathname + \"?load=\"+path  + opts);\n      // #TODO replace this with a dynamic fetch\n      return this.setPath(path);\n    }\n  }\n  \n  clearLoadingInfo() {\n    this.get(\"#container-info\").innerHTML = \"\"\n  }\n  \n  getPath() {\n    return encodeURI(this.shadowRoot.querySelector(\"#container-path\").value);\n  }\n  \n  // #important\n  async setPath(path, donotrender) {\n    \n    this.get('#container-content').style.display = \"block\";\n    this.get('#container-editor').style.display = \"none\";\n\n    // if (this.viewNav) {\n    //   lively.setPosition(this.get(\"#container-root\"), pt(0,0))\n    //   this.viewNav.disable()\n    // }\n\n    this.windowTitle = path.replace(/.*\\//,\"\")\n    if (!path) {\n        path = \"\";\n    }\n\t  var isdir = path.match(/.\\/$/);\n\n    var url;\n    if (path.match(/^https?:\\/\\//)) {\n      url = new URL(this.normalizeURL(path));\n      // url.pathname = lively.paths.normalize(url.pathname);\n      path = \"\" + url;\n    } else if (path.match(/^[a-zA-Z]+:/)) {\n      url = new URL(path)\n      var other = true\n    } else {\n      path = lively.paths.normalize(path);\n      url = \"https://lively4\" + path\n    }\n    \n    // check if our file is a directory\n    \n    var options\n    try { \n      options = await fetch(url, {method: \"OPTIONS\"}).then(r =>  r.json())\n    } catch(e) {\n      options = {}\n    }\n    if (!isdir && !other) {\n      if (options && options.type == \"directory\") {\n        isdir = true\n      }\n      // console.log(\"[container] isdir \" + isdir)\n    }\n    if (!path.match(/\\/$/) && isdir ) {\n      path =  path + \"/\"\n    }\n\n    var container=  this.get('#container-content');\n    // don't scroll away whe reloading the same url\n    if (this.getPath() == path) {\n      this.preserveContentScroll = this.get(\"#container-content\").scrollTop;\n    }\n\n    var markdown = this.get(\"lively-markdown\")\n    if (markdown && markdown.get) {  // #TODO how to dynamically test for being initialized?\n      var presentation = markdown.get(\"lively-presentation\")\n      if (presentation && presentation.currentSlideNumber) {\n        this.lastPage  = presentation.currentSlideNumber()\n      }\n      this.wasContentEditable =   markdown.contentEditable == \"true\"\n    }\n    \n    this.setPathAttributeAndInput(path)\n    \n    var anchorMatch = path.match(/^(https?\\:\\/\\/[^#]*)(#.+)/)\n    if (anchorMatch) {\n      path = anchorMatch[1]\n      var anchor = anchorMatch[2]    \n      console.log(\"path \" + path)\n      console.log(\"anchor \" + anchor)\n      this.anchor = anchor\n    } else {\n      this.anchor = null\n    }\n        \n    // this.clear(); // don't clear here yet... makes browsing more stable\n    \n    \n    container.style.overflow = \"auto\";\n\n    url = this.getURL();\n    \n    if (!url.toString().match(/^https?:\\/\\//)) {\n      var resolvedURL = lively.swxURL(url)\n    } else {\n      resolvedURL = url\n    }\n    \n    this.content = \"\"\n  \n    this.showNavbar();\n  \n    // console.log(\"set url: \" + url);\n    this.sourceContent = \"NOT EDITABLE\";\n    var render = !donotrender;\n    // Handling directories\n\n\n    // Handling files\n    this.lastVersion = null; // just to be sure\n    var renderTimeStamp = Date.now() // #Idean, this is clearly a use-case for #COP, I have to refactor this propagate this dynamical context asyncronously #AsyncContextJS\n    this.renderTimeStamp = renderTimeStamp\n    \n    var format = files.getEnding(path)\n    if (url.protocol == \"search:\") {\n      format = \"html\"\n    }\n    if (path.match(/\\?html/)) {\n      format = \"html\"\n    }\n    if (!donotrender && path.match(/sap\\:/)) {\n      format = \"html\" // when viewing... we want HTML\n    }\n    \n    if (isdir) {\n      // return new Promise((resolve) => { resolve(\"\") });\n      if (!options || !options[\"index-available\"]) {\n        return this.listingForDirectory(url, render, renderTimeStamp)\n      } else {\n        format = \"html\" // e.g. #Bundle \n      }\n    }\n    // ACM #Hack... #TODO -> find out when content is HTML\n    if (format == \"cfm\") {\n      format = \"html\"\n    }\n    \n    if (files.isPicture(format)) {\n      if (render) {\n        fetch(resolvedURL) // cache bust IMG resources.... otherwise the SWX is not asked by the browser\n        return this.appendHtml(\"<img style='max-width:100%; max-height:100%' src='\" + resolvedURL +\"'>\", renderTimeStamp);\n      }\n      else return;\n    } else if (files.isVideo(format)) {\n      if (render) return this.appendHtml(`<video autoplay controls><source src=\"${resolvedURL}\" type=\"video/${format}\"></video>`, renderTimeStamp);\n      else return;\n    } else if (files.isAudio(format)) {\n      if (render) return this.appendHtml(`<audio controls src=\"${resolvedURL}\"></audio>`, renderTimeStamp); \n      else return;\n    } else if (format == \"pdf\") {\n      if (render) return this.appendHtml('<lively-pdf overflow=\"visible\" src=\"'\n        + resolvedURL +'\"></lively-pdf>', renderTimeStamp);\n      else return;\n    } \n    \n  \n    var headers = {}\n    if (format == \"html\") {\n      headers[\"content-type\"] = \"text/html\" // maybe we can convice the url to return html\n    }\n    if (path.match(/gs\\:/)) {\n      format = \"md\"\n    }\n    \n    headers['cache-control'] = 'no-cache'\n    // #deprecated since we now use no-ache\n    if (url.toString().match(lively4url)) {\n      headers[\"forediting\"] = true\n    }\n\n\n    \n    \n    \n    \n    return fetch(url, {\n      method: \"GET\",\n      headers: headers\n    }).then( resp => {\n    \n      \n      \n      this.clear(); // could already be filled again...\n      \n          \n      this.lastVersion = resp.headers.get(\"fileversion\");\n      this.contentType = resp.headers.get(\"content-type\");\n      if (this.contentType && this.contentType.match(\"image\"))  {\n        this.appendHtml(\"<img style='max-width:100%; max-height:100%' src='\" + resolvedURL +\"'>\", renderTimeStamp);\n        return  \n      }   \n      \n      // if (this.contentType.match(\"text/html\"))  {\n      //   format = \"html\"  \n      // }\n      \n      \n\n      // console.log(\"[container] lastVersion \" +  this.lastVersion)\n      \n      // Handle cache error when offline\n      if(resp.status == 503 || resp.status == 403) {\n        format = 'error'\n        \n        \n        // print error early...\n        this.getContentRoot().appendChild(\n          <div>\n            <h2>\n              <span style=\"color: darkred\">{resp.status} {resp.statusText} </span>\n            </h2>\n            <a href=\"\" click={async evt => {\n                evt.preventDefault()\n                var GitHub = await System.import(\"src/client/github.js\").then(m => m.default)\n                var gh = new GitHub()\n                await gh.loadCredentials()\n                window.lively4github =  gh\n              }}>maybe loginto github?</a>\n          </div>);\n        \n      }\n      \n      \n      return resp.text();\n    }).then((content) => {\n\n      console.log(\"setPath content \" + url)\n      \n      this.content = content\n      this.showNavbar();\n      \n      if (format == \"html\" || this.contentType.match(\"text/html\"))  {\n        this.sourceContent = content;\n        if (render) return this.appendHtml(content), renderTimeStamp;\n      } else if (format == \"md\") {\n        this.sourceContent = content;\n        if (render) return this.appendMarkdown(content, renderTimeStamp);\n      } else if (format == \"livelymd\") {\n        this.sourceContent = content;\n        if (render) return this.appendLivelyMD(content, renderTimeStamp);\n      } else if (format == \"csv\") {\n        this.sourceContent = content;\n        if (render) return this.appendCSV(content, renderTimeStamp);\n      } else if (format == \"error\") {\n        this.sourceCountent = content;\n        if (render) {\n          return this.appendHtml(`\n            <h2>\n              <span style=\"color: darkred\">Error: </span>${content}\n            </h2>\n          `, renderTimeStamp);\n        }\n      } else if (format == \"bib\") {\n        this.sourceContent = content;\n        if (render) {\n          return this.appendHtml('<lively-bibtex src=\"'+ url +'\"></lively-bibtex>', renderTimeStamp);\n        }\n      } else if (format == \"dot\") {\n        this.sourceContent = content;\n        if (render) {\n          \n          return this.appendHtml(`<graphviz-dot><script type=\"graphviz\">${content}</script></graphviz-dot>`, renderTimeStamp); \n        } else return;\n      } else if (format == \"xhtml\") {\n        this.sourceContent = content;\n        if (render) {\n          return this.appendHtml('<lively-iframe style=\"position: absolute; top: 0px;left: 0px;\" navigation=\"false\" src=\"'+ url +'\"></lively-iframe>', renderTimeStamp);\n        }\n      } else if (format == \"xml\" || format == \"drawio\") {\n        this.sourceContent = content;\n        if (render && content.match(/^\\<mxfile/)) {\n          return this.appendHtml(`<lively-drawio src=\"${resolvedURL}\"></<lively-drawio>`, renderTimeStamp);\n        }\n      } else {\n        if (content) {\n          if (content.length > (1 * 1024 * 1024)) {\n            if (render) return this.appendHtml(\"file size to large\", renderTimeStamp); \n          } else {\n            this.sourceContent = content;\n            if (render) return this.appendHtml(\"<pre><code>\" + content.replace(/</g, \"&lt;\") +\"</code></pre>\", renderTimeStamp);\n          }          \n        }\n      }\n    }).then(() => {\n      this.dispatchEvent(new CustomEvent(\"path-changed\", {url: this.getURL()}));\n      this.updateFavInfo();\n    })\n    .catch(function(err){\n      console.log(\"Error: \", err);\n      lively.notify(\"ERROR: Could not set path: \" + path,  \"because of: \", err);\n    });\n  }\n  \n  useBrowserHistory() {\n    return this.getAttribute(\"load\") == \"auto\";\n  }\n  \n  history() {\n    if (!this._history) this._history = [];\n    return this._history;\n  }\n\n  forwardHistory() {\n    if (!this._forwardHistory) this._forwardHistory = [];\n    return this._forwardHistory;\n  }\n  /*MD ## Getter / Setter MD*/\n\n  getSourceCode() {\n    var editor = this.get(\"#editor\")\n    if (!editor) return \"\"\n    return editor.currentEditor().getValue()\n  }\n  \n  getBaseURL() {\n    return this.getURL().toString().replace(/[#?].*/,\"\")\n  }\n\n  getContentRoot() {\n    // #Design #Lively4 The container should hide all its contents. The styles defined here should not affect others.\n    \n    // return this // #TODO only reason.. interacting with Halo and drag and drop into container...\n    \n    return this.get('#container-root'); // #TODO fix halo interactrion with this hidden content!\n\n    // #BUT #TODO Blockly and connectors just work globally...\n    // but we do not use blockly and connectors any more...\n    // return this;\n  }\n\n  getDir() {\n    return this.getPath().replace(/[^/]*$/,\"\");\n  }\n\n  getURL() {\n    var path = this.getPath();\n    if (!path) return;\n    if (files.isURL(path)) {\n      return new URL(path);\n    } if (path.match(/^[a-zA-Z]+:/)) {\n      return new URL(path);\n    } else {\n      return new URL(\"https://lively4/\" + path);\n    }\n  }\n  \n\n  async getEditor(editorType) {\n    editorType = editorType || this.currentEditorType || \"lively-editor\"\n    this.currentEditorType = editorType\n    \n    var container = this.get('#container-editor');\n    \n    var livelyEditor = container.querySelector(\"lively-image-editor, lively-editor, babylonian-programming-editor, lively-shadama-editor\");\n    \n    if (livelyEditor && (livelyEditor.localName != editorType)) {\n      livelyEditor.remove()\n      livelyEditor = null\n    }\n    \n    if (livelyEditor) return Promise.resolve(livelyEditor);\n      \n    livelyEditor = await lively.create(editorType, container);\n    livelyEditor.id = \"editor\";\n    \n    if (livelyEditor.awaitEditor) {\n      // console.log(\"[container] opened editor\")\n      livelyEditor.hideToolbar();\n      await livelyEditor.awaitEditor();\n      var livelyCodeMirror = livelyEditor.livelyCodeMirror();\n      if (!livelyCodeMirror) throw new Error(\"Could not initialalize lively-editor\");\n      if (livelyCodeMirror.tagName == \"LIVELY-CODE-MIRROR\") {\n        await new Promise(resolve => {\n          if (livelyCodeMirror[\"editor-loaded\"]) {\n            resolve() // the livelyEditor was very quick and the event was fired in the past\n          } else {\n            livelyCodeMirror.addEventListener(\"editor-loaded\", resolve)\n          }\n        })\n      }\n\n      livelyCodeMirror.enableAutocompletion();\n      livelyCodeMirror.getDoitContext = () => this.getDoitContext();\n\n      livelyCodeMirror.doSave = text => {\n        if (livelyCodeMirror.tagName !== \"LIVELY-CODE-MIRROR\") {\n          this.onSave(); // CTRL+S does not come through...\n        }\n      }  \n      \n      livelyCodeMirror.editor.on(\"cursorActivity\", cm => {\n        this.onEditorCursorActivity(cm)\n      });\n      \n    }\n    return livelyEditor;\n  }\n  \n  getOtherContainers(editing=false) {\n    var url = this.getURL()\n    if (!url) return\n    return document.body.querySelectorAll(\"lively-container\").filter(ea => {\n      var otherURL = ea.getURL()\n      return otherURL && ea.isEditing() == editing && (otherURL.pathname == url.pathname) && (otherURL.host == url.host)\n    })\n  }\n  \n  \n  getDoitContext() {\n    if(this.getURL().pathname.match(/.*\\.md/)) {\n      var url = this.getURL()\n      var otherContainer = this.getOtherContainers()[0]\n      var markdown = otherContainer && otherContainer.get(\"lively-markdown\")\n      var script = markdown && markdown.get(\"lively-script\")\n      \n      return script\n    }\n    \n    return window.that\n  }\n\n  getLivelyCodeMirror() {\n    var livelyEditor = this.get('lively-editor');\n    return livelyEditor && livelyEditor.get && livelyEditor.get('#editor');\n  }\n\n  setPathAttributeAndInput(path) {\n    this.setAttribute(\"src\", path);\n    this.get('#container-path').value = decodeURI(path);\n  }\n  \n  // #private let's do it the hard way\n  asyncGet(selector, maxtime) {\n    maxtime = maxtime || 10000;\n    var startTime = Date.now();\n    return new Promise((resolve, reject) => {\n      var check = () => {\n        var found = this.get(selector);\n        if (found) resolve(found);\n        else if (Date.now() - startTime > maxtime) reject();\n        else setTimeout(check, 100);\n      };\n      check();\n    });\n  }\n  \n  /*MD ## Testing MD*/\n  \n  async isTemplate(url) {\n    var filename = url.replace(/[#?].*/,\"\").toString().replace(/.*\\//,\"\") // #Idea #Refactor Extract getFilename, add \"filename\" to URL class \n    var foundTemplate = await lively.components.searchTemplateFilename(filename)\n    return url == foundTemplate\n  }\n  \n  isFullscreen() {\n    return this.get(\"#container-navigation\").style.display  == \"none\"\n  }\n  \n  isEditing() {\n    return this.getAttribute(\"mode\") == \"edit\";\n  }\n  \n  contentIsTemplate(sourceCode) {\n    return this.getURL().pathname.match(/.*html/)\n      && sourceCode.match(/<template/)\n  }\n  \n  contentIsEditable() {\n    var url = this.getURL()\n    return url && url.pathname && (url.pathname.match(/\\.html$/) || url.pathname.match(/\\.md$/))\n  }\n  /*MD ## Modules MD*/\n\n  reloadModule(url) {\n    console.log(\"reloadModule \" + url)\n    var urlString = url.toString()\n    lively.unloadModule(urlString)\n    return System.import(urlString).then( m => {\n        lively.notify({\n          title: \"Loaded \" + url, color: \"green\"});\n        this.resetLoadingFailed();\n      }, error => {\n        this.loadingFailed(url.toString().replace(/.*\\//,\"\"), error);\n      });\n  }\n\n  async loadTestModule(url) {\n    var testRunner = document.body.querySelector(\"lively-testrunner\");\n    if (testRunner) {\n      try {\n        console.group(\"run test: \" + this.getPath());\n        var scrollContainer = testRunner.get(\".container\")\n        var scrollTop = scrollContainer && scrollContainer.scrollTop  // preserve scroll during update\n        await testRunner.clearTests();\n        await testRunner.resetMocha();\n        await lively.reloadModule(url.toString(), true)\n        await System.import(url.toString());\n        console.log(\"RUN TESTS:\")\n        await testRunner.runTests();\n        await lively.sleep(100)\n        if (scrollContainer) scrollContainer.scrollTop = scrollTop        \n      } finally {\n        console.groupEnd(\"run test: \" + this.getPath());\n      }\n    } else {\n      lively.notify(\"no test-runner to run \" + url.toString().replace(/.*\\//,\"\"));\n    }\n  }\n\n  async loadModule(url) {\n    return lively.reloadModule(\"\" + url, true).then(module => {\n      lively.notify(\"\",\"Module \" + url + \" reloaded!\", 3, null, \"green\");\n\n      this.resetLoadingFailed();\n    }, err => {\n      this.loadingFailed(url, err);\n    });\n  }\n\n  resetLoadingFailed() {\n    // that.resetLoadingFailed()\n    // System.import(urlString)\n    var urlString = this.getURL().toString();\n\n    // #TODO #babel6refactoring\n    if (lively.modules) {\n      if (urlString.match(/\\.js$/)) {\n        var m = lively.modules.module(urlString);\n      }\n    }\n    this.lastLoadingFailed = false;\n    var b = this.get(\"#apply\"); if (b) b.style.border = \"\";\n\n  }\n\n  loadingFailed(moduleName, err) {\n    this.lastLoadingFailed = err;\n    this.get(\"#apply\").style.border = \"2px solid red\";\n\n    lively.notify({\n      title: \"Error loading module \" + moduleName,\n      text:  err.toString().slice(0,200),\n      color: \"red\",\n      details: err});\n    console.error(err);\n  }\n\n  async openTemplateInstance(url) {\n      var name = url.toString().replace(/.*\\//,\"\").replace(/\\.((html)|(js))$/,\"\");\n      var comp = await lively.openComponentInWindow(name);\n      if (comp.livelyExample) comp.livelyExample(); // fill in with example content\n  }\n  /*MD ## Navigation Hisotry MD*/\n  unwindAndFollowHistoryUntil(urlInHistory) {\n    var url = \"nourl\"\n    while(url && url !== urlInHistory ) {\n      url= this.history().pop();\n      this.forwardHistory().push(url);\n    }\n    this.followPath(url)\n  }\n  \n  unwindAndFollowForwardHistoryUntil(urlInHistory) {\n    var url = \"nourl\"\n    while(url && url !== urlInHistory ) {\n      url= this.forwardHistory().pop();\n      this.history().push(url);\n    }\n    this.followPath(url)\n  }\n  /*MD ## File Operations MD*/\n  async deleteFile(url, urls) {\n    lively.notify(\"deleteFile \" + url)\n    if (!urls || !urls.includes(url)) {\n      urls = [url] // clicked somewhere else\n    }\n    if (!urls) urls = [url]\n    \n    var allURLs = new Set()\n    for(var ea of urls) {\n      if (!allURLs.has(ea)) {\n        allURLs.add(ea)\n        if (ea.endsWith(\"/\")) {\n          for(var newfile of await lively.files.walkDir(ea)) {\n            allURLs.add(newfile)\n          }          \n        }\n      }    \n    }\n    urls = Array.from(allURLs)\n    urls = urls.sortBy(ea => ea).reverse() // delete children first\n    \n    var prefix = Strings.longestCommonPrefix(urls.map(ea => ea.replace(/[^/]*$/,\"\"))) // shared dir prefix\n    \n    var names = urls.reverse().map(ea => decodeURI(ea.replace(/\\/$/,\"\").replace(prefix,\"\")))\n    var customDialog = dialog => {\n      var messageDiv = dialog.get(\"#message\")\n      messageDiv.style.maxHeight = \"300px\"\n      messageDiv.style.overflow = \"auto\"\n      messageDiv.style.backgroundColor = \"white\"\n    }\n    var msg = \"<b>Delete \" + urls.length + \" files:</b><br>\" +\n        \"<ol>\" + names.map( ea => \"<li>\" + ea + \"</li>\",  ).join(\"\") + \"</ol>\"\n    if (await lively.confirm(msg, customDialog)) {\n      for(let url of urls) {\n        var result = await fetch(url, {method: 'DELETE'})\n          .then(r => {\n            if (r.status !== 200) {\n              lively.error(\"Could not delete: \" + url)\n            }\n            r.text()\n          });  \n      }\n      this.get(\"#container-leftpane\").update()\n      \n      this.setAttribute(\"mode\", \"show\");\n      this.setPath(url.replace(/\\/$/, \"\").replace(/[^/]*$/, \"\"));\n      this.hideCancelAndSave();\n      \n      lively.notify(\"deleted \" + names);\n    }\n  }\n\n  async renameFile(url, followFile=true, proposedNewName) {\n    url = \"\" + url\n    url = url.replace(/\\/$/,\"\") // case of single dir\n    var base = url.replace(/[^/]*$/,\"\")\n    \n    var name = proposedNewName || decodeURI(url.replace(/.*\\//,\"\"))\n    var newName = await lively.prompt(\"rename\", name)\n    if (!newName) {\n      lively.notify(\"cancel rename \" + name)\n      return\n    }\n    var newURL = base + encodeURI(newName)\n    if (newURL != url) {\n      await files.moveFile(url, newURL)\n      \n      if (followFile) {\n        this.setPath(newURL);\n        this.hideCancelAndSave();        \n      }\n\n      lively.notify(\"moved to \" + newURL);\n    }\n    return newURL\n  }\n  \n  async newFile(path=\"\", type=\"md\") {  \n    var content = \"here we go....\"\n    var ending = type\n    if (type == \"drawio\") {\n      ending = \"drawio\"\n      content = await fetch(lively4url + \"/media/drawio.xml\").then(r => r.text())\n    }\n    \n    path = path.replace(/[^/]*$/,\"\") + \"newfile.\" + ending \n    \n    var fileName = await lively.prompt('Please enter the name of the file', path, async dialog => {\n      // select the filename in the path...\n      await lively.sleep(100) // wait for the new file\n      var input = dialog.get(\"input\")\n      var s = input.value\n      var m = s.match(/([^/.]*)([^/]*)$/)\n      input.select()\n      input.setSelectionRange(m.index,m.index + m[1].length)      \n    })\n    if (!fileName) {\n      lively.notify(\"no file created\");\n      return;\n    }\n    await files.saveFile(fileName, content);\n    lively.notify(\"created \" + fileName);\n    \n    if (type == \"drawio\") {\n      this.setAttribute(\"mode\", \"show\");      \n    } else {\n      this.setAttribute(\"mode\", \"edit\");\n    }\n    \n    this.showCancelAndSave();\n\n    await this.followPath(fileName);\n      \n    this.focus()\n  }\n  \n  async newDirectory(path=\"\") {\n    var fileName = await lively.prompt('Please enter the name of the directory', path);\n      if (!fileName) {\n        lively.notify(\"no file created\");\n        return;\n      }\n      await fetch(fileName, {method: 'MKCOL'});\n      lively.notify(\"created \" + fileName);\n      this.followPath(fileName);\n  }\n  /*MD ## Events MD*/\n  \n  onKeyDown(evt) {\n    var char = String.fromCharCode(evt.keyCode || evt.charCode);\n    if ((evt.ctrlKey || evt.metaKey /* metaKey = cmd key on Mac */) && char == \"S\") {\n      if (evt.shiftKey) {\n        this.onAccept();\n      } else {\n        this.onSave();\n      }\n      evt.preventDefault();\n      evt.stopPropagation();\n    } else if(evt.key == \"F7\") {\n      this.switchBetweenJSAndHTML();\n      evt.stopPropagation();\n      evt.preventDefault();\n    }\n  }\n  \n  onContextMenu(evt) {\n    // fall back to system context menu if shift pressed\n    if (!evt.shiftKey) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      \n      var path = evt.composedPath()\n      var markdown = path.find(ea => ea.localName == \"lively-markdown\") \n      if (markdown) {\n        var elements = path.filter(ea => ea.getAttribute &&  ea.getAttribute(\"data-source-line\"))\n        if (elements.length > 0) {\n          this.onMarkdownContextMenu(evt, markdown, elements)\n          return false\n        }\n      }\n      \n      // var worldContext = document.body; // default to opening context menu content globally\n      // opening in the content makes only save if that content could be persisted and is displayed\n      // disable this for now:\n      // if (this.contentIsEditable() && !this.isEditing()) {\n      //  worldContext = this\n      // }\n      lively.onContextMenu(evt)\n      // lively.openContextMenu(document.body, evt, undefined, worldContext);\n      return false;\n    }\n  }\n  \n \n\n  onClick(evt) {\n    if(evt.shiftKey && !this.isEditing() && this.getURL().pathname.match(/.*\\.md/)) {\n      this.onMarkdownClick(evt)  \n    } \n  }\n  \n  \n  \n  onFullscreen(evt) {\n    this.toggleControls();\n    if (!this.parentElement.isMaximized) return;\n    if ((this.isFullscreen() && !this.parentElement.isMaximized()) ||\n       (!this.isFullscreen() && this.parentElement.isMaximized()))  {\n      this.parentElement.toggleMaximize();\n      if ( this.parentElement.isMaximized()) {\n        this.parentElement.get(\".window-titlebar\").style.display = \"none\"\n        this.parentElement.style.zIndex = 0\n      } else {\n        this.parentElement.style.zIndex = 1000\n        this.parentElement.get(\".window-titlebar\").style.display = \"\"\n      }\n    }\n  }\n  \n  async onToggleOptions() {\n    if (this.classList.contains('show-options')) {\n      this.classList.remove('show-options');\n    } else {\n      this.classList.add('show-options');\n    }\n  }\n  \n  async onFavorite() {\n    await Favorites.toggle(this.getPath());\n    this.updateFavInfo()\n  }\n  \n  async onBeautify() {\n    const ending = this.getPath()::fileEnding();\n    \n    if (ending !== 'js' && ending !== 'css' && ending !== 'html') {\n      return;\n    }\n    \n    const editor = this.get(\"lively-editor\");\n    const text = editor.lastText;\n    let beautifulText;\n    const options = {\n      'end_with_newline': true,\n      'max_preserve_newlines': 3,\n      'js': {\n        'brace_style': ['collapse', 'preserve-inline'],\n        'indent_size': indentationWidth(),\n        'wrap_line_length': 120,\n      },\n      'indent_size': indentationWidth(),\n    }\n    // load the beatify code async... because they are big\n    if (ending === 'js') {\n      await System.import( \"src/client/js-beautify/beautify.js\")        \n      beautifulText = global.js_beautify(text, options);\n    } else if (ending === 'css') {\n      await System.import( \"src/client/js-beautify/beautify-css.js\")\n      beautifulText = global.css_beautify(text, options);\n    } else if (ending === 'html') {\n      await System.import(\"src/client/js-beautify/beautify-html.js\")\n      beautifulText = global.html_beautify(text, options);\n    }\n    editor.setText(beautifulText, true);      \n  }\n\n  onDelete() {\n    var url = this.getURL() +\"\";\n    this.deleteFile(url)\n  }\n\n  async onApply() {\n    var url = this.getBaseURL();\n    var filename = url.replace(/.*\\//,\"\")\n    var foundTemplate = await lively.components.searchTemplateFilename(filename)\n    if (url == foundTemplate) {\n      this.openTemplateInstance(url);\n    } else if (url.match(/\\.js$/))  {\n      this.reloadModule(url);\n    } else {\n      lively.openBrowser(url);\n    }\n  }\n\n  async onSpawnTestRunner(evt) {\n    const path = this.getPath()\n\n    if (!isTestFile(path)) {\n      lively.warn('current file is no test file');\n      return;\n    }\n    \n    const pos = lively.getPosition(evt);\n    const testRunner = await lively.openComponentInWindow('lively-testrunner', pos);\n    testRunner.setTestPath(path);\n    await testRunner.clearTests();\n    await testRunner.resetMocha();\n    await testRunner.loadTests();\n    await testRunner.runTests();\n  }\n\n  onHome() {\n    this.clearNavbar()\n    this.followPath(lively4url)\n  }\n\n  async onSync(evt) {\n    var comp = await (<lively-sync></lively-sync>);\n    var compWindow;\n    lively.components.openInWindow(comp).then((w) => {\n      compWindow = w;\n      lively.setPosition(w, lively.pt(100, 100));\n    });\n\n    var serverURL = lively.files.serverURL(\"\" + this.getURL())\n    comp.setServerURL(serverURL);\n    console.log(\"server url: \" + serverURL);\n    // if (!this.getURL().pathname.match(serverURL)) {\n    //   return lively.notify(\"can only sync on our repositories\");\n    // }\n    var repo =  this.getPath().replace(serverURL +\"/\", \"\").replace(/\\/.*/,\"\");\n    comp.setRepository(repo);\n    comp.sync();\n    // .then(() => compWindow.remove())\n  }\n\n\n  onPathEntered(path) {\n    this.followPath(path);\n  }\n\n\n  onEdit() {\n    this.setAttribute(\"mode\", \"edit\");\n    this.showCancelAndSave();\n    this.editFile();\n  }\n\n  async onCancel() {\n    if (this.unsavedChanges()) {\n      if (!await lively.confirm(\"There are unsaved changes. Discard them?\")) {\n        return;\n      }\n    }\n    this.setAttribute(\"mode\", \"show\");\n    this.setPath(this.getPath());\n    this.hideCancelAndSave();\n\n  }\n\n  onUp() {\n    var path = this.getPath();\n    if (path.match(/(README|index)\\.((html)|(md))/))\n      // one level more\n      this.followPath(path.replace(/(\\/[^/]+\\/[^/]+$)|([^/]+\\/$)/,\"/\"));\n    else\n      this.followPath(path.replace(/(\\/[^/]+$)|([^/]+\\/$)/,\"/\"));\n  }\n\n  onBack() {\n    if (this.history().length < 2) {\n      lively.notify(\"No history to go back!\");\n      return;\n    }\n    lively.lastBackButtonClicked = Date.now(); // can be used by scripts to prevent autoforwarding\n    var url = this.history().pop();\n    var last = _.last(this.history());\n    // lively.notify(\"follow \" + url)\n    this.forwardHistory().push(url);\n    this.followPath(last);\n  }\n\n  onMouseDown(evt) {\n    if (lively.halo) {\n      // close halo\n      lively.halo.onBodyMouseDown(evt, this);\n    }\n    evt.stopPropagation();\n    // evt.preventDefault();\n    Clipboard.onBodyMouseDown(evt)\n  }\n\n  onForward() {\n    var url = this.forwardHistory().pop();\n    if (url) {\n      this.followPath(url);\n    } else {\n      lively.notify(\"Could not navigate forward\");\n    }\n  }\n\n  async onBrowse() {\n    var url = this.getURL();\n    var comp = await lively.openComponentInWindow(\"lively-container\");\n    comp.editFile(\"\" + url);\n  }\n\n  async onDependencies() {\n    lively.openComponentInWindow(\"d3-tree\").then(tree => {\n      tree.dataName = function(d) {\n        return d.name.replace(/.*\\//,\"\").replace(/\\.js/,\"\")\n      }\n      tree.setTreeData(lively.findDependedModulesGraph(this.getURL().toString()))\n      lively.setExtent(tree.parentElement, pt(1200,800))\n      tree.parentElement.setAttribute(\"title\", \"Dependency Graph: \" + this.getURL().toString().replace(/.*\\//,\"\"))\n    })\n  }\n  \n  onEditorBackNavigation() {\n    this.get(\"lively-container-navbar\").focusDetails()\n  }\n\n  async onSaveAs() {\n    var newPath = await lively.prompt(\"Save as..\", this.getPath())\n    if (newPath === undefined) return;\n\n    if (!this.isEditing()) {\n      lively.notify(\"save as \" + newPath)\n      var result = await fetch(newPath, {\n        method: \"get\"\n      })\n      this.lastVersion = result.headers.get(\"fileversion\")\n      this.saveEditsInView(newPath);\n      this.get(\"#container-path\").value = newPath\n      return;\n    }\n    lively.notify(\"Save as... in EditMode not implemented yet\");\n  }\n\n  async buildLatex(dir, pdf) {\n        \n    var serverURL = lively.files.serverURL(dir)\n    if (!serverURL) {\n      lively.warn(\"no lively server found for: \" + dir)\n      return\n    }\n\n    lively.notify(\"LaTeX\", \"build\", 10)\n\n    var buildPath = dir.replace(serverURL, \"\")\n    var makeURL = serverURL + \"/_make/\" + buildPath + \"?target=\" + pdf.replace(/.*\\//,\"\")\n    \n    var resp = await fetch(makeURL, {})\n    \n    var result = await resp.text()\n\n    var logUniqId = \"LaTexLog\"\n    var log = document.body.querySelector(\"#\" + logUniqId)\n    if (log) {\n      log.value = result\n      var show = lively.showElement(log)\n      show.style.border = \"1px solid green\"\n\n    } else {\n      lively.notify(\"LaTeX\", \"finished\", 10, async () => {\n        var log = await lively.openComponentInWindow(\"lively-code-mirror\")\n        log.mode =  \"text\"\n        log.id = logUniqId\n        log.parentElement.setAttribute(\"title\", \"LaTexLog\")\n        log.value = \"\" + result\n      })      \n    }\n     \n    var pdfContainers = lively.queryAll(document.body, \"lively-container\").filter(ea => ea.getURL().toString() == pdf)\n    pdfContainers.forEach(async ea => {\n      var preserveContentScroll = ea.get(\"#container-content\").scrollTop;\n      var pdf = ea.getContentRoot().querySelector(\"lively-pdf\")\n      var page = pdf.getCurrentPage()\n      await pdf.setURL(ea.getURL().toString())\n      await pdf.pdfLoaded\n      await lively.sleep(500) // #TODO fuck it... page loading seems not be finished, even if PDF.js said so\n      \n      if (page) pdf.setCurrentPage(page)\n      lively.notify(\"page \" + page)\n      ea.get(\"#container-content\").scrollTop = preserveContentScroll\n    })\n    \n    if (pdfContainers.length == 0) {\n      lively.notify(\"LaTeX\", \"view pdf\", undefined, () => {\n        lively.openBrowser(pdf)\n      })\n    }  \n  }\n  \n  // #important\n  async onSave(doNotQuit) {\n    var url = this.getURL()\n    url = url.toString().replace(/#.*/, \"\"); // strip anchors while saving and loading files\n    if (!this.isEditing()) {\n      this.saveEditsInView();\n      return;\n    }\n\n    if (this.getURL().pathname.match(/\\/$/)) {\n      files.saveFile(url,\"\");\n\n      return;\n    }\n    this.get(\"#editor\").setURL(url);\n    await this.get(\"#editor\").saveFile()\n    this.__ignoreUpdates = true // #LiveProgramming #S3 don't affect yourself...\n    this.parentElement.__ignoreUpdates = true\n    var sourceCode = this.getSourceCode();\n    // lively.notify(\"!!!saved \" + url)\n    window.LastURL = url\n    // lively.notify(\"update file: \" + this.getURL().pathname + \" \" + this.getURL().pathname.match(/css$/))\n    if (this.getURL().pathname.match(/\\.css$/)) {\n      this.updateCSS();\n    } else if (await this.isTemplate(url)) {\n      lively.notify(\"update template\")\n      if (url.toString().match(/\\.html/)) {\n        // var templateSourceCode = await fetch(url.toString().replace(/\\.[^.]*$/, \".html\")).then( r => r.text())\n        var templateSourceCode = sourceCode\n\n        await lively.updateTemplate(templateSourceCode, url.toString());\n\n      }\n    } else if (this.getURL().pathname.match(/\\.md$/)){\n        var m = sourceCode.match(/markdown-config .*latex\\=([^ ]*)/)\n        if (m) {\n          var dir = this.normalizeURL(this.getDir() + m[1])\n          \n          var m2 = sourceCode.match(/markdown-config .*pdf\\=([^ ]*)/)\n          if (m2) {\n            var pdf = this.normalizeURL(this.getDir() + m2[1])          \n          }\n          this.buildLatex(dir, pdf)\n        }\n    }\n    this.updateOtherContainers();\n\n    var moduleName = this.getURL().pathname.match(/([^/]+)\\.js$/);\n    if (moduleName) {\n      moduleName = moduleName[1];\n\n      const testRegexp = /((test\\/.*)|([.-]test)|([.-]spec))\\.js/;\n      if (this.lastLoadingFailed) {\n        console.log(\"last loading failed... reload\")\n        await this.reloadModule(url); // use our own mechanism...\n      } else if (this.getURL().pathname.match(testRegexp)) {\n        await this.loadTestModule(url);\n      } else if (this.get(\"#live\").checked) {\n        // lively.notify(\"load module \" + moduleName)\n        await this.loadModule(\"\" + url)\n        console.log(\"START DEP TEST RUN\")\n        lively.findDependedModules(\"\" + url).forEach(ea => {\n          if (ea.match(testRegexp)) {\n            this.loadTestModule(ea);\n          }\n        })\n        console.log(\"END DEP TEST RUN\")\n      } else {\n        lively.notify(\"ignore module \" + moduleName)\n      }\n    }\n    // this.showNavbar();\n    \n    // something async... \n    lively.sleep(5000).then(() => {\n      this.__ignoreUpdates = false\n      this.parentElement.__ignoreUpdates = false\n    })\n  }\n  \n  onNewfile() {\n    this.newFile(this.getPath())\n  }\n\n  async onNewdirectory() {\n    this.newDirectory(this.getPath())\n  }\n  \n\n\n\n  onVersions() {\n    this.get(\"#editor\").toggleVersions();\n  }\n\n  onAccept() {\n    this.onSave().then((sourceCode) => {\n      this.setAttribute(\"mode\", \"show\");\n      this.setPath(this.getPath());\n      this.hideCancelAndSave();\n    });\n  }\n\n  \n  async onTextChanged() {\n    if (!this.getURL().pathname.match(/\\.js$/)) {\n      return\n    }\n  }\n\n  onHTMLMutation(mutations, observer) {\n    if (this.isPersisting) return // we mutate while persisting\n\n    mutations.forEach(record => {\n\n      var indicator = this.get(\"#changeIndicator\")\n      if (indicator ) {\n        indicator.style.backgroundColor = \"rgb(250,250,0)\";\n      }\n\n      // if (record.target.id == 'console'\n      //     || record.target.id == 'editor') return;\n\n      this.contentChangedDelay()\n\n      // let shouldSave = true;\n      if (record.type == 'childList') {\n      //     let addedNodes = [...record.addedNodes],\n      //         removedNodes = [...record.removedNodes],\n      //         nodes = addedNodes.concat(removedNodes);\n\n      //     //removed nodes never have a parent, so remeber orphans when they are created\n      //     for (let node of addedNodes) {\n      //         if (hasParentTag(node) == false) {\n      //             orphans.add(node);\n      //         }\n      //     }\n\n      //     // shouldSave = hasNoDonotpersistFlagInherited(addedNodes) || checkRemovedNodes(removedNodes, orphans);\n\n      //     //remove removed orphan nodes from orphan set\n      //     for (let node of removedNodes) {\n      //         if (orphans.has(node)) {\n      //             orphans.delete(node);\n      //         }\n      //     }\n      }\n      else if (record.type == 'attributes'\n          || record.type == 'characterData') {\n\n\n          // shouldSave = hasNoDonotpersistFlagInherited([record.target]);\n      }\n\n      // if (shouldSave) {\n          // sessionStorage[\"lively.scriptMutationsDetected\"] = 'true';\n          // restartPersistenceTimerInterval();\n      // }\n    })\n  }\n\n  onEditorCursorActivity(cm) {\n     if(this.getURL().pathname.match(/.*\\.md/)) {\n      var url = this.getURL()\n      var otherContainer = this.getOtherContainers()[0]\n      var markdown = otherContainer && otherContainer.get(\"lively-markdown\")\n      if (markdown) {\n        this.onMarkdownEditorCursorActivity(cm, markdown)\n      }\n    }\n     \n  }\n  \n  \n  /*MD ## Render Content MD*/\n\n  async appendMarkdown(content, renderTimeStamp) {\n    this.clear()\n    var md = await lively.create(\"lively-markdown\", this.getContentRoot())\n    // md.setAttribute(\"data-lively4-donotpersist\", true) // will be thrown away after loading anyway, #DoesNotWork\n    if (renderTimeStamp && this.renderTimeStamp !== renderTimeStamp) {\n      return md.remove()\n    }\n    md.classList.add(\"presentation\") // for the presentation button\n    md.getDir = this.getDir.bind(this);\n    md.followPath = this.followPath.bind(this);\n    await md.setContent(content)\n    if (md.getAttribute(\"mode\") == \"presentation\") {\n      var presentation = await md.startPresentation()\n      if (this.lastPage) {\n        presentation.gotoSlideAt(this.lastPage)\n      }\n    }\n    if (this.wasContentEditable) {\n      md.contentEditable = true\n    }\n\n    // get around some async fun\n    if (this.preserveContentScroll !== undefined) {\n      this.get(\"#container-content\").scrollTop = this.preserveContentScroll\n      delete this.preserveContentScroll\n    }\n    \n    var contentRoot = md.get(\"#content\")\n    \n    contentRoot.querySelectorAll(`input[type=\"checkbox\"]`).forEach(ea => {\n      if (!ea.parentElement.classList.contains(\"task-list-item\")) {\n        return;\n      }      \n      lively.addEventListener(\"input\", ea, \"click\", async evt => {\n        ea.checked = !ea.checked\n        this.markdownCheckCheckboxAndSave(ea)\n        var highlight = lively.showElement(ea.parentElement)\n        highlight.innerHTML = `<br><span style=\"background:white\">SAVE...</span>`\n        highlight.style.border = \"1px solid green\"\n        highlight.style.color = \"green\"\n        \n      })  \n    })\n    await lively.sleep(500) // wait for renderer to get some positions to scroll to....\n    this.scrollToAnchor(this.anchor)\n  }\n\n  \n  \n  \n  appendLivelyMD(content, renderTimeStamp) {\n    content = content.replace(/@World.*/g,\"\");\n    content = content.replace(/@+Text: name=\"Title\".*\\n/g,\"# \");\n    content = content.replace(/@+Text: name=\"Text.*\\n/g,\"\\n\");\n    content = content.replace(/@+Text: name=\"Content.*\\n/g,\"\\n\");\n    content = content.replace(/@+Box: name=\"SteppingWordCounter\".*\\n/g,\"\\n\");\n    content = content.replace(/@+Text: name=\"MetaNoteText\".*\\n(.*)\\n\\n/g,  \"<i style='color:orange'>$1</i>\\n\\n\");\n    content = content.replace(/@+Text: name=\"WordsText\".*\\n.*/g,\"\\n\");\n\n    this.appendMarkdown(content, renderTimeStamp);\n  }\n\n  async appendScript(scriptElement) {\n    // #IDEA by instanciating we can avoid global (de-)activation collisions\n    // Scenario (A) There should be no activation conflict in this case, because appendScript wait on each other...\n    // Scenario (B)  #TODO opening a page on two licely-containers at the same time will produce such a conflict.\n    // #DRAFT instead of using ScopedScripts as a singleton, we should instanciate it.\n    if (!ScopedScripts) {\n      ScopedScripts = await System.import(\"src/client/scoped-scripts.js\").then(m => m.default)\n    }\n    var layers = ScopedScripts.layers(this.getURL(), this.getContentRoot());\n    ScopedScripts.openPromises = [];\n    return new Promise((resolve, reject)=> {\n      var root = this.getContentRoot();\n      var script   = document.createElement(\"script\");\n      script.type  = \"text/javascript\";\n\n      layers.forEach( ea => ea && ea.beGlobal());\n\n      if (scriptElement.src) {\n        script.src  = scriptElement.src;\n        script.onload = () => {\n          // #WIP multiple activations are not covered.... through this...\n          Promise.all(ScopedScripts.openPromises).then(() => {\n            layers.forEach( ea => ea && ea.beNotGlobal());\n            // console.log(\"ScopedScripts openPromises: \" + ScopedScripts.openPromises)\n            resolve();\n          }, reject);\n        };\n        script.onerror = reject;\n      }\n      script.text  = scriptElement.textContent;\n\n      cop.withLayers(layers, () => {\n        try {\n          root.appendChild(script);\n        } catch(e) {\n          console.error(e)  \n        }\n      });\n      if (!script.src) {\n        Promise.all(ScopedScripts.openPromises).then(() => {\n          layers.forEach( ea => ea && ea.beNotGlobal());\n          // console.log(\"ScopedScripts openPromises: \" + ScopedScripts.openPromises)\n          resolve();\n        }, reject);\n      }\n    })\n\n  }\n\n  async appendHtml(content, renderTimeStamp) {\n    if (renderTimeStamp && this.renderTimeStamp !== renderTimeStamp) {\n      return \n    }\n    // strip lively boot code...\n\n    // content = content.replace(/\\<\\!-- BEGIN SYSTEM\\.JS(.|\\n)*\\<\\!-- END SYSTEM.JS--\\>/,\"\");\n    // content = content.replace(/\\<\\!-- BEGIN LIVELY BOOT(.|\\n)*\\<\\!-- END LIVELY BOOT --\\>/,\"\");\n\n    this.clear(); \n    \n    if (content.match(\"<template\") && this.getURL().pathname.match(\"html$\")) {\n\n      content = \"<pre><code> \" + content.replace(/</g,\"&lt;\") +\"</code></pre>\"\n    }\n\n\n    if (content.match(/<script src=\".*d3\\.v3(.min)?\\.js\".*>/)) {\n      if (!window.d3) {\n        console.log(\"LOAD D3\");\n        // #TODO check if dealing with this D3 is covered now through our general approach...\n        await lively.loadJavaScriptThroughDOM(\"d3\", \"src/external/d3.v3.js\");\n      }\n\n      if (!window.ScopedD3) {\n        console.log(\"LOAD D3 Adaption Layer\");\n        await System.import(\"src/client/container-scoped-d3.js\")\n        ScopedD3.updateCurrentBodyAndURLFrom(this);\n        // return this.appendHtml(content) // try again\n      }\n    }\n\n    if (content.match(/<script src=\".*cola(\\.min)?\\.js\".*>/)) {\n        console.log(\"LOAD Cola\");\n        await lively.loadJavaScriptThroughDOM(\"cola\", \"src/external/cola.js\")\n    }\n\n    //  var content = this.sourceContent\n    try {\n      var root = this.getContentRoot();\n      var nodes = lively.html.parseHTML(content, document, true);\n      if (nodes[0] && nodes[0].localName == 'template') {\n      \t// lively.notify(\"append template \" + nodes[0].id);\n\t\t    return this.appendTemplate(nodes[0].id);\n      }\n      lively.html.fixLinks(nodes, this.getDir(),\n        (path) => this.followPath(path));\n      for(var ea of nodes) {\n        if (ea && ea.tagName == \"SCRIPT\") {\n          try {\n            await this.appendScript(ea);\n          } catch(e) {\n            console.error(e)\n          }\n        } else {\n          root.appendChild(ea);\n          if (ea.querySelectorAll) {\n            for(var block of ea.querySelectorAll(\"pre code\")) {\n              highlight.highlightBlock(block);\n            }\n            // now we can use the structural information we got from the highlighter\n            for(var comment of ea.querySelectorAll(\".hljs-comment\")) {\n              var markdownMatch = comment.textContent.match(/^\\/\\*MD((.|\\n)*)MD\\*\\/$/)\n              if (markdownMatch) {\n                  //source.startsWidth(\"/*MD\") && source.endsWidth(\"MD*/\")\n                var markdown = await (<lively-markdown>{markdownMatch[1]}</lively-markdown>)\n                comment.innerHTML = \"\"\n                comment.appendChild(markdown)\n                await markdown.updateView()\n                markdown.style.whiteSpace = \"normal\" // revert effect of outside `pre` tag \n                markdown.style.display = \"inline-block\"\n                // markdown.style.border = \"2px solid blue\"\n                // markdown.style.backgroundColor = \"lightgray\"\n                \n                lively.html.fixLinks(markdown.shadowRoot.querySelectorAll(\"[href],[src]\"), \n                                    this.getURL().toString().replace(/[^/]*$/,\"\"),\n                                    url => this.followPath(url))\n              }\n            }\n            \n          }\n        }\n      }\n     \n      \n      await components.loadUnresolved(root, false, \"container.js\", true);\n      \n      lively.clipboard.initializeElements(root.querySelectorAll(\"*\"))\n      \n      if (nodes.length == 1 \n          && (nodes[0].localName == \"lively-window\" || nodes[0].classList.contains(\"lively-content\"))) {\n        lively.setPosition(nodes[0], pt(0,0))\n      }\n      \n    } catch(e) {\n      console.log(\"Could not append html:\" + content.slice(0,200) +\"...\" +\" ERROR:\", e);\n    }\n\n    // get around some async fun\n    if (this.preserveContentScroll !== undefined) {\n      this.get(\"#container-content\").scrollTop = this.preserveContentScroll\n      delete this.preserveContentScroll\n    }\n\n    \n    // this is bad and breaks layout 100% layout....\n    // ViewNav.enable(this)\n\n    \n    // await lively.sleep(500) // wait for renderer to get some positions to scroll to....\n    this.scrollToAnchor(this.anchor)\n    \n    setTimeout(() => {\n      this.resetContentChanges()\n      this.observeHTMLChanges()\n    }, 0)\n    \n  }\n\n  async appendCSV(content, renderTimeStamp) {\n    var container=  this.get('#container-content');\n    var table = await lively.create(\"lively-table\")\n    table.setFromCSV(content)\n    \n    if (renderTimeStamp && this.renderTimeStamp !== renderTimeStamp) {\n      return \n    }\n    container.appendChild(table)\n  }\n\n\n  async appendTemplate(name, renderTimeStamp) {\n    try {\n    \tvar node = lively.components.createComponent(name);\n    \tif (renderTimeStamp && this.renderTimeStamp !== renderTimeStamp) {\n        return \n      }\n      this.getContentRoot().appendChild(node);\n      await lively.components.loadByName(name);\n      \n    } catch(e) {\n      console.log(\"Could not append html:\" + content);\n    }\n  }\n\n  \n  /*MD ## Navbar MD*/\n\n  clearNavbar() {\n    var container = this.get('#container-leftpane');\n    container.clear()\n    return container;\n  }\n\n  hideNavbar() {\n    if (lively.getExtent(this.navbar()).x > 1 ) {\n      this.get('lively-separator').onClick()\n    }\n  }\n  \n  navbar() {\n    return this.get('#container-leftpane')\n    \n  }\n  \n  async showNavbar() {\n    // this.get('#container-leftpane').style.display = \"block\";\n    // this.get('lively-separator').style.display = \"block\";\n\n    var navbar = this.navbar()\n    // implement hooks\n    navbar.deleteFile = (url, urls) => { this.deleteFile(url, urls) }\n    navbar.renameFile = (url) => { this.renameFile(url) }\n    navbar.newFile = (url, type) => { this.newFile(url, type) }\n    navbar.newDirectory = (url, type) => { this.newDirectory(url, type) }\n    navbar.followPath = (path, lastPath) => { \n      this.contextURL = lastPath\n      this.followPath(path) \n    }\n    navbar.navigateToName = (name, data) => { this.navigateToName(name, data) }\n\n    await navbar.show && navbar.show(this.getURL(), this.content, navbar.contextURL, false, this.contentType)\n  }\n\n  /*MD ## Controls MD*/\n\n  toggleControls() {\n    var showsControls = this.get(\"#container-navigation\").style.display  == \"none\"\n    if (showsControls) {\n      this.showControls();\n    } else {\n      this.hideControls();\n    }\n    // remember the toggle fullscreen in the url parameters\n    var path = this.getPath()\n    if (this.useBrowserHistory()) {\n      window.history.pushState({ followInline: true, path: path }, 'view ' + path,\n        window.location.pathname + \"?edit=\" + path  + \"&fullscreen=\" + !showsControls);\n    }\n  }\n\n  hideControls() {\n    this.setAttribute(\"controls\",\"hidden\")\n    this.get(\"#fullscreenInline\").style.display = \"block\"\n    this.get(\"#container-navigation\").style.display  = \"none\";\n    this.get(\"#container-leftpane\").style.display  = \"none\";\n    this.get(\"#container-rightpane\").style.flex = 1\n    this.get(\"lively-separator\").style.display  = \"none\";\n  }\n\n  showControls() {    this.getAttribute(\"controls\")\n    this.setAttribute(\"controls\",\"shown\")\n    this.get(\"#fullscreenInline\").style.display = \"none\"\n    this.get(\"#container-navigation\").style.display  = \"\";\n    this.get(\"#container-leftpane\").style.display  = \"\";\n    \n    this.get(\"#container-leftpane\").style.flex = 20\n    this.get(\"#container-rightpane\").style.flex = 80\n    this.get(\"lively-separator\").style.display  = \"\";\n  }\n  \n  /*MD ## Edit MD*/\n  \n  async editFile(path) {\n    // console.log(\"[container] editFile \" + path)\n    this.setAttribute(\"mode\",\"edit\"); // make it persistent\n    \n    \n    if (!path) path = this.getPath()\n    \n    if(path) await this.setPath(path, true /* do not render */) \n    \n    this.clear();\n    var urlString = this.getURL().toString();\n    \n    var containerContent=  this.get('#container-content');\n    containerContent.style.display = \"none\";\n    var containerEditor =  this.get('#container-editor');\n    containerEditor.style.display = \"block\";\n\n\n    this.resetLoadingFailed();\n\n    this.showNavbar();\n\n    \n    \n    // console.log(\"[container] editFile befor getEditor\")\n    // ... demos\\/\n    var editorType = urlString.match(/babylonian-programming-editor\\/demos\\/.*\\js$/) ? \"babylonian-programming-editor\" : \"lively-editor\";\n\n    if (this.sourceContent && this.sourceContent.match('^.*\"enable examples\"')) {\n      editorType = \"babylonian-programming-editor\"\n    }\n    \n    if (urlString.match(/((png)|(jpe?g)|(gif))$/i)) {\n      editorType = \"lively-image-editor\"\n    }\n\n    if (urlString.match(/((shadama))$/i)) {\n      editorType = \"lively-shadama-editor\"\n    }\n    \n    var livelyEditor = await this.getEditor(editorType)\n      // console.log(\"[container] editFile got editor \")\n    \n    if (livelyEditor.awaitEditor) {\n      await livelyEditor.awaitEditor()\n      var codeMirror = livelyEditor.livelyCodeMirror();\n\n      codeMirror.addEventListener(\"change\", evt => this.onTextChanged(evt))      \n    }\n\n    var url = this.getURL();\n    livelyEditor.setURL(url);\n    // console.log(\"[container] editFile setURL \" + url)\n    if (codeMirror) {\n      if (codeMirror.editor && codeMirror.editor.session) {\n        codeMirror.editor.session.setOptions({\n          mode: \"ace/mode/javascript\",\n          tabSize: indentationWidth(),\n          useSoftTabs: true\n        });\n      }\n      codeMirror.changeModeForFile(url.pathname);\n\n      // NOTE: we don't user loadFile directly... because we don't want to edit PNG binaries etc...\n      if (urlString.match(/\\.svg$/)) {\n        this.sourceContent  = await fetch(urlString).then(r => r.text())\n      }\n      \n      livelyEditor.setText(this.sourceContent); // directly setting the source we got\n      if (livelyEditor.checkAndLoadAnnotations) {\n        await livelyEditor.checkAndLoadAnnotations()\n      }\n\n      if (codeMirror.editor) {\n        if (!codeMirror.tagName == \"LIVELY-CODE-MIRROR\") {\n          codeMirror.editor.selection.moveCursorTo(0,0);\n          var lineWidth = 100\n          codeMirror.editor.session.setWrapLimit(lineWidth);\n          codeMirror.editor.renderer.setPrintMarginColumn(lineWidth)\n        }\n      }\n    }\n\n    livelyEditor.lastVersion = this.lastVersion;\n    this.showCancelAndSave();\n\n    if (codeMirror && (\"\"+url).match(/\\.((js)|(py))$/)) {\n      codeMirror.setTargetModule(\"\" + url); // for editing\n    }\n\n    if (codeMirror && this.anchor) {\n      this.scrollToAnchor(this.anchor)\n    }\n  }\n\n  getHTMLSource() {\n    this.getContentRoot().querySelectorAll(\"*\").forEach( ea => {\n      if (ea.livelyPrepareSave)\n        ea.livelyPrepareSave();\n    });\n    return this.getContentRoot().innerHTML\n  }\n\n  /*MD ## Save Content MD*/\n  \n  saveSource(url, source) {\n    return this.getEditor().then( editor => {\n      editor.setURL(url);\n      editor.setText(source);\n      editor.lastVersion = this.lastVersion;\n      editor.saveFile().then( () => {\n        this.lastVersion = editor.lastVersion\n        // #TODO we should update here after conflict resolution?\n        this.updateOtherContainers()\n      }).then(() => {\n        this.resetContentChanges()\n        lively.notify(\"saved content!\")\n      })\n    });\n\n  }\n\n  async saveHTML(url) {\n    return this.saveSource(url, this.getHTMLSource());\n  }\n\n  async saveMarkdown(url) {\n    var markdown =  await this.get(\"lively-markdown\")\n    if (markdown.getAttribute(\"mode\") == \"presentation\") {\n      lively.notify(\"saving in presentation mode not supported yet\")\n    } else {\n      var source = await markdown.htmlAsMarkdownSource()\n      return this.saveSource(url, source);\n    }   \n  }\n\n  async saveEditsInView(url) {\n    url = (url || this.getURL()).toString();\n    var contentElement = this.getContentRoot()\n    if (url.match(/template.*\\.html$/)) {\n        return lively.notify(\"Editing templates in View not supported yet!\");\n    } else if (url.match(/\\.html$/)) {\n      this.saveHTML(new URL(url)).then( () => {\n        // lively.notify({\n        //   title: \"saved HTML\",\n        //   color: \"green\"});\n       });\n    } else if (url.match(/\\.md$/)) {\n      this.saveMarkdown(new URL(url)).then( () => {\n        // lively.notify({\n        //   title: \"saved HTML\",\n        //   color: \"green\"});\n       });\n    } else if (contentElement && contentElement.childNodes[0] && contentElement.childNodes[0].livelySource) {\n      var source = contentElement.childNodes[0].livelySource()\n      if (source.then) source = await source; // maybe some elements take a while to generate their source\n      return this.saveSource(url, source);\n    } else {\n      lively.notify(\"Editing in view not supported for the content type!\");\n    }\n\n  }\n\n  unsavedChanges() {\n    var url = this.getURL()\n    if (!url) return false;\n    if (url.toString().match(/\\/$/)) return false // isDirectory...\n    \n    var editor = this.get(\"#editor\");\n    if (!editor) return this.contentChanged;\n    return  editor.textChanged;\n  }  \n  /*MD ## ContentChange MD*/\n\n  checkForContentChanges() {\n    \n    if (!this.contentIsEditable()) {\n      this.contentChanged = false\n      return\n    }\n    \n    // don't know how to check for edits here... \n    if (!this.isEditing() && this.getURL().pathname.match(/\\.md$/)) {\n      this.contentChanged = false\n      return\n    }\n    \n\n    if (this.isPersisting) return;\n    this.isPersisting = true;\n    // console.log(\"checkForContentChanges \" + (Date.now() - this.lastChecked) + \"ms \" + document.activeElement)\n    this.lastChecked = Date.now()\n\n    try {\n      window.oldActiveElement = document.activeElement\n      var currentSource = this.getHTMLSource()\n\n      if (!this.lastSource || this.lastSource != currentSource) {\n        this.contentChanged = true\n      } else {\n        this.contentChanged = false\n      }\n      this.updateChangeIndicator()\n    } finally {\n      // setTimeout(() => {\n        // console.log(\"refocus \" + oldActiveElement)\n\n        if (oldActiveElement && oldActiveElement.editor) oldActiveElement.editor.focus()\n\n        // we don't want to catch our own mutations... that were cause\n        // by detecting some mutations in the first place\n        this.isPersisting = false\n      // }, 0)\n    }\n  }\n\n  resetContentChanges() {\n    this.lastSource  =  this.getHTMLSource();\n    this.contentChanged = false\n    this.updateChangeIndicator()\n  }\n\n  updateChangeIndicator() {\n    var indicator = this.get(\"#changeIndicator\")\n    if (indicator && this.contentChanged) {\n      indicator.style.backgroundColor = \"rgb(220,30,30)\";\n    } else {\n      indicator.style.backgroundColor = \"rgb(200,200,200)\";\n    }\n  }\n\n \n\n  \n  /*MD ## Focus / Scroll / Navigation MD*/\n  \n  focus() {\n    const livelyCodeMirror = this.getLivelyCodeMirror();\n    if (livelyCodeMirror) { \n      livelyCodeMirror.focus(); \n    } else {\n      this.get(\"lively-container-navbar\").focus()  \n    }\n  }\n  \n  navigateToName(name, data) {\n    // lively.notify(\"navigate to \" + name);\n    var baseURL = this.getURL().toString().replace(/\\#.*/,\"\")\n    var anchor = \"#\" + encodeURIComponent(name.replace(/# ?/g,\"\").replace(/\\*/g,\"\"))\n    var nextURL = baseURL + anchor\n    var editor = this.getLivelyCodeMirror()\n    \n    this.setPathAttributeAndInput(nextURL)\n    this.history().push(nextURL);\n      \n    \n    if (editor) {\n      if (data && data.start) { // we have more information\n        var cm = editor.editor\n        var start = cm.posFromIndex(data.start)\n        var end = cm.posFromIndex(data.end)\n        \n        cm.setSelection(start, end)\n        \n        // scroll only if necessary\n        var rect = cm.getWrapperElement().getBoundingClientRect();\n        var topVisibleLine = cm.lineAtHeight(rect.top, \"window\"); \n        var bottomVisibleLine = cm.lineAtHeight(rect.bottom, \"window\");\n        \n        if (start.line < topVisibleLine) {\n          editor.scrollToLine(start.line )\n        } \n        if (end.line > bottomVisibleLine) {\n          var visibleLines = (bottomVisibleLine - topVisibleLine)\n          editor.scrollToLine(end.line - visibleLines)\n        }\n        \n      } else {\n        editor.find(name);\n      }\n    } else {      \n      \n      this.scrollToAnchor(anchor)\n    }\n  }\n  \n\n  /*MD ## UI MD*/\n\n\n  clear() {\n    this.clearLoadingInfo()\n    this.getContentRoot().innerHTML = '';\n    // Array.from(this.get('#container-content').childNodes)\n    //   .filter( ea => ea.id !== \"container-root\")\n    //   .forEach(ea => ea.remove());\n    this.get('#container-editor').innerHTML = '';\n  }\n\n\n  \n  hideCancelAndSave() {\n    return;\n    _.each(this.shadowRoot.querySelectorAll(\".edit\"), (ea) => {\n      ea.style.visibility = \"hidden\";\n      ea.style.display = \"none\";\n    });\n    _.each(this.shadowRoot.querySelectorAll(\".browse\"), (ea) => {\n      ea.style.visibility = \"visible\";\n      ea.style.display = \"inline-block\";\n    });\n  }\n\n  showCancelAndSave() {\n    return;\n    _.each(this.shadowRoot.querySelectorAll(\".browse\"), (ea) => {\n      ea.style.visibility = \"hidden\";\n      ea.style.display = \"none\";\n    });\n    _.each(this.shadowRoot.querySelectorAll(\".edit\"), (ea) => {\n      ea.style.visibility = \"visible\";\n      ea.style.display = \"inline-block\";\n    });\n\n  }\n  \n  async switchBetweenJSAndHTML() {\n    const ending = this.getPath().replace(/[#?].*/,\"\")::fileEnding();\n    if(ending === 'js' || ending === 'html') {\n      const targetURLString = this.getPath()::replaceFileEndingWith(ending === 'js' ? 'html' : 'js');\n      const existingContainer = Array.from(document.body.querySelectorAll('lively-container'))\n        .find(container => container.getPath().match(targetURLString));\n      if(existingContainer) {\n        lively.gotoWindow(existingContainer.parentElement, true);\n        existingContainer.focus();\n      } else {\n        lively.openBrowser(targetURLString, true)\n          .then(browser => browser.focus());\n      }\n    }\n  }  \n  \n  // #private\n  async updateFavInfo() {\n    const starIcon = this.get('#favorite').querySelector('i');\n\n    if (await Favorites.has(this.getPath())) {\n      starIcon.classList.add('fa-star');\n      starIcon.classList.remove('fa-star-o');\n    } else {\n      starIcon.classList.add('fa-star-o');\n      starIcon.classList.remove('fa-star');\n    }\n  }\n  \n  observeHTMLChanges() {\n    if (this.mutationObserver) this.mutationObserver.disconnect()\n    this.mutationObserver = new MutationObserver((mutations, observer) => {\n        this.onHTMLMutation(mutations, observer)\n    });\n     this.mutationObserver.observe(this, {\n      childList: true,\n      subtree: true,\n      characterData: true,\n      attributes: true});\n  }\n  /*MD ## Update External Content MD*/\n  \n  updateCSS() {\n    var url = \"\" + this.getURL()\n    \n    console.log('[container] updateCSS ', url)\n    \n    var all = Array.from(lively.allElements(true))\n    all.push(...document.head.querySelectorAll(\"link\"))\n    \n    Object.values(lively.components.templates).forEach(template => {\n      all.push(...template.querySelectorAll(\"*\"))      \n    })\n    \n    all.filter(ea => ea.localName == \"link\")\n      .filter(ea => ea.href == url)\n      .forEach(ea => {\n        var parent = ea.parentElement\n        ea.remove()\n        parent.appendChild(ea)\n        lively.notify(\"update css\",  ea.href)\n      })\n    \n    all.filter(ea => ea.localName == \"style\") \n      .filter(ea => ea.getAttribute(\"data-url\") == url) // vs. this.getAttribute(\"data-src\")\n      .forEach(ea => {\n        lively.fillTemplateStyle(ea, url)\n        lively.notify(\"update style css\", url)\n      })\n  }\n\n  updateOtherContainers(url=\"\" + this.getURL()) {\n    console.warn('updateOtherContainers')\n    document.body.querySelectorAll('lively-container').forEach(ea => {\n      if (ea !== this && !ea.isEditing()\n        && (\"\" +ea.getURL()).match(url.replace(/\\.[^.]+$/,\"\"))) {\n        console.log(\"update container content: \" + ea);\n        ea.setPath(ea.getURL() + \"\");        \n      }\n    });\n    \n    updateEditors(url, [this.get(\"lively-editor\")])\n  }\n  \n  /*MD ## Content Navigation MD*/\n  \n  async scrollToAnchor(anchor) {\n    if (anchor) {\n      var name = decodeURI(anchor.replace(/#/,\"\")).replace(/\\n/g,\"\")\n      if (this.isEditing()) {\n        // use Navbar and it's structural knowledge to find the right name\n        var codeMirror = (await this.asyncGet(\"#editor\")).get('#editor');\n        var navbar = await this.asyncGet(\"lively-container-navbar\")\n        await lively.waitOnQuerySelector(navbar.shadowRoot, \"#details ul li\") // wait for some content\n        var item = navbar.detailItems.find(ea => ea.name == name)\n        if (item) {\n          navbar.onDetailsItemClick(item, new CustomEvent(\"nothing\"))\n        }\n        return\n      }\n      \n      // markdown specific ?\n      var md = this.getContentRoot().querySelector(\"lively-markdown\")\n      if (md) {\n        var root = md.shadowRoot\n      } else {\n        root = this.getContentRoot()\n      }\n          \n      var presentation = md && md.get(\"lively-presentation\")\n      var pageNumberMatch = name.match(/^\\@([0-9]+)$/)\n      if (presentation && pageNumberMatch) {\n        presentation.gotoSlideAt(parseInt(pageNumberMatch[1]))\n        return\n      }      \n      \n      // Special Case:\n      \n      // 1. search by id\n      try {\n        var element = root.querySelector(`#${name.replace(/\"/g,\"%22\").replace(/%2F/g,\"\\\\/\")}`)\n      } catch(e) {\n        // ignore\n      }\n      // 2. search for exactly matching anchors\n      if (!element) {\n        element = root.querySelector(`a[name=\"${name.replace(/\"/g,\"%22\")}\"]`)\n      }\n      // 3. brute force search for headings with the text\n      if (!element) {\n        element = _.find(root.querySelectorAll(\"h1,h2,h3,h4\"), ea => ea.textContent == name)\n      }\n            \n      // 4. ok, try fulltext search\n      if (!element) { \n        \n        // search for the text nodes because they are the smallest entities and go to a nearby entity..\n        var node = lively.allTextNodes(root).find(ea => ea.textContent.match(Strings.escapeRegExp(name)))\n        // going one level up will go to far... in most cases\n        // so we cannot do: element = node.parentElement \n        if (node) element = node.previousElementSibling // instead we go sideways\n      }\n      if (element) {\n        // var element = that\n        var slide = lively.allParents(element).find(ea => ea.classList.contains(\"lively-slide\"))\n        \n        if (presentation && slide) {\n          console.log('goto slide ', slide)\n          presentation.setSlide(slide)\n        }\n        \n        // await lively.sleep(500)\n        // a very hacky way to somehow find the position where to scroll\n        this.get(\"#container-content\").scrollTop = 0 \n        var offset = lively.getGlobalPosition(element).subPt(\n          lively.getGlobalPosition(this.get(\"#container-content\")))\n        this.get(\"#container-content\").scrollTop = offset.y\n      }\n    }    \n  }\n  \n \n  /*MD ## Helper MD*/\n  \n  becomeMainContainer() {\n    this.__ignoreUpdates = true; // a hack... since I am missing DevLayers...\n    this.get('#container-content').style.overflow = \"visible\";\n    \n    this.parentElement.toggleMaximize()\n    this.parentElement.hideTitlebar()\n    this.parentElement.style.zIndex = 0\n    this.parentElement.setAttribute(\"data-lively4-donotpersist\",\"all\");\n    \n    this.id = 'main-content';\n    this.setAttribute(\"load\", \"auto\");\n      \n    window.onpopstate = (event) => {\n        var state = event.state;\n        if (state && state.followInline) {\n          console.log(\"follow \" + state.path);\n          this.followPath(state.path);\n        }\n    };\n    var path = lively.preferences.getURLParameter(\"load\");\n    \n    var editPath = lively.preferences.getURLParameter(\"edit\");\n    if (editPath) {\n      path = editPath\n      var edit = true\n    }\n    \n    if (path) {\n      // allow nested queries... http://localhost:9005/lively4-core/start.html?load=academic://Tim%20Felgentreff?count=3\n      path = window.location.search.replace(/.*[?&]((load)|(edit))=/,\"\")\n    }\n  \n    \n    let fullscreen = lively.preferences.getURLParameter(\"fullscreen\") == \"true\";\n    if (fullscreen) {\n      this.onFullscreen() // #TODO replace toggle logic with enableFullscreen, disableFullscreen\n    }\n\n    // force read mode\n    if(this.getAttribute(\"mode\") == \"read\" && edit) {\n      path = edit;\n      edit = undefined;\n    }\n\n    if (!path || path == \"null\") {\n      path = lively4url + \"/\"\n    }\n\n    this.viewOrEditPath(path, edit) \n  }\n\n  // #Refactor, currently used by _navigation.html\n  // _navigation.html should instead use normal link creation... and we might do magic there?\n  // #deprecated #Problem related to html.fixLinks\n  createLink(base, name, href) {\n    var link = document.createElement(\"a\")\n    link.textContent = name\n    var path = base + href\n    link.href = path\n    link.addEventListener(\"click\", (evt) => {\n        this.followPath(path);\n        evt.preventDefault();\n        evt.stopPropagation()\n    });\n    return link\n  }\n  \n  // #deprecated\n  thumbnailFor(url, name) {\n    if (name.match(/\\.((png)|(jpe?g))$/))\n      return \"<img class='thumbnail' src='\" + name +\"'>\";\n    else\n      return \"\";\n  }\n  \n  listingForDirectory(url, render, renderTimeStamp) {\n    return files.statFile(url).then((content) => {\n      this.clear()\n      if (this.renderTimeStamp !== renderTimeStamp) {\n        return \n      }\n      var files = JSON.parse(content).contents;\n      var index = _.find(files, (ea) => ea.name.match(/^\\index\\.md$/i));\n      if (!index) index = _.find(files, (ea) => ea.name.match(/^index\\.html$/i));\n      if (!index) index = _.find(files, (ea) => ea.name.match(/^README\\.md$/i));\n      if (index) {\n        // lively.notify(\"found index\" + index)\n        // this.contextURL\n        \n        return this.followPath(url.toString().replace(/\\/?$/, \"/\" + index.name)) ;\n      }\n      return Promise.resolve(\"\"); // DISABLE Listings\n\n      this.sourceContent = content;\n\n      var fileBrowser = document.createElement(\"lively-file-browser\");\n      /* DEV\n        fileBrowser = that.querySelector(\"lively-file-browser\")\n        url = \"https://lively-kernel.org/lively4/\"\n       */\n      if (render) {\n        return lively.components.openIn(this.getContentRoot(), fileBrowser).then( () => {\n          if (this.renderTimeStamp !== renderTimeStamp) {\n            fileBrowser.remove()\n            return\n          }\n          \n          // lively.notify(\"set url \" + url)\n          fileBrowser.hideToolbar();\n          // override browsing file and direcotry\n          fileBrowser.setMainAction((newURL) => {\n            // lively.notify(\"go \" + newURL)\n            this.followPath(newURL.toString());\n          });\n          fileBrowser.setMainDirectoryAction((newURL) => {\n            // lively.notify(\"go dir \" + newURL)\n            this.followPath(newURL.toString() + \"/\");\n          });\n          fileBrowser.setURL(url);\n        });\n      } else {\n        return ;\n      }\n    }).catch(function(err){\n      console.log(\"Error: \", err);\n      lively.notify(\"ERROR: Could not set path: \" + url,  \"because of: \",  err);\n    });\n  }\n  \n  // #private\n  normalizeURL(urlString) {\n    var url = new URL(urlString);\n    url.pathname = lively.paths.normalize(url.pathname);\n    return  \"\" + url;\n  }\n  \n  /*MD ## Markdown Source Mapping \n  \n  ![](../../../doc/figures/markdown-mapping.drawio)\n  \n  MD*/\n  \n  async onMarkdownContextMenu(evt, markdown, elements) {\n    let menuItems = [\n      ['edit source', () => this.showMarkdownElement(elements[0]), '', ``],\n      ['edit', () => this.editMarkdownElement(elements.last, markdown), '', ``],\n      ['show annotations', () => this.showMarkdownAnnotations(markdown), '', ``],\n    ];\n    var checkbox = elements[0].querySelector(`input[type=\"checkbox\"]`)\n    if (checkbox) {\n      menuItems.push([\"check\", async () => { \n        this.markdownCheckCheckboxAndSave(checkbox)\n      }])\n    }\n    let menu = await ContextMenu.openIn(document.body, evt, undefined, document.body,  menuItems);\n    return false\n  }\n  \n  async markdownCheckCheckboxAndSave(checkbox) {\n    var elements = lively.allParents(checkbox).filter(ea => ea.getAttribute(\"data-source-line\"))\n    debugger\n    checkbox.checked = !checkbox.checked\n    if (checkbox.checked) {\n      checkbox.setAttribute(\"checked\", undefined)\n    } else {\n      checkbox.removeAttribute(\"checked\")\n    }\n    var source = await this.elementToMarkdown(elements.last)\n    var range = this.getMarkdownRange(elements.last)\n    this.saveRegionWithEditor(this.getURL(), range, source)   \n  }\n  \n  \n  getMarkdownRange(element) {\n    var sourceLine = element.getAttribute(\"data-source-line\")\n    return sourceLine && sourceLine.split(\"-\").map(n => parseFloat(n))\n  }\n  \n  setMarkdownRange(element, range) {\n    element.setAttribute(\"data-source-line\", range[0] + \"-\" +  range[1])\n  }\n  \n  \n  onMarkdownEditorCursorActivity(cm, markdown) {\n    var line = cm.getCursor().line + 1\n    var root = markdown.get(\"#content\")\n    var highlights = markdown.get(\"#highlights\")\n    \n    var elements = root.querySelectorAll(`[data-source-line]`).filter(ea => {\n      var range = this.getMarkdownRange(ea)\n      return (range[0] == line) // && (line < range[1])\n    })\n    if (elements.length > 0) {\n      var element = Array.from(elements).last\n      var slide = lively.allParents(element).find(ea => ea.classList.contains(\"lively-slide\"))\n\n      if (slide) {\n        var presentation = lively.allParents(element).find(ea => ea.localName == \"lively-presentation\")\n        if (presentation) presentation.setSlide(slide)  \n      }\n\n      if (this.lastEditCursorHighlight ) this.lastEditCursorHighlight.remove()\n      this.lastEditCursorHighlight = lively.showElement(element)\n      this.lastEditCursorHighlight.style.borderColor = \"rgba(0,0,200,0.5)\"\n      this.lastEditCursorHighlight.innerHTML = \"\"\n      highlights.appendChild(this.lastEditCursorHighlight)\n      this.lastEditCursorHighlight\n      lively.setGlobalPosition(this.lastEditCursorHighlight, lively.getGlobalPosition(element))\n    }\n  }\n  \n  onMarkdownClick(evt) {\n    var markdownElements = evt.composedPath().filter(ea => ea && ea.getAttribute && ea.getAttribute(\"data-source-line\"))\n    if (markdownElements.length == 0) return;\n    var last = markdownElements.first\n\n    var otherContainer = this.getOtherContainers(true)[0]\n    if (otherContainer) {\n      this.containerShowMarkdownElement(otherContainer, last)\n    }\n  }\n  \n  async showMarkdownElement(element) {\n    var otherContainer = this.getOtherContainers(true)[0]\n    if (!otherContainer) {\n      otherContainer = await lively.openBrowser(this.getURL().toString(), true)\n    }\n    this.containerShowMarkdownElement(otherContainer, element)\n    \n  }\n\n  async elementToMarkdown(element) {\n    var markdownConverter = new Upndown()\n    markdownConverter.tabindent = \"  \"\n    markdownConverter.bullet = \"- \"\n    return markdownConverter.convert(element.outerHTML, {keepHtml: true})\n  }\n  \n  async editMarkdownElement(element, markdown) {\n    var source = await this.elementToMarkdown(element)\n    var range = this.getMarkdownRange(element)\n    var rangeOffset = range[0] - 1\n    \n    if (this.lastMarkdownWorkspace) {\n      if (this.lastMarkdownWorkspace.targetElement) {\n        this.lastMarkdownWorkspace.targetElement.style.display = \"\"\n      }\n      this.lastMarkdownWorkspace.remove()\n    }\n    \n    \n    var workspace = await (<lively-code-mirror mode=\"gfm\"></lively-code-mirror>)\n    workspace.targetElement = element\n    \n    this.lastMarkdownWorkspace = workspace\n\n    \n    element.parentElement.insertBefore(workspace, element)\n    element.style.display = \"none\"\n    await  workspace.editorLoaded()    \n    workspace.value = source\n    workspace.focus()\n    workspace.registerExtraKeys({\n      Enter: async () => {\n        await workspace.doSave()\n        element.style.display = \"\"\n\n\n        var root = <div></div>\n            \n        // Just a preview... since we have to reload later .... #TODO make the real thing?\n        await markdown.renderMarkdown(root, workspace.value)\n        Array.from(root.childNodes).forEach(ea  => {\n          workspace.parentElement.insertBefore(ea, workspace)\n\n          var tmpRange =  this.getMarkdownRange(ea)\n          tmpRange[0] += rangeOffset\n          tmpRange[0] += rangeOffset\n          this.setMarkdownRange(element, range)\n          \n          \n          // lively.showElement(ea)\n        })\n        \n        // #TODO fix data-source-line ... in elements after this element! or give up and reload!\n        this.followPath(this.getURL()) // #GiveUp\n        \n        element.remove()\n        workspace.remove()\n      }\n    })\n\n    // prevent slide navigation etc....\n    workspace.addEventListener(\"keydown\", async (evt) => {\n      evt.stopPropagation();\n    })\n    \n    workspace.doSave = async () => {\n      lively.notify(\"save range \" + range[0] + \"-\" + range[1])\n      range = await this.saveRegionWithEditor(this.getURL(), range, workspace.value)    \n    }\n    \n  }\n  \n  async showMarkdownAnnotations(markdown) {\n    var url = this.getURL()\n    var annotationURL = url.replace(/([?#].*$)/,\"\") + \".l4a\"\n    if (await lively.files.exists(annotationURL)) {\n      var annotatedText = await AnnotatedText.fromURL(url, annotationURL)\n      var root = markdown.get(\"#content\")\n      var renderedText = root.textContent\n\n      annotatedText.setText(renderedText)\n\n\n      for(var ea of annotatedText.annotations) {\n        ea.annotateInDOM(root)\n      }      \n    }\n  }\n  \n  async saveRegionWithEditor(url, range, text) {\n    var editor = await lively.create(\"lively-editor\");\n    editor.setURL(url)\n    await editor.loadFile()\n    var cm = editor.currentEditor()\n    \n    // #Hack... realy hack: preserve trailing lines... because outerHTML and the markdown range only fit roughly \n    var lines = cm.getValue().split(\"\\n\")\n    var lastRangeLine = range[1] - 2\n    if (lines[lastRangeLine] == \"\") {\n      range[1]--\n    }\n    \n    cm.setSelection({line: range[0] - 1, ch:0 }, {line: range[1] - 1, ch:0 })    \n    cm.replaceSelection(text + \"\\n\")\n\n    // update element...\n    var newRangeHeight = text.split(\"\\n\").length\n    range[1] = range[0] + newRangeHeight\n    editor.saveFile()\n    return range\n  }\n  \n  containerShowMarkdownElement(otherContainer, element) {\n    var livleyEditor = otherContainer.get('#editor')\n    var livleyCodeMirror = livleyEditor && livleyEditor.get('#editor')\n    var cm = livleyCodeMirror && livleyCodeMirror.editor\n\n    if (cm) {\n      var line = element.getAttribute(\"data-source-line\").split(\"-\")[0]\n      // cm.setCursor({line: line - 1, ch: 0}) \n      cm.setSelection({line: line - 1, ch: 0}, {line: line , ch: 0})         \n      otherContainer.parentElement.focus()\n      otherContainer.focus()\n    }\n  }\n  \n\n  \n  \n  /*MD ## Lively Hooks MD*/\n  \n  // #hook make a gloval position relative, so it can be used in local content\n  localizePosition(pos) {\n    var offsetBounds = this.get('#container-content').getBoundingClientRect();\n    return pos.subPt(pt(offsetBounds.left, offsetBounds.top));\n  }\n  \n  // #hook\n  livelyAllowsSelection(evt) {\n    if (!this.contentIsEditable() || this.isEditing()) return false\n\n    if (evt.composedPath()[0].id == \"container-content\") return true;\n\n    return false\n  }\n  \n  // #hook\n  livelyAcceptsDrop() {\n    return this.contentIsEditable() && !this.isEditing()\n  }\n\n  // #hook\n  livelyPrepareSave() {\n    this.setAttribute(\"leftpane-flex\", this.get(\"#container-leftpane\").style.flex)\n    this.setAttribute(\"rightpane-flex\", this.get(\"#container-rightpane\").style.flex)\n  }\n\n  // #hook\n  livelyPreMigrate() {\n    // do something before I got replaced\n    this.oldContentScroll = this.get(\"#container-content\").scrollTop;\n \t  var livelyEditor = this.get(\"#editor\");\n    if (livelyEditor) {\n      this.oldScrollInfo = livelyEditor.getScrollInfo()\n      this.oldCursor = livelyEditor.getCursor()\n      this.oldFocused = document.activeElement == this\n    }\n  }\n\n  // #hook\n  async livelyExample() {\n    return this.followPath(lively4url + \"/README.md\")\n  }\n\n  // customize clipboard interaction... etc\n  // navigating in this multidimensional space can be hard\n  // #hook\n  livelyTarget() {\n    var markdownElement = this.get(\"lively-markdown\")\n    if (markdownElement && markdownElement.get) { // maybe not initialized yet.. damn! \n      return markdownElement.get(\"#content\")\n    }\n    return this\n  }\n  \n  // #hook\n  livelyMigrate(other) {\n    // other = that\n\n    this._history = other._history;\n    this._forwardHistory = other._forwardHistory;\n    \n    this.isMigrating = true;\n    this.preserveContentScroll = other.oldContentScroll;\n    var editor = other.get(\"#editor\");\n    if (editor) {\n      var otherCodeMirror = editor.currentEditor();\n      if (otherCodeMirror && otherCodeMirror.selection) {\n        var range = otherCodeMirror.selection.getRange();\n        var scrollTop = otherCodeMirror.session.getScrollTop();\n        this.asyncGet(\"#editor\").then( editor => {\n          var thisCodeMirror = editor.currentEditor();\n          if (otherCodeMirror && thisCodeMirror) {\n            thisCodeMirror.session.setScrollTop(scrollTop);\n            thisCodeMirror.selection.setRange(range);\n          }\n          this.isMigrating = false;\n        }).catch(() => {\n          // jsut to be sure..\n          this.isMigrating = false;\n        });\n      }\n      this.asyncGet(\"#editor\").then( editor => {\n        editor.setScrollInfo(other.oldScrollInfo)\n      \teditor.setCursor(other.oldCursor)\n      \tif (other.oldFocused) {\n      \t  // lively.notify(\"set focus again!\")\n      \t  // setTimeout(() => editor.focus(), 1000)\n        }\n      })\n    } else {\n      this.isMigrating = false;\n    }\n  }\n  \n}\n"]}