UNPKG

@xysfe/memento-core

Version:

record and replay the web

3 lines (2 loc) 14.2 kB
var NodeType;!function(e){e[e.Document=0]="Document",e[e.DocumentType=1]="DocumentType",e[e.Element=2]="Element",e[e.Text=3]="Text",e[e.CDATA=4]="CDATA",e[e.Comment=5]="Comment"}(NodeType||(NodeType={}));var _id=1,symbolAndNumberRegex=RegExp("[^a-z1-6-]");function genId(){return _id++}function getValidTagName(e){var t=e.toLowerCase().trim();return symbolAndNumberRegex.test(t)?"div":t}function getCssRulesString(e){try{var t=e.rules||e.cssRules;return t?Array.from(t).reduce(function(e,t){return e+getCssRuleString(t)},""):null}catch(e){return null}}function getCssRuleString(e){return isCSSImportRule(e)?getCssRulesString(e.styleSheet)||"":e.cssText}function isCSSImportRule(e){return"styleSheet"in e}function extractOrigin(e){return(e.indexOf("//")>-1?e.split("/").slice(0,3).join("/"):e.split("/")[0]).split("?")[0]}var URL_IN_CSS_REF=/url\((?:'([^']*)'|"([^"]*)"|([^)]*))\)/gm,RELATIVE_PATH=/^(?!www\.|(?:http|ftp)s?:\/\/|[A-Za-z]:\\|\/\/).*/,DATA_URI=/^(data:)([\w\/\+\-]+);(charset=[\w-]+|base64).*,(.*)/i;function absoluteToStylesheet(e,t){return(e||"").replace(URL_IN_CSS_REF,function(e,r,n,i){var a=r||n||i;if(!a)return e;if(!RELATIVE_PATH.test(a))return"url('"+a+"')";if(DATA_URI.test(a))return"url("+a+")";if("/"===a[0])return"url('"+(extractOrigin(t)+a)+"')";var o=t.split("/"),s=a.split("/");o.pop();for(var u=0,l=s;u<l.length;u++){var c=l[u];"."!==c&&(".."===c?o.pop():o.push(c))}return"url('"+o.join("/")+"')"})}function getAbsoluteSrcsetString(e,t){return""===t.trim()?t:t.split(",").map(function(t){var r=t.trimLeft().trimRight().split(" ");return 2===r.length?absoluteToDoc(e,r[0])+" "+r[1]:1===r.length?""+absoluteToDoc(e,r[0]):""}).join(", ")}function absoluteToDoc(e,t){if(!t||""===t.trim())return t;var r=e.createElement("a");return r.href=t,r.href}function isSVGElement(e){return"svg"===e.tagName||e instanceof SVGElement}function transformAttribute(e,t,r){return"src"===t||"href"===t&&r?absoluteToDoc(e,r):"srcset"===t&&r?getAbsoluteSrcsetString(e,r):"style"===t&&r?absoluteToStylesheet(r,location.href):r}function serializeNode(e,t,r,n,i,a){switch(void 0===i&&(i={}),void 0===a&&(a=[]),e.nodeType){case e.DOCUMENT_NODE:return{type:NodeType.Document,childNodes:[]};case e.DOCUMENT_TYPE_NODE:return{type:NodeType.DocumentType,name:e.name,publicId:e.publicId,systemId:e.systemId};case e.ELEMENT_NODE:var o=!1,s="";"string"==typeof r?o=e.classList.contains(r):e.classList.forEach(function(e){r.test(e)&&(o=!0)});var u=getValidTagName(e.tagName);if(!o)for(var l=0,c=a;l<c.length;l++){var f=c[l];if(u===f.tagName){o=!0,f.placeholder&&(s=f.placeholder);break}}for(var m={},d=0,p=Array.from(e.attributes);d<p.length;d++){var h=p[d],g=h.name,v=h.value;m[g]=transformAttribute(t,g,v);var y="img"===u&&"src"===g||"link"===u&&"href"===g,T=e.rel;!y||("dns-prefetch"===T||"preload"===T)||/^data:image/i.test(m[g])||(m["_memimage_"+g]=m[g])}if("link"===u&&n){var N,_=Array.from(t.styleSheets).find(function(t){return t.href===e.href});(N=getCssRulesString(_))&&(delete m.rel,delete m.href,"_memimage_href"in m&&delete m._memimage_href,m._cssText=absoluteToStylesheet(N,_.href))}if("style"===u&&e.sheet&&!(e.innerText||e.textContent||"").trim().length)(N=getCssRulesString(e.sheet))&&(m._cssText=absoluteToStylesheet(N,location.href));if("input"===u||"textarea"===u||"select"===u){v=e.value;"radio"!==m.type&&"checkbox"!==m.type&&"submit"!==m.type&&"button"!==m.type&&v?m.value=i[m.type]||i[u]?"*".repeat(v.length):v:e.checked&&(m.checked=e.checked)}if("option"===u){var E=e.parentElement;m.value===E.value&&(m.selected=e.selected)}if("canvas"===u&&(m.mem_dataURL=e.toDataURL()),e.scrollLeft&&(m.mem_scrollLeft=e.scrollLeft),e.scrollTop&&(m.mem_scrollTop=e.scrollTop),o){var b=e.getBoundingClientRect(),C=b.width,S=b.height;m.mem_width=C+"px",m.mem_height=S+"px",s&&(m.mem_placeholder=s)}return{type:NodeType.Element,tagName:u,attributes:m,childNodes:[],isSVG:isSVGElement(e)||void 0,needBlock:o};case e.TEXT_NODE:var A=e.parentNode&&e.parentNode.tagName,x=e.textContent,D="STYLE"===A||void 0;return D&&x&&(x=absoluteToStylesheet(x,location.href)),"SCRIPT"===A&&(x="SCRIPT_PLACEHOLDER"),{type:NodeType.Text,textContent:x||"",isStyle:D};case e.CDATA_SECTION_NODE:return{type:NodeType.CDATA,textContent:""};case e.COMMENT_NODE:return{type:NodeType.Comment,textContent:e.textContent||""};default:return!1}}function serializeNodeWithId(e,t,r,n,i,a,o,s){void 0===i&&(i=!1),void 0===a&&(a=!0),void 0===s&&(s=[]);var u,l=serializeNode(e,t,n,a,o,s);if(!l)return console.warn(e,"not serialized"),null;u="__sn"in e?e.__sn.id:genId();var c=Object.assign(l,{id:u});e.__sn=c,r[u]=e;var f=!i;if(c.type===NodeType.Element&&(f=f&&!c.needBlock,delete c.needBlock),(c.type===NodeType.Document||c.type===NodeType.Element)&&f)for(var m=0,d=Array.from(e.childNodes);m<d.length;m++){var p=serializeNodeWithId(d[m],t,r,n,i,a,o,s);p&&c.childNodes.push(p)}return c}function snapshot(e,t,r,n,i){void 0===t&&(t="mem-block"),void 0===r&&(r=!0),void 0===i&&(i=[]);var a={};return[serializeNodeWithId(e,e,a,t,!1,r,!0===n?{color:!0,date:!0,"datetime-local":!0,email:!0,month:!0,number:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0,textarea:!0,select:!0}:!1===n?{}:n,i),a]}var commentre=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g;function parse(e,t){void 0===t&&(t={});var r=1,n=1;function i(e){var t=e.match(/\n/g);t&&(r+=t.length);var i=e.lastIndexOf("\n");n=-1===i?n+e.length:e.length-i}function a(){var e={line:r,column:n};return function(t){return t.position=new o(e),d(),t}}var o=function(){return function(e){this.start=e,this.end={line:r,column:n},this.source=t.source}}();o.prototype.content=e;var s=[];function u(i){var a=new Error(t.source+":"+r+":"+n+": "+i);if(a.reason=i,a.filename=t.source,a.line=r,a.column=n,a.source=e,!t.silent)throw a;s.push(a)}function l(){return m(/^{\s*/)}function c(){return m(/^}/)}function f(){var t,r=[];for(d(),p(r);e.length&&"}"!==e.charAt(0)&&(t=S()||A());)!1!==t&&(r.push(t),p(r));return r}function m(t){var r=t.exec(e);if(r){var n=r[0];return i(n),e=e.slice(n.length),r}}function d(){m(/^\s*/)}function p(e){var t;for(void 0===e&&(e=[]);t=h();)!1!==t&&e.push(t),t=h();return e}function h(){var t=a();if("/"===e.charAt(0)&&"*"===e.charAt(1)){for(var r=2;""!==e.charAt(r)&&("*"!==e.charAt(r)||"/"!==e.charAt(r+1));)++r;if(r+=2,""===e.charAt(r-1))return u("End of comment missing");var o=e.slice(2,r-2);return n+=2,i(o),e=e.slice(r),n+=2,t({type:"comment",comment:o})}}function g(){var e=m(/^([^{]+)/);if(e)return trim(e[0]).replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g,"").replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g,function(e){return e.replace(/,/g,"‌")}).split(/\s*(?![^(]*\)),\s*/).map(function(e){return e.replace(/\u200C/g,",")})}function v(){var e=a(),t=m(/^(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/);if(t){var r=trim(t[0]);if(!m(/^:\s*/))return u("property missing ':'");var n=m(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/),i=e({type:"declaration",property:r.replace(commentre,""),value:n?trim(n[0]).replace(commentre,""):""});return m(/^[;\s]*/),i}}function y(){var e,t=[];if(!l())return u("missing '{'");for(p(t);e=v();)!1!==e&&(t.push(e),p(t)),e=v();return c()?t:u("missing '}'")}function T(){for(var e,t=[],r=a();e=m(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/);)t.push(e[1]),m(/^,\s*/);if(t.length)return r({type:"keyframe",values:t,declarations:y()})}var N,_=C("import"),E=C("charset"),b=C("namespace");function C(e){var t=new RegExp("^@"+e+"\\s*([^;]+);");return function(){var r=a(),n=m(t);if(n){var i={type:e};return i[e]=n[1].trim(),r(i)}}}function S(){if("@"===e[0])return function(){var e=a(),t=m(/^@([-\w]+)?keyframes\s*/);if(t){var r=t[1];if(!(t=m(/^([-\w]+)\s*/)))return u("@keyframes missing name");var n,i=t[1];if(!l())return u("@keyframes missing '{'");for(var o=p();n=T();)o.push(n),o=o.concat(p());return c()?e({type:"keyframes",name:i,vendor:r,keyframes:o}):u("@keyframes missing '}'")}}()||function(){var e=a(),t=m(/^@media *([^{]+)/);if(t){var r=trim(t[1]);if(!l())return u("@media missing '{'");var n=p().concat(f());return c()?e({type:"media",media:r,rules:n}):u("@media missing '}'")}}()||function(){var e=a(),t=m(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/);if(t)return e({type:"custom-media",name:trim(t[1]),media:trim(t[2])})}()||function(){var e=a(),t=m(/^@supports *([^{]+)/);if(t){var r=trim(t[1]);if(!l())return u("@supports missing '{'");var n=p().concat(f());return c()?e({type:"supports",supports:r,rules:n}):u("@supports missing '}'")}}()||_()||E()||b()||function(){var e=a(),t=m(/^@([-\w]+)?document *([^{]+)/);if(t){var r=trim(t[1]),n=trim(t[2]);if(!l())return u("@document missing '{'");var i=p().concat(f());return c()?e({type:"document",document:n,vendor:r,rules:i}):u("@document missing '}'")}}()||function(){var e=a();if(m(/^@page */)){var t=g()||[];if(!l())return u("@page missing '{'");for(var r,n=p();r=v();)n.push(r),n=n.concat(p());return c()?e({type:"page",selectors:t,declarations:n}):u("@page missing '}'")}}()||function(){var e=a();if(m(/^@host\s*/)){if(!l())return u("@host missing '{'");var t=p().concat(f());return c()?e({type:"host",rules:t}):u("@host missing '}'")}}()||function(){var e=a();if(m(/^@font-face\s*/)){if(!l())return u("@font-face missing '{'");for(var t,r=p();t=v();)r.push(t),r=r.concat(p());return c()?e({type:"font-face",declarations:r}):u("@font-face missing '}'")}}()}function A(){var e=a(),t=g();return t?(p(),e({type:"rule",selectors:t,declarations:y()})):u("selector missing")}return addParent((N=f(),{type:"stylesheet",stylesheet:{source:t.source,rules:N,parsingErrors:s}}))}function trim(e){return e?e.replace(/^\s+|\s+$/g,""):""}function addParent(e,t){for(var r=e&&"string"==typeof e.type,n=r?e:t,i=0,a=Object.keys(e);i<a.length;i++){var o=e[a[i]];Array.isArray(o)?o.forEach(function(e){addParent(e,n)}):o&&"object"==typeof o&&addParent(o,n)}return r&&Object.defineProperty(e,"parent",{configurable:!0,writable:!0,enumerable:!1,value:t||null}),e}var tagMap={script:"noscript",altglyph:"altGlyph",altglyphdef:"altGlyphDef",altglyphitem:"altGlyphItem",animatecolor:"animateColor",animatemotion:"animateMotion",animatetransform:"animateTransform",clippath:"clipPath",feblend:"feBlend",fecolormatrix:"feColorMatrix",fecomponenttransfer:"feComponentTransfer",fecomposite:"feComposite",feconvolvematrix:"feConvolveMatrix",fediffuselighting:"feDiffuseLighting",fedisplacementmap:"feDisplacementMap",fedistantlight:"feDistantLight",fedropshadow:"feDropShadow",feflood:"feFlood",fefunca:"feFuncA",fefuncb:"feFuncB",fefuncg:"feFuncG",fefuncr:"feFuncR",fegaussianblur:"feGaussianBlur",feimage:"feImage",femerge:"feMerge",femergenode:"feMergeNode",femorphology:"feMorphology",feoffset:"feOffset",fepointlight:"fePointLight",fespecularlighting:"feSpecularLighting",fespotlight:"feSpotLight",fetile:"feTile",feturbulence:"feTurbulence",foreignobject:"foreignObject",glyphref:"glyphRef",lineargradient:"linearGradient",radialgradient:"radialGradient"};function getTagName(e){var t=tagMap[e.tagName]?tagMap[e.tagName]:e.tagName;return"link"===t&&e.attributes._cssText&&(t="style"),t}var HOVER_SELECTOR=/([^\\]):hover/g,WECHAT_DEVELOPER_INSET_BUG=/(\s|;|\{)inset\s*:([^;}]+)/gi;function addHoverClass(e){var t=parse(e,{silent:!0});return t.stylesheet?(t.stylesheet.rules.forEach(function(t){"selectors"in t&&(t.selectors||[]).forEach(function(t){if(HOVER_SELECTOR.test(t)){var r=t.replace(HOVER_SELECTOR,"$1.\\:hover");e=e.replace(t,t+", "+r)}})}),e.replace(WECHAT_DEVELOPER_INSET_BUG,"$1top: $2; right: $2; bottom: $2; left: $2;")):e}function buildNode(e,t,r){switch(e.type){case NodeType.Document:return t.implementation.createDocument(null,"",null);case NodeType.DocumentType:return t.implementation.createDocumentType(e.name,e.publicId,e.systemId);case NodeType.Element:var n,i=getTagName(e);n=e.isSVG?t.createElementNS("http://www.w3.org/2000/svg",i):t.createElement(i);var a=function(a){if(!e.attributes.hasOwnProperty(a))return"continue";if(e.attributes.hasOwnProperty("_memimage_"+a))return"continue";var o=e.attributes[a];o="boolean"==typeof o||"number"==typeof o?"":o;var s=a;if((a=a.replace("_memimage_","")).startsWith("mem_")){if("canvas"===i&&"mem_dataURL"===a){var u=document.createElement("img");u.src=o,u.onload=function(){var e=n.getContext("2d");e&&e.drawImage(u,0,0,u.width,u.height)}}"mem_imgwidth"===a?n.style.width=o:"mem_width"===a?n.style.width=o:"mem_imgheight"===a?n.style.height=o:"mem_height"===a?n.style.height=o:"video"===i&&"mem_placeholder"===s&&(n.style.background="center / cover no-repeat url("+o+") !important")}else{var l="textarea"===i&&"value"===a,c="style"===i&&"_cssText"===a;if(c&&r&&(o=addHoverClass(o)),l||c){for(var f=t.createTextNode(o),m=0,d=Array.from(n.childNodes);m<d.length;m++){var p=d[m];p.nodeType===n.TEXT_NODE&&n.removeChild(p)}return n.appendChild(f),"continue"}if("iframe"===i&&"src"===a)return"continue";try{e.isSVG&&"xlink:href"===a?n.setAttributeNS("http://www.w3.org/1999/xlink",a,o):"onload"===a||"onclick"===a||"onmouse"===a.substring(0,7)?n.setAttribute("_"+a,o):n.setAttribute(a,o)}catch(e){}}};for(var o in e.attributes)a(o);return n;case NodeType.Text:return t.createTextNode(e.isStyle&&r?addHoverClass(e.textContent):e.textContent);case NodeType.CDATA:return t.createCDATASection(e.textContent);case NodeType.Comment:return t.createComment(e.textContent);default:return null}}function buildNodeWithSN(e,t,r,n,i){void 0===n&&(n=!1),void 0===i&&(i=!0);var a=buildNode(e,t,i);if(!a)return null;if(e.type===NodeType.Document&&(t.close(),t.open(),a=t),a.__sn=e,r[e.id]=a,(e.type===NodeType.Document||e.type===NodeType.Element)&&!n)for(var o=0,s=e.childNodes;o<s.length;o++){var u=s[o],l=buildNodeWithSN(u,t,r,!1,i);l?a.appendChild(l):console.warn("Failed to rebuild",u)}return a}function sideEffects(e){for(var t in e){var r=e[t],n=r.__sn;if(n.type===NodeType.Element){var i=r;for(var a in n.attributes)if(n.attributes.hasOwnProperty(a)&&a.startsWith("mem_")){var o=n.attributes[a];"mem_scrollLeft"===a&&(i.scrollLeft=o),"mem_scrollTop"===a&&(i.scrollTop=o)}}}}function rebuild(e,t,r){void 0===r&&(r=!0);var n={},i=buildNodeWithSN(e,t,n,!1,r);return sideEffects(n),[i,n]}export{snapshot,serializeNodeWithId,rebuild,buildNodeWithSN,addHoverClass,transformAttribute,NodeType}; //# sourceMappingURL=memento-snapshot.min.js.map