프로젝트 소개

rhwp는 Rust와 WebAssembly 기반의 오픈소스 HWP/HWPX 뷰어 겸 에디터다. 한글과컴퓨터의 공개 문서를 참고해 개발했으며, 한컴과 제휴·후원·승인 관계가 없는 독립 프로젝트임을 명시한다. MIT 라이선스. ## 문서 처리 범위 HWP 5.0 바이너리(OLE2 복합 파일), HWPX(Open XML 기반), HML(HWPML 2.9/2.91, 검증된 구조만 제한 지원)을 파싱한다. 문단·표·글상자·이미지·수식·차트, 머리말/꼬리말, 바탕쪽, 각주/미주를 다룬다. 렌더링은 줄 간격·들여쓰기·정렬·탭 정지, 셀 병합과 테두리 스타일, 셀 수식 계산, 다단 레이아웃, 문단 번호/글머리표, 세로쓰기, 홀/짝수 페이지 분리 머리말, 바탕쪽, 객체 배치(본문과 함께/글자처럼/글 앞뒤)를 지원한다. 수식은 분수·근호·첨자, 행렬(MATRIX/PMATRIX/BMATRIX/DMATRIX), cases, EQALIGN, PILE 계열, 대형 연산자(INT/SUM/PROD 등), REL/BUILDREL, 극한, 장제법, 그리스 문자와 100여 개 수학 기호를 포함한다. 페이지 분할은 다단 분할, 표 행 단위 분할, vpos 기반 문단 위치 보정을 처리한다. ## 출력과 렌더러 백엔드 CLI로 SVG, PNG(native Skia 기능 필요), PDF를 내보낸다. PDF는 SVG 호환 경로가 기본이며 텍스트를 벡터 패스로 변환하는 옵션과 바이트 재현성을 제공하고, native Skia 직접 백엔드는 선택 사항이다. 웹에서는 Canvas/CanvasKit 렌더링을 사용하며, 공통 paint IR(PageRenderTree → PageLayerTree)을 두고 legacy/layered SVG, Canvas2D, CanvasKit replay, native Skia 백엔드가 같은 재생 평면 계약을 공유한다. 기본 요청은 Canvas2D이고, `?renderer=auto`를 명시하면 문서 사전 검사를 통과한 경우에만 CanvasKit으로 고정된다. 복합 shaping 문자, 옛한글·PUA 조합, 구조 조판 부호 표시 등은 해당 문서 전체를 Canvas2D로 고정한다. 시각 회귀 CI로 렌더 차이와 PDF 게이트를 검증한다. ## 사용 경로 - 웹 데모(GitHub Pages), Chrome/Edge/Firefox 확장, VS Code 확장(Open VSX 포함) - npm 패키지: `@rhwp/editor`(iframe 임베드 에디터), `@rhwp/core`(WASM 파서/렌더러 API) - CLI: export-svg, export-png, export-pdf, dump, dump-pages, info, capabilities - MCP 서버 내장: 설정 한 줄로 Claude Code 등 MCP 호스트에서 hwp_info, hwp_search, hwp_fill_fields, hwp_open·hwp_doc_* 세션 도구 사용 - 릴리스 바이너리: linux x86_64, macOS x86_64/aarch64, windows x86_64와 SHA256SUMS.txt 제공 웹 에디터(rhwp-studio)는 텍스트 편집·서식 대화상자·표 편집과 한컴 웹기안기 호환 hwpctl API 계층(30개 Action, ParameterSet/ParameterArray, Field API)을 제공한다. 저장은 HWP 편집 저장, HWPX/HML 의미 보존 저장, HWPX→HWP 변환을 지원한다. ## 개발 방식 Rust 1.93.1 기준이며 WASM 빌드는 Docker로 재현한다. 3,400개 이상의 Rust 테스트와 studio 단위/e2e/시각 회귀 CI를 운영한다. 프로젝트는 사람 작업지시자가 방향과 아키텍처 결정을 소유하고 AI를 구현 배율기로 쓰는 방식을 명시적으로 채택하며, 계획서 승인·코드 리뷰·품질 관문을 거친다. 개발 기록은 mydocs/ 디렉터리에 축적된다. 기여 PR은 main이 아닌 devel 브랜치를 대상으로 받는다.