From f1c3aaa0ef26f7a03598082254509afa69cedcad Mon Sep 17 00:00:00 2001 From: Amit Haridas Date: Thu, 23 Jul 2026 00:11:12 +0530 Subject: [PATCH] feat(monospace): build CSS with embedded woff2 base64 --- src/main/ExportCss.js | 25 ++++++++++++++ tests/unit/main/monospace/ExportCss.test.js | 36 +++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/main/ExportCss.js create mode 100644 tests/unit/main/monospace/ExportCss.test.js diff --git a/src/main/ExportCss.js b/src/main/ExportCss.js new file mode 100644 index 0000000..66a88f6 --- /dev/null +++ b/src/main/ExportCss.js @@ -0,0 +1,25 @@ +'use strict'; + +const { FAMILY_BY_KEY } = require('./settings/monospaceSettings'); + +function buildFontFaceBlock(family, woff2Bytes) { + const safeFamily = family.replace(/'/g, "\\'"); + const b64 = Buffer.from(woff2Bytes).toString('base64'); + return `@font-face { + font-family: '${safeFamily}'; + src: url(data:font/woff2;base64,${b64}) format('woff2'); + font-weight: 100 900; + font-style: normal; + font-display: swap; +}`; +} + +function buildExportCss(settings, { woff2 } = {}) { + const family = (settings && FAMILY_BY_KEY[settings.monospaceFont]) || 'JetBrains Mono'; + const ligatures = !!(settings && settings.monospaceLigatures === true); + const face = buildFontFaceBlock(family, woff2 || Buffer.alloc(0)); + const feature = ligatures ? `code, pre, kbd, samp { font-feature-settings: 'liga' 1, 'calt' 1; }` : ''; + return [face, feature].filter(Boolean).join('\n\n'); +} + +module.exports = { buildExportCss, buildFontFaceBlock }; diff --git a/tests/unit/main/monospace/ExportCss.test.js b/tests/unit/main/monospace/ExportCss.test.js new file mode 100644 index 0000000..b4e3acb --- /dev/null +++ b/tests/unit/main/monospace/ExportCss.test.js @@ -0,0 +1,36 @@ +const { buildExportCss, buildFontFaceBlock } = require('../../../../src/main/ExportCss'); + +describe('ExportCss', () => { + test('buildFontFaceBlock emits @font-face with base64 data URI', () => { + const woff2 = Buffer.from([0x77, 0x4f, 0x46, 0x32]); + const css = buildFontFaceBlock('JetBrains Mono', woff2); + expect(css).toContain('@font-face'); + expect(css).toContain("font-family: 'JetBrains Mono'"); + expect(css).toContain("format('woff2')"); + expect(css).toContain('base64,'); + const m = css.match(/base64,([A-Za-z0-9+/=]+)/); + expect(m).toBeTruthy(); + expect(Buffer.from(m[1], 'base64')).toEqual(woff2); + }); + + test('buildExportCss writes @font-face + ligatures when enabled', () => { + const woff2 = Buffer.from([0x77, 0x4f, 0x46, 0x32]); + const css = buildExportCss( + { monospaceFont: 'jetbrains-mono', monospaceLigatures: true }, + { woff2 } + ); + expect(css).toContain('@font-face'); + expect(css).toContain('font-feature-settings'); + expect(css).toContain("'liga' 1"); + }); + + test('buildExportCss with ligatures off omits font-feature-settings', () => { + const woff2 = Buffer.from([0x77, 0x4f, 0x46, 0x32]); + const css = buildExportCss( + { monospaceFont: 'fira-code', monospaceLigatures: false }, + { woff2 } + ); + expect(css).not.toContain('font-feature-settings'); + expect(css).toContain('Fira Code'); + }); +});