take-shot
Version:
Screenshots with JavaScript
58 lines • 2.13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.embedResources = exports.shouldEmbed = exports.embed = exports.parseURLs = void 0;
const util_1 = require("./util");
const mimes_1 = require("./mimes");
const dataurl_1 = require("./dataurl");
const URL_REGEX = /url\((['"]?)([^'"]+?)\1\)/g;
function toRegex(url) {
// eslint-disable-next-line no-useless-escape
const escaped = url.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1');
return new RegExp(`(url\\(['"]?)(${escaped})(['"]?\\))`, 'g');
}
function parseURLs(cssText) {
const urls = [];
cssText.replace(URL_REGEX, (raw, _quotation, url) => {
urls.push(url);
return raw;
});
return urls.filter((url) => !(0, dataurl_1.isDataUrl)(url));
}
exports.parseURLs = parseURLs;
async function embed(cssText, resourceURL, baseURL, getContentFromUrl) {
try {
const resolvedURL = baseURL ? (0, util_1.resolveUrl)(resourceURL, baseURL) : resourceURL;
const contentType = (0, mimes_1.getMimeType)(resourceURL);
let dataURL;
if (getContentFromUrl) {
const content = await getContentFromUrl(resolvedURL);
dataURL = (0, dataurl_1.makeDataUrl)(content, contentType);
}
else {
dataURL = await (0, dataurl_1.resourceToDataURL)(resolvedURL, contentType);
}
return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`);
}
catch (error) {
// pass
}
return cssText;
}
exports.embed = embed;
function filterPreferredFontFormat(str) {
return str;
}
function shouldEmbed(url) {
return url.search(URL_REGEX) !== -1;
}
exports.shouldEmbed = shouldEmbed;
async function embedResources(cssText, baseUrl) {
if (!shouldEmbed(cssText)) {
return cssText;
}
const filteredCSSText = filterPreferredFontFormat(cssText);
const urls = parseURLs(filteredCSSText);
return urls.reduce((deferred, url) => deferred.then((css) => embed(css, url, baseUrl)), Promise.resolve(filteredCSSText));
}
exports.embedResources = embedResources;
//# sourceMappingURL=embed-resources.js.map