feat(monospace): ExportCss embeds woff2 as base64 in CSS

Self-contained CSS for HTML export and print-preview iframe.
This commit is contained in:
2026-08-23 19:31:33 +05:30
parent 9fd81ff5a0
commit 228ee04b09
2 changed files with 61 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
'use strict';
const fs = require('fs');
function toDataUri(filePath) {
const buf = fs.readFileSync(filePath);
return `data:font/woff2;base64,${buf.toString('base64')}`;
}
function build({ activeFontPath, family, weight = 400, ligatures = false }) {
const features = ligatures ? 'normal' : "'liga' 0, 'calt' 0, 'dlig' 0";
const faceBlock = activeFontPath
? `@font-face {
font-family: '${family}';
font-weight: ${weight};
font-style: normal;
font-display: swap;
src: url('${toDataUri(activeFontPath)}') format('woff2');
}
`
: '';
return `${faceBlock}code, pre, kbd, samp {
font-family: '${family}', monospace;
font-feature-settings: ${features};
}
pre, code {
white-space: pre;
tab-size: 4;
}
`;
}
module.exports = { build };
+27
View File
@@ -0,0 +1,27 @@
const fs = require('fs');
const path = require('path');
const ExportCss = require('../src/main/ExportCss');
describe('ExportCss.build', () => {
const fakeFontPath = path.join(__dirname, 'fixtures', 'fake.woff2');
const fixture = Buffer.from('woff2-binary-fake-data');
beforeAll(() => {
fs.mkdirSync(path.dirname(fakeFontPath), { recursive: true });
fs.writeFileSync(fakeFontPath, fixture);
});
afterAll(() => fs.rmSync(path.dirname(fakeFontPath), { recursive: true, force: true }));
test('emits a self-contained CSS with embedded @font-face', () => {
const css = ExportCss.build({ activeFontPath: fakeFontPath, family: 'JetBrains Mono', weight: 400, ligatures: false });
expect(css).toMatch(/@font-face\s*\{[^}]*src:\s*url\('data:font\/woff2;base64,/);
expect(css).toContain("font-family: 'JetBrains Mono'");
expect(css).toMatch(/font-feature-settings:[^;]*liga[^;]*0/);
});
test('falls back to family-only CSS when font path is missing', () => {
const css = ExportCss.build({ activeFontPath: null, family: 'Fira Code', weight: 700, ligatures: true });
expect(css).not.toContain('data:font/woff2;');
expect(css).toContain("font-family: 'Fira Code'");
});
});