refactor(docx): getBaseRun helper, hoist mainConfig, derive sections, remove dead OL code

- Add getBaseRun() next to getHtmlStyle() and replace 8 inline baseRun spreads (~27 lines).
- Hoist one mainConfig object in buildDocument; sidebar call spreads only the two
  differing color keys (~17 lines).
- Remove BUILT_IN_SECTIONS Set; derive membership via `sectionId in data.sections` (~14 lines).
- Delete unreachable ordered-list numbering machinery in html-to-docx.ts: numberingRef is
  always undefined through all call paths, so isOrdered && numberingRef is always false (~15 lines).

Claude-Session: https://claude.ai/code/session_012Bnvt1MghwHj4qQRxuQUGa
This commit is contained in:
Amruth Pillai
2026-07-04 19:27:01 +02:00
parent 439ae114f9
commit dfe75390cd
3 changed files with 39 additions and 129 deletions
+16 -49
View File
@@ -122,27 +122,13 @@ function blendWithWhite(hex: string, opacity: number): string {
// --- Section rendering dispatch ---
const BUILT_IN_SECTIONS = new Set<string>([
"profiles",
"experience",
"education",
"projects",
"skills",
"languages",
"interests",
"awards",
"certifications",
"publications",
"volunteer",
"references",
]);
function renderSection(sectionId: string, data: ResumeData, colorHex: string): Paragraph[] {
if (sectionId === "summary") {
return renderSummary(data.summary, colorHex);
}
if (BUILT_IN_SECTIONS.has(sectionId)) {
// ponytail: data.sections keys are the source of truth; no need to maintain a parallel Set
if (sectionId in data.sections) {
const section = data.sections[sectionId as SectionType];
if (section) {
return renderBuiltInSection(sectionId as SectionType, section, colorHex);
@@ -405,17 +391,19 @@ export function buildDocument(data: ResumeData): Document {
const documentChildren: (Paragraph | Table)[] = [];
// ponytail: hoisted once; sidebar call spreads only the two differing color keys
const mainConfig = {
headingFont,
headingSizeHalfPt: headingSize,
bodyFont,
bodySizeHalfPt: bodySize,
textColorHex,
primaryColorHex: colorHex,
};
// Header placement depends on template
if (templateConfig.headerPosition === "full-width") {
// Configure colors for main content
setRenderConfig({
headingFont,
headingSizeHalfPt: headingSize,
bodyFont,
bodySizeHalfPt: bodySize,
textColorHex,
primaryColorHex: colorHex,
});
setRenderConfig(mainConfig);
documentChildren.push(...buildHeader(data, colorHex, textColorHex));
}
@@ -424,27 +412,13 @@ export function buildDocument(data: ResumeData): Document {
const isFullWidth = layoutPage.fullWidth || layoutPage.sidebar.length === 0;
if (isFullWidth) {
setRenderConfig({
headingFont,
headingSizeHalfPt: headingSize,
bodyFont,
bodySizeHalfPt: bodySize,
textColorHex,
primaryColorHex: colorHex,
});
setRenderConfig(mainConfig);
for (const sectionId of [...layoutPage.main, ...layoutPage.sidebar]) {
documentChildren.push(...renderSection(sectionId, data, colorHex));
}
} else {
// Render main sections with normal colors
setRenderConfig({
headingFont,
headingSizeHalfPt: headingSize,
bodyFont,
bodySizeHalfPt: bodySize,
textColorHex,
primaryColorHex: colorHex,
});
setRenderConfig(mainConfig);
const mainParagraphs: Paragraph[] = [];
if (templateConfig.headerPosition === "main-only") {
@@ -455,14 +429,7 @@ export function buildDocument(data: ResumeData): Document {
}
// Render sidebar sections with potentially inverted colors
setRenderConfig({
headingFont,
headingSizeHalfPt: headingSize,
bodyFont,
bodySizeHalfPt: bodySize,
textColorHex: sidebarTextColorHex,
primaryColorHex: sidebarHeadingColorHex,
});
setRenderConfig({ ...mainConfig, textColorHex: sidebarTextColorHex, primaryColorHex: sidebarHeadingColorHex });
const sidebarParagraphs: Paragraph[] = [];
if (templateConfig.headerPosition === "sidebar-only") {