Skip to content

Task #1134: fix HWPX serializer paragraph id collisions#1206

Closed
Mireutale wants to merge 6 commits into
edwardkim:develfrom
Mireutale:fix/issue-1134-hwpx-serializer
Closed

Task #1134: fix HWPX serializer paragraph id collisions#1206
Mireutale wants to merge 6 commits into
edwardkim:develfrom
Mireutale:fix/issue-1134-hwpx-serializer

Conversation

@Mireutale

Copy link
Copy Markdown
Contributor

변경 요약

HWPX 직렬화 중 본문 문단과 표 셀 내부 문단의 hp:p id가 같은 번호 공간을 공유하지 않아 전역 중복이 발생할 수 있는 문제를 수정했습니다.

  • 섹션 직렬화 컨텍스트의 문단 id 할당을 본문과 셀 문단이 함께 사용하도록 정리
  • 본문 문단과 표 셀 문단 id가 전역으로 유니크한지 검증하는 회귀 테스트 추가

관련 이슈

closes #1134

테스트

  • cargo fmt --all -- --check 통과
  • cargo test 통과
  • cargo clippy -- -D warnings 통과
  • 관련 샘플 파일로 SVG 내보내기 확인
  • 웹(WASM) 렌더링 확인 (해당하는 경우)

스크린샷

직렬화 XML id 충돌 수정이라 스크린샷 비교는 생략했습니다.

Mireutale and others added 6 commits May 29, 2026 15:40
- parse→serialize→parse 사이클 검증 테스트 4개 추가
  (fillBrush 배경색, CharShape run, 셀 내 control, controls+CharShape 동시)
- split_runs_charshapes_controls(): controls가 있는 셀 문단에서도
  char_offsets 갭 기반으로 CharShape 경계를 정확히 분리
- write_cell_paragraph_runs(): controls+다중CharShape+has_inner_boundary
  조건 충족 시 세 번째 분기로 처리

closes edwardkim#1134
각 셀에서 enumerate() 인덱스를 재사용해 id="0", id="1" 등이
문서 전체에 중복 출력되던 문제를 수정한다.
SerializeContext에 전역 para_id_counter를 추가하고,
write_sub_list에서 ctx.next_para_id()를 사용해 문서 내 유일성을 보장한다.
aea2eac 커밋이 셀 문단 id에 ctx.next_para_id() 를 도입했으나
section.rs 본문 문단 id 는 여전히 하드코드(0, idx as u32)를 사용,
같은 section.xml 안에서 id 충돌이 발생했다.

- section.rs: 본문 첫 문단·추가 문단·각주미주 루프 3곳을
  ctx.next_para_id() 로 통일, 불필요한 enumerate() 제거
- hwpx_roundtrip_integration.rs: 본문+표 포함 섹션의
  <hp:p id> 유일성 검증 테스트 추가
@edwardkim edwardkim self-requested a review June 1, 2026 04:06
@edwardkim edwardkim added this to the v1.0.0 milestone Jun 1, 2026
@edwardkim edwardkim added the enhancement New feature or request label Jun 1, 2026
@edwardkim

Copy link
Copy Markdown
Owner

@Mireutale 님, rhwp 에 첫 기여를 보내주셔서 환영하고 감사합니다. 🎉 직렬화 영역의 문제를 정확히 짚어 깔끔한 수정과 회귀 테스트까지 함께 주셨습니다. 검토 결과와 함께, 이 PR 을 닫게 된 사정을 설명드립니다.

검토 결과

1. 문단 id 충돌 수정 (PR 목적) — 방향 적절
SerializeContext::next_para_id() 로 본문 문단과 표 셀 문단이 전역 카운터를 공유하게 한 설계는 깔끔하고, <hp:p id> 전역 유니크 회귀 테스트도 의도가 명확합니다.

