Skip to content

zarathucorp/project-hwpx-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

39 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

hwpxctl

ν•œκ΅­μ–΄: README.md English: README.en.md

hwpxctl은 HWPX λ¬Έμ„œλ₯Ό ZIP/XML νŒ¨ν‚€μ§€λ‘œ λ‹€λ£¨λŠ” CLIμž…λ‹ˆλ‹€. ν˜„μž¬ 쀑심 λ°©ν–₯은 low-level XML surgery 도ꡬλ₯Ό μœ μ§€ν•˜λ©΄μ„œ, κΈ°μ‘΄ 볡합 양식을 μ•ˆμ „ν•˜κ²Œ λΆ„μ„ν•˜κ³  μ±„μš°λŠ” Template-First νŽΈμ§‘ 흐름을 κ°•ν™”ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ κ°œμš”

  • .hwpx 파일의 ꡬ쑰λ₯Ό inspect, validate, text둜 확인
  • analyze-template, find-targets, scaffold-template-contract, fill-template --template --payload 기반 Template-First 흐름 지원
  • unpack 디렉터리 κΈ°μ€€μœΌλ‘œ 문단, 문단 μ •λ ¬/λ“€μ—¬μ“°κΈ°/간격, λͺ©λ‘, ν‘œ, μ„Ήμ…˜, 각주/λ―Έμ£Ό, 머리말/꼬리말, ν•˜μ΄νΌλ§ν¬, μˆ˜μ‹, λ©”λͺ¨, λ„ν˜• νŽΈμ§‘
  • Markdown/HTML export 지원
  • μŠ€νƒ€μΌ, 객체, XML νƒœκ·Έ/속성/XPath 기반 검색 지원
  • opt-in historyEntry λ³€κ²½ 좔적 지원
  • μ΅œμ’… 검증은 Hancom Office HWP Viewer PDF 인쇄 κ²°κ³Ό κΈ°μ€€

ν˜„μž¬ μƒνƒœ

  • v1 λ²”μœ„μ˜ κ³ μˆ˜μ€€ νŽΈμ§‘/검색/export κΈ°λŠ₯은 λŒ€λΆ€λΆ„ κ΅¬ν˜„λ¨
  • 빈 λ¬Έμ„œμ—μ„œ ν‘œ 기반 양식을 μž¬κ΅¬μ„±ν•˜λŠ” 데 ν•„μš”ν•œ νŽ˜μ΄μ§€ λ ˆμ΄μ•„μ›ƒ, 폰트, μ…€ μŠ€νƒ€μΌ, merge/border κΈ°λŠ₯이 포함됨
  • set-paragraph-text, set-run-text, set-table-cell, find-runs-by-style, replace-runs-by-style, find-objects, find-by-tag, find-by-attr, find-by-xpathλŠ” --section λ˜λŠ” --all-sections 기반 닀쀑 section λ²”μœ„λ₯Ό 지원함
  • λ³€κ²½ 좔적은 ν˜„μž¬ history-only 1μ°¨ κ΅¬ν˜„μž„
  • low-level XML/history/version 접근은 λ‹€μŒ λ‹¨κ³„λ‘œ 남아 있음

ν˜„μž¬ λ°©ν–₯κ³Ό κ΅¬μ‘°λŠ” docs/architecture.md, 단계 κ³„νšμ€ docs/roadmap.md, μ‹€μ œ μ§„ν–‰ μƒνƒœλŠ” docs/progress.mdμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

지원 ν™˜κ²½

  • macOS: CLI νŽΈμ§‘ + Hancom Office HWP Viewer PDF 인쇄 κ²€μ¦κΉŒμ§€ 전체 흐름 지원
  • Linux / CI: CLI νŽΈμ§‘, validate, export, ν…ŒμŠ€νŠΈλŠ” κ°€λŠ₯ν•˜μ§€λ§Œ Viewer μžλ™ 인쇄 검증은 μ§€μ›ν•˜μ§€ μ•ŠμŒ
  • Windows / PowerShell: CLI λΉŒλ“œμ™€ κΈ°λ³Έ νŽΈμ§‘ 흐름은 κ°€λŠ₯ν•˜μ§€λ§Œ Viewer μžλ™ 인쇄 검증 μŠ€ν¬λ¦½νŠΈλŠ” μ§€μ›ν•˜μ§€ μ•ŠμŒ

