UNPKG

@argdown/node

Version:

Async Argdown application for node.js

54 lines 2.17 kB
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