UNPKG

@argdown/node

Version:

Async Argdown application for node.js

64 lines (62 loc) 2.07 kB
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}` ); } } } }; }