embed = {
const attr = "srcdoc";
const iframe = Object.assign(html`<iframe>`, {
frameBorder: 0,
sandbox: "allow-same-origin allow-scripts",
width
});
const src = "javascript:self.frameElement.getAttribute('" + attr + "')";
const polyfill = !(attr in iframe) ? { src } : {};
const dom = new DOMParser();
const xml = new XMLSerializer();
const swap = (
(apos) => (m, quote, attr) =>
apos + attr.replace(new RegExp(apos, "g"), quote) + apos
)("'");
return function (srcdoc, { display = true, loading = "lazy" } = {}) {
if (Array.isArray(srcdoc) && srcdoc.raw) {
srcdoc = interpolate(arguments);
}
srcdoc = xml
.serializeToString(
dom.parseFromString(
srcdoc
.replace(/&(?!amp;)/g, "&")
.replace(/<!--[\s\S]*?-->/g, "")
.replace(/<(\S+)\s*>\s*<[/]\1\s*>/g, ""),
"text/xml"
)
)
.replace(/^\s+/gm, "")
.split(/\n/)
.join("")
.replace(/(")([^"\\]*(?:(?:\1|\\)\1[^"]*)*)\1/g, swap);
const node = Object.assign(
iframe.cloneNode(),
!!display ? {} : { height: 0 }
);
for (const [k, v] of Object.entries(
Object.assign({ loading, srcdoc }, polyfill)
)) {
node.setAttribute.call(node, k, v);
Object.defineProperty(node, k, {
value: node.getAttribute(k)
});
}
return Object.assign(node, {
value: node,
onload() {
node.contentWindow.parent.postMessage(node.srcdoc);
node.dispatchEvent(new CustomEvent("input"));
}
});
};
}