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.
- package/CHANGELOG.md +19 -0
- package/LICENSE +674 -0
- package/README.md +219 -0
- package/dist/bin.d.ts +6 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +10 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/index.d.ts +50 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +278 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/generator/index.d.ts +36 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +302 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/resume_en.d.ts +22 -0
- package/dist/generator/resume_en.d.ts.map +1 -0
- package/dist/generator/resume_en.js +524 -0
- package/dist/generator/resume_en.js.map +1 -0
- package/dist/generator/resume_ja.d.ts +22 -0
- package/dist/generator/resume_ja.d.ts.map +1 -0
- package/dist/generator/resume_ja.js +440 -0
- package/dist/generator/resume_ja.js.map +1 -0
- package/dist/generator/rirekisho/components.d.ts +83 -0
- package/dist/generator/rirekisho/components.d.ts.map +1 -0
- package/dist/generator/rirekisho/components.js +405 -0
- package/dist/generator/rirekisho/components.js.map +1 -0
- package/dist/generator/rirekisho/data.d.ts +18 -0
- package/dist/generator/rirekisho/data.d.ts.map +1 -0
- package/dist/generator/rirekisho/data.js +274 -0
- package/dist/generator/rirekisho/data.js.map +1 -0
- package/dist/generator/rirekisho/index.d.ts +20 -0
- package/dist/generator/rirekisho/index.d.ts.map +1 -0
- package/dist/generator/rirekisho/index.js +67 -0
- package/dist/generator/rirekisho/index.js.map +1 -0
- package/dist/generator/rirekisho/layout.d.ts +20 -0
- package/dist/generator/rirekisho/layout.d.ts.map +1 -0
- package/dist/generator/rirekisho/layout.js +354 -0
- package/dist/generator/rirekisho/layout.js.map +1 -0
- package/dist/generator/rirekisho/styles.d.ts +9 -0
- package/dist/generator/rirekisho/styles.d.ts.map +1 -0
- package/dist/generator/rirekisho/styles.js +362 -0
- package/dist/generator/rirekisho/styles.js.map +1 -0
- package/dist/generator/rirekisho/types.d.ts +163 -0
- package/dist/generator/rirekisho/types.d.ts.map +1 -0
- package/dist/generator/rirekisho/types.js +80 -0
- package/dist/generator/rirekisho/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/index.d.ts +21 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +639 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/types/config.d.ts +64 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +78 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +146 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/metadata.d.ts +55 -0
- package/dist/types/metadata.d.ts.map +1 -0
- package/dist/types/metadata.js +136 -0
- package/dist/types/metadata.js.map +1 -0
- package/dist/types/result.d.ts +50 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +74 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/sections.d.ts +168 -0
- package/dist/types/sections.d.ts.map +1 -0
- package/dist/types/sections.js +122 -0
- package/dist/types/sections.js.map +1 -0
- package/dist/validator/index.d.ts +20 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +67 -0
- package/dist/validator/index.js.map +1 -0
- package/examples/example-cv-en.md +77 -0
- package/examples/example-cv-ja.md +116 -0
- package/examples/sample-photo.png +0 -0
- 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)}">氏 名</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 ?? '    ';
|
|
74
|
+
const dobMonth = info.dob?.month ?? '  ';
|
|
75
|
+
const dobDay = info.dob?.day ?? '  ';
|
|
76
|
+
const ageDisplay = info.age !== null ? String(info.age) : '  ';
|
|
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":"AAAA;;GAEG;AASH,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,SAAS,EAAE,CAAC,KAAa;IACvB,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,EAAE,CAAC,KAAa;IACvB,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,IAAY,EACZ,WAAmB,EACnB,KAAa,EACb,UAKI,EAAE;IAEN,MAAM,EACJ,SAAS,GAAG,EAAE,GAAG,KAAK,EACtB,SAAS,GAAG,CAAC,GAAG,KAAK,EACrB,SAAS,GAAG,CAAC,EACb,eAAe,GAAG,IAAI,EAAE,gCAAgC;MACzD,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,gBAAgB,GAAG,WAAW,GAAG,SAAS,CAAC;IACjD,iEAAiE;IACjE,MAAM,cAAc,GAAG,gBAAgB,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;AAClE,CAAC;AAWD,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAe;IACxD,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACrC,OAAO;sEAC6D,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC;;mCAElD,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;UACpE,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,GAAG;;;GAGjD,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAoB;IACjE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAChE,MAAM,YAAY,GAAG,iBAAiB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;IAEvD,+FAA+F;IAC/F,MAAM,YAAY,GAAG,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC;IAE3E,4CAA4C;IAC5C,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE;QACjF,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,SAAS,EAAE,CAAC,GAAG,KAAK;KACrB,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE;QACzE,SAAS,EAAE,EAAE,GAAG,KAAK;QACrB,SAAS,EAAE,EAAE,GAAG,KAAK;QACrB,SAAS,EAAE,CAAC,GAAG,KAAK;KACrB,CAAC,CAAC;IAEH,OAAO;+BACsB,YAAY;;mDAEQ,EAAE,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,QAAQ;;uCAElD,EAAE,CAAC,cAAc,CAAC,KAAK,YAAY;6EACG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;mDACvC,EAAE,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,IAAI;;GAE9E,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,mBAAmB,CAAC,EAClC,MAAM,EACN,IAAI,GACgB;IACpB,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAClD,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;IAEnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,kCAAkC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,kBAAkB,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,kBAAkB,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAE7E,OAAO;oCAC2B,QAAQ;;qEAEyB,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;gBAClE,OAAO,MAAM,QAAQ,MAAM,MAAM,SAAS,UAAU;;2BAEzC,EAAE,CAAC,WAAW,CAAC,mFAAmF,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;;wDAElF,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM;;;GAGlF,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,IAAI,EACJ,SAAS,GACO;IAChB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,SAAS,EAAE,UAAU,EAAE,GAC3F,MAAM,CAAC;IACT,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IACzD,MAAM,eAAe,GAAG,SAAS;QAC/B,CAAC,CAAC,IAAI,CAAC,eAAe;QACtB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;IAC5D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAEnD,qFAAqF;IACrF,MAAM,qBAAqB,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,EAAE,GAAG,KAAK,CAAC;IAEjF,uBAAuB;IACvB,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,eAAe,IAAI,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE;QACrG,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,SAAS,EAAE,CAAC,GAAG,KAAK;KACrB,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,iBAAiB,CAAC,OAAO,IAAI,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE;QACrF,SAAS,EAAE,EAAE,GAAG,KAAK;QACrB,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,SAAS,EAAE,CAAC,GAAG,KAAK;KACrB,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE;QACxE,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE;QACxE,SAAS,EAAE,CAAC,GAAG,KAAK;QACpB,SAAS,EAAE,CAAC,GAAG,KAAK,EAAE,qCAAqC;QAC3D,SAAS,EAAE,CAAC,GAAG,KAAK,EAAE,qBAAqB;QAC3C,eAAe,EAAE,IAAI,EAAE,mDAAmD;KAC3E,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAExC,MAAM,IAAI,GAAG,SAAS;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,2DAA2D,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,gCAAgC,CAAC;IAEtI,oCAAoC;IACpC,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5D,OAAO;uCAC8B,EAAE,CAAC,gBAAgB,CAAC;8FACmC,YAAY;wDAClD,EAAE,CAAC,qBAAqB,CAAC;mEACd,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;uDACzB,EAAE,CAAC,uBAAuB,CAAC,KAAK,eAAe;;;2DAG3C,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;qCACxD,KAAK;yDACe,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,QAAQ;cACtE,IAAI;;qEAEmD,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC,eAAe,CAAC,KAAK,OAAO;;;2BAG1H,EAAE,CAAC,YAAY,CAAC,kDAAkD,YAAY;8BAC3E,EAAE,CAAC,qBAAqB,CAAC;8EACuB,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;oCACvD,EAAE,CAAC,aAAa,CAAC,KAAK,KAAK;;gHAEiD,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;mEAC1D,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;oCACpE,EAAE,CAAC,aAAa,CAAC,6DAA6D,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK;;;;GAItI,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,YAAY,EAAiB;IACnE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAErC,uCAAuC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;uDAC4C,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC;;sBAEzE,YAAY;;;KAG7B,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,OAAO;qDAC4C,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC;;qCAExD,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;iCACjB,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC;;;;;;;;GAQ7C,CAAC;AACJ,CAAC;AAcD,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,MAAM,GACY;IAClB,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAEjD,MAAM,SAAS,GAAG;yBACK,EAAE,CAAC,cAAc,CAAC;oDACS,EAAE,CAAC,aAAa,CAAC;oDACjB,EAAE,CAAC,aAAa,CAAC;oDACjB,EAAE,CAAC,aAAa,CAAC,KAAK,KAAK;;GAE5E,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,UAAU,GAAG,iBAAiB,CAAC;QACnC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACzC,UAAU,GAAG,eAAe,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACnD,UAAU,GAAG,kBAAkB,CAAC;QAClC,CAAC;QAED,OAAO;2BACgB,EAAE,CAAC,cAAc,CAAC;+EACkC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;gFACjC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;qBAC7F,UAAU,sCAAsC,EAAE,CAAC,aAAa,CAAC,KAAK,OAAO;;KAE7F,CAAC;IACJ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzE,OAAO;wCAC+B,WAAW;;;;;;;UAOzC,SAAS;UACT,QAAQ;;;GAGf,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,iBAAiB,CAAC,EAChC,MAAM,EACN,IAAI,EACJ,MAAM,GACY;IAClB,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAExE,MAAM,SAAS,GAAG;yBACK,EAAE,CAAC,cAAc,CAAC;oDACS,EAAE,CAAC,aAAa,CAAC;oDACjB,EAAE,CAAC,aAAa,CAAC;oDACjB,EAAE,CAAC,aAAa,CAAC;;GAElE,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAElB,OAAO;2BACgB,EAAE,CAAC,cAAc,CAAC;+EACkC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;gFACjC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;uEAC3C,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;;KAEpG,CAAC;IACJ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzE,OAAO;wCAC+B,WAAW;;;;;;;UAOzC,SAAS;UACT,QAAQ;;;GAGf,CAAC;AACJ,CAAC;AAgBD,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,GACO;IAChB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACzB,MAAM,YAAY,GAAG,QAAQ;QAC3B,CAAC,CAAC,2BAA2B,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,QAAQ,SAAS;QAChE,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,cAAc,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3C,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,cAAc,GAAG,eAAe,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,wCAAwC;IACxC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,QAAQ,GAAG,sBAAsB,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,yCAAyC,KAAK,OAAO,CAAC;IAC3H,CAAC;IAED,OAAO;sCAC6B,cAAc;yCACX,KAAK,GAAG,YAAY;sDACP,OAAO,GAAG,QAAQ;;GAErE,CAAC;AACJ,CAAC;AAeD;;;GAGG;AACH,SAAS,8BAA8B,CACrC,OAA8B,EAC9B,eAAuB;IAEvB,8CAA8C;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACvD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5C,gCAAgC;IAChC,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtD,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA8B,EAC9B,eAAuB;IAMvB,MAAM,UAAU,GAAG,8BAA8B,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAE5E,IAAI,UAAU,EAAE,CAAC;QACf,wCAAwC;QACxC,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACnE,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,GAAG,eAAe,EAAE,CAAC;YAC5D,iEAAiE;YACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAClD,wCAAwC;YACxC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAChD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC;QAC3C,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;QACzC,qBAAqB,EAAE,KAAK;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,MAAM,EACN,IAAI,EACJ,OAAO,EACP,KAAK,EACL,YAAY,GACE;IACd,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAEhD,wDAAwD;IACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,sBAAsB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEtE,OAAO;;QAED,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;;;YAG1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAClC,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACrC,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAClD,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;UAErD,aAAa,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;;0DAES,EAAE,CAAC,WAAW,CAAC;UAC/D,iBAAiB,CAAC;QAClB,MAAM;QACN,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,eAAe;QACzB,KAAK,EAAE,WAAW;KACnB,CAAC;;;GAGP,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EACN,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,KAAK,GACU;IACf,MAAM,EACJ,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,WAAW,GACZ,GAAG,MAAM,CAAC;IAEX,wDAAwD;IACxD,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,sBAAsB,CACjE,OAAO,EACP,eAAe,CAChB,CAAC;IAEF,sEAAsE;IACtE,MAAM,cAAc,GAClB,gBAAgB,GAAG,CAAC,IAAI,qBAAqB;QAC3C,CAAC,CAAC,8BAA8B,EAAE,CAAC,WAAW,CAAC;YACzC,iBAAiB,CAAC;YAClB,MAAM;YACN,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,MAAM,CAAC;YACtD,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,uBAAuB;SAChC,CAAC;eACG;QACT,CAAC,CAAC,EAAE,CAAC;IAET,kDAAkD;IAClD,MAAM,iBAAiB,GAAG,cAAc;QACtC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;mCAC6B,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,mBAAmB,CAAC;UAC5E,eAAe,CAAC;YAChB,MAAM;YACN,KAAK,EAAE,0BAA0B;YACjC,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,mBAAmB;SAC5B,CAAC;;KAEL,CAAC;IAEJ,+EAA+E;IAC/E,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAEzF,OAAO;;QAED,cAAc;gCACU,EAAE,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,WAAW,CAAC;UAC7E,iBAAiB,CAAC;QAClB,MAAM;QACN,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,kBAAkB;KAC3B,CAAC;;QAEF,iBAAiB;;UAEf,eAAe,CAAC;QAChB,MAAM;QACN,KAAK,EAAE,SAAS;QAChB,QAAQ,EACN,uCAAuC;QACzC,OAAO,EAAE,KAAK;KACf,CAAC;;;GAGP,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|