Files
MorphDoc/packages/docx-engine/src/reference-options.ts
T

67 lines
1.8 KiB
TypeScript

import {
defaultExportConfig,
getPaperDimensionsMm,
lengthToMillimeters,
resolvePageMargins,
type ExportConfig,
type MarkdownDocumentMetadata,
type ThemeManifest
} from "@md-to-pdf/core";
import type { DocxThemeTokenSet } from "@md-to-pdf/docx-theme-engine";
export interface DynamicReferenceDocxOptions {
exportConfig: ExportConfig;
theme: ThemeManifest;
fileName: string;
metadata: Pick<MarkdownDocumentMetadata, "title" | "author">;
themeTokens?: DocxThemeTokenSet;
}
export function resolveReferencePageOptions(
options: DynamicReferenceDocxOptions
) {
const { exportConfig, theme } = options;
const themeDefaults = theme.pageDefaults;
const dimensions = getPaperDimensionsMm(
exportConfig.paper.format,
exportConfig.paper.orientation
);
const margins = resolvePageMargins(
exportConfig.paper,
themeDefaults?.margins
);
const useThemeDecorations =
exportConfig.pageDecorationsMode === "theme";
return {
dimensions,
margins: {
top: lengthToMillimeters(margins.top),
right: lengthToMillimeters(margins.right),
bottom: lengthToMillimeters(margins.bottom),
left: lengthToMillimeters(margins.left)
},
orientation: exportConfig.paper.orientation,
header: useThemeDecorations
? themeDefaults?.header ?? defaultExportConfig.header
: exportConfig.header,
footer: useThemeDecorations
? themeDefaults?.footer ?? defaultExportConfig.footer
: exportConfig.footer
};
}
export function resolveHeaderTemplate(
value: string,
options: DynamicReferenceDocxOptions
) {
const replacements: Record<string, string> = {
title: options.metadata.title,
author: options.metadata.author,
filename: options.fileName
};
return value.replace(
/\$\{(title|author|filename)\}/gu,
(_match, name: string) => replacements[name] ?? ""
);
}