핡심 μ°¨μ΄λŠ” scripts/print_hwpx_via_viewer.pyκ°€ macOS의 osascript와 Hancom Office HWP Viewer에 μ˜μ‘΄ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€.

μš”κ΅¬ 사항

  • ν˜„μž¬ 배포 방식 κΈ°μ€€μœΌλ‘œ μ„€μΉ˜ μ „ Go toolchain이 λ¨Όμ € μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€
  • Go 1.26+
  • Python
  • macOSμ—μ„œ μ΅œμ’… λ Œλ” 검증이 ν•„μš”ν•˜λ©΄ Hancom Office HWP Viewer

ν˜„μž¬λŠ” Homebrew, apt, winget, prebuilt release binary 배포λ₯Ό 아직 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
즉 go install λ˜λŠ” go build둜 μ„€μΉ˜ν•˜λŠ” 흐름이 κΈ°λ³Έμž…λ‹ˆλ‹€.

μ„€μΉ˜

곡개 μ €μž₯μ†Œ κΈ°μ€€μœΌλ‘œλŠ” go install 방식이 κ°€μž₯ μΌλ°˜μ μž…λ‹ˆλ‹€.

go install github.com/zarathucorp/project-hwpx-cli/cmd/hwpxctl@latest

μ„€μΉ˜ ν›„ μ‹€ν–‰ νŒŒμΌμ€ 보톡 GOBIN λ˜λŠ” $(go env GOPATH)/bin μ•„λž˜μ— λ†“μž…λ‹ˆλ‹€. μƒˆ ν™˜κ²½μ—μ„œλŠ” 보톡 μ—¬κΈ°κΉŒμ§€λ‘œ λλ‚˜μ§€ μ•Šκ³ , κ·Έ 디렉터리λ₯Ό PATH에 μΆ”κ°€ν•΄μ•Ό ν„°λ―Έλ„μ—μ„œ hwpxctl이 λ°”λ‘œ μž‘νž™λ‹ˆλ‹€. ν˜„μž¬ μ„€μΉ˜ μœ„μΉ˜λŠ” μ•„λž˜ λͺ…λ ΉμœΌλ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

go env GOBIN
go env GOPATH

PATH μ„€μ •

macOS / Linux

ν˜„μž¬ μ…Έμ—μ„œλ§Œ λ°”λ‘œ μ“°λ €λ©΄:

export PATH="$(go env GOPATH)/bin:$PATH"

영ꡬ λ°˜μ˜μ€ μ‚¬μš©ν•˜λŠ” μ…Έ μ„€μ • νŒŒμΌμ— 같은 쀄을 μΆ”κ°€ν•˜λ©΄ λ©λ‹ˆλ‹€.

  • zsh: ~/.zshrc
  • bash: ~/.bashrc λ˜λŠ” ~/.bash_profile

예λ₯Ό λ“€μ–΄ macOS κΈ°λ³Έ zsh ν™˜κ²½μ΄λ©΄ μ•„λž˜ μˆœμ„œκ°€ κ°€μž₯ μΌλ°˜μ μž…λ‹ˆλ‹€.

echo 'export PATH="$HOME/go/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
command -v hwpxctl
hwpxctl --help

μ›ν•˜λ©΄ κΈ°λ³Έ μ„€μΉ˜ μœ„μΉ˜ λŒ€μ‹  별도 bin 디렉터리λ₯Ό μ§€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

go env -w GOBIN="$HOME/.local/bin"

Windows PowerShell

ν˜„μž¬ μ‚¬μš©μž PATH에 Go λ°”μ΄λ„ˆλ¦¬ 디렉터리λ₯Ό μΆ”κ°€ν•˜λŠ” 일반적인 방식은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

$goBin = "$(go env GOPATH)\bin"
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";" + $goBin, "User")

μƒˆ PowerShell 창을 μ—° λ’€ μ•„λž˜μ²˜λŸΌ ν™•μΈν•©λ‹ˆλ‹€.

Get-Command hwpxctl.exe
hwpxctl.exe --help

μ†ŒμŠ€μ—μ„œ 직접 λΉŒλ“œ

개발 μ€‘μ΄κ±°λ‚˜ 둜컬 μˆ˜μ •λ³Έμ„ λ°”λ‘œ μ‹€ν–‰ν•˜κ³  μ‹ΆμœΌλ©΄ μ•„λž˜ 방식도 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

go build -o "$(go env GOPATH)/bin/hwpxctl" ./cmd/hwpxctl
hwpxctl --help

