@argdown/node
Version:
Async Argdown application for node.js
54 lines • 2.17 kB
JavaScript
import { ArgdownPluginError } from "@argdown/core";
import isSvg from "is-svg";
import imageType from "image-type";
import { imageUtils } from "./utils.js";
import path from "path";
export class GenerateDataUrlsPlugin {
name = "GenerateDataUrlsPlugin";
runAsync = async (request, _response, _logger) => {
if (!request.images ||
!request.images.files ||
!request.images.convertToDataUrls) {
return;
}
for (const image of Object.values(request.images.files)) {
if (!image ||
typeof image !== "object" ||
!("path" in image) ||
!image.path) {
return;
}
const imageObj = image;
try {
const baseDir = request.inputPath && !!path.extname(request.inputPath)
? path.dirname(request.inputPath)
: request.inputPath || "";
const buffer = await imageUtils.getImage(imageObj.path, baseDir);
let mimeType = "";
if (buffer) {
const bufferString = buffer.toString("utf-8");
if (isSvg(bufferString)) {
mimeType = "svg+xml";
}
else {
const imageTypeResult = await imageType(buffer);
if (imageTypeResult) {
mimeType = imageTypeResult.mime;
}
else {
throw new Error("File is not an image.");
}
}
const dataUrl = `data:${mimeType};base64,${buffer.toString("base64")}`;
imageObj.dataUrl = dataUrl;
}
}
catch (err) {
if (err instanceof Error) {
throw new ArgdownPluginError(this.name, "inline-image-generation-failed", `'Generating inline image of '${imageObj.path}' failed. ${err.message}`);
}
}
}
};
}
//# sourceMappingURL=GenerateDataUrlsPlugin.js.map