@argdown/node
Version:
Async Argdown application for node.js
64 lines (62 loc) • 2.07 kB
text/typescript
import {
IAsyncArgdownPlugin,
IAsyncRequestHandler
} from "../IAsyncArgdownPlugin";
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 implements IAsyncArgdownPlugin {
name = "GenerateDataUrlsPlugin";
runAsync: IAsyncRequestHandler = 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"
)}`;
// const stringToReplace = new RegExp(image.path, "g");
// response.svg = response.svg?.replace(stringToReplace, dataUrl);
// logger.log("verbose", `dataUrl: ${dataUrl}`);
image.dataUrl = dataUrl;
// image.path = 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}`
);
}
}
}
};
}