From 592f05b2bc25e54d4ada12b82d9d97f9d2c1425a Mon Sep 17 00:00:00 2001 From: Eleven Date: Sat, 25 Jul 2026 01:04:15 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B8=B0=EB=8A=A5:=20convert=EC=97=90=20--font?= =?UTF-8?q?-dir=20=ED=94=8C=EB=9E=98=EA=B7=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=E2=80=94=20PDF=20=EB=B3=80=ED=99=98=20=EC=99=B8=EB=B6=80=20?= =?UTF-8?q?=ED=8F=B0=ED=8A=B8=20CLI=20=EC=A0=9C=EC=96=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit render/diff/mcp에만 있던 --font-dir가 convert(PDF)에는 없어 HWP_FONT_DIR 환경변수로만 폰트를 지정할 수 있던 비대칭 해소. - Convert 명령에 --font-dir 추가 (반복 가능, pdf 전용 표기) - convert::run에 font_dirs 관통: 확장자 .pdf 추론 시 render 위임 경로 (기존 Vec::new() 하드코딩)와 명시적 --to pdf 팔 모두 - 미지정 시 기존 HWP_FONT_DIR → fonts/ 폴백 유지 (하위 호환) - write_by_ext(edit/new/MCP 저장 공용)의 PDF 경로는 범위 밖 — 기존 동작 유지 - cli-reference.md 드리프트 게이트 bless로 재생성 - clippy too_many_arguments는 edit/diff 관례대로 #[allow] 처리 검증: 격리 테스트로 플래그 유무 대조 — fonts/ 없는 CWD에서 미지정 시 시스템 폰트 대체(함초롬바탕→AppleMyungjo), --font-dir 지정 시 글꼴 일치. 확장자 추론·--to pdf 두 경로 모두 확인. scripts/check.sh 통과. Co-Authored-By: Claude Fable 5 --- crates/hwp-cli/src/cli.rs | 3 +++ crates/hwp-cli/src/commands/convert.rs | 17 ++++++++++------- crates/hwp-cli/src/main.rs | 2 ++ docs/manual/cli-reference.md | 1 + 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/crates/hwp-cli/src/cli.rs b/crates/hwp-cli/src/cli.rs index a90e8bc..eaa6ebe 100644 --- a/crates/hwp-cli/src/cli.rs +++ b/crates/hwp-cli/src/cli.rs @@ -76,6 +76,9 @@ pub enum Cmd { /// (md) 숨은 설명 텍스트도 포함 (기본: 제외) #[arg(long = "with-hidden")] with_hidden: bool, + /// (pdf) 추가 폰트 디렉터리 (반복 가능, 기본: HWP_FONT_DIR 또는 fonts/) + #[arg(long)] + font_dir: Vec, }, /// 페이지 렌더링 diff --git a/crates/hwp-cli/src/commands/convert.rs b/crates/hwp-cli/src/commands/convert.rs index b9d50ca..a0917f0 100644 --- a/crates/hwp-cli/src/commands/convert.rs +++ b/crates/hwp-cli/src/commands/convert.rs @@ -3,7 +3,7 @@ //! M2 범위: hwp/hwpx → markdown/JSON. hwpx 쓰기(M4)와 hwp 쓰기(M6)는 //! 이후 마일스톤. -use std::path::Path; +use std::path::{Path, PathBuf}; use crate::commands::cat::load_document; use hwp_cli::cli::ConvertFormat; @@ -19,6 +19,7 @@ pub struct MdOpts<'a> { pub with_hidden: bool, } +#[allow(clippy::too_many_arguments)] pub fn run( input: &Path, output: &Path, @@ -27,6 +28,7 @@ pub fn run( preserve_layout: bool, embed_bin: bool, md_opts: &MdOpts, + font_dirs: Vec, ) -> anyhow::Result<()> { // PDF는 문서 포맷 변환이 아니라 렌더 출력 — render 경로에 위임한다 // (사용자의 "변환" 프레이밍 대응: `hwp convert in.hwp -o out.pdf`). @@ -42,7 +44,7 @@ pub fn run( "all", 96.0, Some(hwp_cli::cli::RenderFormat::Pdf), - Vec::new(), + font_dirs, ); } @@ -101,7 +103,7 @@ pub fn run( } ConvertFormat::Pdf => { let doc = load_document(input)?; - let result = hwp_render::render_document_pdf(&doc, &pdf_render_opts(), None)?; + let result = hwp_render::render_document_pdf(&doc, &pdf_render_opts(font_dirs), None)?; print_warnings(&result.report); std::fs::write(output, &result.data)?; } @@ -209,7 +211,7 @@ pub fn write_by_ext( Vec::new() } Some("pdf") => { - let result = hwp_render::render_document_pdf(doc, &pdf_render_opts(), None)?; + let result = hwp_render::render_document_pdf(doc, &pdf_render_opts(Vec::new()), None)?; std::fs::write(output, &result.data)?; result.report } @@ -231,11 +233,12 @@ pub fn resolve_font_dirs(given: Vec) -> Vec hwp_render::RenderOptions { +/// PDF 렌더 옵션 — 폰트는 `given`(`--font-dir`)이 비었으면 `HWP_FONT_DIR` +/// (없으면 `fonts/`)에서 해석. +fn pdf_render_opts(given: Vec) -> hwp_render::RenderOptions { hwp_render::RenderOptions { dpi: 96.0, - font_dirs: resolve_font_dirs(Vec::new()), + font_dirs: resolve_font_dirs(given), } } diff --git a/crates/hwp-cli/src/main.rs b/crates/hwp-cli/src/main.rs index 07bd8af..732259d 100644 --- a/crates/hwp-cli/src/main.rs +++ b/crates/hwp-cli/src/main.rs @@ -46,6 +46,7 @@ fn main() -> anyhow::Result<()> { media_dir, with_header_footer, with_hidden, + font_dir, } => commands::convert::run( &input, &output, @@ -58,6 +59,7 @@ fn main() -> anyhow::Result<()> { with_header_footer, with_hidden, }, + font_dir, ), Cmd::Render { input, diff --git a/docs/manual/cli-reference.md b/docs/manual/cli-reference.md index f31ef29..95fc0d6 100644 --- a/docs/manual/cli-reference.md +++ b/docs/manual/cli-reference.md @@ -64,6 +64,7 @@ | `--media-dir` | `` | | (md) 이미지 추출 디렉터리 — 기본 "<출력스템>.media". 상대경로는 출력 파일 기준으로 해석하고 링크는 입력한 경로 그대로 쓴다 (예: figs) | | `--with-header-footer` | | | (md) 머리말/꼬리말 텍스트도 포함 (기본: 제외) | | `--with-hidden` | | | (md) 숨은 설명 텍스트도 포함 (기본: 제외) | +| `--font-dir` | `` | | (pdf) 추가 폰트 디렉터리 (반복 가능, 기본: HWP_FONT_DIR 또는 fonts/) | ## `hwp render`