배경
현재 src/serializer/에 HwpSerializer(HWP 5.0 CFB) 한 구현체만 있어 Document IR을 HWPX(XML 기반 ZIP 패키지)로 내보내는 기능이 없다. DocumentSerializer trait는 이미 추상화되어 있어 HwpxSerializer만 추가하면 파이프라인에 연결된다.
목표
parse_hwpx → (편집) → serialize_hwpx → 다시 parse_hwpx 시 IR이 동등하게 유지되도록 HWPX 직렬화 경로를 신규 구현한다.
범위 (MVP)
HWPX 파서가 현재 지원하는 범위에 맞춘다.
대상:
- ZIP 컨테이너 + OPF 패키지 (
Contents/content.hpf)
Contents/header.xml (fonts, charShapes, paraShapes, borderFills, styles, 기타 ID 맵)
Contents/section*.xml (문단·텍스트·charShape·paraShape·lineSegArray)
- 표(
<tbl> + <pos>/<sz>/<outMargin>/<tc hasMargin>)
- 그림 +
BinData/ 배치
- 라운드트립 자동 검증
범위 외 (후속 이슈):
- 각주/미주, 머리말/꼬리말, 도형, 필드/하이퍼링크 (HWPX 파서도 미구현)
- HWP↔HWPX 교차 변환
단계 계획 (5단계, 하이퍼-워터폴)
- ZIP + content.hpf + 최소 header.xml + 빈 section0.xml → 빈 HWPX 생성, 한컴 오픈 검증
- 본문 문단/텍스트/charShape/paraShape/lineSegArray 직렬화 → 텍스트 라운드트립
- 표 직렬화 (attr↔common 역매핑은 `mydocs/tech/hwp_hwpx_ir_differences.md` 기준)
- 그림 + BinData 배치
- 라운드트립 테스트 (parse_hwpx → serialize_hwpx → parse_hwpx → IR diff 0)
참고 문서
mydocs/tech/hwp_save_guide.md — HWP 저장 구조 (참고)
mydocs/tech/hwp_hwpx_ir_differences.md — IR 차이점 (직접 영향)
src/parser/hwpx/ — 역방향 레퍼런스
아키텍처
```rust
pub struct HwpxSerializer;
impl DocumentSerializer for HwpxSerializer {
fn serialize(&self, doc: &Document) -> Result<Vec, SerializeError> { ... }
}
```
src/serializer/hwpx/ 신설 (reader 거울 구조):
mod.rs — 엔트리 (serialize_hwpx)
writer.rs — ZIP 쓰기
content.rs — content.hpf 생성
header.rs — header.xml 생성
section.rs — section*.xml 생성
utils.rs — 공용 XML 헬퍼
배경
현재
src/serializer/에HwpSerializer(HWP 5.0 CFB) 한 구현체만 있어 Document IR을 HWPX(XML 기반 ZIP 패키지)로 내보내는 기능이 없다.DocumentSerializertrait는 이미 추상화되어 있어HwpxSerializer만 추가하면 파이프라인에 연결된다.목표
parse_hwpx→ (편집) →serialize_hwpx→ 다시parse_hwpx시 IR이 동등하게 유지되도록 HWPX 직렬화 경로를 신규 구현한다.범위 (MVP)
HWPX 파서가 현재 지원하는 범위에 맞춘다.
대상:
Contents/content.hpf)Contents/header.xml(fonts, charShapes, paraShapes, borderFills, styles, 기타 ID 맵)Contents/section*.xml(문단·텍스트·charShape·paraShape·lineSegArray)<tbl>+<pos>/<sz>/<outMargin>/<tc hasMargin>)BinData/배치범위 외 (후속 이슈):
단계 계획 (5단계, 하이퍼-워터폴)
참고 문서
mydocs/tech/hwp_save_guide.md— HWP 저장 구조 (참고)mydocs/tech/hwp_hwpx_ir_differences.md— IR 차이점 (직접 영향)src/parser/hwpx/— 역방향 레퍼런스아키텍처
```rust
pub struct HwpxSerializer;
impl DocumentSerializer for HwpxSerializer {
fn serialize(&self, doc: &Document) -> Result<Vec, SerializeError> { ... }
}
```
src/serializer/hwpx/신설 (reader 거울 구조):mod.rs— 엔트리 (serialize_hwpx)writer.rs— ZIP 쓰기content.rs— content.hpf 생성header.rs— header.xml 생성section.rs— section*.xml 생성utils.rs— 공용 XML 헬퍼