diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index ddb975068..127596895 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -153,7 +153,7 @@ export default class ShareThemeExportProvider extends ZipExportProvider { } if (!fontData) continue; - const fontFileName = `assets/icon-pack-${iconPack.manifest.prefix.toLowerCase()}.${extension}`; + const fontFileName = `assets/icon-pack-${iconPack.prefix.toLowerCase()}.${extension}`; this.archive.append(fontData, { name: fontFileName }); } } diff --git a/apps/server/src/services/icon_pack_boxicons-v2.json b/apps/server/src/services/icon_pack_boxicons-v2.json index e513ce830..69c19b741 100644 --- a/apps/server/src/services/icon_pack_boxicons-v2.json +++ b/apps/server/src/services/icon_pack_boxicons-v2.json @@ -1,5 +1,4 @@ { - "prefix": "bx", "icons": { "bx-child": { "glyph": "", diff --git a/apps/server/src/services/icon_packs.ts b/apps/server/src/services/icon_packs.ts index 71dc4cc3f..5c757aecf 100644 --- a/apps/server/src/services/icon_packs.ts +++ b/apps/server/src/services/icon_packs.ts @@ -26,7 +26,6 @@ export const MIME_TO_EXTENSION_MAPPINGS: Record = { }; export interface IconPackManifest { - prefix: string; icons: Record([defaultIconPack.manifest.prefix]); + const usedPrefixes = new Set([defaultIconPack.prefix]); const customIconPacks = search.searchNotes("#iconPack") .filter(note => !note.isProtected) .map(iconPackNote => processIconPack(iconPackNote)) .filter(iconPack => { if (!iconPack) return false; - if (iconPack.manifest.prefix === "bx" || usedPrefixes.has(iconPack.manifest.prefix)) { - log.info(`Skipping icon pack with duplicate prefix '${iconPack.manifest.prefix}': ${iconPack.title} (${iconPack.manifestNoteId})`); + if (iconPack.prefix === "bx" || usedPrefixes.has(iconPack.prefix)) { + log.info(`Skipping icon pack with duplicate prefix '${iconPack.prefix}': ${iconPack.title} (${iconPack.manifestNoteId})`); return false; } - usedPrefixes.add(iconPack.manifest.prefix); + usedPrefixes.add(iconPack.prefix); return true; }) as ProcessedIconPack[]; @@ -79,17 +80,17 @@ export function getIconPacks() { export function generateIconRegistry(iconPacks: ProcessedIconPack[]): IconRegistry { const sources: IconRegistry["sources"] = []; - for (const { manifest, title, icon } of iconPacks) { + for (const { manifest, title, icon, prefix } of iconPacks) { const icons: IconRegistry["sources"][number]["icons"] = Object.entries(manifest.icons) .map(( [id, { terms }] ) => { if (!id || !terms) return null; - return { id: `${manifest.prefix} ${id}`, terms }; + return { id: `${prefix} ${id}`, terms }; }) .filter(Boolean) as IconRegistry["sources"][number]["icons"]; if (!icons.length) continue; sources.push({ - prefix: manifest.prefix, + prefix, name: title, icon, icons @@ -112,7 +113,14 @@ export function processIconPack(iconPackNote: BNote): ProcessedIconPack | undefi return; } + const prefix = iconPackNote.getLabelValue("iconPack"); + if (!prefix) { + log.error(`Icon pack is missing 'iconPack' label defining its prefix: ${iconPackNote.title} (${iconPackNote.noteId})`); + return; + } + return { + prefix, manifest, fontMime: attachment.mime, fontAttachmentId: attachment.attachmentId, @@ -139,14 +147,14 @@ export function determineBestFontAttachment(iconPackNote: BNote) { return null; } -export function generateCss({ manifest, fontMime, builtin, fontAttachmentId }: ProcessedIconPack, fontUrl: string) { +export function generateCss({ manifest, fontMime, builtin, fontAttachmentId, prefix }: 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)}'; }`); + iconDeclarations.push(`.${prefix}.${key}::before { content: '\\${mapping.glyph.charCodeAt(0).toString(16)}'; }`); } - const fontFamily = builtin ? fontAttachmentId : `trilium-icon-pack-${manifest.prefix}`; + const fontFamily = builtin ? fontAttachmentId : `trilium-icon-pack-${prefix}`; return `\ @font-face { font-family: '${fontFamily}'; @@ -155,7 +163,7 @@ export function generateCss({ manifest, fontMime, builtin, fontAttachmentId }: P src: url('${fontUrl}') format('${MIME_TO_CSS_FORMAT_MAPPINGS[fontMime]}'); } - .${manifest.prefix} { + .${prefix} { font-family: '${fontFamily}' !important; font-weight: normal; font-style: normal; diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index 0a85362c3..077614001 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -89,10 +89,10 @@ export function renderNoteForExport(note: BNote, parentBranch: BBranch, basePath faviconUrl: `${basePath}favicon.ico`, ancestors, isStatic: true, - iconPackCss: iconPacks.map(p => generateCss(p, `${basePath}assets/icon-pack-${p.manifest.prefix.toLowerCase()}.${MIME_TO_EXTENSION_MAPPINGS[p.fontMime]}`)) + iconPackCss: iconPacks.map(p => generateCss(p, `${basePath}assets/icon-pack-${p.prefix.toLowerCase()}.${MIME_TO_EXTENSION_MAPPINGS[p.fontMime]}`)) .filter(Boolean) .join("\n\n"), - iconPackSupportedPrefixes: iconPacks.map(p => p.manifest.prefix) + iconPackSupportedPrefixes: iconPacks.map(p => p.prefix) }); } @@ -147,7 +147,7 @@ export function renderNoteContent(note: SNote) { )) .filter(Boolean) .join("\n\n"), - iconPackSupportedPrefixes: iconPacks.map(p => p.manifest.prefix) + iconPackSupportedPrefixes: iconPacks.map(p => p.prefix) }); }