mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-02 18:10:18 +05:30
feat(monospace): build CSS with embedded woff2 base64
This commit is contained in:
@@ -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 };
|
||||||
@@ -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');
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user