From 2c03a11c579d4b9e4f5e52b8b5ba0eb90f41d7cf Mon Sep 17 00:00:00 2001 From: windingwind <33902321+windingwind@users.noreply.github.com> Date: Tue, 16 Apr 2024 10:12:19 +0800 Subject: [PATCH] update: add imageCache --- src/addon.ts | 2 ++ src/utils/str.ts | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/addon.ts b/src/addon.ts index d2bc6ff..83777a5 100644 --- a/src/addon.ts +++ b/src/addon.ts @@ -76,6 +76,7 @@ class Addon { relation: { worker?: Worker; }; + imageCache: Record; readonly prompt?: Prompt; } = { alive: true, @@ -119,6 +120,7 @@ class Addon { }, }, relation: {}, + imageCache: {}, get prompt() { return ToolkitGlobal.getInstance().prompt.instance; }, diff --git a/src/utils/str.ts b/src/utils/str.ts index 838eddb..a356ba5 100644 --- a/src/utils/str.ts +++ b/src/utils/str.ts @@ -69,11 +69,23 @@ function arrayBufferToBase64(buffer: ArrayBufferLike) { } export async function getItemDataURL(item: Zotero.Item) { + if (addon.data.imageCache[item.id]) { + return addon.data.imageCache[item.id]; + } const path = (await item.getFilePathAsync()) as string; const buf = (await IOUtils.read(path)).buffer; - return ( - "data:" + item.attachmentContentType + ";base64," + arrayBufferToBase64(buf) - ); + const dataURL = + "data:" + + item.attachmentContentType + + ";base64," + + arrayBufferToBase64(buf); + const keys = Object.keys(addon.data.imageCache); + // Limit cache size + while (keys.length > 100) { + delete addon.data.imageCache[keys.shift() as any]; + } + addon.data.imageCache[item.id] = dataURL; + return dataURL; } export async function fileExists(path: string): Promise {