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,302 @@
1
+ /**
2
+ * Output Generator module
3
+ * Generates PDF and HTML outputs
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import puppeteer from 'puppeteer';
8
+ import { findSectionByTag, isSectionValidForFormat } from '../types/sections.js';
9
+ import { generateCVEnHTML } from './resume_en.js';
10
+ import { generateCVJaHTML } from './resume_ja.js';
11
+ import { generateRirekishoHTML } from './rirekisho/index.js';
12
+ // Re-export generators
13
+ export { generateCVEnHTML, generateCVJaHTML, generateRirekishoHTML };
14
+ /**
15
+ * Page size dimensions in mm
16
+ */
17
+ export const PAGE_SIZES = {
18
+ a3: { width: 420, height: 297 },
19
+ a4: { width: 210, height: 297 },
20
+ b4: { width: 364, height: 257 },
21
+ b5: { width: 176, height: 250 },
22
+ letter: { width: 215.9, height: 279.4 },
23
+ };
24
+ /**
25
+ * MIME types for supported image formats
26
+ */
27
+ const IMAGE_MIME_TYPES = {
28
+ '.png': 'image/png',
29
+ '.jpg': 'image/jpeg',
30
+ '.jpeg': 'image/jpeg',
31
+ '.tiff': 'image/tiff',
32
+ '.tif': 'image/tiff',
33
+ };
34
+ /**
35
+ * Read image file and convert to base64 data URI
36
+ */
37
+ function readPhotoAsDataUri(photoPath) {
38
+ const ext = path.extname(photoPath).toLowerCase();
39
+ const mimeType = IMAGE_MIME_TYPES[ext];
40
+ if (!mimeType) {
41
+ throw new Error(`Unsupported image format: ${ext}`);
42
+ }
43
+ const imageBuffer = fs.readFileSync(photoPath);
44
+ const base64 = imageBuffer.toString('base64');
45
+ return `data:${mimeType};base64,${base64}`;
46
+ }
47
+ /**
48
+ * Escape HTML special characters
49
+ */
50
+ export function escapeHtml(text) {
51
+ return text
52
+ .replace(/&/g, '&')
53
+ .replace(/</g, '&lt;')
54
+ .replace(/>/g, '&gt;')
55
+ .replace(/"/g, '&quot;')
56
+ .replace(/'/g, '&#039;');
57
+ }
58
+ /**
59
+ * Detect language from CV content
60
+ */
61
+ function detectLanguage(cv) {
62
+ // Check if name_ja exists or if sections have Japanese titles
63
+ if (cv.metadata.name_ja)
64
+ return 'ja';
65
+ for (const section of cv.sections) {
66
+ // Check for Japanese characters in title
67
+ if (/[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]/.test(section.title)) {
68
+ return 'ja';
69
+ }
70
+ }
71
+ return 'en';
72
+ }
73
+ /**
74
+ * Default section order for CV format
75
+ */
76
+ const DEFAULT_CV_SECTION_ORDER = ['summary', 'experience', 'education', 'skills', 'certifications', 'languages', 'competencies', 'motivation'];
77
+ /**
78
+ * Resolve section ID from tag or ID
79
+ * Returns the section ID if input matches a tag or is already an ID
80
+ */
81
+ function resolveSectionId(input, sections) {
82
+ // First check if it's a direct section ID match
83
+ const directMatch = sections.find(s => s.id === input);
84
+ if (directMatch) {
85
+ return directMatch.id;
86
+ }
87
+ // Then check if it matches a section title (case-insensitive)
88
+ const titleMatch = sections.find(s => s.title.toLowerCase() === input.toLowerCase());
89
+ if (titleMatch) {
90
+ return titleMatch.id;
91
+ }
92
+ // Finally, check SECTION_DEFINITIONS tags
93
+ const def = findSectionByTag(input);
94
+ if (def) {
95
+ // Check if this section exists in the input
96
+ const sectionExists = sections.find(s => s.id === def.id);
97
+ if (sectionExists) {
98
+ return def.id;
99
+ }
100
+ }
101
+ return undefined;
102
+ }
103
+ /**
104
+ * Filter and order sections based on sectionOrder config
105
+ * If sectionOrder is provided, only include sections in that order
106
+ * If not provided, use default order for CV or include all sections for rirekisho
107
+ */
108
+ function filterAndOrderSections(sections, format, sectionOrder, logger) {
109
+ // Get all section IDs from input
110
+ const allSectionIds = sections.map(s => s.id);
111
+ // Determine which sections are valid for this format
112
+ const validSectionIds = allSectionIds.filter(id => isSectionValidForFormat(id, format));
113
+ const invalidSectionIds = allSectionIds.filter(id => !isSectionValidForFormat(id, format));
114
+ let includedSectionIds;
115
+ let skippedSectionIds;
116
+ if (format === 'cv') {
117
+ if (sectionOrder && sectionOrder.length > 0) {
118
+ // Resolve section order (tags/titles to IDs)
119
+ const resolvedOrder = [];
120
+ for (const input of sectionOrder) {
121
+ const resolvedId = resolveSectionId(input, sections);
122
+ if (resolvedId && validSectionIds.includes(resolvedId) && !resolvedOrder.includes(resolvedId)) {
123
+ resolvedOrder.push(resolvedId);
124
+ }
125
+ }
126
+ // Use custom order - only include sections that are in sectionOrder AND valid for format
127
+ includedSectionIds = resolvedOrder;
128
+ skippedSectionIds = validSectionIds.filter(id => !resolvedOrder.includes(id));
129
+ }
130
+ else {
131
+ // Use default order for CV
132
+ const orderedIds = [];
133
+ const remainingIds = new Set(validSectionIds);
134
+ // Add sections in default order
135
+ for (const id of DEFAULT_CV_SECTION_ORDER) {
136
+ if (remainingIds.has(id)) {
137
+ orderedIds.push(id);
138
+ remainingIds.delete(id);
139
+ }
140
+ }
141
+ // Add any remaining sections not in default order
142
+ for (const id of remainingIds) {
143
+ orderedIds.push(id);
144
+ }
145
+ includedSectionIds = orderedIds;
146
+ skippedSectionIds = [];
147
+ }
148
+ }
149
+ else {
150
+ // Rirekisho: use all valid sections in original order
151
+ includedSectionIds = validSectionIds;
152
+ skippedSectionIds = [];
153
+ }
154
+ // Log section information
155
+ logger.info({ sections: includedSectionIds }, 'Sections included');
156
+ if (skippedSectionIds.length > 0) {
157
+ logger.info({ sections: skippedSectionIds }, 'Sections skipped (not in section-order)');
158
+ }
159
+ if (invalidSectionIds.length > 0) {
160
+ logger.info({ sections: invalidSectionIds }, `Sections skipped (not valid for ${format} format)`);
161
+ }
162
+ // Build ordered section list
163
+ const sectionMap = new Map(sections.map(s => [s.id, s]));
164
+ const orderedSections = [];
165
+ for (const id of includedSectionIds) {
166
+ const section = sectionMap.get(id);
167
+ if (section) {
168
+ orderedSections.push(section);
169
+ }
170
+ }
171
+ return orderedSections;
172
+ }
173
+ /**
174
+ * Generate HTML for CV format
175
+ */
176
+ function generateCVHTML(cv, paperSize, _chronologicalOrder, sectionOrder, logger) {
177
+ const language = detectLanguage(cv);
178
+ // TODO: Add chronological order support for CV format
179
+ // Filter and order sections if logger is provided
180
+ let sections = cv.sections;
181
+ if (logger) {
182
+ sections = filterAndOrderSections(cv.sections, 'cv', sectionOrder, logger);
183
+ }
184
+ const filteredCv = { ...cv, sections };
185
+ if (language === 'ja') {
186
+ return generateCVJaHTML(filteredCv, { paperSize });
187
+ }
188
+ return generateCVEnHTML(filteredCv, { paperSize });
189
+ }
190
+ /**
191
+ * Generate PDF from HTML
192
+ */
193
+ async function generatePDF(html, paperSize, isRirekisho) {
194
+ const browser = await puppeteer.launch({
195
+ headless: true,
196
+ args: ['--no-sandbox', '--disable-setuid-sandbox'],
197
+ });
198
+ try {
199
+ const page = await browser.newPage();
200
+ await page.setContent(html, { waitUntil: ['load', 'networkidle0'] });
201
+ const size = PAGE_SIZES[paperSize];
202
+ let pdfOptions;
203
+ if (isRirekisho) {
204
+ // Rirekisho uses landscape orientation with the specified paper size
205
+ // PAGE_SIZES for rirekisho are already in landscape (width > height)
206
+ const rirekishoSizes = {
207
+ a3: { width: 420, height: 297 },
208
+ a4: { width: 297, height: 210 },
209
+ b4: { width: 364, height: 257 },
210
+ b5: { width: 257, height: 182 },
211
+ letter: { width: 279.4, height: 215.9 },
212
+ };
213
+ const rirekishoSize = rirekishoSizes[paperSize];
214
+ await page.setViewport({
215
+ width: Math.round(rirekishoSize.width * 3.78),
216
+ height: Math.round(rirekishoSize.height * 3.78),
217
+ deviceScaleFactor: 2,
218
+ });
219
+ pdfOptions = {
220
+ width: `${rirekishoSize.width}mm`,
221
+ height: `${rirekishoSize.height}mm`,
222
+ printBackground: true,
223
+ margin: { top: '0mm', right: '0mm', bottom: '0mm', left: '0mm' },
224
+ preferCSSPageSize: false,
225
+ scale: 1,
226
+ };
227
+ }
228
+ else {
229
+ pdfOptions = {
230
+ width: `${size.width}mm`,
231
+ height: `${size.height}mm`,
232
+ printBackground: true,
233
+ margin: { top: '10mm', right: '10mm', bottom: '10mm', left: '10mm' },
234
+ preferCSSPageSize: true,
235
+ };
236
+ }
237
+ const pdfUint8Array = await page.pdf(pdfOptions);
238
+ return Buffer.from(pdfUint8Array);
239
+ }
240
+ finally {
241
+ await browser.close();
242
+ }
243
+ }
244
+ /**
245
+ * Generate output files
246
+ */
247
+ export async function generateOutput(cv, config, logger) {
248
+ const generatedFiles = [];
249
+ const formats = config.format === 'both' ? ['cv', 'rirekisho'] : [config.format];
250
+ const outputTypes = config.outputType === 'both' ? ['html', 'pdf'] : [config.outputType];
251
+ // Ensure output directory exists
252
+ const outputDir = path.dirname(config.output);
253
+ if (!fs.existsSync(outputDir)) {
254
+ fs.mkdirSync(outputDir, { recursive: true });
255
+ }
256
+ for (const format of formats) {
257
+ logger.debug(`Generating ${format}...`);
258
+ // Determine chronological order
259
+ // rirekisho always uses 'asc' (oldest first), cv uses config value or defaults to 'desc'
260
+ const chronologicalOrder = format === 'rirekisho' ? 'asc' : (config.chronologicalOrder ?? 'desc');
261
+ // Generate HTML
262
+ let html;
263
+ if (format === 'rirekisho') {
264
+ // Log sections for rirekisho
265
+ const sections = filterAndOrderSections(cv.sections, 'rirekisho', undefined, logger);
266
+ const filteredCv = { ...cv, sections };
267
+ // Read photo file if provided (only for rirekisho)
268
+ let photoDataUri;
269
+ if (config.photo) {
270
+ photoDataUri = readPhotoAsDataUri(config.photo);
271
+ logger.debug({ photo: config.photo }, 'Photo loaded for rirekisho');
272
+ }
273
+ html = generateRirekishoHTML(filteredCv, {
274
+ paperSize: config.paperSize,
275
+ chronologicalOrder,
276
+ hideMotivation: config.hideMotivation,
277
+ photoDataUri,
278
+ });
279
+ }
280
+ else {
281
+ html = generateCVHTML(cv, config.paperSize, chronologicalOrder, config.sectionOrder, logger);
282
+ }
283
+ const baseName = path.basename(config.output);
284
+ const suffix = format === 'rirekisho' ? '_rirekisho' : '_cv';
285
+ for (const outputType of outputTypes) {
286
+ const ext = outputType === 'pdf' ? '.pdf' : '.html';
287
+ const outputPath = path.join(outputDir, `${baseName}${suffix}${ext}`);
288
+ if (outputType === 'html') {
289
+ fs.writeFileSync(outputPath, html, 'utf-8');
290
+ }
291
+ else {
292
+ const pdfBuffer = await generatePDF(html, config.paperSize, format === 'rirekisho');
293
+ fs.writeFileSync(outputPath, pdfBuffer);
294
+ }
295
+ generatedFiles.push(outputPath);
296
+ logger.debug(`Generated: ${outputPath}`);
297
+ }
298
+ }
299
+ return generatedFiles;
300
+ }
301
+ export default generateOutput;
302
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * English CV Generator
3
+ * Generates HTML for English CV format with Times font family
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 CVEnOptions {
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 English HTML CV
20
+ */
21
+ export declare function generateCVEnHTML(cv: CVInput, options: CVEnOptions): string;
22
+ //# sourceMappingURL=resume_en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume_en.d.ts","sourceRoot":"","sources":["../../src/generator/resume_en.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,EAMV,aAAa,EAId,MAAM,sBAAsB,CAAC;AAE9B,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;AA0gBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAkC1E"}