{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-augment/src/client/html.js"],"names":["Preferences","_","Rasterize","pt","Strings","KeyboardHandler","getDispatchHandler","key","dispatchKey","evt","object","upOrDown","stopAndPreventDefault","handler","keyCode","preventDefault","stopPropagation","keyUpOrDown","String","fromCharCode","HTML","findAllNodes","visit","all","Set","document","querySelectorAll","ea","add","shadowRoot","subobjects","Array","from","getFilter","includes","tagName","getHtmlContent","body","filter","childNodes","map","outerHTML","join","clearHtmlContent","each","removeChild","parseHTML","html","tmpRoot","createElement","innerHTML","setHtmlContent","nodes","appendChild","registerButtons","parent","prototype","forEach","call","node","name","id","funcName","replace","c","toUpperCase","addEventListener","func","alert","registerKeys","obj","domain","target","getAttribute","setAttribute","lively","registerDrag","draggable","removeEventListener","onDragStart","onDrag","onDragEnd","registerInputs","value","fixLinks","dir","followPath","Error","href","path","anchor","m","match","code","console","log","src","swAwareBasePath","localName","saveCurrentPageAs","prev","preferences","getURLParameter","url","window","prompt","savePageAs","saveCurrentPage","confirm","source","files","saveFile","then","notify","getGlobalSource","worldContext","write","JSON","stringify","getPosition","x","scrollingElement","scrollLeft","y","scrollTop","oldActiveElement","activeElement","livelyPrepareSave","e","warn","focusWithoutScroll","hasDoNotPersistTag","checkForChildrenValueToo","attributes","hasOwnProperty","dataset","lively4Donotpersist","loadHTMLFromURL","zoom","fetch","r","status","text","tmp","create","style","transform","setGlobalPosition","clipboard","pasteHTMLDataInto","remove","saveAsPNG","saveAsURL","element","elementToURL","registerAttributeObservers","_attrObserver","disconnect","MutationObserver","mutations","mutation","type","methodName","toUpperCaseFirst","attributeName","oldValue","observe","removeContextStyleChangeListener","cb","getContextStyleCallbackMap","array","get","set","addContextStyleChangeListener","push","contextStyleCallbackMap","WeakMap","disconnectContextStyleObserver","observer","registerContextStyleObserver","changeEvent","CustomEvent","bubbles","isMetaNode","dispatchEvent","allElements","cbArray","eaCB","subtree","attributeFilter","addDeepMousePressed","listFunc","deepListId","clearList","oldList","querySelector","_deepPressedLastMouseUp","cancelOnBack","sleep","list","item","backgroundColor","position","getGlobalPosition","addPt","textAlign","zIndex","opacity","minWidth","Date","now","addChooseList","HTMLElement","toString","getExtent","findHeaders","roots","headers","eaRoot","allQuerySelectorAll","query","result"],"mappings":"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","file":"html.js","sourcesContent":["import Preferences from \"src/client/preferences.js\"\nimport _ from 'src/external/lodash/lodash.js'\nimport Rasterize from \"src/client/rasterize.js\"\nimport {pt} from 'src/client/graphics.js'\nimport Strings from 'src/client/strings.js'\n\n/*\n * Kitchensink for all HTML manipulation utilities\n */\n\nclass KeyboardHandler {\n  \n  // Generic Keyboad handler to get rid of the magic keycode numbers \n  static getDispatchHandler(key) {\n    return ({\n      \"9\": \"onTab\",\n      \"13\": \"onEnter\",\n      \"27\": \"onEsc\",\n      \"32\": \"onSpace\",\n      \"37\": \"onLeft\",\n      \"38\": \"onUp\",\n      \"39\": \"onRight\",\n      \"40\": \"onDown\",\n    })[key]\n  }\n  \n  static dispatchKey(evt, object, upOrDown, stopAndPreventDefault) {\n    var handler = this.getDispatchHandler(evt.keyCode)\n    if (handler) {\n      handler += upOrDown\n      if (object[handler]) {\n        object[handler](evt)\n        if (stopAndPreventDefault) {\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n      }\n    }\n    var keyUpOrDown = \"onKey\" + upOrDown\n    if (object[keyUpOrDown]) {\n        var key = String.fromCharCode(evt.keyCode)\n        object[keyUpOrDown](evt, key)\n        if (stopAndPreventDefault) {\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n    }\n  }\n}\n\nexport default class HTML {\n\n  static findAllNodes(visit, all) {\n    if (!all) { all = new Set() }\n    if (!visit) { visit = document.querySelectorAll('*') }\n    for (var ea of visit) {\n    all.add(ea);\n    if (ea.shadowRoot) {\n      var subobjects = ea.shadowRoot.querySelectorAll('*');\n      this.findAllNodes(subobjects, all);\n    }\n    }\n    return Array.from(all);\n  }\n  \n  static getFilter(ea) {\n    return !['SCRIPT', 'LIVELY-PREFERENCES', 'LIVELY-HALOS'].includes(ea.tagName);\n  }\n  \n  static getHtmlContent(body) {\n    return _.filter(body.childNodes, this.getFilter).map( \n      (ea) => ea.outerHTML).join(\"\\n\");\n  }\n  \n  static clearHtmlContent(body) {\n    return _.filter(body.childNodes, this.getFilter).each( (ea) => body.removeChild(ea)).join(\"\\n\")\n  }\n  \n  static parseHTML(html) {\n    var tmpRoot = document.createElement(\"div\")\n    tmpRoot.innerHTML = html\n    return Array.from(tmpRoot.childNodes)\n  }\n  \n  static setHtmlContent(body, html) {\n    \n    \n    var nodes = this.parseHTML(html)\n    _.each(nodes, (ea) => {\n      body.appendChild(html)\n    })\n  }\n  \n  static registerButtons(parent) {\n    // Just an experiment for having to write less code.... which ended up in having more code here ;-) #Jens\n    Array.prototype.forEach.call(parent.shadowRoot.querySelectorAll(\"button\"), node => {\n      var name = node.id\n      var funcName = name.replace(/^./, c => \"on\"+ c.toUpperCase())\n      // console.log(\"register button \" + name)\n      node.addEventListener(\"click\", () => {\n        var func = parent[funcName]\n        if (func) {\n          func.call(parent)\n        } else {\n          alert(\"No callback: \" +  funcName)\n        }\n      })\n    })\n  }\n  \n  static registerKeys(obj, domain, target, stopAndPreventDefault) {\n    domain = domain || \"Keys\"\n    target = target || obj\n    \n    // enable keyboard events\n    if (obj && obj.getAttribute) {\n      if (obj.getAttribute(\"tabindex\") === null) {\n        obj.setAttribute(\"tabindex\", 0)\n      }\n    }\n    lively.addEventListener(domain, obj, \"keydown\", evt => {\n      KeyboardHandler.dispatchKey(evt, target, \"Down\", stopAndPreventDefault)\n    })\n    lively.addEventListener(domain, obj, \"keyup\", evt => {\n      KeyboardHandler.dispatchKey(evt, target, \"Up\", stopAndPreventDefault)\n    })\n  }\n  \n  \n  static registerDrag(obj, domain, target) {\n    target.draggable=true; \n    lively.removeEventListener(domain, target);\n    lively.addEventListener(domain, target, \"dragstart\", \n      evt => obj.onDragStart && obj.onDragStart(evt));\n    lively.addEventListener(domain, target, \"drag\", \n      evt => obj.onDrag && obj.onDrag(evt));\n    lively.addEventListener(domain, target, \"dragend\", \n      evt => obj.onDragEnd && obj.onDragEnd(evt));\n  }\n       \n  \n  static registerInputs(parent) {\n    Array.prototype.forEach.call(parent.shadowRoot.querySelectorAll(\"input\"), node => {\n      var name = node.id\n      var funcName = name.replace(/^./, function (c) {\n            return \"on\" + c.toUpperCase() ;\n          }) + \"Changed\";\n        // console.log(\"register input \" + name)\n        node.addEventListener(\"input\", function(evt) {\n          var value = node.value\n          var func = parent[funcName];\n          if (func) {\n            func.call(parent, value);\n          } else {\n            // ignore it\n            // alert(\"No callback: \" + funcName);\n          }\n        });\n      })\n  }\n\n  static fixLinks(nodes, dir, followPath) {\n    // console.log(\"fix links \" + dir)\n    if (! followPath) {\n      throw new Error(\"argument followPath missing\");\n    }\n    if (! nodes) return;\n    \n    Array.prototype.forEach.call(nodes, node => {\n      if (node.getAttribute) {\n        \n        var href = node.getAttribute(\"href\")\n        if (href) {\n          // console.log(\"FIX LINK \", href)\n          // #TODO load inplace....\n          var path;\n          var anchor;\n          var m\n          if (m = href.match(/javascript:visitPath\\('webwerkstatt\\/(.*)'\\)/)) {\n            path = \"/Thesis/\" + m[1]\n          } else if (m = href.match(/javascript:(.*)'\\)/)) {\n            var code = m[1]\n            // do nothing            \n          } else if (href.match(/([A-Za-z]+):\\/\\/.*/)) {\n            // console.log(\"ignore \"  + href);\n            path = href;\n          } else if (href.match(/^\\//)) {\n            path = href; // ABSOLTUE paths\n          } else if (href.match(/^#/)) {\n            // Anchor links\n            path = null\n            anchor = href\n          } else {\n            path = dir + href // that leaves us RELATIVE paths\n            if(!path.match(/((\\.[A-Za-z0-9]+)|(\\/))$/) && !path.match(/\\?/)) {\n              // no ending?\n              // we could check, or assume md for the moment\n              path += \".md\"\n              console.log(\"assume Markdown for \"+ path)\n            }\n          } \n          if (path) {\n            // console.log(\"fix \"  + href + \" to \" + path + \"(dir \" + dir + \")\")\n            if (node.tagName == \"LINK\") {\n              // console.log(\"update LINK\", path)\n              node.setAttribute(\"data-href\", href) // so we keep the original somewhere..\n              node.setAttribute(\"href\", path)\n            }            \n            lively.addEventListener(\"lively\", node, \"click\", (evt) => { \n              evt.preventDefault()\n              evt.stopPropagation()\n              followPath(path); \n              return false; \n            });\n          } else if (anchor) {\n            lively.addEventListener(\"lively\", node, \"click\", (evt) => { \n              debugger\n              evt.preventDefault()\n              evt.stopPropagation()\n              followPath(anchor); \n              return false; \n            });\n          } else {\n            // console.log(\"ignore \" + href)\n          }\n        } else if (node.getAttribute('src')) {\n          // image tag\n          let src = node.getAttribute('src'),\n              // TODO: remove duplicate\n              swAwareBasePath = '', //https://lively4/\n              path;\n          // TODO: remove duplucated logic\n          if (src.match(/([A-Za-z]+):\\/\\/.+/)) {\n            // ignore FULL URLS\n            // console.log(\"ignore \"  + src);\n          } else if (src.match(/^data:.+/)) {\n            // ignore data urls\n          } else if (src.match(/^\\//)) {\n            path = src; // ABSOLTUE paths\n          } else {\n            console.log(\"FIX SRC \", node.localName,  swAwareBasePath +  dir, \"src:\" + src)\n            path = swAwareBasePath + dir + src // that leaves us RELATIVE paths\n          }\n          if (path) {\n            node.setAttribute('src', path);\n          } else {\n            // console.log(\"ignore image \" + href)\n          }\n        }\n        this.fixLinks(node.childNodes, dir, followPath)\n      }\n    })\n  }\n  \n  static saveCurrentPageAs() {\n    var prev = lively.preferences.getURLParameter(\"page\")\n    if (!prev) prev = \"\"\n    var url = window.prompt(\"Save page as?\", prev)\n    this.savePageAs(url)\n  }\n\n  static saveCurrentPage() {\n    var url = lively.preferences.getURLParameter(\"page\");\n    if (!url) {\n      lively.confirm(\"Could not save this page...\")\n    } else {\n      this.savePageAs(url)\n    }\n  }\n  \n  static savePageAs(url) {\n    var source  = document.body.innerHTML // #TODO here we must put more work...\n    lively.files.saveFile(url, source).then( () => {\n      lively.notify(\"Saved \" + url)\n    })\n  }\n\n  static getGlobalSource(worldContext) {\n    worldContext= worldContext || document.body;\n    Preferences.write(\"bodyPosition\", JSON.stringify(lively.getPosition(document.body)))\n    Preferences.write(\"bodyScroll\", JSON.stringify({\n      x: document.scrollingElement.scrollLeft,\n      y: document.scrollingElement.scrollTop\n    }));\n    \n    var source = \"\"\n    var oldActiveElement = lively.activeElement()\n    worldContext.querySelectorAll(\"*\").forEach( ea => {\n      try {\n        if (ea.livelyPrepareSave) ea.livelyPrepareSave();\n      } catch(e) {\n        console.warn(\"Error during prepare save\", e);\n      }\n    });\n    lively.focusWithoutScroll(oldActiveElement)\n\n    Array.from(worldContext.querySelectorAll(\":scope > lively-window, :scope > .lively-content\")).filter(ea => {\n      return !this.hasDoNotPersistTag(ea)\n    }).forEach( ea => {\n      source += ea.outerHTML + \"\\n\"\n    });\n    return source\n  }\n  \n  static hasDoNotPersistTag(node, checkForChildrenValueToo = false) {\n    return node.attributes\n        && node.attributes.hasOwnProperty('data-lively4-donotpersist')\n        && (checkForChildrenValueToo ?\n            node.dataset.lively4Donotpersist == 'children' || node.dataset.lively4Donotpersist == 'all' :\n            node.dataset.lively4Donotpersist == 'all');\n  }\n  \n  static async loadHTMLFromURL(url, zoom=1) {\n    var html = await fetch(url).then(r => {\n      if (r.status != 200) {\n        throw new Error(\"Could not load HTML from \" + url + \" due to status \" + r.status)\n      }\n      return r.text()\n    })\n    var tmp = await lively.create(\"div\")\n    tmp.style.transform = `scale(${zoom})`\n    lively.setGlobalPosition(tmp, pt(0,0))\n    try {\n      lively.clipboard.pasteHTMLDataInto(html, tmp)\n    } finally {\n      tmp.remove()\n    }\n    return tmp\n  }\n  \n  static async saveAsPNG(url) {\n    if (url.match(/\\.html$/)) {\n      var saveAsURL = url.replace(/html$/, \"png\")\n      var zoom = 2\n      var element = await this.loadHTMLFromURL(url, zoom)\n      document.body.appendChild(element)\n      // await lively.sleep(100)\n      try {\n        await Rasterize.elementToURL(element, saveAsURL, zoom)      \n      } finally {\n        element.remove()\n      }\n    }\n    return saveAsURL\n  }\n\n static async registerAttributeObservers(obj) {\n    obj._attrObserver && obj._attrObserver.disconnect(); \n\n    obj._attrObserver = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {  \n        if(mutation.type == \"attributes\") { \n          // console.log('mutation ' + mutation.attributeName )\n          var methodName = \"on\" + Strings.toUpperCaseFirst(mutation.attributeName) + \"Changed\"\n          if (obj[methodName]) {\n            // console.log(\"found \" + methodName)\n            obj[methodName](\n              mutation.target.getAttribute(mutation.attributeName),\n              mutation.oldValue)\n          } else {\n             console.log(\"[AttributeObservers] NOT found: \" + methodName, obj)\n          }\n        }\n      });\n    });\n    obj._attrObserver.observe(obj, { attributes: true });  \n  }\n\n  // ## Example workspace\n  /*\n      import html from \"src/client/html.js\"\n      lively.html.registerContextStyleObserver(document.body)\n\n      lively.html.registerContextStyleObserver(document.body).then(o => {\n        o.disconnect()\n      })\n  */\n  \n  static removeContextStyleChangeListener(obj, cb) {\n    if (!obj || ! cb) {\n      throw new Error(\"parameter missing\")\n    }\n    var map = this.getContextStyleCallbackMap()\n    var array = map.get(obj)\n    if (array) {\n      array = []\n       map.set(obj, array.filter(ea => ea !== cb))\n    }\n  }\n  \n  static addContextStyleChangeListener(obj, cb) {\n    if (!obj || ! cb) {\n      throw new Error(\"parameter missing\")\n    }\n    var map = this.getContextStyleCallbackMap()\n    var array = map.get(obj)\n    if (!array) {\n      array = []\n       map.set(obj, array)\n    }\n    array.push(cb)\n  }\n  \n  \n  static getContextStyleCallbackMap() {\n    if (!this.contextStyleCallbackMap) {\n      this.contextStyleCallbackMap = new WeakMap()\n    }\n    return  this.contextStyleCallbackMap\n  }\n  \n  \n  static async disconnectContextStyleObserver(obj, domain=\"\") {\n    var observer = obj[\"_contextStyleObserver\" + domain] \n    if (observer) {\n      observer.disconnect(); \n    }\n  }\n  \n  \n  static async registerContextStyleObserver(obj, domain=\"\") {\n    this.disconnectContextStyleObserver(obj, domain);\n\n    \n    var map = this.getContextStyleCallbackMap()\n    \n    var observer = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {  \n        if(mutation.type == \"attributes\" \n            && mutation.attributeName == \"style\"\n            && mutation.target !== document.body) {\n          \n        \n          \n          var changeEvent = new CustomEvent(\"context-style-changed\", {\n            bubbles: false,\n            target: mutation.target\n          })\n          if (mutation.target.isMetaNode) return;\n          mutation.target.dispatchEvent(changeEvent)  \n          lively.allElements(true, mutation.target).forEach(ea => {\n            if (ea.isMetaNode) return;\n            var cbArray = map.get(ea) \n            if (cbArray) {\n              cbArray.forEach(eaCB => {\n                eaCB(changeEvent)\n              })\n            }\n          \n         })      \n        }\n      });\n    })\n    obj[\"_contextStyleObserver\" + domain] = observer \n    observer.observe(obj, { \n      subtree: true,\n      attributes: true,\n      attributeFilter: [\"style\"]\n    });\n    return observer \n  }\n  \n  \n  \n  // #TODO refactor magic numbers to style? maybe lively.css?\n  static addDeepMousePressed(element, listFunc, cb) {\n    if (!listFunc) {\n      throw new Error(\"listFunc argument is missing\")\n    }\n    var deepListId = \"deep-list\"\n    function clearList() {\n      var oldList = element.querySelector(\"#\" + deepListId)\n      if (oldList) oldList.remove()\n    }\n    lively.addEventListener(\"HTMLDeepPress\", element, \"mousedown\", async (evt) => {\n      clearList()\n      element._deepPressedLastMouseUp = null\n      element.cancelOnBack = null\n      await lively.sleep(1000)\n      if (!element._deepPressedLastMouseUp) {\n        element.cancelOnBack = true\n        var list = <div id={deepListId} style=\"font-size:12pt\"><ul>{... \n          listFunc().map(ea => {\n            var item = <li>{ea}</li>\n            item.addEventListener(\"mouseenter\", () => item.style.backgroundColor = \"lightgray\")\n            item.addEventListener(\"mouseleave\", () => item.style.backgroundColor = \"\")\n            item.addEventListener(\"mouseup\", (evt) => {\n              evt.stopPropagation()\n              evt.preventDefault()\n              list.remove()\n              cb && cb(evt, ea)\n            })\n            return item\n          })\n        }</ul></div>\n        list.style.position = 'absolute';\n        element.appendChild(list)\n        lively.setGlobalPosition(list, lively.getGlobalPosition(list).addPt(pt(0,25)))\n        list.style.textAlign = \"left\"\n        list.style.zIndex = 1000\n        list.style.backgroundColor = \"white\"\n        list.style.opacity = 0.8\n        list.style.minWidth = \"200px\"\n      }\n    })\n      \n    lively.addEventListener(\"HTMLDeepPress\", element, \"mouseup\", evt => {\n      element._deepPressedLastMouseUp = Date.now()\n      // I don't know were to ged rid of it when not here_\n      clearList()\n    });\n  }\n  \n  // #TODO refactor magic numbers to style? maybe lively.css?\n  static addChooseList(element, listFunc, cb) {\n    if (!listFunc) {\n      throw new Error(\"listFunc argument is missing\")\n    }\n    var deepListId = \"choose-list\"\n    function clearList() {\n      var oldList = element.querySelector(\"#\" + deepListId)\n      if (oldList) {\n        oldList.remove()\n        return true\n      }\n      return false\n    }\n    lively.addEventListener(\"ChooseList\", element, \"click\", async (evt) => {\n      if (clearList()) return; // click closed old...\n      var list = <div id={deepListId} style=\"font-size:12pt\"><ul>{... \n          listFunc().map(ea => {\n            // we accept a list of objects or HTMLElements\n            var item;\n            if (ea instanceof HTMLElement) {\n              item = ea;\n            } else {\n              item = <li>{ea.toString()}</li>;\n              if (ea.style) { item.style = ea.style; }\n            }\n\n              item.addEventListener(\"mouseenter\", () => item.style.backgroundColor = \"lightgray\")\n            item.addEventListener(\"mouseleave\", () => item.style.backgroundColor = \"\")\n            item.addEventListener(\"mouseup\", (evt) => {\n              evt.stopPropagation()\n              evt.preventDefault()\n              list.remove()\n              cb && cb(evt, ea)\n            })\n\n            return item\n          })\n        }</ul></div>\n        list.style.position = 'absolute';\n        element.appendChild(list)\n        lively.setGlobalPosition(list, lively.getGlobalPosition(list).addPt(pt(0,lively.getExtent(element).y)))\n        list.style.textAlign = \"left\"\n        list.style.zIndex = 1000\n        list.style.backgroundColor = \"white\"\n        list.style.opacity = 0.8\n        list.style.minWidth = \"300px\"\n      \n    })\n  }\n  \n  \n  static findHeaders(roots) {\n    var headers = []\n    roots.forEach(eaRoot => {\n      if (eaRoot.localName && eaRoot.localName.match(/^h[1-3]$/)) {\n        headers.push(eaRoot)\n      }\n      if (eaRoot.querySelectorAll) {\n        eaRoot.querySelectorAll(\"h1,h2,h3\").forEach(ea => headers.push(ea))\n      }\n    })\n    return headers\n  } \n  \n  static allQuerySelectorAll(roots,query) {\n    var result = []\n    roots.forEach(eaRoot => {\n      // if (eaRoot.localName && eaRoot.localName.match(/^h[1-3]$/)) {\n      //   result.push(eaRoot)\n      // }\n      if (eaRoot.querySelectorAll) {\n        result.push(...eaRoot.querySelectorAll(query))\n      }\n    })\n    return result\n  } \n}\n\n// #LiveProgramming #Hack #CircularDependency #TODO\nif (window.lively) {\n  window.lively.html = HTML\n}\n\n\n"]}