From 1c940ff8a2f4037338b5e52706d2b5d4e9393751 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 28 Dec 2025 02:24:18 +0200 Subject: [PATCH] fix(icon_packs): integrate boxicons back into share export --- apps/server/src/routes/assets.ts | 15 ++++++++++----- .../src/services/export/zip/share_theme.ts | 17 ++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/apps/server/src/routes/assets.ts b/apps/server/src/routes/assets.ts index 4418876a7..812222c5d 100644 --- a/apps/server/src/routes/assets.ts +++ b/apps/server/src/routes/assets.ts @@ -35,10 +35,6 @@ async function register(app: express.Application) { req.url = `/${assetUrlFragment}${req.url}`; vite.middlewares(req, res, next); }); - app.use(`/share/assets/fonts/`, (req, res, next) => { - req.url = `/${assetUrlFragment}/src/fonts${req.url}`; - vite.middlewares(req, res, next); - }); app.use(`/node_modules/@excalidraw/excalidraw/dist/prod`, persistentCacheStatic(path.join(srcRoot, "../../node_modules/@excalidraw/excalidraw/dist/prod"))); } else { const publicDir = path.join(resourceDir, "public"); @@ -49,10 +45,10 @@ async function register(app: express.Application) { app.use(`/${assetUrlFragment}/src`, persistentCacheStatic(path.join(publicDir, "src"))); app.use(`/${assetUrlFragment}/stylesheets`, persistentCacheStatic(path.join(publicDir, "stylesheets"))); app.use(`/${assetUrlFragment}/fonts`, persistentCacheStatic(path.join(publicDir, "fonts"))); - app.use(`/share/assets/fonts/`, express.static(path.join(publicDir, "fonts"))); app.use(`/${assetUrlFragment}/translations/`, persistentCacheStatic(path.join(publicDir, "translations"))); app.use(`/node_modules/`, persistentCacheStatic(path.join(publicDir, "node_modules"))); } + app.use(`/share/assets/fonts/`, express.static(path.join(getClientDir(), "fonts"))); app.use(`/share/assets/`, express.static(getShareThemeAssetDir())); app.use(`/${assetUrlFragment}/images`, persistentCacheStatic(path.join(resourceDir, "assets", "images"))); app.use(`/${assetUrlFragment}/doc_notes`, persistentCacheStatic(path.join(resourceDir, "assets", "doc_notes"))); @@ -70,6 +66,15 @@ export function getShareThemeAssetDir() { return path.join(resourceDir, "share-theme/assets"); } +export function getClientDir() { + if (process.env.NODE_ENV === "development") { + const srcRoot = path.join(__dirname, "..", ".."); + return path.join(srcRoot, "../client/src"); + } + const resourceDir = getResourceDir(); + return path.join(resourceDir, "public"); +} + export default { register }; diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index 5a960554d..ddb975068 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -1,5 +1,5 @@ import ejs from "ejs"; -import fs, { readdirSync } from "fs"; +import fs, { readdirSync, readFileSync } from "fs"; import { convert as convertToText } from "html-to-text"; import { t } from "i18next"; import { join } from "path"; @@ -7,7 +7,7 @@ import { join } from "path"; import becca from "../../../becca/becca"; import type BBranch from "../../../becca/entities/bbranch.js"; import type BNote from "../../../becca/entities/bnote.js"; -import { getShareThemeAssetDir } from "../../../routes/assets"; +import { getClientDir, getShareThemeAssetDir } from "../../../routes/assets"; import { getDefaultTemplatePath, readTemplate, renderNoteForExport } from "../../../share/content_renderer"; import { getIconPacks, MIME_TO_EXTENSION_MAPPINGS, ProcessedIconPack } from "../../icon_packs"; import NoteMeta, { NoteMetaFile } from "../../meta/note_meta"; @@ -144,13 +144,16 @@ export default class ShareThemeExportProvider extends ZipExportProvider { // Inject the custom fonts. for (const iconPack of this.iconPacks) { - const attachment = becca.getAttachment(iconPack.fontAttachmentId); - if (!attachment) { - continue; + const extension = MIME_TO_EXTENSION_MAPPINGS[iconPack.fontMime]; + let fontData: Buffer | undefined; + if (iconPack.builtin) { + fontData = readFileSync(join(getClientDir(), "fonts", `${iconPack.fontAttachmentId}.${extension}`)); + } else { + fontData = becca.getAttachment(iconPack.fontAttachmentId)?.getContent(); } - const fontData = attachment.getContent(); - const fontFileName = `assets/icon-pack-${iconPack.manifest.prefix.toLowerCase()}.${MIME_TO_EXTENSION_MAPPINGS[attachment.mime]}`; + if (!fontData) continue; + const fontFileName = `assets/icon-pack-${iconPack.manifest.prefix.toLowerCase()}.${extension}`; this.archive.append(fontData, { name: fontFileName }); } }