md2cv 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +674 -0
  3. package/README.md +219 -0
  4. package/dist/bin.d.ts +6 -0
  5. package/dist/bin.d.ts.map +1 -0
  6. package/dist/bin.js +10 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/cli/index.d.ts +50 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +278 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/generator/index.d.ts +36 -0
  13. package/dist/generator/index.d.ts.map +1 -0
  14. package/dist/generator/index.js +302 -0
  15. package/dist/generator/index.js.map +1 -0
  16. package/dist/generator/resume_en.d.ts +22 -0
  17. package/dist/generator/resume_en.d.ts.map +1 -0
  18. package/dist/generator/resume_en.js +524 -0
  19. package/dist/generator/resume_en.js.map +1 -0
  20. package/dist/generator/resume_ja.d.ts +22 -0
  21. package/dist/generator/resume_ja.d.ts.map +1 -0
  22. package/dist/generator/resume_ja.js +440 -0
  23. package/dist/generator/resume_ja.js.map +1 -0
  24. package/dist/generator/rirekisho/components.d.ts +83 -0
  25. package/dist/generator/rirekisho/components.d.ts.map +1 -0
  26. package/dist/generator/rirekisho/components.js +405 -0
  27. package/dist/generator/rirekisho/components.js.map +1 -0
  28. package/dist/generator/rirekisho/data.d.ts +18 -0
  29. package/dist/generator/rirekisho/data.d.ts.map +1 -0
  30. package/dist/generator/rirekisho/data.js +274 -0
  31. package/dist/generator/rirekisho/data.js.map +1 -0
  32. package/dist/generator/rirekisho/index.d.ts +20 -0
  33. package/dist/generator/rirekisho/index.d.ts.map +1 -0
  34. package/dist/generator/rirekisho/index.js +67 -0
  35. package/dist/generator/rirekisho/index.js.map +1 -0
  36. package/dist/generator/rirekisho/layout.d.ts +20 -0
  37. package/dist/generator/rirekisho/layout.d.ts.map +1 -0
  38. package/dist/generator/rirekisho/layout.js +354 -0
  39. package/dist/generator/rirekisho/layout.js.map +1 -0
  40. package/dist/generator/rirekisho/styles.d.ts +9 -0
  41. package/dist/generator/rirekisho/styles.d.ts.map +1 -0
  42. package/dist/generator/rirekisho/styles.js +362 -0
  43. package/dist/generator/rirekisho/styles.js.map +1 -0
  44. package/dist/generator/rirekisho/types.d.ts +163 -0
  45. package/dist/generator/rirekisho/types.d.ts.map +1 -0
  46. package/dist/generator/rirekisho/types.js +80 -0
  47. package/dist/generator/rirekisho/types.js.map +1 -0
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +10 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/parser/index.d.ts +21 -0
  53. package/dist/parser/index.d.ts.map +1 -0
  54. package/dist/parser/index.js +639 -0
  55. package/dist/parser/index.js.map +1 -0
  56. package/dist/types/config.d.ts +64 -0
  57. package/dist/types/config.d.ts.map +1 -0
  58. package/dist/types/config.js +5 -0
  59. package/dist/types/config.js.map +1 -0
  60. package/dist/types/errors.d.ts +78 -0
  61. package/dist/types/errors.d.ts.map +1 -0
  62. package/dist/types/errors.js +146 -0
  63. package/dist/types/errors.js.map +1 -0
  64. package/dist/types/index.d.ts +9 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +9 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/types/metadata.d.ts +55 -0
  69. package/dist/types/metadata.d.ts.map +1 -0
  70. package/dist/types/metadata.js +136 -0
  71. package/dist/types/metadata.js.map +1 -0
  72. package/dist/types/result.d.ts +50 -0
  73. package/dist/types/result.d.ts.map +1 -0
  74. package/dist/types/result.js +74 -0
  75. package/dist/types/result.js.map +1 -0
  76. package/dist/types/sections.d.ts +168 -0
  77. package/dist/types/sections.d.ts.map +1 -0
  78. package/dist/types/sections.js +122 -0
  79. package/dist/types/sections.js.map +1 -0
  80. package/dist/validator/index.d.ts +20 -0
  81. package/dist/validator/index.d.ts.map +1 -0
  82. package/dist/validator/index.js +67 -0
  83. package/dist/validator/index.js.map +1 -0
  84. package/examples/example-cv-en.md +77 -0
  85. package/examples/example-cv-ja.md +116 -0
  86. package/examples/sample-photo.png +0 -0
  87. package/package.json +93 -0