ν™˜κ²½λ³„ Quick Start

macOS

go install github.com/zarathucorp/project-hwpx-cli/cmd/hwpxctl@latest
echo 'export PATH="$HOME/go/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
command -v hwpxctl
hwpxctl inspect ./sample.hwpx
hwpxctl unpack ./sample.hwpx --output ./work/sample
hwpxctl append-text ./work/sample --text "κ²€ν†  문단"
hwpxctl pack ./work/sample --output ./output/sample-edited.hwpx

Linux / CI

go install github.com/zarathucorp/project-hwpx-cli/cmd/hwpxctl@latest
export PATH="$(go env GOPATH)/bin:$PATH"
command -v hwpxctl
hwpxctl validate ./sample.hwpx --format json
hwpxctl unpack ./sample.hwpx --output ./work/sample
hwpxctl append-text ./work/sample --text "κ²€ν†  문단"
hwpxctl pack ./work/sample --output ./output/sample-edited.hwpx
hwpxctl text ./output/sample-edited.hwpx --format json

Windows PowerShell

go install github.com/zarathucorp/project-hwpx-cli/cmd/hwpxctl@latest
$goBin = "$(go env GOPATH)\bin"
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";" + $goBin, "User")
$env:Path = [Environment]::GetEnvironmentVariable("Path", "User")
Get-Command hwpxctl.exe
hwpxctl.exe inspect .\sample.hwpx
hwpxctl.exe unpack .\sample.hwpx --output .\work\sample
hwpxctl.exe append-text .\work\sample --text "κ²€ν†  문단"
hwpxctl.exe pack .\work\sample --output .\output\sample-edited.hwpx

κΈ°λ³Έ μ‚¬μš© 흐름

1. κΈ°μ‘΄ λ¬Έμ„œ μˆ˜μ •

hwpxctl inspect ./sample.hwpx
hwpxctl unpack ./sample.hwpx --output ./work/sample
hwpxctl set-text-style ./work/sample --paragraph 0 --font-name "맑은 κ³ λ”•" --font-size-pt 12
hwpxctl pack ./work/sample --output ./output/sample-edited.hwpx

2. Template-First 양식 μ±„μš°κΈ°

hwpxctl analyze-template ./sample.hwpx --format json
hwpxctl find-targets ./sample.hwpx --placeholder PROJECT_TITLE --format json
hwpxctl scaffold-template-contract ./sample.hwpx --output ./output/template.yaml --payload-output ./output/payload.yaml
hwpxctl fill-template ./work/sample --template ./output/template.yaml --payload ./output/payload.yaml --roundtrip-check true --format json
hwpxctl safe-pack ./work/sample --output ./output/sample-filled.hwpx --force true

3. 빈 λ¬Έμ„œμ—μ„œ ν‘œ 양식 μ‹œμž‘

hwpxctl create --output ./work/form
hwpxctl set-page-layout ./work/form --orientation PORTRAIT --width-mm 210 --height-mm 297 --left-margin-mm 25 --right-margin-mm 25 --top-margin-mm 15 --bottom-margin-mm 15
hwpxctl add-table ./work/form --rows 4 --cols 3 --width-mm 160
hwpxctl merge-table-cells ./work/form --table 0 --start-row 0 --start-col 0 --end-row 0 --end-col 2
hwpxctl set-table-cell ./work/form --table 0 --row 0 --col 0 --text "제λͺ©" --font-name "맑은 κ³ λ”•" --font-size-pt 14 --bold true
hwpxctl normalize-table-borders ./work/form --table 0
hwpxctl pack ./work/form --output ./output/form.hwpx

4. μžλ™ν™”μš© JSON 좜λ ₯

hwpxctl schema
hwpxctl validate ./sample.hwpx --format json
hwpxctl find-runs-by-style ./work/sample --font-name "맑은 κ³ λ”•" --font-size-pt 12 --format json

5. macOS μ΅œμ’… λ Œλ” 검증

python ./scripts/print_hwpx_via_viewer.py ./output/sample-edited.hwpx

상세 λͺ…λ Ή 계약과 μ˜΅μ…˜μ€ docs/cli-reference.mdμ—μ„œ ν™•μΈν•˜λŠ” 것을 기본으둜 ν•©λ‹ˆλ‹€.

