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,524 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* English CV Generator
|
|
3
|
+
* Generates HTML for English CV format with Times font family
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Page size dimensions in mm
|
|
7
|
+
*/
|
|
8
|
+
const PAGE_SIZES = {
|
|
9
|
+
a3: { width: 420, height: 297 },
|
|
10
|
+
a4: { width: 210, height: 297 },
|
|
11
|
+
b4: { width: 364, height: 257 },
|
|
12
|
+
b5: { width: 176, height: 250 },
|
|
13
|
+
letter: { width: 215.9, height: 279.4 },
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Escape HTML special characters
|
|
17
|
+
*/
|
|
18
|
+
function escapeHtml(text) {
|
|
19
|
+
return text
|
|
20
|
+
.replace(/&/g, '&')
|
|
21
|
+
.replace(/</g, '<')
|
|
22
|
+
.replace(/>/g, '>')
|
|
23
|
+
.replace(/"/g, '"')
|
|
24
|
+
.replace(/'/g, ''');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Format date for display
|
|
28
|
+
*/
|
|
29
|
+
function formatDate(date) {
|
|
30
|
+
if (!date)
|
|
31
|
+
return '';
|
|
32
|
+
const months = [
|
|
33
|
+
'Jan',
|
|
34
|
+
'Feb',
|
|
35
|
+
'Mar',
|
|
36
|
+
'Apr',
|
|
37
|
+
'May',
|
|
38
|
+
'Jun',
|
|
39
|
+
'Jul',
|
|
40
|
+
'Aug',
|
|
41
|
+
'Sep',
|
|
42
|
+
'Oct',
|
|
43
|
+
'Nov',
|
|
44
|
+
'Dec',
|
|
45
|
+
];
|
|
46
|
+
return `${months[date.getMonth()]} ${date.getFullYear()}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Format end date which can be Date or 'present'
|
|
50
|
+
*/
|
|
51
|
+
function formatEndDate(end) {
|
|
52
|
+
if (!end)
|
|
53
|
+
return '';
|
|
54
|
+
if (end === 'present')
|
|
55
|
+
return 'Present';
|
|
56
|
+
return formatDate(end);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format date range
|
|
60
|
+
*/
|
|
61
|
+
function formatDateRange(start, end) {
|
|
62
|
+
const startStr = formatDate(start);
|
|
63
|
+
const endStr = formatEndDate(end);
|
|
64
|
+
if (startStr && endStr)
|
|
65
|
+
return `${startStr} - ${endStr}`;
|
|
66
|
+
if (startStr)
|
|
67
|
+
return startStr;
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Generate base CSS styles
|
|
72
|
+
*/
|
|
73
|
+
function generateStyles(paperSize) {
|
|
74
|
+
const size = PAGE_SIZES[paperSize];
|
|
75
|
+
return `
|
|
76
|
+
@page {
|
|
77
|
+
size: ${size.width}mm ${size.height}mm;
|
|
78
|
+
margin: 15mm;
|
|
79
|
+
}
|
|
80
|
+
* {
|
|
81
|
+
margin: 0;
|
|
82
|
+
padding: 0;
|
|
83
|
+
box-sizing: border-box;
|
|
84
|
+
}
|
|
85
|
+
body {
|
|
86
|
+
font-family: "Times New Roman", Times, serif;
|
|
87
|
+
font-size: 11pt;
|
|
88
|
+
line-height: 1.4;
|
|
89
|
+
color: #333;
|
|
90
|
+
background: #fff;
|
|
91
|
+
max-width: 800px;
|
|
92
|
+
margin: 0 auto;
|
|
93
|
+
padding: 20px;
|
|
94
|
+
}
|
|
95
|
+
header {
|
|
96
|
+
text-align: center;
|
|
97
|
+
margin-bottom: 16px;
|
|
98
|
+
padding-bottom: 12px;
|
|
99
|
+
}
|
|
100
|
+
h1 {
|
|
101
|
+
font-size: 20pt;
|
|
102
|
+
font-weight: bold;
|
|
103
|
+
margin-bottom: 6px;
|
|
104
|
+
color: #000;
|
|
105
|
+
}
|
|
106
|
+
.contact-info {
|
|
107
|
+
font-size: 10pt;
|
|
108
|
+
color: #333;
|
|
109
|
+
}
|
|
110
|
+
.contact-info a {
|
|
111
|
+
color: #333;
|
|
112
|
+
text-decoration: none;
|
|
113
|
+
}
|
|
114
|
+
.contact-info a:hover {
|
|
115
|
+
text-decoration: underline;
|
|
116
|
+
}
|
|
117
|
+
section {
|
|
118
|
+
margin-bottom: 14px;
|
|
119
|
+
page-break-inside: avoid;
|
|
120
|
+
break-inside: avoid;
|
|
121
|
+
}
|
|
122
|
+
.entry {
|
|
123
|
+
page-break-inside: avoid;
|
|
124
|
+
break-inside: avoid;
|
|
125
|
+
}
|
|
126
|
+
h2 {
|
|
127
|
+
font-size: 12pt;
|
|
128
|
+
font-weight: bold;
|
|
129
|
+
text-transform: uppercase;
|
|
130
|
+
border-bottom: 1px solid #333;
|
|
131
|
+
padding-bottom: 2px;
|
|
132
|
+
margin-bottom: 8px;
|
|
133
|
+
color: #000;
|
|
134
|
+
}
|
|
135
|
+
.entry {
|
|
136
|
+
margin-bottom: 10px;
|
|
137
|
+
}
|
|
138
|
+
.entry-header {
|
|
139
|
+
display: flex;
|
|
140
|
+
justify-content: space-between;
|
|
141
|
+
align-items: baseline;
|
|
142
|
+
flex-wrap: wrap;
|
|
143
|
+
}
|
|
144
|
+
.entry-title {
|
|
145
|
+
font-weight: bold;
|
|
146
|
+
color: #000;
|
|
147
|
+
}
|
|
148
|
+
.entry-subtitle {
|
|
149
|
+
font-style: italic;
|
|
150
|
+
color: #333;
|
|
151
|
+
font-size: 10pt;
|
|
152
|
+
}
|
|
153
|
+
.entry-date {
|
|
154
|
+
color: #333;
|
|
155
|
+
font-size: 10pt;
|
|
156
|
+
}
|
|
157
|
+
.entry-location {
|
|
158
|
+
color: #555;
|
|
159
|
+
font-size: 10pt;
|
|
160
|
+
}
|
|
161
|
+
.entry-summary {
|
|
162
|
+
margin-top: 3px;
|
|
163
|
+
font-size: 10pt;
|
|
164
|
+
}
|
|
165
|
+
ul {
|
|
166
|
+
margin-left: 18px;
|
|
167
|
+
margin-top: 3px;
|
|
168
|
+
}
|
|
169
|
+
li {
|
|
170
|
+
margin-bottom: 2px;
|
|
171
|
+
font-size: 10pt;
|
|
172
|
+
}
|
|
173
|
+
p {
|
|
174
|
+
margin-bottom: 6px;
|
|
175
|
+
font-size: 10pt;
|
|
176
|
+
}
|
|
177
|
+
.role {
|
|
178
|
+
margin-bottom: 8px;
|
|
179
|
+
}
|
|
180
|
+
.role-header {
|
|
181
|
+
display: flex;
|
|
182
|
+
justify-content: space-between;
|
|
183
|
+
align-items: baseline;
|
|
184
|
+
}
|
|
185
|
+
.project {
|
|
186
|
+
margin-left: 15px;
|
|
187
|
+
margin-top: 4px;
|
|
188
|
+
}
|
|
189
|
+
.project-name {
|
|
190
|
+
font-weight: 500;
|
|
191
|
+
font-size: 10pt;
|
|
192
|
+
}
|
|
193
|
+
.competency-entry {
|
|
194
|
+
margin-bottom: 4px;
|
|
195
|
+
font-size: 10pt;
|
|
196
|
+
}
|
|
197
|
+
.competency-header {
|
|
198
|
+
font-weight: bold;
|
|
199
|
+
}
|
|
200
|
+
.skills-grid {
|
|
201
|
+
display: grid;
|
|
202
|
+
grid-template-columns: 1fr 1fr 1fr;
|
|
203
|
+
gap: 2px 20px;
|
|
204
|
+
}
|
|
205
|
+
.skill-item {
|
|
206
|
+
font-size: 10pt;
|
|
207
|
+
}
|
|
208
|
+
.skill-category {
|
|
209
|
+
margin-bottom: 4px;
|
|
210
|
+
font-size: 10pt;
|
|
211
|
+
}
|
|
212
|
+
.skill-category-name {
|
|
213
|
+
font-weight: bold;
|
|
214
|
+
}
|
|
215
|
+
.cert-item {
|
|
216
|
+
font-size: 9pt;
|
|
217
|
+
color: #000;
|
|
218
|
+
margin-bottom: 2px;
|
|
219
|
+
}
|
|
220
|
+
.lang-item {
|
|
221
|
+
font-size: 9pt;
|
|
222
|
+
}
|
|
223
|
+
@media print {
|
|
224
|
+
body {
|
|
225
|
+
padding: 0;
|
|
226
|
+
max-width: none;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
`;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Render education section
|
|
233
|
+
* Format:
|
|
234
|
+
* <school> —— <start - end>
|
|
235
|
+
* <degree> — <location>
|
|
236
|
+
* <details>
|
|
237
|
+
*/
|
|
238
|
+
function renderEducation(entries) {
|
|
239
|
+
return entries
|
|
240
|
+
.map((entry) => {
|
|
241
|
+
const dateRange = formatDateRange(entry.start, entry.end);
|
|
242
|
+
let html = '<div class="entry">';
|
|
243
|
+
// Title line: <school> —— <date range>
|
|
244
|
+
html += '<div class="entry-header">';
|
|
245
|
+
html += `<span class="entry-title">${escapeHtml(entry.school)}</span>`;
|
|
246
|
+
if (dateRange) {
|
|
247
|
+
html += `<span class="entry-date">${escapeHtml(dateRange)}</span>`;
|
|
248
|
+
}
|
|
249
|
+
html += '</div>';
|
|
250
|
+
// Subtitle line: <degree> — <location>
|
|
251
|
+
const subtitleParts = [];
|
|
252
|
+
if (entry.degree) {
|
|
253
|
+
subtitleParts.push(escapeHtml(entry.degree));
|
|
254
|
+
}
|
|
255
|
+
if (entry.location) {
|
|
256
|
+
subtitleParts.push(escapeHtml(entry.location));
|
|
257
|
+
}
|
|
258
|
+
if (subtitleParts.length > 0) {
|
|
259
|
+
html += `<div class="entry-subtitle">${subtitleParts.join(' — ')}</div>`;
|
|
260
|
+
}
|
|
261
|
+
// Details
|
|
262
|
+
if (entry.details && entry.details.length > 0) {
|
|
263
|
+
html += '<ul>';
|
|
264
|
+
for (const detail of entry.details) {
|
|
265
|
+
html += `<li>${escapeHtml(detail)}</li>`;
|
|
266
|
+
}
|
|
267
|
+
html += '</ul>';
|
|
268
|
+
}
|
|
269
|
+
html += '</div>';
|
|
270
|
+
return html;
|
|
271
|
+
})
|
|
272
|
+
.join('\n');
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Render experience section
|
|
276
|
+
* Format:
|
|
277
|
+
* <company name> -- <role> <start - end>
|
|
278
|
+
* <team_name> -- <location>
|
|
279
|
+
* <summary>
|
|
280
|
+
* <highlights>
|
|
281
|
+
*/
|
|
282
|
+
function renderExperience(entries) {
|
|
283
|
+
return entries
|
|
284
|
+
.flatMap((entry) => {
|
|
285
|
+
return entry.roles.map((role) => {
|
|
286
|
+
const dateRange = formatDateRange(role.start, role.end);
|
|
287
|
+
let html = '<div class="entry">';
|
|
288
|
+
// Section title: <company> —— <role> <date range>
|
|
289
|
+
html += '<div class="entry-header">';
|
|
290
|
+
html += `<span class="entry-title">${escapeHtml(entry.company)} —— ${escapeHtml(role.title)}</span>`;
|
|
291
|
+
if (dateRange) {
|
|
292
|
+
html += `<span class="entry-date">${escapeHtml(dateRange)}</span>`;
|
|
293
|
+
}
|
|
294
|
+
html += '</div>';
|
|
295
|
+
// Sub title: <team> — <location>
|
|
296
|
+
const subtitleParts = [];
|
|
297
|
+
if (role.team) {
|
|
298
|
+
subtitleParts.push(escapeHtml(role.team));
|
|
299
|
+
}
|
|
300
|
+
if (entry.location) {
|
|
301
|
+
subtitleParts.push(escapeHtml(entry.location));
|
|
302
|
+
}
|
|
303
|
+
if (subtitleParts.length > 0) {
|
|
304
|
+
html += `<div class="entry-subtitle">${subtitleParts.join(' — ')}</div>`;
|
|
305
|
+
}
|
|
306
|
+
// Summary
|
|
307
|
+
if (role.summary && role.summary.length > 0) {
|
|
308
|
+
html += '<div class="entry-summary">';
|
|
309
|
+
html += role.summary.map((s) => escapeHtml(s)).join(' ');
|
|
310
|
+
html += '</div>';
|
|
311
|
+
}
|
|
312
|
+
// Highlights
|
|
313
|
+
if (role.highlights && role.highlights.length > 0) {
|
|
314
|
+
html += '<ul>';
|
|
315
|
+
for (const highlight of role.highlights) {
|
|
316
|
+
html += `<li>${escapeHtml(highlight)}</li>`;
|
|
317
|
+
}
|
|
318
|
+
html += '</ul>';
|
|
319
|
+
}
|
|
320
|
+
// Projects
|
|
321
|
+
if (role.projects && role.projects.length > 0) {
|
|
322
|
+
for (const project of role.projects) {
|
|
323
|
+
const projDateRange = formatDateRange(project.start, project.end);
|
|
324
|
+
html += '<div class="project">';
|
|
325
|
+
html += `<span class="project-name">${escapeHtml(project.name)}</span>`;
|
|
326
|
+
if (projDateRange) {
|
|
327
|
+
html += ` <span class="entry-date">(${escapeHtml(projDateRange)})</span>`;
|
|
328
|
+
}
|
|
329
|
+
if (project.bullets && project.bullets.length > 0) {
|
|
330
|
+
html += '<ul>';
|
|
331
|
+
for (const bullet of project.bullets) {
|
|
332
|
+
html += `<li>${escapeHtml(bullet)}</li>`;
|
|
333
|
+
}
|
|
334
|
+
html += '</ul>';
|
|
335
|
+
}
|
|
336
|
+
html += '</div>';
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
html += '</div>';
|
|
340
|
+
return html;
|
|
341
|
+
});
|
|
342
|
+
})
|
|
343
|
+
.join('\n');
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Render certifications section
|
|
347
|
+
*/
|
|
348
|
+
function renderCertifications(entries) {
|
|
349
|
+
return entries
|
|
350
|
+
.map((entry) => {
|
|
351
|
+
let html = `<div class="cert-item">• ${escapeHtml(entry.name)}`;
|
|
352
|
+
if (entry.date) {
|
|
353
|
+
html += ` (${escapeHtml(formatDate(entry.date))})`;
|
|
354
|
+
}
|
|
355
|
+
html += '</div>';
|
|
356
|
+
return html;
|
|
357
|
+
})
|
|
358
|
+
.join('\n');
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Default number of columns for skills grid
|
|
362
|
+
*/
|
|
363
|
+
const DEFAULT_SKILLS_COLUMNS = 3;
|
|
364
|
+
/**
|
|
365
|
+
* Render skills section - supports grid and categorized formats
|
|
366
|
+
*/
|
|
367
|
+
function renderSkills(entries, options) {
|
|
368
|
+
// Check if categorized format (entries have non-empty category with description)
|
|
369
|
+
const isCategorized = options.format === 'categorized' ||
|
|
370
|
+
entries.some(e => e.category && (e.description || e.items.length > 0));
|
|
371
|
+
if (isCategorized && entries.some(e => e.category)) {
|
|
372
|
+
// Categorized format: • <category>: <description or items>
|
|
373
|
+
return entries
|
|
374
|
+
.filter(e => e.category)
|
|
375
|
+
.map((entry) => {
|
|
376
|
+
const content = entry.description || entry.items.join(', ');
|
|
377
|
+
return `<div class="skill-category">• <span class="skill-category-name">${escapeHtml(entry.category)}:</span> ${escapeHtml(content)}</div>`;
|
|
378
|
+
})
|
|
379
|
+
.join('\n');
|
|
380
|
+
}
|
|
381
|
+
// Grid format: flatten all items
|
|
382
|
+
const allItems = [];
|
|
383
|
+
for (const entry of entries) {
|
|
384
|
+
for (const item of entry.items) {
|
|
385
|
+
allItems.push(item);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (allItems.length === 0) {
|
|
389
|
+
return '';
|
|
390
|
+
}
|
|
391
|
+
const columns = options.columns ?? DEFAULT_SKILLS_COLUMNS;
|
|
392
|
+
let html = `<div class="skills-grid" style="grid-template-columns: repeat(${columns}, 1fr);">`;
|
|
393
|
+
for (const item of allItems) {
|
|
394
|
+
html += `<div class="skill-item">• ${escapeHtml(item)}</div>`;
|
|
395
|
+
}
|
|
396
|
+
html += '</div>';
|
|
397
|
+
return html;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Render skills from list content as grid
|
|
401
|
+
*/
|
|
402
|
+
function renderSkillsList(items, columns = DEFAULT_SKILLS_COLUMNS) {
|
|
403
|
+
if (items.length === 0) {
|
|
404
|
+
return '';
|
|
405
|
+
}
|
|
406
|
+
let html = `<div class="skills-grid" style="grid-template-columns: repeat(${columns}, 1fr);">`;
|
|
407
|
+
for (const item of items) {
|
|
408
|
+
html += `<div class="skill-item">• ${escapeHtml(item)}</div>`;
|
|
409
|
+
}
|
|
410
|
+
html += '</div>';
|
|
411
|
+
return html;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Render core competencies section
|
|
415
|
+
*/
|
|
416
|
+
function renderCompetencies(entries) {
|
|
417
|
+
return entries
|
|
418
|
+
.map((entry) => {
|
|
419
|
+
return `<div class="competency-entry"><span class="competency-header">${escapeHtml(entry.header)}:</span> ${escapeHtml(entry.description)}</div>`;
|
|
420
|
+
})
|
|
421
|
+
.join('\n');
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Render languages section
|
|
425
|
+
*/
|
|
426
|
+
function renderLanguages(entries) {
|
|
427
|
+
return entries
|
|
428
|
+
.map((entry) => {
|
|
429
|
+
let html = `<span class="lang-item">${escapeHtml(entry.language)}`;
|
|
430
|
+
if (entry.level) {
|
|
431
|
+
html += ` (${escapeHtml(entry.level)})`;
|
|
432
|
+
}
|
|
433
|
+
html += '</span>';
|
|
434
|
+
return html;
|
|
435
|
+
})
|
|
436
|
+
.join(' • ');
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Render section content
|
|
440
|
+
*/
|
|
441
|
+
function renderSectionContent(content, sectionId) {
|
|
442
|
+
switch (content.type) {
|
|
443
|
+
case 'text':
|
|
444
|
+
return `<p>${escapeHtml(content.text)}</p>`;
|
|
445
|
+
case 'list':
|
|
446
|
+
// For skills section, render as grid
|
|
447
|
+
if (sectionId === 'skills') {
|
|
448
|
+
return renderSkillsList(content.items);
|
|
449
|
+
}
|
|
450
|
+
return ('<ul>' + content.items.map((item) => `<li>${escapeHtml(item)}</li>`).join('\n') + '</ul>');
|
|
451
|
+
case 'education':
|
|
452
|
+
return renderEducation(content.entries);
|
|
453
|
+
case 'experience':
|
|
454
|
+
return renderExperience(content.entries);
|
|
455
|
+
case 'certifications':
|
|
456
|
+
return renderCertifications(content.entries);
|
|
457
|
+
case 'skills':
|
|
458
|
+
return renderSkills(content.entries, content.options);
|
|
459
|
+
case 'competencies':
|
|
460
|
+
return renderCompetencies(content.entries);
|
|
461
|
+
case 'languages':
|
|
462
|
+
return renderLanguages(content.entries);
|
|
463
|
+
case 'table':
|
|
464
|
+
// Tables are mainly for rirekisho, render as list for resume
|
|
465
|
+
return ('<ul>' +
|
|
466
|
+
content.rows.map((row) => `<li>${escapeHtml(row.content)}</li>`).join('\n') +
|
|
467
|
+
'</ul>');
|
|
468
|
+
default:
|
|
469
|
+
return '';
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Render contact info line: home_address | phone_number | email | linkedin
|
|
474
|
+
*/
|
|
475
|
+
function renderContactInfo(cv) {
|
|
476
|
+
const parts = [];
|
|
477
|
+
if (cv.metadata.home_address) {
|
|
478
|
+
parts.push(escapeHtml(cv.metadata.home_address));
|
|
479
|
+
}
|
|
480
|
+
parts.push(escapeHtml(cv.metadata.phone_number));
|
|
481
|
+
parts.push(`<a href="mailto:${escapeHtml(cv.metadata.email_address)}">${escapeHtml(cv.metadata.email_address)}</a>`);
|
|
482
|
+
if (cv.metadata.linkedin) {
|
|
483
|
+
const linkedinUrl = cv.metadata.linkedin;
|
|
484
|
+
parts.push(`<a href="${escapeHtml(linkedinUrl)}">${escapeHtml(linkedinUrl)}</a>`);
|
|
485
|
+
}
|
|
486
|
+
return parts.join(' | ');
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Generate English HTML CV
|
|
490
|
+
*/
|
|
491
|
+
export function generateCVEnHTML(cv, options) {
|
|
492
|
+
const styles = generateStyles(options.paperSize);
|
|
493
|
+
const name = cv.metadata.name;
|
|
494
|
+
const contactHtml = renderContactInfo(cv);
|
|
495
|
+
// Use sections in the order provided (already filtered and ordered by generator/index.ts)
|
|
496
|
+
const sectionsHtml = cv.sections
|
|
497
|
+
.map((section) => {
|
|
498
|
+
return `
|
|
499
|
+
<section>
|
|
500
|
+
<h2>${escapeHtml(section.title)}</h2>
|
|
501
|
+
${renderSectionContent(section.content, section.id)}
|
|
502
|
+
</section>`;
|
|
503
|
+
})
|
|
504
|
+
.join('\n');
|
|
505
|
+
return `<!DOCTYPE html>
|
|
506
|
+
<html lang="en">
|
|
507
|
+
<head>
|
|
508
|
+
<meta charset="UTF-8">
|
|
509
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
510
|
+
<title>${escapeHtml(name)} - CV</title>
|
|
511
|
+
<style>${styles}</style>
|
|
512
|
+
</head>
|
|
513
|
+
<body>
|
|
514
|
+
<header>
|
|
515
|
+
<h1>${escapeHtml(name)}</h1>
|
|
516
|
+
<div class="contact-info">${contactHtml}</div>
|
|
517
|
+
</header>
|
|
518
|
+
<main>
|
|
519
|
+
${sectionsHtml}
|
|
520
|
+
</main>
|
|
521
|
+
</body>
|
|
522
|
+
</html>`;
|
|
523
|
+
}
|
|
524
|
+
//# sourceMappingURL=resume_en.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume_en.js","sourceRoot":"","sources":["../../src/generator/resume_en.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Japanese CV Generator (職務経歴書スタイル)
|
|
3
|
+
* Generates HTML for Japanese CV format with Mincho font
|
|
4
|
+
*/
|
|
5
|
+
import type { PaperSize } from '../types/config.js';
|
|
6
|
+
import type { CVMetadata } from '../types/metadata.js';
|
|
7
|
+
import type { ParsedSection } from '../types/sections.js';
|
|
8
|
+
export interface CVJaOptions {
|
|
9
|
+
readonly paperSize: PaperSize;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Input for CV generation
|
|
13
|
+
*/
|
|
14
|
+
export interface CVInput {
|
|
15
|
+
readonly metadata: CVMetadata;
|
|
16
|
+
readonly sections: readonly ParsedSection[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate Japanese HTML CV
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateCVJaHTML(cv: CVInput, options: CVJaOptions): string;
|
|
22
|
+
//# sourceMappingURL=resume_ja.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume_ja.d.ts","sourceRoot":"","sources":["../../src/generator/resume_ja.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAKV,aAAa,EAId,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAyaD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAuC1E"}
|