@@ -0,0 +1,405 @@
1
+ /**
2
+ * HTML components for Rirekisho (履歴書)
3
+ */
4
+ // ============================================================================
5
+ // Utility Functions
6
+ // ============================================================================
7
+ function mm(value) {
8
+ return `${value}mm`;
9
+ }
10
+ function pt(value) {
11
+ return `${value}pt`;
12
+ }
13
+ /**
14
+ * Calculate optimal font size for text to fit in cell
15
+ * @param text - The text to fit
16
+ * @param cellWidthMm - Available cell width in mm
17
+ * @param scale - Scale factor for the paper size
18
+ * @param options - Optional configuration
19
+ */
20
+ function calculateFontSize(text, cellWidthMm, scale, options = {}) {
21
+ const { maxFontPt = 10 * scale, minFontPt = 6 * scale, paddingMm = 4, charWidthFactor = 0.35, // Japanese characters are wider
22
+ } = options;
23
+ if (!text || text.length === 0) {
24
+ return maxFontPt;
25
+ }
26
+ const availableWidthMm = cellWidthMm - paddingMm;
27
+ // Estimate: each character needs (charWidthFactor * fontSize) mm
28
+ const requiredFontPt = availableWidthMm / (text.length * charWidthFactor);
29
+ return Math.max(minFontPt, Math.min(maxFontPt, requiredFontPt));
30
+ }
31
+ export function buildHeader({ layout, today }) {
32
+ const { photoWidth, scale } = layout;
33
+ return `
34
+ <div class="flex flex--between flex--end" style="margin-bottom: ${mm(1.5 * scale)}">
35
+ <span class="text--title">履歴書</span>
36
+ <span style="margin-right: ${mm(photoWidth)}; font-size: ${pt(9 * scale)}">
37
+ ${today.year} 年 ${today.month} 月 ${today.day} 日現在
38
+ </span>
39
+ </div>
40
+ `;
41
+ }
42
+ export function buildNameSection({ layout, info }) {
43
+ const { photoWidth, nameMainHeight, scale, pageWidth } = layout;
44
+ const nameRowStyle = `margin-right: ${mm(photoWidth)}`;
45
+ // Calculate available width for name/furigana (pageWidth - photoWidth - label width - padding)
46
+ const labelWidthMm = 14 * scale;
47
+ const availableWidthMm = pageWidth - photoWidth - labelWidthMm - 4 * scale;
48
+ // Calculate font sizes based on text length
49
+ const furiganaFontSize = calculateFontSize(info.furigana, availableWidthMm, scale, {
50
+ maxFontPt: 8 * scale,
51
+ minFontPt: 5 * scale,
52
+ paddingMm: 4 * scale,
53
+ });
54
+ const nameFontSize = calculateFontSize(info.name, availableWidthMm, scale, {
55
+ maxFontPt: 16 * scale,
56
+ minFontPt: 10 * scale,
57
+ paddingMm: 4 * scale,
58
+ });
59
+ return `
60
+ <div class="cell" style="${nameRowStyle}; border-bottom: none">
61
+ <div class="cell__label">ふりがな</div>
62
+ <div class="cell__value" style="font-size: ${pt(furiganaFontSize)}">${info.furigana}</div>
63
+ </div>
64
+ <div class="cell" style="height: ${mm(nameMainHeight)}; ${nameRowStyle}; border-bottom: none">
65
+ <div class="cell__label" style="align-self: flex-start; padding-top: ${mm(1 * scale)}">氏&#x3000;名</div>
66
+ <div class="cell__value" style="font-size: ${pt(nameFontSize)}">${info.name}</div>
67
+ </div>
68
+ `;
69
+ }
70
+ export function buildBirthGenderRow({ layout, info, }) {
71
+ const { photoWidth, scale, genderWidth } = layout;
72
+ const rowStyle = `margin-right: ${mm(photoWidth)}`;
73
+ const dobYear = info.dob?.year ?? '&#x3000;&#x3000;&#x3000;&#x3000;';
74
+ const dobMonth = info.dob?.month ?? '&#x3000;&#x3000;';
75
+ const dobDay = info.dob?.day ?? '&#x3000;&#x3000;';
76
+ const ageDisplay = info.age !== null ? String(info.age) : '&#x3000;&#x3000;';
77
+ return `
78
+ <div class="cell flex" style="${rowStyle}; padding: 0; border-bottom: none">
79
+ <div class="cell__label"></div>
80
+ <div class="cell__value flex flex--center" style="font-size: ${pt(9 * scale)}">
81
+ <span>${dobYear} 年 ${dobMonth} 月 ${dobDay} 日生(満 ${ageDisplay} 歳)</span>
82
+ </div>
83
+ <div style="width: ${mm(genderWidth)}; border-left: 0.5pt solid #000; display: flex; align-items: center; padding: 0 ${mm(2 * scale)}; align-self: stretch">
84
+ <span class="text--xs">※性別</span>
85
+ <span class="text--small" style="margin-left: ${mm(2 * scale)}">${info.gender}</span>
86
+ </div>
87
+ </div>
88
+ `;
89
+ }
90
+ export function buildAddressRow({ layout, info, isPrimary, }) {
91
+ const { contactWidth, scale, addressRowHeight, addressFuriganaHeight, pageWidth, photoWidth } = layout;
92
+ const address = isPrimary ? info.address : info.address2;
93
+ const addressFurigana = isPrimary
94
+ ? info.addressFurigana
95
+ : info.address2Furigana;
96
+ const postCode = isPrimary ? info.postCode : info.postCode2;
97
+ const phone = isPrimary ? info.phone : info.phone2;
98
+ const email = isPrimary ? info.email : info.email2;
99
+ // Calculate available width for address (pageWidth - contactWidth - label - padding)
100
+ const addressAvailableWidth = pageWidth - photoWidth - contactWidth - 12 * scale;
101
+ // Calculate font sizes
102
+ const addressFuriganaFontSize = calculateFontSize(addressFurigana || '', addressAvailableWidth, scale, {
103
+ maxFontPt: 8 * scale,
104
+ minFontPt: 5 * scale,
105
+ paddingMm: 4 * scale,
106
+ });
107
+ const addressFontSize = calculateFontSize(address || '', addressAvailableWidth, scale, {
108
+ maxFontPt: 12 * scale,
109
+ minFontPt: 7 * scale,
110
+ paddingMm: 4 * scale,
111
+ });
112
+ const phoneFontSize = calculateFontSize(phone || '', contactWidth, scale, {
113
+ maxFontPt: 8 * scale,
114
+ minFontPt: 5 * scale,
115
+ paddingMm: 4 * scale,
116
+ charWidthFactor: 0.22,
117
+ });
118
+ const emailFontSize = calculateFontSize(email || '', contactWidth, scale, {
119
+ maxFontPt: 9 * scale,
120
+ minFontPt: 3 * scale, // Allow smaller font for long emails
121
+ paddingMm: 4 * scale, // Left/right padding
122
+ charWidthFactor: 0.22, // Slightly larger factor for better fit estimation
123
+ });
124
+ const label = isPrimary ? '現住所' : '連絡先';
125
+ const note = isPrimary
126
+ ? ''
127
+ : `<span class="text--xxs" style="position: absolute; top: ${mm(1 * scale)}; right: ${mm(2 * scale)}">(現住所以外に連絡を希望する場合のみ記入)</span>`;
128
+ // 現住所は下の罫線なし(連絡先と重複を避ける)、連絡先は下の罫線あり
129
+ const bottomBorder = isPrimary ? 'border-bottom: none' : '';
130
+ return `
131
+ <div class="flex" style="height: ${mm(addressRowHeight)}">
132
+ <div style="flex: 1; display: flex; flex-direction: column; border: 0.5pt solid #000; ${bottomBorder}">
133
+ <div class="flex" style="width: 100%; height: ${mm(addressFuriganaHeight)}; border-bottom: 0.5pt solid #ccc; align-items: center">
134
+ <div class="cell__label text--xs" style="padding-left: ${mm(2 * scale)}; align-items: center; justify-content: flex-start">ふりがな</div>
135
+ <div class="cell__value" style="font-size: ${pt(addressFuriganaFontSize)}">${addressFurigana}</div>
136
+ </div>
137
+ <div class="flex flex--col" style="width: 100%; flex: 1; position: relative">
138
+ <div class="flex flex--center" style="padding: ${mm(1 * scale)} 0 0 ${mm(2 * scale)}">
139
+ <span class="text--xs">${label}</span>
140
+ <span class="text--xs" style="margin-left: ${mm(4 * scale)}">〒${postCode}</span>
141
+ ${note}
142
+ </div>
143
+ <div class="flex--1 flex flex--center" style="padding: 0 ${mm(2 * scale)} 0 ${mm(10 * scale)}; font-size: ${pt(addressFontSize)}">${address}</div>
144
+ </div>
145
+ </div>
146
+ <div style="width: ${mm(contactWidth)}; border: 0.5pt solid #000; border-left: none; ${bottomBorder}; display: flex; flex-direction: column">
147
+ <div style="height: ${mm(addressFuriganaHeight)}; border-bottom: 0.5pt solid #ccc; display: flex; align-items: center; justify-content: center; position: relative">
148
+ <span class="text--xs" style="position: absolute; top: 50%; left: ${mm(1 * scale)}; transform: translateY(-50%)">電話</span>
149
+ <span style="font-size: ${pt(phoneFontSize)}">${phone}</span>
150
+ </div>
151
+ <div class="flex--1 flex flex--center" style="justify-content: center; position: relative; padding: 0 ${mm(2 * scale)}">
152
+ <span class="text--xs" style="position: absolute; top: ${mm(1 * scale)}; left: ${mm(1 * scale)}">E-mail</span>
153
+ <span style="font-size: ${pt(emailFontSize)}; text-align: center; word-break: break-all; padding-top: ${mm(3 * scale)}">${email}</span>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ `;
158
+ }
159
+ export function buildPhotoBox({ layout, photoDataUri }) {
160
+ const { photoWidth, scale } = layout;
161
+ // If photo is provided, show the image
162
+ if (photoDataUri) {
163
+ return `
164
+ <div style="position: absolute; right: 0; top: ${mm(-9 * scale)}; width: ${mm(photoWidth)}">
165
+ <div class="photo-box photo-box--with-image" style="margin: 0 auto">
166
+ <img src="${photoDataUri}" alt="証明写真" style="width: 100%; height: 100%; object-fit: cover;" />
167
+ </div>
168
+ </div>
169
+ `;
170
+ }
171
+ // Default: show instructions
172
+ return `
173
+ <div style="position: absolute; right: 0; top: ${mm(-9 * scale)}; width: ${mm(photoWidth)}">
174
+ <div class="photo-box" style="margin: 0 auto">
175
+ <div style="margin-bottom: ${mm(1 * scale)}">写真をはる位置</div>
176
+ <div style="font-size: ${pt(5.5 * scale)}; line-height: 1.5">
177
+ 写真を貼る必要が<br>ある場合<br>
178
+ 1. 縦 36〜40mm<br>横 24〜30mm<br>
179
+ 2. 本人単身胸から上<br>
180
+ 3. 裏面のりづけ
181
+ </div>
182
+ </div>
183
+ </div>
184
+ `;
185
+ }
186
+ export function buildHistoryTable({ layout, data, rowCount, title, height, }) {
187
+ const { tableRowHeight, tableFontSize } = layout;
188
+ const headerRow = `
189
+ <tr style="height: ${mm(tableRowHeight)}">
190
+ <td class="align--center" style="font-size: ${pt(tableFontSize)}">年</td>
191
+ <td class="align--center" style="font-size: ${pt(tableFontSize)}">月</td>
192
+ <td class="align--center" style="font-size: ${pt(tableFontSize)}">${title}</td>
193
+ </tr>
194
+ `;
195
+ const dataRows = Array.from({ length: rowCount }, (_, i) => {
196
+ const d = data[i];
197
+ const content = d?.[2] ?? '';
198
+ let alignClass = 'align--left pad';
199
+ if (content === '学歴' || content === '職歴') {
200
+ alignClass = 'align--center';
201
+ }
202
+ else if (content === '以上' || content === '現在に至る') {
203
+ alignClass = 'align--right pad';
204
+ }
205
+ return `
206
+ <tr style="height: ${mm(tableRowHeight)}">
207
+ <td class="col--year align--center valign--middle" style="font-size: ${pt(tableFontSize)}">${d?.[0] ?? ''}</td>
208
+ <td class="col--month align--center valign--middle" style="font-size: ${pt(tableFontSize)}">${d?.[1] ?? ''}</td>
209
+ <td class="${alignClass} valign--middle" style="font-size: ${pt(tableFontSize)}">${content}</td>
210
+ </tr>
211
+ `;
212
+ }).join('');
213
+ const heightStyle = height !== undefined ? `height: ${mm(height)};` : '';
214
+ return `
215
+ <div class="table-wrapper" style="${heightStyle}">
216
+ <table>
217
+ <colgroup>
218
+ <col class="col--year">
219
+ <col class="col--month">
220
+ <col>
221
+ </colgroup>
222
+ ${headerRow}
223
+ ${dataRows}
224
+ </table>
225
+ </div>
226
+ `;
227
+ }
228
+ export function buildLicenseTable({ layout, data, height, }) {
229
+ const { licenseRows: rowCount, tableRowHeight, tableFontSize } = layout;
230
+ const headerRow = `
231
+ <tr style="height: ${mm(tableRowHeight)}">
232
+ <td class="align--center" style="font-size: ${pt(tableFontSize)}">年</td>
233
+ <td class="align--center" style="font-size: ${pt(tableFontSize)}">月</td>
234
+ <td class="align--center" style="font-size: ${pt(tableFontSize)}">免許・資格</td>
235
+ </tr>
236
+ `;
237
+ const dataRows = Array.from({ length: rowCount }, (_, i) => {
238
+ const d = data[i];
239
+ return `
240
+ <tr style="height: ${mm(tableRowHeight)}">
241
+ <td class="col--year align--center valign--middle" style="font-size: ${pt(tableFontSize)}">${d?.[0] ?? ''}</td>
242
+ <td class="col--month align--center valign--middle" style="font-size: ${pt(tableFontSize)}">${d?.[1] ?? ''}</td>
243
+ <td class="align--left pad valign--middle" style="font-size: ${pt(tableFontSize)}">${d?.[2] ?? ''}</td>
244
+ </tr>
245
+ `;
246
+ }).join('');
247
+ const heightStyle = height !== undefined ? `height: ${mm(height)};` : '';
248
+ return `
249
+ <div class="table-wrapper" style="${heightStyle}">
250
+ <table>
251
+ <colgroup>
252
+ <col class="col--year">
253
+ <col class="col--month">
254
+ <col>
255
+ </colgroup>
256
+ ${headerRow}
257
+ ${dataRows}
258
+ </table>
259
+ </div>
260
+ `;
261
+ }
262
+ export function buildSectionBox({ layout, title, subtitle, content, listItems, height, minHeight, }) {
263
+ const { scale } = layout;
264
+ const subtitleHtml = subtitle
265
+ ? `<span style="font-size: ${pt(8 * scale)}">${subtitle}</span>`
266
+ : '';
267
+ let containerStyle = '';
268
+ if (height !== undefined) {
269
+ containerStyle = `height: ${mm(height)}`;
270
+ }
271
+ else if (minHeight !== undefined) {
272
+ containerStyle = `min-height: ${mm(minHeight)}`;
273
+ }
274
+ // Build list HTML if listItems provided
275
+ let listHtml = '';
276
+ if (listItems && listItems.length > 0) {
277
+ const items = listItems.map((item) => `<li>${item}</li>`).join('');
278
+ listHtml = `<ul style="margin: ${mm(1 * scale)} 0 0 ${mm(8 * scale)}; padding: 0; list-style-type: disc;">${items}</ul>`;
279
+ }
280
+ return `
281
+ <div class="section-box" style="${containerStyle}">
282
+ <div class="section-box__header">${title}${subtitleHtml}</div>
283
+ <div class="section-box__content text--small">${content}${listHtml}</div>
284
+ </div>
285
+ `;
286
+ }
287
+ /**
288
+ * Check if "職歴" label is at the last row of left page
289
+ * If so, we need to move it to the right page
290
+ */
291
+ function shouldMoveShokurekiToRightPage(history, leftHistoryRows) {
292
+ // Get the data that would be on the left page
293
+ const leftPageData = history.slice(0, leftHistoryRows);
294
+ if (leftPageData.length === 0)
295
+ return false;
296
+ // Check if the last row is "職歴"
297
+ const lastRow = leftPageData[leftPageData.length - 1];
298
+ return lastRow?.[2] === '職歴';
299
+ }
300
+ /**
301
+ * Get adjusted history data for left and right pages
302
+ * If "職歴" is at the last row of left page, leave an empty row instead
303
+ */
304
+ export function getAdjustedHistoryData(history, leftHistoryRows) {
305
+ const shouldMove = shouldMoveShokurekiToRightPage(history, leftHistoryRows);
306
+ if (shouldMove) {
307
+ // Find the index of "職歴" in the history
308
+ const shokurekiIndex = history.findIndex((row) => row[2] === '職歴');
309
+ if (shokurekiIndex >= 0 && shokurekiIndex < leftHistoryRows) {
310
+ // Left page: everything before "職歴" (leave empty row at the end)
311
+ const leftData = history.slice(0, shokurekiIndex);
312
+ // Right page: "職歴" and everything after
313
+ const rightData = history.slice(shokurekiIndex);
314
+ return { leftData, rightData, shokurekiMovedToRight: true };
315
+ }
316
+ }
317
+ // Normal case: split at leftHistoryRows
318
+ return {
319
+ leftData: history.slice(0, leftHistoryRows),
320
+ rightData: history.slice(leftHistoryRows),
321
+ shokurekiMovedToRight: false,
322
+ };
323
+ }
324
+ export function buildLeftPage({ layout, info, history, today, photoDataUri, }) {
325
+ const { leftHistoryRows, tableMargin } = layout;
326
+ // Get adjusted data (may have "職歴" moved to right page)
327
+ const { leftData } = getAdjustedHistoryData(history, leftHistoryRows);
328
+ return `
329
+ <div class="page page--left">
330
+ ${buildHeader({ layout, today })}
331
+ <div class="flex" style="position: relative">
332
+ <div style="flex: 1">
333
+ ${buildNameSection({ layout, info })}
334
+ ${buildBirthGenderRow({ layout, info })}
335
+ ${buildAddressRow({ layout, info, isPrimary: true })}
336
+ ${buildAddressRow({ layout, info, isPrimary: false })}
337
+ </div>
338
+ ${buildPhotoBox({ layout, photoDataUri })}
339
+ </div>
340
+ <div class="history-container" style="margin-top: ${mm(tableMargin)}">
341
+ ${buildHistoryTable({
342
+ layout,
343
+ data: leftData,
344
+ rowCount: leftHistoryRows,
345
+ title: '学 歴 ・ 職 歴',
346
+ })}
347
+ </div>
348
+ </div>
349
+ `;
350
+ }
351
+ export function buildRightPage({ layout, history, license, motivation, competencies, notes, }) {
352
+ const { leftHistoryRows, rightHistoryRows, rightHistoryTableHeight, licenseTableHeight, motivationMinHeight, hideMotivation, tableMargin, } = layout;
353
+ // Get adjusted data (may have "職歴" moved to right page)
354
+ const { rightData, shokurekiMovedToRight } = getAdjustedHistoryData(history, leftHistoryRows);
355
+ // Build history continuation section (only if there are rows to show)
356
+ const historySection = rightHistoryRows > 0 || shokurekiMovedToRight
357
+ ? `<div style="margin-bottom: ${mm(tableMargin)}">
358
+ ${buildHistoryTable({
359
+ layout,
360
+ data: rightData,
361
+ rowCount: Math.max(rightHistoryRows, rightData.length),
362
+ title: '学歴・職歴',
363
+ height: rightHistoryTableHeight,
364
+ })}
365
+ </div>`
366
+ : '';
367
+ // Build motivation section with calculated height
368
+ const motivationSection = hideMotivation
369
+ ? ''
370
+ : `
371
+ <div style="margin-bottom: ${mm(tableMargin)}; height: ${mm(motivationMinHeight)}">
372
+ ${buildSectionBox({
373
+ layout,
374
+ title: '志望の動機、特技、自己PR、アピールポイントなど',
375
+ content: motivation,
376
+ listItems: competencies,
377
+ height: motivationMinHeight,
378
+ })}
379
+ </div>
380
+ `;
381
+ // License table margin: use margin-top only when history section doesn't exist
382
+ const licenseMarginTop = rightHistoryRows > 0 || shokurekiMovedToRight ? 0 : tableMargin;
383
+ return `
384
+ <div class="page page--right">
385
+ ${historySection}
386
+ <div style="margin-top: ${mm(licenseMarginTop)}; margin-bottom: ${mm(tableMargin)}">
387
+ ${buildLicenseTable({
388
+ layout,
389
+ data: license,
390
+ height: licenseTableHeight,
391
+ })}
392
+ </div>
393
+ ${motivationSection}
394
+ <div class="notes-container">
395
+ ${buildSectionBox({
396
+ layout,
397
+ title: '本人希望記入欄',
398
+ subtitle: '(特に給料・職種・勤務時間・勤務地・その他についての希望などがあれば記入)',
399
+ content: notes,
400
+ })}
401
+ </div>
402
+ </div>
403
+ `;
404
+ }
405
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/generator/rirekisho/components.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Data extraction and transformation for Rirekisho (履歴書)
3
+ */
4
+ import type { ChronologicalOrder } from '../../types/config.js';
5
+ import type { CVMetadata } from '../../types/metadata.js';
6
+ import type { ParsedSection } from '../../types/sections.js';
7
+ import type { DataCounts, HistoryRow, PersonalInfo, TodayDate } from './types.js';
8
+ export declare function getTodayDate(): TodayDate;
9
+ export declare function extractPersonalInfo(metadata: CVMetadata, today: Date): PersonalInfo;
10
+ export declare function buildHistoryData(sections: readonly ParsedSection[], order: ChronologicalOrder): HistoryRow[];
11
+ export declare function buildLicenseData(sections: readonly ParsedSection[], order: ChronologicalOrder): HistoryRow[];
12
+ export declare function getSectionText(sections: readonly ParsedSection[], ids: string[]): string;
13
+ /**
14
+ * Get list items from a section (for competencies)
15
+ */
16
+ export declare function getSectionList(sections: readonly ParsedSection[], ids: string[]): string[];
17
+ export declare function countDataRows(sections: readonly ParsedSection[]): DataCounts;
18
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/generator/rirekisho/data.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAIV,aAAa,EAGd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EACV,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AA2CpB,wBAAgB,YAAY,IAAI,SAAS,CAOxC;AAMD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,IAAI,GACV,YAAY,CAyBd;AAuGD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,KAAK,EAAE,kBAAkB,GACxB,UAAU,EAAE,CAkCd;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,KAAK,EAAE,kBAAkB,GACxB,UAAU,EAAE,CAWd;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,GAAG,EAAE,MAAM,EAAE,GACZ,MAAM,CAQR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,GAAG,EAAE,MAAM,EAAE,GACZ,MAAM,EAAE,CAeV;AAMD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,UAAU,CA2C5E"}