Convert Markdown to HWPX (Korean Hancom Office format)
Project description
md2hwpx
md2hwpx는 마크다운(.md)을 아래아 한글 HWPX(.hwpx)로 변환해주는 파이썬 도구입니다. Pandoc 없이 순수 파이썬으로 동작합니다.
pypandoc-hwpx 포크이며, 새로운 기능과 개선을 계속 추가하고 있습니다.
주요 기능
- Pandoc 없이 변환: Marko 파서 + XML 생성으로 순수 파이썬 변환
- CLI 및 Python API 제공
- YAML 프론트매터 지원: 문서
title메타데이터 작성 - 템플릿 기반 스타일: 제목/본문/리스트/표 셀 플레이스홀더로 WYSIWYG 스타일링
- 이미지 prefix 지원: 플레이스홀더 앞에 이미지를 배치하는 템플릿 스타일 자동 반영
- 헤더 앞 공백/페이지브레이크: 레벨별 빈줄 수·높이·페이지브레이크 설정
- 설정 파일 지원: JSON/YAML 설정 파일로 변환 옵션 일괄 관리
- 표 지원: GFM 표, 정렬 및 컬럼 비율 반영
- 리스트: 중첩 목록과 시작 번호 지원
- 이미지 임베딩: 로컬 이미지 삽입, 크기 보정, 경로 검증
- 인용문, 수평선
- 각주
- 확장 헤더: 1–9 레벨
- 디버그 출력:
.jsonAST,.html출력
요구 사항
- Python 3.9+
- 라이브러리: marko, python-frontmatter, Pillow
설치
PyPI 설치 (권장)
pip install md2hwpx
소스 설치
git clone https://github.com/jundamin/md2hwpx.git
cd md2hwpx
pip install -e .
사용 방법
CLI
# Markdown -> HWPX
md2hwpx input.md -o output.hwpx
# 참조 템플릿 지정
md2hwpx input.md --reference-doc=custom.hwpx -o output.hwpx
# 디버그: JSON AST 출력
md2hwpx input.md -o debug.json
# 디버그: HTML 출력
md2hwpx input.md -o output.html
CLI 옵션
| 옵션 | 설명 |
|---|---|
input_file |
입력 마크다운 파일 (.md, .markdown) |
-o, --output |
출력 파일 (.hwpx, .json, .html) |
-r, --reference-doc |
스타일/페이지 설정용 참조 HWPX (기본: 내장 blank.hwpx) |
--config FILE |
JSON/YAML 설정 파일 경로 (snake_case 키) |
--page-break-before LEVELS |
지정 레벨 헤더 앞에 페이지브레이크 삽입. 예: 1,2 |
--blank-lines-before-header SPEC |
레벨별 빈줄 수. 예: 2:2,3:1 |
--space-before-header SPEC |
레벨별 정밀 공백 높이(mm). 예: 2:10,3:5 |
--blank-line-before-header |
H1–H3 앞에 빈줄 삽입 (레거시, 단순 on/off) |
--verbose |
디버그 로그 출력 |
-q, --quiet |
오류 외 출력 억제 |
-v, --version |
버전 출력 |
프론트매터 (title)
---
title: 문서 제목
---
# 제목
title 값은 HWPX 문서 메타데이터에 기록됩니다.
Python API
from md2hwpx import convert_string
# 기본 변환
convert_string("# 안녕하세요\n\n내용입니다.", "output.hwpx")
# 커스텀 템플릿
convert_string("# 안녕하세요\n\n내용입니다.", "output.hwpx", reference_doc="template.hwpx")
# ConversionConfig로 세부 설정
from md2hwpx.config import ConversionConfig
config = ConversionConfig()
config.PAGE_BREAK_BEFORE_HEADER_LEVELS = {1: True}
config.BLANK_LINES_BEFORE_HEADER = {2: [2, 5.0], 3: 1} # H2 앞: 5mm 빈줄 2개, H3 앞: 기본 빈줄 1개
convert_string("# H1\n\n## H2\n\n본문", "output.hwpx", config=config)
헤더 앞 공백 / 페이지브레이크 설정
헤더(H1–H6) 앞에 빈줄이나 페이지브레이크를 레벨별로 지정할 수 있습니다.
CLI로 지정
# H1 앞 페이지브레이크
md2hwpx input.md -o output.hwpx --page-break-before 1
# H2 앞 10mm 공백, H3 앞 5mm 공백
md2hwpx input.md -o output.hwpx --space-before-header 2:10,3:5
# H2 앞 빈줄 2개, H3 앞 빈줄 1개
md2hwpx input.md -o output.hwpx --blank-lines-before-header 2:2,3:1
설정 파일로 지정 (JSON/YAML)
# config.yaml
page_break_before_header_levels:
1: true
blank_lines_before_header:
2: [2, 5.0] # H2 앞: 5mm 높이 빈줄 2개
3: [1, 3.0] # H3 앞: 3mm 높이 빈줄 1개
4: 1 # H4 앞: 기본 높이 빈줄 1개
space_before_header_mm:
2: 10.0 # H2 앞: 10mm 공백 (blank_lines보다 우선)
md2hwpx input.md -o output.hwpx --config config.yaml
JSON 형식도 지원합니다:
{
"page_break_before_header_levels": {"1": true},
"blank_lines_before_header": {"2": [2, 5.0], "3": 1}
}
우선순위
--page-break-before > --space-before-header > --blank-lines-before-header > --blank-line-before-header (레거시)
참고: 문서의 첫 번째 블록이 헤더인 경우, 위 설정은 적용되지 않습니다.
스타일 커스터마이징 (템플릿)
한컴오피스에서 참조 HWPX 템플릿을 편집하면 출력 스타일을 손쉽게 제어할 수 있습니다.
방법 1: 플레이스홀더 방식 (권장)
템플릿에 플레이스홀더 텍스트를 넣고 원하는 서식을 적용합니다.
| 플레이스홀더 | 마크다운 요소 |
|---|---|
{{H1}} |
# 제목 1 |
{{H2}} |
## 제목 2 |
{{H3}} |
### 제목 3 |
{{H4}}–{{H9}} |
####–######### |
{{BODY}} |
본문 |
리스트 플레이스홀더
리스트 레벨(1–7)별 스타일을 정의할 수 있습니다.
{{LIST_BULLET_1}}…{{LIST_BULLET_7}}{{LIST_ORDERED_1}}…{{LIST_ORDERED_7}}
플레이스홀더 앞 텍스트는 접두(prefix)로 사용됩니다(예: 1. , 가. ).
템플릿 단락에 번호 매기기를 지정하면 해당 번호 스타일을 유지합니다.
이미지 prefix 플레이스홀더
플레이스홀더 앞에 이미지(hp:pic)를 배치하면 변환 결과에도 해당 이미지가 prefix로 반영됩니다.
예: 체크박스 이미지를 {{LIST_BULLET_1}} 앞에 삽입하면, 모든 1레벨 목록 항목 앞에 해당 이미지가 붙습니다.
이미지는 템플릿의 BinData에서 출력 파일로 자동 복사됩니다.
표 셀 플레이스홀더
표 셀 스타일을 세부적으로 지정하려면 아래 12개 플레이스홀더를 사용하세요.
{{CELL_HEADER_LEFT}},{{CELL_HEADER_CENTER}},{{CELL_HEADER_RIGHT}}{{CELL_TOP_LEFT}},{{CELL_TOP_CENTER}},{{CELL_TOP_RIGHT}}{{CELL_MIDDLE_LEFT}},{{CELL_MIDDLE_CENTER}},{{CELL_MIDDLE_RIGHT}}{{CELL_BOTTOM_LEFT}},{{CELL_BOTTOM_CENTER}},{{CELL_BOTTOM_RIGHT}}
사용 예:
md2hwpx input.md --reference-doc=my_template.hwpx -o output.hwpx
방법 2: 스타일 직접 편집
- 기본 템플릿 복사:
python -c "import md2hwpx; import shutil; shutil.copy(md2hwpx.__path__[0] + '/blank.hwpx', 'my_template.hwpx')"
- 한컴오피스에서 서식 > 스타일(F6) 메뉴로 편집
- 참조 템플릿으로 사용
지원하는 마크다운 요소
| 요소 | 지원 |
|---|---|
| 제목 (1–9) | 지원 |
| 문단 | 지원 |
| 굵게 / 기울임 / 취소선 | 지원 |
| 링크 | 지원 (HWPX 하이퍼링크) |
| 이미지 | 지원 (임베딩) |
| 표 (GFM) | 지원 (정렬 + 컬럼 비율) |
| 글머리/번호 목록 | 지원 (중첩) |
| 코드 블록 | 지원 |
| 인라인 코드 | 지원 |
| 인용문 | 지원 (중첩) |
| 수평선 | 지원 |
| 각주 | 지원 |
| 위첨자 / 아래첨자 | AST에 있으면 출력 지원 |
보안 및 제한 사항
- 입력/템플릿 파일 크기 제한 (기본 50 MB)
- 이미지 개수 제한 (기본 500)
- 이미지 경로 검증(절대 경로/상위 경로 차단)
개발
# 개발 설치
pip install -e .
# 테스트 실행
python -m pytest tests/ -v
# 자세한 로그로 실행
md2hwpx test.md -o output.hwpx --verbose
포크 이후 변경 사항
원본 포크 이후 주요 변경 사항:
- 헤더/리스트/표 셀 플레이스홀더 기반 스타일
- GFM 표 정렬 및 컬럼 비율 처리
- 프론트매터 메타데이터(title) 반영
- 리스트 시작 번호 및 템플릿 번호 매기기 개선
- 보안 제한(파일 크기, 이미지 개수, 경로 검증)
- 이미지 prefix 플레이스홀더 지원 (체크박스 등 이미지를 헤더/리스트 앞에 자동 반영)
- 헤더 앞 공백/페이지브레이크 레벨별 설정 (
--page-break-before,--space-before-header,--blank-lines-before-header) - 빈줄 높이(mm) 지정 지원 (
blank_lines_before_header: {2: [2, 5.0]}) - JSON/YAML 설정 파일 지원 (
--config), Python API에서도ConversionConfig직접 전달 가능
라이선스
MIT License. 자세한 내용은 LICENSE를 참고하세요.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file md2hwpx-0.1.5.tar.gz.
File metadata
- Download URL: md2hwpx-0.1.5.tar.gz
- Upload date:
- Size: 96.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
127e375fe5bbd19161c1ab8f0f472d6f35ce3ac381e4cf1e88fab1169d56eb94
|
|
| MD5 |
f6e9476860a29b1c47e1486669ea802e
|
|
| BLAKE2b-256 |
e4fb72ce78b2dad3c10ec2479a35d6fc4864e6cef53edc0dbe664889f54873b5
|
Provenance
The following attestation bundles were made for md2hwpx-0.1.5.tar.gz:
Publisher:
publish.yml on JunDamin/md2hwpx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
md2hwpx-0.1.5.tar.gz -
Subject digest:
127e375fe5bbd19161c1ab8f0f472d6f35ce3ac381e4cf1e88fab1169d56eb94 - Sigstore transparency entry: 1242769797
- Sigstore integration time:
-
Permalink:
JunDamin/md2hwpx@617b1295650f478097438a1c2ed06064f994d29a -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/JunDamin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@617b1295650f478097438a1c2ed06064f994d29a -
Trigger Event:
release
-
Statement type:
File details
Details for the file md2hwpx-0.1.5-py3-none-any.whl.
File metadata
- Download URL: md2hwpx-0.1.5-py3-none-any.whl
- Upload date:
- Size: 76.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eeee66f99c20e4922074d76493f00cebb1477ca60c2e19bfb93abc2e6b229d23
|
|
| MD5 |
809a983f2edd89c2dc7ed4fad64672d4
|
|
| BLAKE2b-256 |
2f57c1606b444b74a17e2e239723c3b2b899fe15a430b72a6111aff2083cccd9
|
Provenance
The following attestation bundles were made for md2hwpx-0.1.5-py3-none-any.whl:
Publisher:
publish.yml on JunDamin/md2hwpx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
md2hwpx-0.1.5-py3-none-any.whl -
Subject digest:
eeee66f99c20e4922074d76493f00cebb1477ca60c2e19bfb93abc2e6b229d23 - Sigstore transparency entry: 1242769805
- Sigstore integration time:
-
Permalink:
JunDamin/md2hwpx@617b1295650f478097438a1c2ed06064f994d29a -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/JunDamin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@617b1295650f478097438a1c2ed06064f994d29a -
Trigger Event:
release
-
Statement type: