- build: generate CV PDF from cv-zh.md / cv-en.md via Typst cv template - open: open generated PDF with default application - --lang-en flag switches between Chinese and English CV
64 lines
1.5 KiB
Python
64 lines
1.5 KiB
Python
"""CV build and open utilities."""
|
|
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
import click
|
|
|
|
from bin.md_to_pdf import build_pdf
|
|
|
|
|
|
_CV_DIR = (
|
|
Path.home()
|
|
/ "Library"
|
|
/ "Mobile Documents"
|
|
/ "iCloud~md~obsidian"
|
|
/ "Documents"
|
|
/ "myacademia"
|
|
/ "00-cv"
|
|
)
|
|
|
|
|
|
def _src(lang_en: bool) -> Path:
|
|
return _CV_DIR / ("cv-en.md" if lang_en else "cv-zh.md")
|
|
|
|
|
|
def _pdf(lang_en: bool) -> Path:
|
|
return _CV_DIR / ("cv-en.pdf" if lang_en else "cv-zh.pdf")
|
|
|
|
|
|
@click.group(name="mycv")
|
|
def mycv_cmd():
|
|
"""Build and open CV PDFs."""
|
|
pass
|
|
|
|
|
|
@mycv_cmd.command("build")
|
|
@click.option("--lang-en", is_flag=True, help="Build English CV (default: Chinese)")
|
|
def mycv_build(lang_en):
|
|
"""Build CV PDF from markdown using the cv Typst template."""
|
|
src = _src(lang_en)
|
|
out = _pdf(lang_en)
|
|
|
|
if not src.exists():
|
|
click.secho(f"CV source not found: {src}", fg="red")
|
|
raise click.Abort()
|
|
|
|
click.secho(f"Building {'English' if lang_en else 'Chinese'} CV ...", fg="cyan")
|
|
build_pdf("cv", [src], out, bookmark_depth=2)
|
|
click.secho(f"CV generated: {out}", fg="green")
|
|
|
|
|
|
@mycv_cmd.command("open")
|
|
@click.option("--lang-en", is_flag=True, help="Open English CV (default: Chinese)")
|
|
def mycv_open(lang_en):
|
|
"""Open the CV PDF with the default application."""
|
|
pdf = _pdf(lang_en)
|
|
|
|
if not pdf.exists():
|
|
click.secho(f"PDF not found: {pdf}", fg="red")
|
|
click.secho("Run 'mytoolkit mycv build' first.", fg="yellow")
|
|
raise click.Abort()
|
|
|
|
subprocess.run(["open", str(pdf)], check=False)
|