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.
- package/CHANGELOG.md +7 -0
- package/README.ja.md +75 -22
- package/README.md +76 -22
- package/dist/generator/cover_letter.d.ts +12 -0
- package/dist/generator/cover_letter.d.ts.map +1 -0
- package/dist/generator/cover_letter.js +252 -0
- package/dist/generator/cover_letter.js.map +1 -0
- package/dist/generator/index.d.ts +2 -1
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +24 -5
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/resume_en.d.ts.map +1 -1
- package/dist/generator/resume_en.js +4 -3
- package/dist/generator/resume_en.js.map +1 -1
- package/dist/generator/resume_ja.d.ts.map +1 -1
- package/dist/generator/resume_ja.js +4 -3
- package/dist/generator/resume_ja.js.map +1 -1
- package/dist/template/definitions/en.d.ts.map +1 -1
- package/dist/template/definitions/en.js +46 -0
- package/dist/template/definitions/en.js.map +1 -1
- package/dist/template/generator.d.ts.map +1 -1
- package/dist/template/generator.js +4 -2
- package/dist/template/generator.js.map +1 -1
- package/dist/types/config.d.ts +2 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +2 -2
- package/dist/types/config.js.map +1 -1
- package/dist/types/metadata.d.ts +8 -0
- package/dist/types/metadata.d.ts.map +1 -1
- package/dist/types/metadata.js +30 -0
- package/dist/types/metadata.js.map +1 -1
- package/dist/types/sections.d.ts +1 -1
- package/dist/types/sections.d.ts.map +1 -1
- package/dist/types/sections.js +20 -1
- package/dist/types/sections.js.map +1 -1
- package/dist/types/template.d.ts +2 -2
- package/dist/types/template.d.ts.map +1 -1
- package/examples/cover_letter.md +22 -0
- 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
|
|
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`)
|
|
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`
|
|
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`
|
|
339
|
-
| `experience`
|
|
340
|
-
| `education`
|
|
341
|
-
| `skills`
|
|
342
|
-
| `certifications`
|
|
343
|
-
| `languages`
|
|
344
|
-
| `competencies`
|
|
345
|
-
| `motivation`
|
|
346
|
-
| `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
|
|
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
|
|
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
|
|
117
|
-
| ------------------ |
|
|
118
|
-
| `-o, --output` | Output file path (default: stdout)
|
|
119
|
-
| `-l, --lang` | Template language (`en`, `ja`)
|
|
120
|
-
| `-f, --format` | Output format (`cv`, `rirekisho`, `both`)
|
|
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`
|
|
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
|
|
332
|
-
|
|
|
333
|
-
| `summary`
|
|
334
|
-
| `experience`
|
|
335
|
-
| `education`
|
|
336
|
-
| `skills`
|
|
337
|
-
| `certifications`
|
|
338
|
-
| `languages`
|
|
339
|
-
| `competencies`
|
|
340
|
-
| `motivation`
|
|
341
|
-
| `notes`
|
|
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,
|
|
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"}
|