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