feat(export): wire HTML export to monospace ExportCss (pandoc + fallback)

This commit is contained in:
2026-08-23 19:31:33 +05:30
parent 269d4ac028
commit fac0d3d4a6
+25
View File
@@ -8,6 +8,7 @@ const PDFOperations = require('./main/PDFOperations');
const GitOperations = require('./main/GitOperations'); const GitOperations = require('./main/GitOperations');
const PdfFontHeader = require('./main/PdfFontHeader'); const PdfFontHeader = require('./main/PdfFontHeader');
const MonospaceFontConfig = require('./main/MonospaceFontConfig'); const MonospaceFontConfig = require('./main/MonospaceFontConfig');
const ExportCss = require('./main/ExportCss');
// Add MiKTeX to PATH for LaTeX support // Add MiKTeX to PATH for LaTeX support
if (process.platform === 'win32') { if (process.platform === 'win32') {
@@ -335,6 +336,22 @@ function buildMonospaceHeaderFile() {
return headerFile; return headerFile;
} }
// Build a self-contained CSS fragment for HTML/EPUB exports that embeds
// the active monospace font as a base64 data URI. Returns a string with a
// trailing newline suitable for either inline injection or a temp file.
function buildMonospaceExportCss() {
const s = readSettingsJsonCached();
const familyKey = s.monospaceFont || 'jetbrains-mono';
const family = familyKey === 'fira-code' ? 'Fira Code' : 'JetBrains Mono';
const monoFontPath = MonospaceFontConfig.getMonoFontTtfPath(familyKey, 400);
return ExportCss.build({
activeFontPath: monoFontPath,
family,
weight: 400,
ligatures: !!s.monospaceLigatures,
});
}
// Plugin settings IPC handlers // Plugin settings IPC handlers
ipcMain.handle('plugin-settings:get', (_event, key) => { ipcMain.handle('plugin-settings:get', (_event, key) => {
return store.get(key); return store.get(key);
@@ -2764,6 +2781,12 @@ function performExportWithOptions(format, options) {
} else if (format === 'json') { } else if (format === 'json') {
pandocCmd = `${getPandocPath()} "${currentFile}" -t json -o "${outputFile}"`; pandocCmd = `${getPandocPath()} "${currentFile}" -t json -o "${outputFile}"`;
exportWithPandoc(pandocCmd, outputFile, format); exportWithPandoc(pandocCmd, outputFile, format);
} else if (format === 'html') {
// Build a complete HTML file with our bundled monospace font as embedded CSS.
const cssFile = path.join(os.tmpdir(), `monospace-html-${Date.now()}-${process.pid}.css`);
fs.writeFileSync(cssFile, buildMonospaceExportCss(), 'utf-8');
pandocCmd = `${getPandocPath()} "${inputFile}" -s --css="${cssFile}" -o "${outputFile}"`;
exportWithPandoc(pandocCmd, outputFile, format);
} else if (format === 'yaml' || format === 'xml' || format === 'toml') { } else if (format === 'yaml' || format === 'xml' || format === 'toml') {
// For YAML/XML/TOML, save the raw markdown content with the new extension // For YAML/XML/TOML, save the raw markdown content with the new extension
try { try {
@@ -3025,6 +3048,7 @@ function exportToHTML(outputFile) {
const marked = require('marked'); const marked = require('marked');
const markdownContent = fs.readFileSync(currentFile, 'utf8'); const markdownContent = fs.readFileSync(currentFile, 'utf8');
const htmlContent = marked.parse(markdownContent); const htmlContent = marked.parse(markdownContent);
const monospaceCss = buildMonospaceExportCss();
const fullHtml = `<!DOCTYPE html> const fullHtml = `<!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
@@ -3032,6 +3056,7 @@ function exportToHTML(outputFile) {
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Exported Document</title> <title>Exported Document</title>
<style> <style>
${monospaceCss}
body { body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
line-height: 1.6; line-height: 1.6;