2. fillBrush 직렬화 완성 (header.rs +229) — PR 본문 미설명 + 정합 이슈
header.rs 변경은 기존 "Stage 1 빈 fillBrush 래퍼" 를 winBrush/gradation/imgBrush 실제 직렬화로 완성한 것으로, PR 목적(id 충돌)과는 별개 작업입니다. PR 제목·본문에는 id 충돌만 적혀 있어 이 변경이 드러나지 않습니다.

  • 같은 IR(Fill/SolidFill/GradientFill/ImageFill)을 쓰는 HWP 직렬화(control.rs::serialize_shape_fill)와 방향은 정합합니다.
  • 다만 image_fill_mode_str 가 출력하는 일부 토큰(LEFT_BOTTOM/LEFT_CENTER/RIGHT_CENTER/RIGHT_TOP/RIGHT_BOTTOM/CENTER_TOP 등)은 현재 HWPX 파서(parser/hwpx/header.rs, section.rs)가 역으로 읽지 못해 TileAll 로 폴백합니다. 즉 rhwp 자기 라운드트립이 일부 깨지며, 이 토큰들이 실제 한컴 HWPX 스펙 값인지 추가 확인이 필요합니다.

닫는 사정

  • 현재 rhwp 는 HWPX→HWP 직렬화(exportHwp, HWPX→HWP 재저장 파일 열기 실패 시 오류 미표시 #178 어댑터)만 완성·검증된 상태이고, HWPX 쓰기(serialize_hwpx/exportHwpx)는 아직 미완성 모듈입니다. 이 PR 이 대상으로 하는 영역이 그 미완성 모듈입니다.
  • 미완성 모듈의 방향성·완성 범위는 메인테이너가 정리한 뒤 진행하는 것이 맞다고 판단하여, 이 PR 은 일단 닫습니다.

제안

  • 문단 id 충돌 수정은 그 자체로 가치가 있으니, fillBrush 완성과 분리하여 id 수정만 담은 PR 로 재제출해 주시면 우선 검토하겠습니다.
  • fillBrush 직렬화는 HWPX 쓰기 모듈 정비 일정에 맞춰 별도로 다루겠습니다(토큰 ↔ 파서 라운드트립 정합 + 한컴 스펙 대조 포함).

이번 기여로 드러난 id 충돌 문제와 fillBrush 미완성 지점은 후속 작업에 반영하겠습니다. 다시 한번 감사드리며, 분리 재제출을 기다리겠습니다.

@edwardkim

Copy link
Copy Markdown
Owner

위 검토 의견대로, HWPX 쓰기 미완성 모듈 정비 방향을 메인테이너가 정리한 뒤 진행하기 위해 이 PR 을 닫습니다. 문단 id 충돌 수정만 분리한 PR 재제출을 환영합니다.

@edwardkim edwardkim closed this Jun 1, 2026
@Mireutale

Copy link
Copy Markdown
Contributor Author

확인했습니다. fillBrush 완성과 분리하여 id 수정만 담은 PR 로 재제출하도록 하겠습니다!

edwardkim added a commit that referenced this pull request Jun 1, 2026
…CLOSE, by @Mireutale 첫 기여)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Jun 1, 2026
@Mireutale (#1206 분리 재제출) — HWPX 직렬화 시 본문 문단과 표 셀 문단의 <hp:p id>
가 같은 번호 공간을 공유하지 않아 전역 중복 가능. SerializeContext 에 전역
next_para_id() 카운터 추가, 본문·각주·셀 문단이 공유.

#1206 close 사유 ②(fillBrush 혼재)·③(image_fill_mode 비대칭) 해소 — header.rs 제외,
id 충돌 수정만 분리. 충돌 해소: #1213(textFlow) 테스트와 인접 충돌 → 양쪽 보존.

검증: clippy(lib) clean, cargo test --tests 1921 passed. 통합 테스트
para_ids_unique_across_body_and_table(basic-table-01 라운드트립 id 전역 유니크).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Jun 1, 2026
@Mireutale #1206 분리 재제출. 1921 passed, fillBrush 제외 확인.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants