{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/src/client/rasterize.js"],"names":["rasterizeHTML","pt","CloneDeepHTML","diffCSS","a","b","astyle","getComputedStyle","bstyle","css","i","length","name","item","match","getPropertyValue","shallowClone","obj","parent","root","node","constructor","parentElement","tagName","document","createTextNode","textContent","replace","lively4url","createElement","id","_shadowRootContentNode","SVGElement","createElementNS","Array","from","attributes","forEach","ea","setAttribute","value","e","console","log","shadowRoot","lively","showElement","style","beforeElementStyle","beforeContent","content","text","JSON","parse","warn","cssText","appendChild","deepCopyAsHTML","to","deepCopyAsHTMLFromTo","undefined","target","contentNode","childNodes","fromChild","toChild","Rasterize","trimCanvas","canvas","rowBlank","imageData","width","y","x","data","columnBlank","top","bottom","ctx","getContext","getImageData","height","left","right","trimmed","copy","ownerDocument","copyCtx","putImageData","elementToCanvas","element","zoom","bounds","getTotalGlobalBounds","extent","sleep","cloned","h","querySelector","setPosition","minExtent","Math","max","drawHTML","outerHTML","elementToDataURL","toDataURL","elementToURL","url","dataURL","files","copyURLtoURL","asImage","img","src","openAsImage","body","TemplatePreview","createPreview","templateName","Error","comp","Promise","race","openComponentInWindow","r","setTimeout","livelyExample","$morph","remove","windowTitle","then","position","imgData","fetch","blob","imgURL","method","error","generate","dry","urls","components","getTemplatePaths","dir","json","templates","contents","filter","previewUrl","existFile","stoped"],"mappings":"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","file":"rasterize.js","sourcesContent":["import rasterizeHTML from \"src/external/rasterizeHTML.js\"\nimport {pt} from \"src/client/graphics.js\"\n\n/* ## Workspace Snipped for interactive Testing\n\n```\n  import {CloneDeepHTML} from \"src/client/rasterize.js\"\n\n  $morph(\"Cloned\").innerHTML = \"\"\n  var cloned = CloneDeepHTML.deepCopyAsHTML($morph(\"Original\"))\n  $morph(\"Cloned\").appendChild(cloned)\n```\n*/\n\n// the rasterization code expects only plain HTML and cannot deal with shadow dom, so we flatten it away\nexport class CloneDeepHTML {\n\n  // computes the styles of a and b and prints the difference CSS\n  static diffCSS(a,b) {\n    var astyle = getComputedStyle(a)\n    var bstyle = getComputedStyle(b)\n    var css = \"\"\n    for(var i=0; i < astyle.length; i++) {\n      var name = astyle.item(i)\n      if (!name.match(\"-webkit\")) {\n        if (astyle.getPropertyValue(name) != bstyle.getPropertyValue(name)) {\n          css += name +\": \" + astyle.getPropertyValue(name) +\";\\n\"\n        }        \n      }\n    }\n    return css\n  }\n  \n  \n  static shallowClone(obj, parent, root) {\n    if (!obj) return;\n    var node\n    if (obj.constructor.name == \"Text\") {\n      if (obj.parentElement && obj.parentElement.tagName == \"STYLE\") {\n        // #Hack hot fix font-awesome styles...\n        node = document.createTextNode(obj.textContent.replace(/url\\('\\.\\.\\/fonts\\/fontawesome-webfont/g, \n          `url('${lively4url}/src/external/font-awesome/fonts/fontawesome-webfont`)) \n      } else {\n        node = document.createTextNode(obj.textContent) \n      }\n    } else if (obj.tagName == \"CONTENT\"){\n      node = document.createElement(\"div\")\n      node.id = \"CONTENTNODE\"\n      if (root) {\n        root._shadowRootContentNode = node\n      }      \n      return node\n    } else if (obj.tagName == \"STYLE\"){\n      node = document.createElement(\"style\")\n      \n      return node\n    } else if (obj instanceof SVGElement) {\n      // console.log(\"svg element \" + obj)\n      node = document.createElementNS(\"http://www.w3.org/2000/svg\", obj.tagName); \n      Array.from(obj.attributes).forEach(ea => {\n        try {\n          // console.log(\"attr \" + ea.name + \" \" + ea.value)\n          node.setAttribute(ea.name, ea.value)        \n        } catch(e) {\n          console.log('rasterize: could not write attribute ' + ea.name + \" from \" + obj)\n        }\n      })\n      return node\n    } else if ( obj.shadowRoot){\n      node = document.createElement(\"div\")\n    } else {\n      if (!obj.tagName) {\n        // comments...\n      } else{\n        node = document.createElement(obj.tagName);\n      }\n    }\n    if (obj.tagName == \"H1\") {\n      lively.showElement(obj)\n    }\n    \n    if (obj.attributes) {\n      Array.from(obj.attributes).forEach(ea => {\n        if (ea.name == \"style\") return;\n        try {\n          node[ea.name] = \"\" + ea.value        \n        } catch(e) {\n          console.log('rasterize: could not write attribute ' + ea.name + \" from \" + obj)\n        }\n      })\n      if (obj.style) {\n        node.style = this.diffCSS(obj, node)      \n      }\n      \n      var beforeElementStyle = getComputedStyle(obj, ':before')\n      var beforeContent = beforeElementStyle.content\n      if (beforeContent && beforeContent.length > 0 && beforeContent !== 'none') {\n        var text = document.createElement(\"span\")\n        \n        try {\n          text.textContent = \"\" + JSON.parse(beforeContent)\n        } catch(e) {\n          lively.warn('could not parse ' + beforeContent, e);\n        }\n        text.style  = beforeContent.cssText\n        node.appendChild(text)\n      }\n    }\n    if (obj.tagName == \"INPUT\") {\n      // weired... why are they not connected?\n      node.value = obj.value\n      node.setAttribute(\"value\", obj.value)\n    }\n    \n    return node\n  }\n\n  static deepCopyAsHTML(obj) {\n    var to = this.shallowClone(obj)\n    this.deepCopyAsHTMLFromTo(obj, to, undefined)\n    return to\n  }\n\n  static deepCopyAsHTMLFromTo(from, to, root) {\n    var target = to;\n    \n    if (from.shadowRoot) {\n      this.deepCopyAsHTMLFromTo(from.shadowRoot, to, from)\n      \n      var contentNode  = from._shadowRootContentNode\n      if (contentNode) {\n        target = contentNode;\n      }\n    }\n    \n    from.childNodes.forEach( fromChild => {\n      var toChild = this.shallowClone(fromChild, target, root);\n      if (toChild) {\n        target.appendChild(toChild);\n        this.deepCopyAsHTMLFromTo(fromChild, toChild, root);    \n      }\n    })\n  }\n}\n\n// var clone = CloneDeepHTML.deepCopyAsHTML(that)\n// $morph(\"result\").innerHTML = \"\"\n// $morph(\"result\").appendChild(clone)\n// $morph(\"showResult\").inspect(clone)\n\nexport default class Rasterize {  \n    // from: https://gist.github.com/timdown/021d9c8f2aabc7092df564996f5afbbf\n    static trimCanvas(canvas) {\n        function rowBlank(imageData, width, y) {\n            for (var x = 0; x < width; ++x) {\n                if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false;\n            }\n            return true;\n        }\n\n        function columnBlank(imageData, width, x, top, bottom) {\n            for (var y = top; y < bottom; ++y) {\n                if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false;\n            }\n            return true;\n        }\n\n        var ctx = canvas.getContext(\"2d\");\n        var width = canvas.width;\n        var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n        var top = 0, bottom = imageData.height, left = 0, right = imageData.width;\n\n        while (top < bottom && rowBlank(imageData, width, top)) ++top;\n        while (bottom - 1 > top && rowBlank(imageData, width, bottom - 1)) --bottom;\n        while (left < right && columnBlank(imageData, width, left, top, bottom)) ++left;\n        while (right - 1 > left && columnBlank(imageData, width, right - 1, top, bottom)) --right;\n\n        var trimmed = ctx.getImageData(left, top, right - left, bottom - top);\n        var copy = canvas.ownerDocument.createElement(\"canvas\");\n        var copyCtx = copy.getContext(\"2d\");\n        copy.width = trimmed.width;\n        copy.height = trimmed.height;\n        copyCtx.putImageData(trimmed, 0, 0);\n\n        return copy;\n    }\n  \n   static async elementToCanvas(element, zoom=1) {\n    // zoom = 2; // see   tmp.style.transform = \"scale(2)\" in (rc/client/html.js)\n    var bounds = lively.getTotalGlobalBounds(element)\n    var extent = pt(bounds.width, bounds.height)\n\n    await lively.sleep(100); // give the element some time to render...\n    \n    var cloned = CloneDeepHTML.deepCopyAsHTML(element)\n    \n    \n    var h = document.createElement(\"html\")\n    h.appendChild(document.createElement(\"body\"))\n    // var style = document.createElement(\"style\")\n    // style.textContent = await fetch(lively4url + \"/src/external/font-awesome/css/font-awesome.css\").then(r => r.text())\n    // h.appendChild(document.createElement(\"head\"))\n    // h.querySelector(\"head\").appendChild(style)\n    h.querySelector(\"body\").appendChild(cloned)\n\n    lively.setPosition(cloned, pt(0,0))\n    var canvas = document.createElement(\"canvas\")\n    var minExtent = pt(1,1);\n    canvas.width = Math.max(extent.x * zoom, minExtent.x);\n    canvas.height = Math.max(extent.y * zoom, minExtent.y);\n    await rasterizeHTML.drawHTML(h.outerHTML, canvas)\n    \n    canvas = this.trimCanvas(canvas)\n    return canvas\n  } \n\n  static async elementToDataURL(element, zoom) {\n    var canvas = await this.elementToCanvas(element, zoom)\n    return canvas.toDataURL(\"image/png\")\n  } \n\n  \n  static async elementToURL(element, url, zoom) {\n    var dataURL = await this.elementToDataURL(element, zoom)\n    return lively.files.copyURLtoURL(dataURL, url)\n  } \n  \n  static async asImage(element) {\n    var dataURL = await this.elementToDataURL(element)\n    var img = document.createElement(\"img\")\n    img.src = dataURL\n    return img\n  } \n  \n  static async openAsImage(element) {\n    var img = await this.asImage(element)\n    document.body.appendChild(img)\n    return img\n  } \n}\n\nexport class TemplatePreview {\n  \n  static async createPreview(url, templateName) {\n    if (!url) throw new Error(\"url argument missing\");\n    if (!templateName) throw new Error(\"templateName argument missing\");    \n    console.log(\"PREVIEW work on:\" + templateName)\n    try {\n      var comp = await Promise.race([\n        lively.openComponentInWindow(templateName),\n        new Promise(r => setTimeout(r, 4000))\n      ])\n      if (!comp) {\n        console.log(\"could not load component in time: \" + templateName)\n        return \n      }\n      \n      if (comp.livelyExample) {\n        await comp.livelyExample()\n      }\n      \n      var a = $morph(\"RasterImg\"); if(a) a.remove();\n      var img = await Rasterize.openAsImage(comp.windowTitle ? comp.parentElement : comp).then(img => {\n        img.id = \"RasterImg\"\n        img.style.width = (img.width * 1) + \"px\"\n        img.style.position = \"fixed\"\n        img.style.top  = \"0px\"\n        img.style.right  = \"0px\"\n        \n        return img\n      })\n      // img.remove()\n\n      var imgData = await fetch(img.src).then(r => r.blob())      \n      var imgURL = url + templateName + \".png\";\n      await fetch(imgURL, { method: \"PUT\", body: imgData})\n      console.log(\"PREVIEW wrote \" + imgURL)\n    } catch(e) {\n      console.error(e)\n    } finally {\n      if (comp && comp.parentElement) {\n        comp.parentElement.remove()  \n      }  \n    }\n    return imgURL\n  }\n  \n  static async generate(dry) {\n    let urls = lively.components.getTemplatePaths();\n    for(let url of urls) {\n      console.log(\"generate preview in: \" + url)\n      let dir = await fetch(url, {\n          method: \"OPTIONS\"\n        }).then( r => r.json())\n        let templates = dir.contents\n          .filter(ea => ea.name.match(/\\.html$/))\n        for(let ea of templates) {\n          let name = ea.name.replace(/\\.html$/,\"\")\n          let previewUrl = (url + name + \".png\")\n          try {\n            console.log(\"next \" + previewUrl)\n            if (! await lively.files.existFile(previewUrl)) {\n              if (TemplatePreview.stoped) return;\n              if (dry) {\n                console.warn(\"would generate \" + url)\n              } else {\n                try {\n                  await Promise.race([\n                    this.createPreview(url, name),\n                    new Promise(r => setTimeout(r, 6000))\n                  ])\n                } catch(e) {\n                  console.warn(\"GeneratePreview Errro: \" + e)\n                }\n              }\n            } else {\n              console.warn(\"Preview exists: \" + previewUrl)\n            }            \n          } catch(e) {\n            console.warn(\"Error when generating preview: \" + e)\n          }\n          \n        }\n      }      \n    }\n}\n\n\n// TemplatePreview.generate()\n\n// Rasterize.openAsImage(that)"]}