mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-23 23:10:17 +05:30
style: apply Prettier formatting
Run after full implementation to enforce 2-space / 100-char / single-quote conventions across all new + adjacent files.
This commit is contained in:
@@ -142,7 +142,10 @@
|
|||||||
line-height: 1.3;
|
line-height: 1.3;
|
||||||
color: #00ff00;
|
color: #00ff00;
|
||||||
white-space: pre;
|
white-space: pre;
|
||||||
font-feature-settings: 'liga' 0, 'calt' 0, 'dlig' 0;
|
font-feature-settings:
|
||||||
|
'liga' 0,
|
||||||
|
'calt' 0,
|
||||||
|
'dlig' 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.template-grid {
|
.template-grid {
|
||||||
|
|||||||
+36
-13
@@ -575,7 +575,9 @@ function checkPandocAvailability() {
|
|||||||
pandocAvailable = !error;
|
pandocAvailable = !error;
|
||||||
if (!error) {
|
if (!error) {
|
||||||
const m = String(stdout).match(/pandoc\s+(\d+)\.(\d+)/);
|
const m = String(stdout).match(/pandoc\s+(\d+)\.(\d+)/);
|
||||||
pandocVersionCache = m ? { major: Number(m[1]), minor: Number(m[2]) } : { major: 0, minor: 0 };
|
pandocVersionCache = m
|
||||||
|
? { major: Number(m[1]), minor: Number(m[2]) }
|
||||||
|
: { major: 0, minor: 0 };
|
||||||
} else {
|
} else {
|
||||||
pandocVersionCache = { major: 0, minor: 0 };
|
pandocVersionCache = { major: 0, minor: 0 };
|
||||||
}
|
}
|
||||||
@@ -2786,7 +2788,8 @@ function performExportWithOptions(format, options) {
|
|||||||
if (bold) fonts.push({ path: bold, family, weight: 700 });
|
if (bold) fonts.push({ path: bold, family, weight: 700 });
|
||||||
if (fonts.length) await DocxFontEmbedder.embed(outputFile, fonts);
|
if (fonts.length) await DocxFontEmbedder.embed(outputFile, fonts);
|
||||||
} catch (embedErr) {
|
} catch (embedErr) {
|
||||||
if (typeof console !== 'undefined') console.warn('[docx] font embed failed:', embedErr.message);
|
if (typeof console !== 'undefined')
|
||||||
|
console.warn('[docx] font embed failed:', embedErr.message);
|
||||||
}
|
}
|
||||||
if (tempInputFile) {
|
if (tempInputFile) {
|
||||||
try {
|
try {
|
||||||
@@ -2903,17 +2906,24 @@ function performExportWithOptions(format, options) {
|
|||||||
const familyKey = readSettingsJsonCached().monospaceFont || 'jetbrains-mono';
|
const familyKey = readSettingsJsonCached().monospaceFont || 'jetbrains-mono';
|
||||||
const regular = MonospaceFontConfig.getMonoFontTtfPath(familyKey, 400);
|
const regular = MonospaceFontConfig.getMonoFontTtfPath(familyKey, 400);
|
||||||
const fonts = [];
|
const fonts = [];
|
||||||
if (regular) fonts.push({ path: regular, family: familyKey === 'fira-code' ? 'Fira Code' : 'JetBrains Mono', weight: 400 });
|
if (regular)
|
||||||
|
fonts.push({
|
||||||
|
path: regular,
|
||||||
|
family: familyKey === 'fira-code' ? 'Fira Code' : 'JetBrains Mono',
|
||||||
|
weight: 400,
|
||||||
|
});
|
||||||
if (fonts.length) {
|
if (fonts.length) {
|
||||||
const patched = await EpubFontEmbedder.patchManifest(outputFile, fonts);
|
const patched = await EpubFontEmbedder.patchManifest(outputFile, fonts);
|
||||||
try {
|
try {
|
||||||
fs.renameSync(patched, outputFile);
|
fs.renameSync(patched, outputFile);
|
||||||
} catch (renameErr) {
|
} catch (renameErr) {
|
||||||
if (typeof console !== 'undefined') console.warn('[epub] could not overwrite with patched EPUB:', renameErr.message);
|
if (typeof console !== 'undefined')
|
||||||
|
console.warn('[epub] could not overwrite with patched EPUB:', renameErr.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (patchErr) {
|
} catch (patchErr) {
|
||||||
if (typeof console !== 'undefined') console.warn('[epub] manifest patch failed:', patchErr.message);
|
if (typeof console !== 'undefined')
|
||||||
|
console.warn('[epub] manifest patch failed:', patchErr.message);
|
||||||
}
|
}
|
||||||
showExportSuccess(outputFile);
|
showExportSuccess(outputFile);
|
||||||
});
|
});
|
||||||
@@ -3619,13 +3629,16 @@ ipcMain.on('export-with-options', (event, { format, options }) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Handle batch conversion
|
// Handle batch conversion
|
||||||
ipcMain.on('batch-convert', (event, { inputFolder, outputFolder, format, options, includeSubfolders }) => {
|
ipcMain.on(
|
||||||
if (!conversionLimiter()) {
|
'batch-convert',
|
||||||
mainWindow.webContents.send('conversion-status', 'Please wait before converting again...');
|
(event, { inputFolder, outputFolder, format, options, includeSubfolders }) => {
|
||||||
return;
|
if (!conversionLimiter()) {
|
||||||
|
mainWindow.webContents.send('conversion-status', 'Please wait before converting again...');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
performBatchConversion(inputFolder, outputFolder, format, options, includeSubfolders);
|
||||||
}
|
}
|
||||||
performBatchConversion(inputFolder, outputFolder, format, options, includeSubfolders);
|
);
|
||||||
});
|
|
||||||
|
|
||||||
// Handle folder selection for batch conversion
|
// Handle folder selection for batch conversion
|
||||||
ipcMain.on('select-folder', (event, type) => {
|
ipcMain.on('select-folder', (event, type) => {
|
||||||
@@ -3734,7 +3747,13 @@ function extractTablesFromMarkdown(markdown) {
|
|||||||
}
|
}
|
||||||
return tables;
|
return tables;
|
||||||
}
|
}
|
||||||
async function performBatchConversion(inputFolder, outputFolder, format, options, includeSubfolders = true) {
|
async function performBatchConversion(
|
||||||
|
inputFolder,
|
||||||
|
outputFolder,
|
||||||
|
format,
|
||||||
|
options,
|
||||||
|
includeSubfolders = true
|
||||||
|
) {
|
||||||
if (!fs.existsSync(inputFolder)) {
|
if (!fs.existsSync(inputFolder)) {
|
||||||
dialog.showErrorBox('Error', 'Input folder does not exist');
|
dialog.showErrorBox('Error', 'Input folder does not exist');
|
||||||
return;
|
return;
|
||||||
@@ -4093,7 +4112,11 @@ async function performBatchConversion(inputFolder, outputFolder, format, options
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
console.error(`Batch: Failed to convert ${path.basename(inputFile)}:`, error.message, stderr);
|
console.error(
|
||||||
|
`Batch: Failed to convert ${path.basename(inputFile)}:`,
|
||||||
|
error.message,
|
||||||
|
stderr
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
// Add headers/footers to DOCX if enabled
|
// Add headers/footers to DOCX if enabled
|
||||||
if (format === 'docx' && headerFooterSettings.enabled) {
|
if (format === 'docx' && headerFooterSettings.enabled) {
|
||||||
|
|||||||
@@ -38,8 +38,9 @@ async function patchZipWithFonts(inputPath, fonts) {
|
|||||||
`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n` +
|
`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n` +
|
||||||
`<w:fonts xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/main">\n` +
|
`<w:fonts xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/main">\n` +
|
||||||
fonts
|
fonts
|
||||||
.map((f, i) =>
|
.map(
|
||||||
` <w:font w:name="${f.family}"><w:embedRegular r:id="${generatedRId(i)}" xmlns:r="${REL_NS}"/></w:font>`
|
(f, i) =>
|
||||||
|
` <w:font w:name="${f.family}"><w:embedRegular r:id="${generatedRId(i)}" xmlns:r="${REL_NS}"/></w:font>`
|
||||||
)
|
)
|
||||||
.join('\n') +
|
.join('\n') +
|
||||||
`\n</w:fonts>\n`;
|
`\n</w:fonts>\n`;
|
||||||
@@ -59,11 +60,17 @@ async function patchZipWithFonts(inputPath, fonts) {
|
|||||||
const ttfCt = 'application/x-font-ttf';
|
const ttfCt = 'application/x-font-ttf';
|
||||||
const filePart = `/word/fonts/${path.basename(f.path)}`;
|
const filePart = `/word/fonts/${path.basename(f.path)}`;
|
||||||
if (!ct.includes(`PartName="${filePart}"`)) {
|
if (!ct.includes(`PartName="${filePart}"`)) {
|
||||||
ct = ct.replace('</Types>', `<Override PartName="${filePart}" ContentType="${ttfCt}"/></Types>`);
|
ct = ct.replace(
|
||||||
|
'</Types>',
|
||||||
|
`<Override PartName="${filePart}" ContentType="${ttfCt}"/></Types>`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ct.includes('Default Extension="ttf"')) {
|
if (!ct.includes('Default Extension="ttf"')) {
|
||||||
ct = ct.replace('</Types>', '<Default Extension="ttf" ContentType="application/x-font-ttf"/></Types>');
|
ct = ct.replace(
|
||||||
|
'</Types>',
|
||||||
|
'<Default Extension="ttf" ContentType="application/x-font-ttf"/></Types>'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
zip.file(ctPath, ct);
|
zip.file(ctPath, ct);
|
||||||
|
|
||||||
@@ -116,4 +123,4 @@ async function embed(docxPath, fonts) {
|
|||||||
return patchZipWithFonts(docxPath, fonts);
|
return patchZipWithFonts(docxPath, fonts);
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { embed };
|
module.exports = { embed };
|
||||||
|
|||||||
@@ -41,4 +41,4 @@ async function patchManifest(epubPath, fonts) {
|
|||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { patchManifest };
|
module.exports = { patchManifest };
|
||||||
|
|||||||
@@ -2,12 +2,19 @@
|
|||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const { getActiveMonoFont, isLigaturesEnabled, FAMILY_BY_KEY } = require('./settings/monospaceSettings');
|
const {
|
||||||
|
getActiveMonoFont,
|
||||||
|
isLigaturesEnabled,
|
||||||
|
FAMILY_BY_KEY,
|
||||||
|
} = require('./settings/monospaceSettings');
|
||||||
|
|
||||||
const WEIGHT_BY_KEY = { 300: 'Light', 400: 'Regular', 500: 'Medium', 600: 'SemiBold', 700: 'Bold' };
|
const WEIGHT_BY_KEY = { 300: 'Light', 400: 'Regular', 500: 'Medium', 600: 'SemiBold', 700: 'Bold' };
|
||||||
|
|
||||||
function getAppRoot() {
|
function getAppRoot() {
|
||||||
if (process.resourcesPath && fs.existsSync(path.join(process.resourcesPath, 'app.asar.unpacked'))) {
|
if (
|
||||||
|
process.resourcesPath &&
|
||||||
|
fs.existsSync(path.join(process.resourcesPath, 'app.asar.unpacked'))
|
||||||
|
) {
|
||||||
return process.resourcesPath;
|
return process.resourcesPath;
|
||||||
}
|
}
|
||||||
return path.resolve(__dirname, '..', '..');
|
return path.resolve(__dirname, '..', '..');
|
||||||
@@ -32,12 +39,18 @@ function getMonoFontTtfPath(familyKey, weight = 400) {
|
|||||||
if (fs.existsSync(p)) return p;
|
if (fs.existsSync(p)) return p;
|
||||||
}
|
}
|
||||||
const filename = path.basename(candidates[candidates.length - 1]);
|
const filename = path.basename(candidates[candidates.length - 1]);
|
||||||
console.warn(`[MonospaceFontConfig] bundled font missing: ${filename}; falling back to system monospace`);
|
console.warn(
|
||||||
|
`[MonospaceFontConfig] bundled font missing: ${filename}; falling back to system monospace`
|
||||||
|
);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function ligaturesEnabled(settings) { return isLigaturesEnabled(settings); }
|
function ligaturesEnabled(settings) {
|
||||||
|
return isLigaturesEnabled(settings);
|
||||||
|
}
|
||||||
|
|
||||||
function getActiveFamily(settings) { return getActiveMonoFont(settings); }
|
function getActiveFamily(settings) {
|
||||||
|
return getActiveMonoFont(settings);
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = { getMonoFontTtfPath, ligaturesEnabled, getActiveFamily };
|
module.exports = { getMonoFontTtfPath, ligaturesEnabled, getActiveFamily };
|
||||||
|
|||||||
@@ -44,4 +44,4 @@ function build({ fontTtfPath, boldTtfPath, ligatures }) {
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { build };
|
module.exports = { build };
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ function buildFontFaceBlock(familyKey) {
|
|||||||
return `@font-face { font-family: '${family}'; font-weight: 400; font-style: normal; src: url('${dataUri}') format('woff2'); }`;
|
return `@font-face { font-family: '${family}'; font-weight: 400; font-style: normal; src: url('${dataUri}') format('woff2'); }`;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// Non-fatal: fall back to the system monospace stack declared in styles-modern.css.
|
// Non-fatal: fall back to the system monospace stack declared in styles-modern.css.
|
||||||
if (typeof console !== 'undefined') console.warn('[print-preview] font embed failed:', err.message);
|
if (typeof console !== 'undefined')
|
||||||
|
console.warn('[print-preview] font embed failed:', err.message);
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -125,7 +126,8 @@ class PrintPreview {
|
|||||||
const width = orientation === 'landscape' ? size.height : size.width;
|
const width = orientation === 'landscape' ? size.height : size.width;
|
||||||
const height = orientation === 'landscape' ? size.width : size.height;
|
const height = orientation === 'landscape' ? size.width : size.height;
|
||||||
|
|
||||||
const family = this._monospaceSettings.monospaceFont === 'fira-code' ? 'Fira Code' : 'JetBrains Mono';
|
const family =
|
||||||
|
this._monospaceSettings.monospaceFont === 'fira-code' ? 'Fira Code' : 'JetBrains Mono';
|
||||||
const ligaturesOn = this._monospaceSettings.monospaceLigatures === true;
|
const ligaturesOn = this._monospaceSettings.monospaceLigatures === true;
|
||||||
const featureSettings = ligaturesOn ? 'normal' : "'liga' 0, 'calt' 0, 'dlig' 0";
|
const featureSettings = ligaturesOn ? 'normal' : "'liga' 0, 'calt' 0, 'dlig' 0";
|
||||||
const fontFaceBlock = buildFontFaceBlock(this._monospaceSettings.monospaceFont);
|
const fontFaceBlock = buildFontFaceBlock(this._monospaceSettings.monospaceFont);
|
||||||
|
|||||||
Binary file not shown.
@@ -12,10 +12,22 @@ describe('DocxFontEmbedder.embed', () => {
|
|||||||
fs.mkdirSync(dir, { recursive: true });
|
fs.mkdirSync(dir, { recursive: true });
|
||||||
fs.writeFileSync(fontPath, 'fake-ttf-data');
|
fs.writeFileSync(fontPath, 'fake-ttf-data');
|
||||||
const zip = new JSZip();
|
const zip = new JSZip();
|
||||||
zip.file('[Content_Types].xml', '<?xml version="1.0"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"></Types>');
|
zip.file(
|
||||||
zip.file('_rels/.rels', '<?xml version="1.0"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>');
|
'[Content_Types].xml',
|
||||||
zip.file('word/document.xml', '<?xml version="1.0"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/main"><w:body/></w:document>');
|
'<?xml version="1.0"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"></Types>'
|
||||||
zip.file('word/styles.xml', '<?xml version="1.0"?><w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/main"><w:style w:type="character" w:styleId="SourceCode"><w:name w:val="Source Code"/></w:style></w:styles>');
|
);
|
||||||
|
zip.file(
|
||||||
|
'_rels/.rels',
|
||||||
|
'<?xml version="1.0"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>'
|
||||||
|
);
|
||||||
|
zip.file(
|
||||||
|
'word/document.xml',
|
||||||
|
'<?xml version="1.0"?><w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/main"><w:body/></w:document>'
|
||||||
|
);
|
||||||
|
zip.file(
|
||||||
|
'word/styles.xml',
|
||||||
|
'<?xml version="1.0"?><w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/main"><w:style w:type="character" w:styleId="SourceCode"><w:name w:val="Source Code"/></w:style></w:styles>'
|
||||||
|
);
|
||||||
fs.writeFileSync(docxPath, await zip.generateAsync({ type: 'nodebuffer' }));
|
fs.writeFileSync(docxPath, await zip.generateAsync({ type: 'nodebuffer' }));
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -27,7 +39,9 @@ describe('DocxFontEmbedder.embed', () => {
|
|||||||
]);
|
]);
|
||||||
const zip = await JSZip.loadAsync(fs.readFileSync(out));
|
const zip = await JSZip.loadAsync(fs.readFileSync(out));
|
||||||
expect(Object.keys(zip.files).some((f) => f.startsWith('word/fonts/'))).toBe(true);
|
expect(Object.keys(zip.files).some((f) => f.startsWith('word/fonts/'))).toBe(true);
|
||||||
const fontTable = zip.file('word/fontTable.xml') ? await zip.file('word/fontTable.xml').async('string') : '';
|
const fontTable = zip.file('word/fontTable.xml')
|
||||||
|
? await zip.file('word/fontTable.xml').async('string')
|
||||||
|
: '';
|
||||||
expect(fontTable).toContain('JetBrains Mono');
|
expect(fontTable).toContain('JetBrains Mono');
|
||||||
expect(fontTable).toMatch(/<w:embedRegular/);
|
expect(fontTable).toMatch(/<w:embedRegular/);
|
||||||
const styles = await zip.file('word/styles.xml').async('string');
|
const styles = await zip.file('word/styles.xml').async('string');
|
||||||
@@ -35,10 +49,14 @@ describe('DocxFontEmbedder.embed', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('is idempotent: running twice does not double-embed', async () => {
|
test('is idempotent: running twice does not double-embed', async () => {
|
||||||
const once = await DocxFontEmbedder.embed(docxPath, [{ path: fontPath, family: 'JetBrains Mono', weight: 400 }]);
|
const once = await DocxFontEmbedder.embed(docxPath, [
|
||||||
const twice = await DocxFontEmbedder.embed(once, [{ path: fontPath, family: 'JetBrains Mono', weight: 400 }]);
|
{ path: fontPath, family: 'JetBrains Mono', weight: 400 },
|
||||||
|
]);
|
||||||
|
const twice = await DocxFontEmbedder.embed(once, [
|
||||||
|
{ path: fontPath, family: 'JetBrains Mono', weight: 400 },
|
||||||
|
]);
|
||||||
const zip = await JSZip.loadAsync(fs.readFileSync(twice));
|
const zip = await JSZip.loadAsync(fs.readFileSync(twice));
|
||||||
const fontEntries = Object.keys(zip.files).filter((f) => /^word\/fonts\/[^/]+\.ttf$/.test(f));
|
const fontEntries = Object.keys(zip.files).filter((f) => /^word\/fonts\/[^/]+\.ttf$/.test(f));
|
||||||
expect(fontEntries.length).toBe(1);
|
expect(fontEntries.length).toBe(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,7 +12,10 @@ describe('EpubFontEmbedder.patchManifest', () => {
|
|||||||
fs.mkdirSync(fixturesDir, { recursive: true });
|
fs.mkdirSync(fixturesDir, { recursive: true });
|
||||||
fs.writeFileSync(fontPath, 'fake-ttf-binary');
|
fs.writeFileSync(fontPath, 'fake-ttf-binary');
|
||||||
const zip = new JSZip();
|
const zip = new JSZip();
|
||||||
zip.file('OEBPS/content.opf', '<?xml version="1.0"?><package xmlns="http://www.idpf.org/2007/opf"></package>');
|
zip.file(
|
||||||
|
'OEBPS/content.opf',
|
||||||
|
'<?xml version="1.0"?><package xmlns="http://www.idpf.org/2007/opf"></package>'
|
||||||
|
);
|
||||||
fs.writeFileSync(epubPath, await zip.generateAsync({ type: 'nodebuffer' }));
|
fs.writeFileSync(epubPath, await zip.generateAsync({ type: 'nodebuffer' }));
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -28,4 +31,4 @@ describe('EpubFontEmbedder.patchManifest', () => {
|
|||||||
expect(opf).toMatch(/<item[^>]*href="OEBPS\/fonts\/fake\.ttf"/);
|
expect(opf).toMatch(/<item[^>]*href="OEBPS\/fonts\/fake\.ttf"/);
|
||||||
expect(opf).toMatch(/<item[^>]*media-type="application\/x-font-ttf"/);
|
expect(opf).toMatch(/<item[^>]*media-type="application\/x-font-ttf"/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -13,14 +13,24 @@ describe('ExportCss.build', () => {
|
|||||||
afterAll(() => fs.rmSync(path.dirname(fakeFontPath), { recursive: true, force: true }));
|
afterAll(() => fs.rmSync(path.dirname(fakeFontPath), { recursive: true, force: true }));
|
||||||
|
|
||||||
test('emits a self-contained CSS with embedded @font-face', () => {
|
test('emits a self-contained CSS with embedded @font-face', () => {
|
||||||
const css = ExportCss.build({ activeFontPath: fakeFontPath, family: 'JetBrains Mono', weight: 400, ligatures: false });
|
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).toMatch(/@font-face\s*\{[^}]*src:\s*url\('data:font\/woff2;base64,/);
|
||||||
expect(css).toContain("font-family: 'JetBrains Mono'");
|
expect(css).toContain("font-family: 'JetBrains Mono'");
|
||||||
expect(css).toMatch(/font-feature-settings:[^;]*liga[^;]*0/);
|
expect(css).toMatch(/font-feature-settings:[^;]*liga[^;]*0/);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('falls back to family-only CSS when font path is missing', () => {
|
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 });
|
const css = ExportCss.build({
|
||||||
|
activeFontPath: null,
|
||||||
|
family: 'Fira Code',
|
||||||
|
weight: 700,
|
||||||
|
ligatures: true,
|
||||||
|
});
|
||||||
expect(css).not.toContain('data:font/woff2;');
|
expect(css).not.toContain('data:font/woff2;');
|
||||||
expect(css).toContain("font-family: 'Fira Code'");
|
expect(css).toContain("font-family: 'Fira Code'");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ const fs = require('fs');
|
|||||||
const MonospaceFontConfig = require('../src/main/MonospaceFontConfig');
|
const MonospaceFontConfig = require('../src/main/MonospaceFontConfig');
|
||||||
|
|
||||||
describe('MonospaceFontConfig', () => {
|
describe('MonospaceFontConfig', () => {
|
||||||
afterEach(() => { jest.clearAllMocks(); });
|
afterEach(() => {
|
||||||
|
jest.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
test('returns null when no file exists', () => {
|
test('returns null when no file exists', () => {
|
||||||
fs.existsSync.mockReturnValue(false);
|
fs.existsSync.mockReturnValue(false);
|
||||||
@@ -16,13 +18,17 @@ describe('MonospaceFontConfig', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('returns dev repo path when dev file exists', () => {
|
test('returns dev repo path when dev file exists', () => {
|
||||||
fs.existsSync.mockImplementation((p) => !p.includes('app.asar.unpacked') && p.endsWith('JetBrainsMono-Regular.ttf'));
|
fs.existsSync.mockImplementation(
|
||||||
|
(p) => !p.includes('app.asar.unpacked') && p.endsWith('JetBrainsMono-Regular.ttf')
|
||||||
|
);
|
||||||
const p = MonospaceFontConfig.getMonoFontTtfPath('jetbrains-mono', 400);
|
const p = MonospaceFontConfig.getMonoFontTtfPath('jetbrains-mono', 400);
|
||||||
expect(p).toMatch(/assets\/fonts\/JetBrainsMono-Regular\.ttf$/);
|
expect(p).toMatch(/assets\/fonts\/JetBrainsMono-Regular\.ttf$/);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('returns packaged asar.unpacked path when present and file exists', () => {
|
test('returns packaged asar.unpacked path when present and file exists', () => {
|
||||||
fs.existsSync.mockImplementation((p) => p.includes('app.asar.unpacked') && p.endsWith('FiraCode-Regular.ttf'));
|
fs.existsSync.mockImplementation(
|
||||||
|
(p) => p.includes('app.asar.unpacked') && p.endsWith('FiraCode-Regular.ttf')
|
||||||
|
);
|
||||||
const p = MonospaceFontConfig.getMonoFontTtfPath('fira-code', 400);
|
const p = MonospaceFontConfig.getMonoFontTtfPath('fira-code', 400);
|
||||||
expect(p).toContain('app.asar.unpacked');
|
expect(p).toContain('app.asar.unpacked');
|
||||||
expect(p).toContain('FiraCode-Regular.ttf');
|
expect(p).toContain('FiraCode-Regular.ttf');
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
const { getDefaults, getActiveMonoFont, isLigaturesEnabled } = require('../src/main/settings/monospaceSettings');
|
const {
|
||||||
|
getDefaults,
|
||||||
|
getActiveMonoFont,
|
||||||
|
isLigaturesEnabled,
|
||||||
|
} = require('../src/main/settings/monospaceSettings');
|
||||||
|
|
||||||
describe('monospaceSettings', () => {
|
describe('monospaceSettings', () => {
|
||||||
test('getDefaults returns sane defaults', () => {
|
test('getDefaults returns sane defaults', () => {
|
||||||
|
|||||||
@@ -52,4 +52,4 @@ describe('PdfFontHeader.build', () => {
|
|||||||
});
|
});
|
||||||
expect(tex).toMatch(/\{FiraCode\}/);
|
expect(tex).toMatch(/\{FiraCode\}/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user