md2cv 2.4.0 → 2.5.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 (39) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.ja.md +75 -22
  3. package/README.md +76 -22
  4. package/dist/generator/cover_letter.d.ts +12 -0
  5. package/dist/generator/cover_letter.d.ts.map +1 -0
  6. package/dist/generator/cover_letter.js +252 -0
  7. package/dist/generator/cover_letter.js.map +1 -0
  8. package/dist/generator/index.d.ts +2 -1
  9. package/dist/generator/index.d.ts.map +1 -1
  10. package/dist/generator/index.js +24 -5
  11. package/dist/generator/index.js.map +1 -1
  12. package/dist/generator/resume_en.d.ts.map +1 -1
  13. package/dist/generator/resume_en.js +4 -3
  14. package/dist/generator/resume_en.js.map +1 -1
  15. package/dist/generator/resume_ja.d.ts.map +1 -1
  16. package/dist/generator/resume_ja.js +4 -3
  17. package/dist/generator/resume_ja.js.map +1 -1
  18. package/dist/template/definitions/en.d.ts.map +1 -1
  19. package/dist/template/definitions/en.js +46 -0
  20. package/dist/template/definitions/en.js.map +1 -1
  21. package/dist/template/generator.d.ts.map +1 -1
  22. package/dist/template/generator.js +4 -2
  23. package/dist/template/generator.js.map +1 -1
  24. package/dist/types/config.d.ts +2 -1
  25. package/dist/types/config.d.ts.map +1 -1
  26. package/dist/types/config.js +2 -2
  27. package/dist/types/config.js.map +1 -1
  28. package/dist/types/metadata.d.ts +8 -0
  29. package/dist/types/metadata.d.ts.map +1 -1
  30. package/dist/types/metadata.js +30 -0
  31. package/dist/types/metadata.js.map +1 -1
  32. package/dist/types/sections.d.ts +1 -1
  33. package/dist/types/sections.d.ts.map +1 -1
  34. package/dist/types/sections.js +20 -1
  35. package/dist/types/sections.js.map +1 -1
  36. package/dist/types/template.d.ts +2 -2
  37. package/dist/types/template.d.ts.map +1 -1
  38. package/examples/cover_letter.md +22 -0
  39. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.5.0](https://github.com/yuyash/md2cv/compare/v2.4.0...v2.5.0) (2026-02-16)
9
+
10
+
11
+ ### Features
12
+
13
+ * add cover letter format support ([#62](https://github.com/yuyash/md2cv/issues/62)) ([4d191ff](https://github.com/yuyash/md2cv/commit/4d191ff9f0b68ee55c2119a6de0a6e546de2e19c))
14
+
8
15
  ## [2.4.0](https://github.com/yuyash/md2cv/compare/v2.3.0...v2.4.0) (2026-02-16)
9
16
 
10
17
 
package/README.ja.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  [English](README.md) | [日本語](README.ja.md)
4
4
 
5
- md2cv は Markdown で書かれた履歴書・職務経歴書を PDF や HTML に変換するコマンドラインツールです。Markdown で内容を書くだけで、フォーマットやレイアウトは md2cv が自動で処理します。欧米式の CV と日本式の履歴書の両方に対応しています。
5
+ md2cv は Markdown で書かれた履歴書・職務経歴書・カバーレターを PDF や HTML に変換するコマンドラインツールです。Markdown で内容を書くだけで、フォーマットやレイアウトは md2cv が自動で処理します。欧米式の CV、日本式の履歴書、カバーレターに対応しています。
6
6
 
7
7
  ## 主な機能
8
8
 
9
9
  - Markdown で履歴書を作成
10
10
  - PDF と HTML の出力に対応
11
- - 複数フォーマット対応:欧米式 CV、日本式履歴書
11
+ - 複数フォーマット対応:欧米式 CV、日本式履歴書、カバーレター
12
12
 
13
13
  ## インストール
14
14
 
@@ -40,6 +40,9 @@ md2cv init -l ja -f rirekisho -o my-rirekisho.md
40
40
  # 両方のフォーマット用テンプレートを生成
41
41
  md2cv init -l ja -f both -o my-resume.md
42
42
 
43
+ # カバーレターのテンプレートを生成
44
+ md2cv init -l en -f cover_letter -o my-cover-letter.md
45
+
43
46
  # 説明コメントなしでテンプレートを生成
44
47
  md2cv init -l ja -f cv --no-comments -o my-cv.md
45
48
 
@@ -90,6 +93,12 @@ md2cv -i examples/example-cv-ja.md --stylesheet custom.css
90
93
 
91
94
  # 詳細ログを有効化
92
95
  md2cv -i examples/example-cv-ja.md --verbose
96
+
97
+ # カバーレターを PDF で生成
98
+ md2cv -i examples/cover_letter.md -f cover_letter
99
+
100
+ # カバーレターを HTML で生成
101
+ md2cv -i examples/cover_letter.md -f cover_letter -t html
93
102
  ```
94
103
 
95
104
  ## CLI コマンド
@@ -113,14 +122,14 @@ md2cv -i input.md [options] # 'generate' は省略可能
113
122
  md2cv init [options]
114
123
  ```
115
124
 
116
- | オプション | 説明 | デフォルト |
117
- | ------------------ | --------------------------------------------- | ---------- |
118
- | `-o, --output` | 出力ファイルパス(デフォルト: 標準出力) | 標準出力 |
119
- | `-l, --lang` | テンプレート言語(`en`, `ja`) | `en` |
120
- | `-f, --format` | 出力フォーマット(`cv`, `rirekisho`, `both`) | `cv` |
121
- | `--no-comments` | テンプレートから説明コメントを除外 | - |
122
- | `--list-templates` | 利用可能なテンプレートと詳細を表示 | - |
123
- | `--list-sections` | 指定フォーマットの利用可能なセクションを表示 | - |
125
+ | オプション | 説明 | デフォルト |
126
+ | ------------------ | ------------------------------------------------------------- | ---------- |
127
+ | `-o, --output` | 出力ファイルパス(デフォルト: 標準出力) | 標準出力 |
128
+ | `-l, --lang` | テンプレート言語(`en`, `ja`) | `en` |
129
+ | `-f, --format` | 出力フォーマット(`cv`, `rirekisho`, `both`, `cover_letter`) | `cv` |
130
+ | `--no-comments` | テンプレートから説明コメントを除外 | - |
131
+ | `--list-templates` | 利用可能なテンプレートと詳細を表示 | - |
132
+ | `--list-sections` | 指定フォーマットの利用可能なセクションを表示 | - |
124
133
 
125
134
  ## generate オプション
126
135
 
@@ -130,7 +139,7 @@ md2cv init [options]
130
139
  | -------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------ |
131
140
  | `-i, --input <file>` | 入力 Markdown ファイル(必須) | - |
132
141
  | `-o, --output <path>` | 出力ファイルパス(拡張子なし) | 入力ファイルと同じディレクトリ |
133
- | `-f, --format <format>` | 出力フォーマット: `cv`, `rirekisho`, `both` | `cv` |
142
+ | `-f, --format <format>` | 出力フォーマット: `cv`, `rirekisho`, `both`, `cover_letter` | `cv` |
134
143
  | `-t, --output-type <type>` | 出力タイプ: `pdf`, `html`, `both` | `pdf` |
135
144
  | `-p, --paper-size <size>` | 用紙サイズ: `a3`, `a4`, `b4`, `b5`, `letter` | `a4` |
136
145
  | `-c, --config <file>` | 設定ファイル(JSON または YAML) | - |
@@ -185,6 +194,13 @@ dob: 1990-01-15
185
194
  | `dob` | `DOB`, `DATE_OF_BIRTH` | いいえ |
186
195
  | `linkedin` | `LINKEDIN`, `LINKEDIN_URL` | いいえ |
187
196
  | `photo` | `PHOTO`, `PHOTO_PATH` | いいえ |
197
+ | `job_title` | `JOB_TITLE` | いいえ |
198
+ | `recipient_name` | `RECIPIENT_NAME` | いいえ |
199
+ | `recipient_company` | `RECIPIENT_COMPANY` | いいえ |
200
+ | `subject` | `SUBJECT` | いいえ |
201
+ | `date` | `DATE` | いいえ |
202
+
203
+ `job_title`、`recipient_name`、`recipient_company`、`subject`、`date` はカバーレターフォーマットで使用されます。`date` を省略すると現在の日付が使用されます。
188
204
 
189
205
  優先順位: フロントマターの値が環境変数より優先されます。
190
206
 
@@ -333,17 +349,54 @@ items:
333
349
 
334
350
  #### セクション一覧
335
351
 
336
- | セクション ID | 対応タグ | フォーマット |
337
- | ---------------- | ------------------------------------------------------------------------- | ------------ |
338
- | `summary` | 概要, 職務要約, Summary, Professional Summary, Profile, Executive Summary | CV |
339
- | `experience` | 職歴, 職務経歴, Experience, Work Experience, Professional Experience | 両方 |
340
- | `education` | 学歴, Education | 両方 |
341
- | `skills` | スキル, Skills, Technical Skills | 両方 |
342
- | `certifications` | 免許・資格, 資格, 免許, Certifications | 両方 |
343
- | `languages` | 語学, Languages, Language Skills | CV |
344
- | `competencies` | 自己PR, Core Competencies, Key Competencies, Superpowers | 両方 |
345
- | `motivation` | 志望動機, 志望の動機, Motivation | 履歴書 |
346
- | `notes` | 本人希望記入欄, Notes | 履歴書 |
352
+ | セクション ID | 対応タグ | フォーマット |
353
+ | ------------------- | ------------------------------------------------------------------------- | ------------ |
354
+ | `summary` | 概要, 職務要約, Summary, Professional Summary, Profile, Executive Summary | CV |
355
+ | `experience` | 職歴, 職務経歴, Experience, Work Experience, Professional Experience | 両方 |
356
+ | `education` | 学歴, Education | 両方 |
357
+ | `skills` | スキル, Skills, Technical Skills | 両方 |
358
+ | `certifications` | 免許・資格, 資格, 免許, Certifications | 両方 |
359
+ | `languages` | 語学, Languages, Language Skills | CV |
360
+ | `competencies` | 自己PR, Core Competencies, Key Competencies, Superpowers | 両方 |
361
+ | `motivation` | 志望動機, 志望の動機, Motivation | 履歴書 |
362
+ | `notes` | 本人希望記入欄, Notes | 履歴書 |
363
+ | `cover_letter_body` | Cover Letter, Body, Letter | カバーレター |
364
+
365
+ ### カバーレター
366
+
367
+ カバーレターフォーマットは、フロントマターでヘッダー情報と宛先を指定し、`# Cover Letter` セクションに本文を記述します:
368
+
369
+ ```markdown
370
+ ---
371
+ name: 山田 太郎
372
+ job_title: ソフトウェアエンジニア
373
+ email_address: taro@example.com
374
+ phone_number: 090-1234-5678
375
+ home_address: 東京都千代田区
376
+ linkedin: https://linkedin.com/in/taroyamada
377
+ recipient_name: 採用ご担当者様
378
+ recipient_company: 株式会社サンプル
379
+ subject: ソフトウェアエンジニア職
380
+ date: 2026年2月13日
381
+ ---
382
+
383
+ # Cover Letter
384
+
385
+ 貴社のソフトウェアエンジニア職に応募いたします。
386
+ 10年以上のスケーラブルな分散システム構築の経験を活かし、
387
+ 貴社のチームに貢献できると確信しております。
388
+
389
+ 現職では、パフォーマンスベンチマークプラットフォームの開発をリードし、
390
+ 大規模なシステム信頼性の確保に取り組んでおります。
391
+
392
+ ご検討のほど、よろしくお願いいたします。
393
+ ```
394
+
395
+ 生成コマンド:
396
+
397
+ ```bash
398
+ md2cv -i cover_letter.md -f cover_letter
399
+ ```
347
400
 
348
401
  ### Markdown 書式
349
402
 
package/README.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  [English](README.md) | [日本語](README.ja.md)
4
4
 
5
- md2cv is a command-line tool that transforms Markdown documents into formatted PDF and HTML resumes. Simply write your CV in Markdown, and let md2cv handle the formatting and layout. The tool supports both western-style CVs and Japanese-style documents including rirekisho (履歴書) and shokumu-keirekisho (職務経歴書).
5
+ md2cv is a command-line tool that transforms Markdown documents into formatted PDF and HTML resumes. Simply write your CV in Markdown, and let md2cv handle the formatting and layout. The tool supports western-style CVs, Japanese-style documents including rirekisho (履歴書) and shokumu-keirekisho (職務経歴書), and cover letters.
6
6
 
7
7
  ## Key Features
8
8
 
9
9
  - Write your CV in Markdown
10
10
  - Generate PDF and HTML outputs
11
- - Multiple format support: western-style CV and Japanese rirekisho (履歴書)
11
+ - Multiple format support: western-style CV, Japanese rirekisho (履歴書), and cover letter
12
12
 
13
13
  ## Installation
14
14
 
@@ -40,6 +40,9 @@ md2cv init -l ja -f rirekisho -o my-rirekisho.md
40
40
  # Generate a template for both formats
41
41
  md2cv init -l en -f both -o my-resume.md
42
42
 
43
+ # Generate a cover letter template
44
+ md2cv init -l en -f cover_letter -o my-cover-letter.md
45
+
43
46
  # Generate template without explanatory comments
44
47
  md2cv init -l en -f cv --no-comments -o my-cv.md
45
48
 
@@ -90,6 +93,12 @@ md2cv -i examples/example-cv-en.md --stylesheet custom.css
90
93
 
91
94
  # Enable verbose logging
92
95
  md2cv -i examples/example-cv-en.md --verbose
96
+
97
+ # Generate a cover letter PDF
98
+ md2cv -i examples/cover_letter.md -f cover_letter
99
+
100
+ # Generate a cover letter HTML
101
+ md2cv -i examples/cover_letter.md -f cover_letter -t html
93
102
  ```
94
103
 
95
104
  ## CLI Commands
@@ -113,14 +122,14 @@ Generate a markdown template to help you get started.
113
122
  md2cv init [options]
114
123
  ```
115
124
 
116
- | Option | Description | Default |
117
- | ------------------ | ------------------------------------------------ | ------- |
118
- | `-o, --output` | Output file path (default: stdout) | stdout |
119
- | `-l, --lang` | Template language (`en`, `ja`) | `en` |
120
- | `-f, --format` | Output format (`cv`, `rirekisho`, `both`) | `cv` |
121
- | `--no-comments` | Exclude explanatory comments from template | - |
122
- | `--list-templates` | List available templates and their details | - |
123
- | `--list-sections` | List available sections for the specified format | - |
125
+ | Option | Description | Default |
126
+ | ------------------ | --------------------------------------------------------- | ------- |
127
+ | `-o, --output` | Output file path (default: stdout) | stdout |
128
+ | `-l, --lang` | Template language (`en`, `ja`) | `en` |
129
+ | `-f, --format` | Output format (`cv`, `rirekisho`, `both`, `cover_letter`) | `cv` |
130
+ | `--no-comments` | Exclude explanatory comments from template | - |
131
+ | `--list-templates` | List available templates and their details | - |
132
+ | `--list-sections` | List available sections for the specified format | - |
124
133
 
125
134
  ## Generate Options
126
135
 
@@ -130,7 +139,7 @@ The following options are available for the `generate` command:
130
139
  | -------------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------- |
131
140
  | `-i, --input <file>` | Input markdown file (required) | - |
132
141
  | `-o, --output <path>` | Output file path (without extension) | Input directory |
133
- | `-f, --format <format>` | Output format: `cv`, `rirekisho`, `both` | `cv` |
142
+ | `-f, --format <format>` | Output format: `cv`, `rirekisho`, `both`, `cover_letter` | `cv` |
134
143
  | `-t, --output-type <type>` | Output type: `pdf`, `html`, `both` | `pdf` |
135
144
  | `-p, --paper-size <size>` | Paper size: `a3`, `a4`, `b4`, `b5`, `letter` | `a4` |
136
145
  | `-c, --config <file>` | Configuration file (JSON or YAML) | - |
@@ -180,6 +189,13 @@ Frontmatter fields can also be set via environment variables. You can provide al
180
189
  | `dob` | `DOB`, `DATE_OF_BIRTH` | No |
181
190
  | `linkedin` | `LINKEDIN`, `LINKEDIN_URL` | No |
182
191
  | `photo` | `PHOTO`, `PHOTO_PATH` | No |
192
+ | `job_title` | `JOB_TITLE` | No |
193
+ | `recipient_name` | `RECIPIENT_NAME` | No |
194
+ | `recipient_company` | `RECIPIENT_COMPANY` | No |
195
+ | `subject` | `SUBJECT` | No |
196
+ | `date` | `DATE` | No |
197
+
198
+ The fields `job_title`, `recipient_name`, `recipient_company`, `subject`, and `date` are used by the cover letter format. If `date` is omitted, the current date is used.
183
199
 
184
200
  Priority: Frontmatter values override environment variables.
185
201
 
@@ -328,17 +344,55 @@ Available to start immediately. Open to relocation.
328
344
 
329
345
  #### Section Reference
330
346
 
331
- | Section ID | Supported Tags | Format |
332
- | ---------------- | ------------------------------------------------------------------------- | --------- |
333
- | `summary` | Summary, Professional Summary, Profile, Executive Summary, 概要, 職務要約 | CV |
334
- | `experience` | Experience, Work Experience, Professional Experience, 職歴, 職務経歴 | Both |
335
- | `education` | Education, 学歴 | Both |
336
- | `skills` | Skills, Technical Skills, スキル | Both |
337
- | `certifications` | Certifications, 免許・資格, 資格, 免許. | Both |
338
- | `languages` | Languages, Language Skills語学 | CV |
339
- | `competencies` | Core Competencies, Key Competencies, Superpowers, 自己PR | Both |
340
- | `motivation` | Motivation, 志望動機, 志望の動機 | Rirekisho |
341
- | `notes` | Notes, 本人希望記入欄 | Rirekisho |
347
+ | Section ID | Supported Tags | Format |
348
+ | ------------------- | ------------------------------------------------------------------------- | ------------ |
349
+ | `summary` | Summary, Professional Summary, Profile, Executive Summary, 概要, 職務要約 | CV |
350
+ | `experience` | Experience, Work Experience, Professional Experience, 職歴, 職務経歴 | Both |
351
+ | `education` | Education, 学歴 | Both |
352
+ | `skills` | Skills, Technical Skills, スキル | Both |
353
+ | `certifications` | Certifications, 免許・資格, 資格, 免許. | Both |
354
+ | `languages` | Languages, Language Skills語学 | CV |
355
+ | `competencies` | Core Competencies, Key Competencies, Superpowers, 自己PR | Both |
356
+ | `motivation` | Motivation, 志望動機, 志望の動機 | Rirekisho |
357
+ | `notes` | Notes, 本人希望記入欄 | Rirekisho |
358
+ | `cover_letter_body` | Cover Letter, Body, Letter | Cover Letter |
359
+
360
+ ### Cover Letter
361
+
362
+ The cover letter format uses frontmatter for header and recipient information, with a `# Cover Letter` section for the body:
363
+
364
+ ```markdown
365
+ ---
366
+ name: John Doe
367
+ job_title: Software Engineer
368
+ email_address: john@example.com
369
+ phone_number: '+1-555-123-4567'
370
+ home_address: Seattle, WA
371
+ linkedin: https://linkedin.com/in/johndoe
372
+ recipient_name: Hiring Manager
373
+ recipient_company: Acme Corp
374
+ subject: Software Engineer Position
375
+ date: February 13, 2026
376
+ ---
377
+
378
+ # Cover Letter
379
+
380
+ I am writing to express my strong interest in the Software Engineer
381
+ position at Acme Corp. With over 10 years of experience building
382
+ scalable distributed systems, I am excited about the opportunity
383
+ to contribute to your team.
384
+
385
+ In my current role, I lead the development of performance
386
+ benchmarking platforms that ensure system reliability at massive scale.
387
+
388
+ Thank you for considering my application.
389
+ ```
390
+
391
+ Generate with:
392
+
393
+ ```bash
394
+ md2cv -i cover_letter.md -f cover_letter
395
+ ```
342
396
 
343
397
  ### Markdown Formatting
344
398
 
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Cover Letter Generator
3
+ * Generates HTML for cover letter format matching the CV header style
4
+ */
5
+ import type { CVOptions } from '../types/config.js';
6
+ import type { CVInput } from './common.js';
7
+ export type { CVInput };
8
+ /**
9
+ * Generate cover letter HTML
10
+ */
11
+ export declare function generateCoverLetterHtml(cv: CVInput, options: CVOptions): string;
12
+ //# sourceMappingURL=cover_letter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cover_letter.d.ts","sourceRoot":"","sources":["../../src/generator/cover_letter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAA0B,MAAM,oBAAoB,CAAC;AAE5E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,YAAY,EAAE,OAAO,EAAE,CAAC;AAwMxB;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,SAAS,GACjB,MAAM,CA8DR"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Cover Letter Generator
3
+ * Generates HTML for cover letter format matching the CV header style
4
+ */
5
+ import { isSectionValidForFormat } from '../types/sections.js';
6
+ import { PAGE_SIZES, escapeHtml } from './common.js';
7
+ import { markdownToHtml } from './markdown.js';
8
+ /**
9
+ * Generate CSS styles for cover letter
10
+ */
11
+ function generateStyles(paperSize, marginMm, lineHeight) {
12
+ const size = PAGE_SIZES[paperSize];
13
+ const margins = marginMm ?? { top: 30, right: 30, bottom: 30, left: 30 };
14
+ const lh = lineHeight ?? 1.2;
15
+ return `
16
+ :root {
17
+ --cl-font-family: "Noto Serif", "Times New Roman", Times, Georgia, serif;
18
+ --cl-font-size-base: 11pt;
19
+ --cl-font-size-name: 20pt;
20
+ --cl-font-size-title: 11pt;
21
+ --cl-font-size-small: 10pt;
22
+ --cl-line-height: ${lh};
23
+ --cl-color-text: #333;
24
+ --cl-color-heading: #000;
25
+ --cl-color-link: #1a0dab;
26
+ }
27
+ @page {
28
+ size: ${size.width}mm ${size.height}mm;
29
+ margin: ${margins.top}mm ${margins.right}mm ${margins.bottom}mm ${margins.left}mm;
30
+ }
31
+ * { margin: 0; padding: 0; box-sizing: border-box; }
32
+ html { background: #e0e0e0; }
33
+ body {
34
+ font-family: var(--cl-font-family);
35
+ font-size: var(--cl-font-size-base);
36
+ line-height: var(--cl-line-height);
37
+ color: var(--cl-color-text);
38
+ background: #fff;
39
+ width: ${size.width}mm;
40
+ min-height: ${size.height}mm;
41
+ margin: 0 auto;
42
+ padding: ${margins.top}mm ${margins.right}mm ${margins.bottom}mm ${margins.left}mm;
43
+ }
44
+ /* Header: name+title left, contact right */
45
+ .cl-header {
46
+ display: flex;
47
+ justify-content: space-between;
48
+ align-items: flex-start;
49
+ margin-bottom: 8px;
50
+ padding-bottom: 12px;
51
+ border-bottom: 2px solid #000;
52
+ }
53
+ .cl-header-left h1 {
54
+ font-family: "Noto Sans", "Helvetica Neue", Arial, "Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif;
55
+ font-size: var(--cl-font-size-name);
56
+ font-weight: bold;
57
+ color: var(--cl-color-heading);
58
+ margin-bottom: 2px;
59
+ }
60
+ .cl-header-left .cl-job-title {
61
+ font-family: "Noto Sans", "Helvetica Neue", Arial, "Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif;
62
+ font-size: var(--cl-font-size-title);
63
+ color: var(--cl-color-text);
64
+ }
65
+ .cl-header-right {
66
+ text-align: right;
67
+ font-size: var(--cl-font-size-small);
68
+ line-height: 1.6;
69
+ }
70
+ .cl-header-right a {
71
+ color: var(--cl-color-link);
72
+ text-decoration: none;
73
+ }
74
+ .cl-header-right a:hover { text-decoration: underline; }
75
+ /* Date */
76
+ .cl-date {
77
+ text-align: right;
78
+ margin-bottom: 20px;
79
+ font-size: var(--cl-font-size-base);
80
+ }
81
+ /* Recipient */
82
+ .cl-recipient {
83
+ margin-bottom: 16px;
84
+ font-size: var(--cl-font-size-base);
85
+ }
86
+ .cl-recipient p { margin-bottom: 4px; }
87
+ /* Subject */
88
+ .cl-subject {
89
+ font-weight: bold;
90
+ margin-bottom: 16px;
91
+ font-size: var(--cl-font-size-base);
92
+ }
93
+ /* Body */
94
+ .cl-body p {
95
+ margin-bottom: 12px;
96
+ text-align: justify;
97
+ font-size: var(--cl-font-size-base);
98
+ }
99
+ .cl-body ul, .cl-body ol {
100
+ margin-left: 18px;
101
+ margin-bottom: 12px;
102
+ }
103
+ .cl-body li { margin-bottom: 4px; }
104
+ /* Closing */
105
+ .cl-closing {
106
+ margin-top: 24px;
107
+ font-size: var(--cl-font-size-base);
108
+ }
109
+ .cl-closing .cl-sign-off { margin-bottom: 24px; }
110
+ .cl-closing .cl-signature { font-weight: normal; }
111
+ /* Markdown inline styles */
112
+ strong, b { font-weight: bold; }
113
+ em, i { font-style: italic; }
114
+ a { color: var(--cl-color-link); text-decoration: underline; }
115
+ @media print {
116
+ html { background: none; }
117
+ body { width: auto; min-height: auto; padding: 0; }
118
+ }
119
+ `;
120
+ }
121
+ /**
122
+ * Render contact info block (right-aligned)
123
+ */
124
+ function renderContactBlock(cv) {
125
+ const lines = [];
126
+ if (cv.metadata.home_address) {
127
+ lines.push(escapeHtml(cv.metadata.home_address));
128
+ }
129
+ if (cv.metadata.phone_number) {
130
+ lines.push(escapeHtml(cv.metadata.phone_number));
131
+ }
132
+ if (cv.metadata.email_address) {
133
+ lines.push(`<a href="mailto:${escapeHtml(cv.metadata.email_address)}">${escapeHtml(cv.metadata.email_address)}</a>`);
134
+ }
135
+ if (cv.metadata.linkedin) {
136
+ const url = cv.metadata.linkedin;
137
+ // Show short display text
138
+ const display = url.replace(/^https?:\/\//, '').replace(/\/$/, '');
139
+ lines.push(`<a href="${escapeHtml(url)}">${escapeHtml(display)}</a>`);
140
+ }
141
+ return lines.join('<br>');
142
+ }
143
+ /**
144
+ * Format the date for the cover letter
145
+ */
146
+ function formatLetterDate(dateStr) {
147
+ if (dateStr)
148
+ return escapeHtml(dateStr);
149
+ // Default to current date
150
+ const now = new Date();
151
+ return now.toLocaleDateString('en-US', {
152
+ year: 'numeric',
153
+ month: 'long',
154
+ day: 'numeric',
155
+ });
156
+ }
157
+ /**
158
+ * Extract body content from sections
159
+ * The cover letter body comes from the first section (typically "Cover Letter" or "Body")
160
+ */
161
+ function extractBodyHtml(cv) {
162
+ // Only use sections valid for cover_letter format
163
+ const sections = cv.sections.filter((s) => isSectionValidForFormat(s.id, 'cover_letter'));
164
+ const parts = [];
165
+ for (const section of sections) {
166
+ if (section.content.type === 'text') {
167
+ parts.push(markdownToHtml(section.content.text));
168
+ }
169
+ else if (section.content.type === 'mixed') {
170
+ for (const part of section.content.parts) {
171
+ if (part.type === 'paragraph') {
172
+ parts.push(markdownToHtml(part.text));
173
+ }
174
+ else if (part.type === 'list') {
175
+ parts.push('<ul>' +
176
+ part.items
177
+ .map((item) => `<li>${markdownToHtml(item)}</li>`)
178
+ .join('') +
179
+ '</ul>');
180
+ }
181
+ }
182
+ }
183
+ else if (section.content.type === 'composite') {
184
+ for (const block of section.content.blocks) {
185
+ if (block.type === 'markdown') {
186
+ parts.push(markdownToHtml(block.content));
187
+ }
188
+ }
189
+ }
190
+ }
191
+ return parts.join('\n');
192
+ }
193
+ /**
194
+ * Generate cover letter HTML
195
+ */
196
+ export function generateCoverLetterHtml(cv, options) {
197
+ const styles = generateStyles(options.paperSize, options.marginMm, options.lineHeight);
198
+ const name = cv.metadata.name;
199
+ const jobTitle = cv.metadata.job_title ?? '';
200
+ const contactHtml = renderContactBlock(cv);
201
+ const dateStr = formatLetterDate(cv.metadata.date);
202
+ const recipientName = cv.metadata.recipient_name ?? 'Hiring Manager';
203
+ const recipientCompany = cv.metadata.recipient_company ?? '';
204
+ const subject = cv.metadata.subject ?? '';
205
+ const bodyHtml = extractBodyHtml(cv);
206
+ const customStylesHtml = options.customStylesheet
207
+ ? `<style class="custom-styles">${options.customStylesheet}</style>`
208
+ : '';
209
+ const headerSourceLineAttr = cv.frontmatterSourceLines
210
+ ? ` data-source-line="${cv.frontmatterSourceLines.startLine}" data-source-end-line="${cv.frontmatterSourceLines.endLine}"`
211
+ : '';
212
+ return `<!DOCTYPE html>
213
+ <html lang="en">
214
+ <head>
215
+ <meta charset="UTF-8">
216
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
217
+ <title>${escapeHtml(name)} - Cover Letter</title>
218
+ <style class="default-styles">${styles}</style>
219
+ ${customStylesHtml}
220
+ </head>
221
+ <body class="cover-letter">
222
+ <header class="cl-header"${headerSourceLineAttr}>
223
+ <div class="cl-header-left">
224
+ <h1>${escapeHtml(name)}</h1>
225
+ ${jobTitle ? `<div class="cl-job-title">${escapeHtml(jobTitle)}</div>` : ''}
226
+ </div>
227
+ <div class="cl-header-right">
228
+ ${contactHtml}
229
+ </div>
230
+ </header>
231
+
232
+ <div class="cl-date">${dateStr}</div>
233
+
234
+ <div class="cl-recipient">
235
+ <p>Dear ${escapeHtml(recipientName)},</p>
236
+ ${recipientCompany ? `<p>${escapeHtml(recipientCompany)}</p>` : ''}
237
+ </div>
238
+
239
+ ${subject ? `<div class="cl-subject">Re: ${escapeHtml(subject)}</div>` : ''}
240
+
241
+ <div class="cl-body">
242
+ ${bodyHtml}
243
+ </div>
244
+
245
+ <div class="cl-closing">
246
+ <p class="cl-sign-off">Sincerely,</p>
247
+ <p class="cl-signature">${escapeHtml(name)}</p>
248
+ </div>
249
+ </body>
250
+ </html>`;
251
+ }
252
+ //# sourceMappingURL=cover_letter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cover_letter.js","sourceRoot":"","sources":["../../src/generator/cover_letter.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,11 @@
5
5
  import type { Logger } from '../cli/index.js';
6
6
  import type { PaperSize, ResolvedConfig } from '../types/config.js';
7
7
  import type { CVInput } from './common.js';
8
+ import { generateCoverLetterHtml } from './cover_letter.js';
8
9
  import { generateEnHtml } from './resume_en.js';
9
10
  import { generateJaHtml } from './resume_ja.js';
10
11
  import { generateRirekishoHTML } from './rirekisho/index.js';
11
- export { generateEnHtml, generateJaHtml, generateRirekishoHTML };
12
+ export { generateCoverLetterHtml, generateEnHtml, generateJaHtml, generateRirekishoHTML, };
12
13
  export { inlineMarkdownToHtml, markdownToHtml } from './markdown.js';
13
14
  /**
14
15
  * Page size dimensions in mm (portrait orientation for CV)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAMV,SAAS,EACT,cAAc,EACf,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAAE,CAAC;AAGjE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAOzE,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CACvC,SAAS,EACT;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAOlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMnD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAE5B,CAAC;AAE7B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAY5D;AASD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAgBnE;AA0PD;;GAEG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,OAAO,EACX,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CA6FnB;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAMV,SAAS,EACT,cAAc,EACf,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,qBAAqB,GACtB,CAAC;AAGF,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAOzE,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CACvC,SAAS,EACT;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAOlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMnD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAE5B,CAAC;AAE7B;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAY5D;AASD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAgBnE;AA4PD;;GAEG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,OAAO,EACX,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CA+GnB;AAED,eAAe,cAAc,CAAC"}