From 626b7fc6ea36283befaa9d2f8b28c8e36b19ad71 Mon Sep 17 00:00:00 2001 From: Nicholas Jitkoff Date: Thu, 30 Jun 2022 08:50:18 -0700 Subject: [PATCH] Add el function --- docs/bitty.js | 76 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 16 deletions(-) diff --git a/docs/bitty.js b/docs/bitty.js index f269068..59c5e6c 100644 --- a/docs/bitty.js +++ b/docs/bitty.js @@ -1,16 +1,10 @@ -window.el = function (tagName, attrs, ...children) { - let l = document.createElement(tagName); - Object.entries(attrs).forEach(([k,v]) => l[k] = v); - children.forEach((c) => l.appendChild(typeof c == "string" ? document.createTextNode(c) : c)); - return l; -} - const padForBase64 = (s, c = " ") => s.padEnd(s.length + (3 - s.length % 3) % 3, c) const HEAD_TAGS = () => btoa(padForBase64('\n')); -const HEAD_TAGS_EXTENDED = () => btoa(padForBase64(``)); +const HEAD_TAGS_EXTENDED = () => btoa(padForBase64(``)); const dataUrlRE = -/^data:(?(?[a-z]+)\/(?[a-z+]+))?(?(?:;[^;,]+=[^;,]+)*)?(?:;(?\w+64))?,(?.*)$/ +/^data:(?(?[a-z]+)\/(?[a-z+\-]+))?(?(?:;[^;,]+=[^;,]+)*)?(?:;(?\w+64))?,(?.*)$/ + ///^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i; // dataurl := "data:" [ mediatype ] [ ";base64" ] "," data @@ -56,12 +50,19 @@ class DataURL { } let match = url.match(dataUrlRE); + + this.params = {}; + if (match) { let info = match.groups; Object.assign(this, info); this.params = info.params ? JSON.parse('{"' + decodeURI(info.params?.substring(1)).replace(/"/g, '\\"').replace(/;/g, '","').replace(/=/g,'":"') + '"}') : {}; } - if (this.encoding) this.data = this.data.replace(/=/g,""); + if (this.encoding) { + this.data = this.data.replace(/=/g,""); + } else { + this.data = decodeURIComponent(this.data); + } } get href() { @@ -118,9 +119,12 @@ class DataURL { } parseDom = async () => { - const parser = new DOMParser(); - const doc = parser.parseFromString(`` + atob(this.data), this.mediatype); - return doc; + try { + + const parser = new DOMParser(); + const doc = parser.parseFromString(`` + atob(this.data), this.mediatype); + return doc; + } catch (e) {} } } @@ -154,10 +158,9 @@ async function testCompression(rawData) { } async function compressData(data, encoding = GZIP_MARKER, callback) { - console.log("compressing with", encoding) + console.debug("Compressing with", encoding) if (encoding == GZIP_MARKER) { return import("/js/gzip/pako.js").then((module) => { - console.log({gzdata:data}) return pako.deflate(data, {level:"9"}); }); } else if (encoding == BROT_MARKER) { @@ -441,7 +444,7 @@ function pathToMetadata(path) { } function metadataToPath(data) { - if (!data || !data.title) return ""; + if (!data || !data.title) return "/"; let path = ["/" + encodePrettyComponent(data.title)]; if (data.description) path.push("d/" + encodePrettyComponent(data.description.substring(0,200).split(". ").shift())); if (data.favicon) path.push("f/" + encodeURIComponent(data.favicon)); @@ -449,6 +452,46 @@ function metadataToPath(data) { return path.join('/') + "/"; } +// window.el = function (tagName, attrs, ...children) { +// let l = document.createElement(tagName); +// Object.entries(attrs).forEach(([k,v]) => l[k] = v); +// children.forEach((c) => l.appendChild(typeof c == "string" ? document.createTextNode(c) : c)); +// return l; +// } + +const el = (selector, ...args) => { + var attrs = (args[0] && typeof args[0] === 'object' && !Array.isArray(args[0]) && !(args[0] instanceof HTMLElement)) ? args.shift() : {}; + + let classes = selector.split("."); + if (classes.length > 0) selector = classes.shift(); + if (classes.length) attrs.className = classes.join(" ") + + let id = selector.split("#"); + if (id.length > 0) selector = id.shift(); + if (id.length) attrs.id = id[0]; + + var node = document.createElement(selector.length > 0 ? selector : "div"); + for (let prop in attrs) { + if (attrs.hasOwnProperty(prop) && attrs[prop] != undefined) { + if (prop.indexOf("data-") == 0) { + let dataProp = prop.substring(5).replace(/-([a-z])/g, function(g) { return g[1].toUpperCase(); }); + node.dataset[dataProp] = attrs[prop]; + } else { + node[prop] = attrs[prop]; + } + } + } + + const append = (child) => { + if (Array.isArray(child)) return child.forEach(append); + if (typeof child == "string") child = document.createTextNode(child); + if (child) node.appendChild(child); + }; + args.forEach(append); + + return node; +}; + export { DataURL, infoForDataURL, @@ -464,6 +507,7 @@ export { metadataToPath, pathToMetadata, parseBittyURL, + el, BASE64_MARKER, LZMA64_MARKER, BASE_MARKER,