uhtml
Version:
A micro HTML/SVG render
1 lines • 7.34 kB
JavaScript
self.uhtml=function(e){"use strict";var t=function(e){return{get:function(t){return e.get(t)},set:function(t,n){return e.set(t,n),n}}},n=/([^\s\\>"'=]+)\s*=\s*(['"]?)$/,r=/^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i,a=/<[a-z][^>]+$/i,o=/>[^<>]*$/,c=/<([a-z]+[a-z0-9:._-]*)([^>]*?)(\/>)/gi,u=/\s+$/,i=function e(t,n){return 0<n--&&(a.test(t[n])||!o.test(t[n])&&e(t,n))},l=function(e,t,n){return r.test(t)?e:"<".concat(t).concat(n.replace(u,""),"></").concat(t,">")},f=function(e,t,r){for(var a=[],o=e.length,u=function(r){var o=e[r-1];a.push(n.test(o)&&i(e,r)?o.replace(n,(function(e,n,a){return"".concat(t).concat(r-1,"=").concat(a||'"').concat(n).concat(a?"":'"')})):"".concat(o,"\x3c!--").concat(t).concat(r-1,"--\x3e"))},f=1;f<o;f++)u(f);a.push(e[o-1]);var s=a.join("").trim();return r?s:s.replace(c,l)},s=Array.isArray,d=[],v=d.indexOf,p=d.slice,h=function(e,t){return 111===e.nodeType?1/t<0?t?function(e){var t=e.firstChild,n=e.lastChild,r=document.createRange();return r.setStartAfter(t),r.setEndAfter(n),r.deleteContents(),t}(e):e.lastChild:t?e.valueOf():e.firstChild:e},m=function(e){var t="fragment",n="template",r="content"in o(n)?function(e){var t=o(n);return t.innerHTML=e,t.content}:function(e){var r=o(t),c=o(n),u=null;if(/^[^\S]*?<(col(?:group)?|t(?:head|body|foot|r|d|h))/i.test(e)){var i=RegExp.$1;c.innerHTML="<table>"+e+"</table>",u=c.querySelectorAll(i)}else c.innerHTML=e,u=c.childNodes;return a(r,u),r};return function(e,t){return("svg"===t?c:r)(e)};function a(e,t){for(var n=t.length;n--;)e.appendChild(t[0])}function o(n){return n===t?e.createDocumentFragment():e.createElementNS("http://www.w3.org/1999/xhtml",n)}function c(e){var n=o(t),r=o("div");return r.innerHTML='<svg xmlns="http://www.w3.org/2000/svg">'+e+"</svg>",a(n,r.firstChild.childNodes),n}}(document),g=function(e,t){return e.childNodes[t]},y=function(e){for(var t=[],n=e.parentNode;n;)t.push(v.call(n.childNodes,e)),n=(e=n).parentNode;return t},w=document,b=w.createTreeWalker,N=w.importNode,x=1!=N.length,C=x?function(e,t,n){return N.call(document,m(e,t,n),!0)}:m,A=x?function(e){return b.call(document,e,129,null,!1)}:function(e){return b.call(document,e,129)},k=function(e,t,n){return function(e,t,n,r,a){for(var o=n.length,c=t.length,u=o,i=0,l=0,f=null;i<c||l<u;)if(c===i)for(var s=u<o?l?r(n[l-1],-0).nextSibling:r(n[u-l],0):a;l<u;)e.insertBefore(r(n[l++],1),s);else if(u===l)for(;i<c;)f&&f.has(t[i])||e.removeChild(r(t[i],-1)),i++;else if(t[i]===n[l])i++,l++;else if(t[c-1]===n[u-1])c--,u--;else if(t[i]===n[u-1]&&n[l]===t[c-1]){var d=r(t[--c],-1).nextSibling;e.insertBefore(r(n[l++],1),r(t[i++],-1).nextSibling),e.insertBefore(r(n[--u],1),d),t[c]=n[u]}else{if(!f){f=new Map;for(var v=l;v<u;)f.set(n[v],v++)}if(f.has(t[i])){var p=f.get(t[i]);if(l<p&&p<u){for(var h=i,m=1;++h<c&&h<u&&f.get(t[h])===p+m;)m++;if(m>p-l)for(var g=r(t[i],0);l<p;)e.insertBefore(r(n[l++],1),g);else e.replaceChild(r(n[l++],1),r(t[i++],-1))}else i++}else e.removeChild(r(t[i++],-1))}return n}(e.parentNode,t,n,h,e)},E=function(e,t){switch(t[0]){case"?":return function(e,t,n){return function(r){n!==!!r&&((n=!!r)?e.setAttribute(t,""):e.removeAttribute(t))}}(e,t.slice(1),!1);case".":return function(e,t){return"dataset"===t?function(e){var t=e.dataset;return function(e){for(var n in e){var r=e[n];null==r?delete t[n]:t[n]=r}}}(e):function(n){e[t]=n}}(e,t.slice(1));case"o":if("n"===t[1])return function(e,t){var n,r=t.slice(2);return!(t in e)&&t.toLowerCase()in e&&(r=r.toLowerCase()),function(t){var a=s(t)?t:[t,!1];n!==a[0]&&(n&&e.removeEventListener(r,n,a[1]),(n=a[0])&&e.addEventListener(r,n,a[1]))}}(e,t)}switch(t){case"ref":return function(e){var t;return function(n){t!==n&&(t=n,"function"==typeof n?n(e):n.current=e)}}(e);case"aria":return function(e){return function(t){for(var n in t){var r="role"===n?n:"aria-".concat(n),a=t[n];null==a?e.removeAttribute(r):e.setAttribute(r,a)}}}(e)}return function(e,t){var n,r=!0,a=document.createAttributeNS(null,t);return function(t){n!==t&&(null==(n=t)?r||(e.removeAttributeNode(a),r=!0):(a.value=t,r&&(e.setAttributeNodeNS(a),r=!1)))}}(e,t)};function T(e){var t=e.type,n=e.path.reduceRight(g,this);return"node"===t?function(e){var t,n,r=[];return function a(o){switch(typeof o){case"string":case"number":case"boolean":t!==o&&(t=o,n||(n=document.createTextNode("")),n.data=o,r=k(e,r,[n]));break;case"object":case"undefined":if(null==o){t!=o&&(t=o,r=k(e,r,[]));break}if(s(o)){t=o,0===o.length?r=k(e,r,[]):"object"==typeof o[0]?r=k(e,r,o):a(String(o));break}t!==o&&"ELEMENT_NODE"in o&&(t=o,r=k(e,r,11===o.nodeType?p.call(o.childNodes):[o]));break;case"function":a(o(e))}}}(n):"attr"===t?E(n,e.name):function(e){var t;return function(n){t!=n&&(t=n,e.textContent=null==n?"":n)}}(n)}var L="isµ",M=t(new WeakMap),S=/^(?:plaintext|script|style|textarea|title|xmp)$/i,O=function(e,t){var n=M.get(t)||M.set(t,function(e,t){for(var n=f(t,L,"svg"===e),r=C(n,e),a=A(r),o=[],c=t.length-1,u=0,i="".concat(L).concat(u);u<c;){var l=a.nextNode();if(!l)throw"bad template: ".concat(n);if(8===l.nodeType)l.data===i&&(o.push({type:"node",path:y(l)}),i="".concat(L).concat(++u));else{for(;l.hasAttribute(i);)o.push({type:"attr",path:y(l),name:l.getAttribute(i)}),l.removeAttribute(i),i="".concat(L).concat(++u);S.test(l.tagName)&&l.textContent.trim()==="\x3c!--".concat(i,"--\x3e")&&(l.textContent="",o.push({type:"text",path:y(l)}),i="".concat(L).concat(++u))}}return{content:r,nodes:o}}(e,t)),r=n.content,a=n.nodes,o=N.call(document,r,!0);return{content:o,updates:a.map(T,o)}},$=function(e,t){var n=t.type,r=t.template,a=t.values,o=a.length;j(e,a,o);var c=e.entry;c&&c.template===r&&c.type===n||(e.entry=c=function(e,t){var n=O(e,t);return{type:e,template:t,content:n.content,updates:n.updates,wire:null}}(n,r));for(var u=c,i=u.content,l=u.updates,f=u.wire,s=0;s<o;s++)l[s](a[s]);return f||(c.wire=function(e){var t=e.childNodes,n=t.length;if(n<2)return n?t[0]:e;var r=p.call(t,0);return{ELEMENT_NODE:1,nodeType:111,firstChild:r[0],lastChild:r[n-1],valueOf:function(){if(t.length!==n)for(var a=0;a<n;)e.appendChild(r[a++]);return e}}}(i))},j=function e(t,n,r){for(var a=t.stack,o=0;o<r;o++){var c=n[o];c instanceof H?n[o]=$(a[o]||(a[o]={stack:[],entry:null,wire:null}),c):s(c)?e(a[o]||(a[o]={stack:[],entry:null,wire:null}),c,c.length):a[o]=null}r<a.length&&a.splice(r)};function H(e,t,n){this.type=e,this.template=t,this.values=n}var B=Object.create,W=Object.defineProperties,z=function(e){var n=t(new WeakMap);return W((function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];return new H(e,t,r)}),{for:{value:function(t,r){var a=n.get(t)||n.set(t,B(null));return a[r]||(a[r]=function(t){return function(n){for(var r=arguments.length,a=new Array(r>1?r-1:0),o=1;o<r;o++)a[o-1]=arguments[o];return $(t,{type:e,template:n,values:a})}}({stack:[],entry:null,wire:null}))}},node:{value:function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a<n;a++)r[a-1]=arguments[a];return $({stack:[],entry:null,wire:null},{type:e,template:t,values:r}).valueOf()}}})},D=t(new WeakMap),R=z("html"),_=z("svg");return e.Hole=H,e.html=R,e.render=function(e,t){var n="function"==typeof t?t():t,r=D.get(e)||D.set(e,{stack:[],entry:null,wire:null}),a=n instanceof H?$(r,n):n;return a!==r.wire&&(r.wire=a,e.textContent="",e.appendChild(a.valueOf())),e},e.svg=_,e}({});