λ¬Έμ„œ

  • docs/cli-reference.md: λͺ…령별 μž…λ ₯, 좜λ ₯, μ˜΅μ…˜, JSON envelope
  • docs/progress.md: ν˜„μž¬ μ§„ν–‰ μƒνƒœμ™€ 칸반
  • docs/architecture.md: ν˜„μž¬ μ½”λ“œ κΈ°μ€€ μ•„ν‚€ν…μ²˜ ꡬ쑰
  • docs/agent-guide.md: AI μ—μ΄μ „νŠΈ 호좜 μˆœμ„œμ™€ ꢌμž₯ μ‚¬μš© νŒ¨ν„΄
  • docs/example-table-playbook.md: example ν‘œλ₯Ό νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ λ‹€μ‹œ λ§Œλ“œλŠ” μž‘μ—…ν˜• κ°€μ΄λ“œμ™€ μ‹œν–‰μ°©μ˜€ λ©”λͺ¨
  • docs/example-parity-harness.md: example 원본과 생성본을 같은 검증 λ£¨ν”„λ‘œ λΉ„κ΅ν•˜λŠ” parity ν•˜λ„€μŠ€ μ•ˆλ‚΄
  • docs/roadmap.md: κ΅¬ν˜„ λ²”μœ„μ™€ λ‹€μŒ μž‘μ—… μš°μ„ μˆœμœ„
  • docs/research-notes.md: HWPX ꡬ쑰 λ©”λͺ¨μ™€ 섀계 λ°°κ²½

곡개 μ €μž₯μ†Œ λ©”λͺ¨

  • 곡개 μ €μž₯μ†Œμ—λŠ” λ―Όκ°ν•˜κ±°λ‚˜ μ €μž‘κΆŒ μ΄μŠˆκ°€ μžˆμ„ 수 μžˆλŠ” 원본 example/*.hwpxλ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” 것을 κΈ°λ³Έκ°’μœΌλ‘œ ν•©λ‹ˆλ‹€
  • sample 원본이 ν•„μš”ν•˜λ©΄ 둜컬 private 경둜λ₯Ό 직접 μ§€μ •ν•΄ μ‚¬μš©ν•˜λŠ” 흐름을 ꢌμž₯ν•©λ‹ˆλ‹€
  • λ¬Έμ„œ μ‚¬μ΄νŠΈλŠ” GitHub Pages에 ν•„μš”ν•  λ•Œ μˆ˜λ™ λ°°ν¬ν•˜λŠ” ꡬ성을 기본으둜 λ‘‘λ‹ˆλ‹€

검증 원칙

  • ꡬ쑰 κ²€μ¦μ΄λ‚˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ§ŒμœΌλ‘œ μ™„λ£Œ μ²˜λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€
  • νŽΈμ§‘ κΈ°λŠ₯은 κ°€λŠ₯ν•˜λ©΄ μ‹€μ œ .hwpx μ‚°μΆœλ¬Όμ„ λ§Œλ“  λ’€ Hancom Office HWP Viewer둜 PDF 인쇄 κ²€μ¦κΉŒμ§€ μˆ˜ν–‰ν•©λ‹ˆλ‹€
  • κΈ°λ³Έ 검증 μŠ€ν¬λ¦½νŠΈλŠ” python ./scripts/print_hwpx_via_viewer.py <file.hwpx>μž…λ‹ˆλ‹€
  • 검증 μ‚°μΆœλ¬Όμ€ output/ μ•„λž˜μ— 남겨 before/after 비ꡐ가 κ°€λŠ₯ν•˜λ„λ‘ μœ μ§€ν•©λ‹ˆλ‹€

ν”„λ‘œμ νŠΈ ꡬ쑰

ν•œκ³„

  • 일뢀 νŽΈμ§‘/λ ˆμ΄μ•„μ›ƒ λͺ…령은 아직 첫 section μ€‘μ‹¬μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€
  • Viewer PDF μžλ™ 인쇄 검증은 ν˜„μž¬ macOS μ „μš©μž…λ‹ˆλ‹€
  • λ³€κ²½ 좔적은 visible tracking이 μ•„λ‹ˆλΌ historyEntry 기둝 μœ„μ£Όμž…λ‹ˆλ‹€
  • .hwpλŠ” μ§€μ›ν•˜μ§€ μ•Šκ³  .hwpx만 λ‹€λ£Ήλ‹ˆλ‹€
  • low-level XML part 쑰회/νŽΈμ§‘ APIλŠ” 아직 정식 λ…ΈμΆœν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€

About

HWPX inspection, editing, and verification CLI

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors