take-shot
Version:
Screenshots with JavaScript
98 lines • 3.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.embedImages = void 0;
const embed_resources_1 = require("./embed-resources");
const util_1 = require("./util");
const dataurl_1 = require("./dataurl");
const mimes_1 = require("./mimes");
async function embedProp(propName, node) {
const propValue = node.style?.getPropertyValue(propName);
if (propValue) {
const cssString = await (0, embed_resources_1.embedResources)(propValue, null);
node.style.setProperty(propName, cssString, node.style.getPropertyPriority(propName));
return true;
}
return false;
}
async function embedBackground(clonedNode) {
if (!(await embedProp('background', clonedNode))) {
await embedProp('background-image', clonedNode);
}
if (!(await embedProp('mask', clonedNode))) {
await embedProp('mask-image', clonedNode);
}
}
async function embedImageNode(clonedNode, placeholder) {
const isImageElement = (0, util_1.isInstanceOfElement)(clonedNode, HTMLImageElement);
if (
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
!(isImageElement && !(0, dataurl_1.isDataUrl)(clonedNode.src)) &&
!((0, util_1.isInstanceOfElement)(clonedNode, SVGImageElement) && !(0, dataurl_1.isDataUrl)(clonedNode.href.baseVal))) {
return;
}
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal;
const dataURL = await (0, dataurl_1.resourceToDataURL)(url, (0, mimes_1.getMimeType)(url), placeholder);
await new Promise((resolve) => {
clonedNode.onload = resolve;
clonedNode.onerror = (e) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
clonedNode.src = placeholder || '';
console.log('onerror ===>', e);
};
const image = clonedNode;
if (image.decode) {
image.decode = resolve;
}
if (image.loading === 'lazy') {
image.loading = 'eager';
}
if (isImageElement) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
clonedNode.srcset = '';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
clonedNode.src = dataURL;
}
else {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
clonedNode.href.baseVal = dataURL;
}
});
}
async function embedChildren(clonedNode, placeholder) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const children = (0, util_1.toArray)(clonedNode.childNodes);
const deferreds = children.map((child) => embedImages(child, placeholder));
await Promise.all(deferreds).then(() => clonedNode);
}
async function embedImages(clonedNode, placeholder) {
if ((0, util_1.isInstanceOfElement)(clonedNode, Element)) {
try {
await embedBackground(clonedNode);
}
catch (e) {
console.log('embedBackground ===>', e);
}
try {
await embedImageNode(clonedNode, placeholder);
}
catch (e) {
console.log('embedImageNode ===>', e);
}
try {
await embedChildren(clonedNode, placeholder);
}
catch (e) {
console.log('embedChildren ===>', e);
}
}
}
exports.embedImages = embedImages;
//# sourceMappingURL=embed-images.js.map