From 1efb21c627ec8c83e967ff9e1a1243fb803a9a8d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 27 Dec 2025 23:39:27 +0200 Subject: [PATCH] feat(export/share): render custom icons --- apps/server/src/routes/index.ts | 2 +- apps/server/src/services/icon_packs.ts | 6 ++---- apps/server/src/share/content_renderer.ts | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/server/src/routes/index.ts b/apps/server/src/routes/index.ts index a94e8e57e..3c8354ee9 100644 --- a/apps/server/src/routes/index.ts +++ b/apps/server/src/routes/index.ts @@ -63,7 +63,7 @@ function index(req: Request, res: Response) { baseApiUrl: 'api/', currentLocale: getCurrentLocale(), iconPackCss: iconPacks - .map(p => generateCss(p)) + .map(p => generateCss(p, `/api/attachments/${p.fontAttachmentId}/download`)) .filter(Boolean) .join("\n\n"), iconRegistry: generateIconRegistry(iconPacks) diff --git a/apps/server/src/services/icon_packs.ts b/apps/server/src/services/icon_packs.ts index ce69aeb6b..b2b7e2e4c 100644 --- a/apps/server/src/services/icon_packs.ts +++ b/apps/server/src/services/icon_packs.ts @@ -2,7 +2,6 @@ import { IconRegistry } from "@triliumnext/commons"; import type BAttachment from "../becca/entities/battachment"; import type BNote from "../becca/entities/bnote"; -import { note } from "../test/becca_mocking"; import boxiconsManifest from "./icon_pack_boxicons-v2.json"; import log from "./log"; import search from "./search/services/search"; @@ -125,20 +124,19 @@ export function determineBestFontAttachment(iconPackNote: BNote) { return null; } -export function generateCss({ manifest, fontAttachmentId, fontMime }: ProcessedIconPack, isShare = false) { +export function generateCss({ manifest, fontMime }: ProcessedIconPack, fontUrl: string) { try { const iconDeclarations: string[] = []; for (const [ key, mapping ] of Object.entries(manifest.icons)) { iconDeclarations.push(`.${manifest.prefix}.${key}::before { content: '\\${mapping.glyph.charCodeAt(0).toString(16)}'; }`); } - const downloadBaseUrl = isShare ? '/share' : ''; return `\ @font-face { font-family: 'trilium-icon-pack-${manifest.prefix}'; font-weight: normal; font-style: normal; - src: url('${downloadBaseUrl}/api/attachments/${fontAttachmentId}/download') format('${MIME_TO_CSS_FORMAT_MAPPINGS[fontMime]}'); + src: url('${fontUrl}') format('${MIME_TO_CSS_FORMAT_MAPPINGS[fontMime]}'); } .${manifest.prefix} { diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index 023c70cf9..3ea4b3c06 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -12,7 +12,7 @@ import BAttachment from '../becca/entities/battachment.js'; import type BBranch from "../becca/entities/bbranch.js"; import BNote from "../becca/entities/bnote.js"; import assetPath, { assetUrlFragment } from "../services/asset_path.js"; -import { generateCss, getIconPacks, ProcessedIconPack } from "../services/icon_packs.js"; +import { generateCss, getIconPacks, MIME_TO_EXTENSION_MAPPINGS, ProcessedIconPack } from "../services/icon_packs.js"; import log from "../services/log.js"; import options from "../services/options.js"; import utils, { getResourceDir, isDev, safeExtractMessageAndStackFromError } from "../services/utils.js"; @@ -89,7 +89,7 @@ export function renderNoteForExport(note: BNote, parentBranch: BBranch, basePath faviconUrl: `${basePath}favicon.ico`, ancestors, isStatic: true, - iconPackCss: iconPacks.map(p => generateCss(p, true)) + iconPackCss: iconPacks.map(p => generateCss(p, `${basePath}assets/icon-pack-${p.manifest.prefix.toLowerCase()}.${MIME_TO_EXTENSION_MAPPINGS[p.fontMime]}`)) .filter(Boolean) .join("\n\n"), iconPackSupportedPrefixes: iconPacks.map(p => p.manifest.prefix) @@ -141,7 +141,7 @@ export function renderNoteContent(note: SNote) { ancestors, isStatic: false, faviconUrl: note.hasRelation("shareFavicon") ? `api/notes/${note.getRelationValue("shareFavicon")}/download` : `../favicon.ico`, - iconPackCss: iconPacks.map(p => generateCss(p, true)) + iconPackCss: iconPacks.map(p => generateCss(p, `/share/api/attachments/${p.fontAttachmentId}/download`)) .filter(Boolean) .join("\n\n"), iconPackSupportedPrefixes: iconPacks.map(p => p.manifest.prefix)