feat(export/share): render custom icons

This commit is contained in:
Elian Doran 2025-12-27 23:39:27 +02:00
parent d5b04864c8
commit 1efb21c627
No known key found for this signature in database
3 changed files with 6 additions and 8 deletions

View File

@ -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)

View File

@ -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} {

View File

@ -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)