Skip to content

Task #511 v2 + #554: HWP3 Square wrap 보완6+8 (페이지네이션 안전) + 변환본 식별 휴리스틱#589

Closed
jangster77 wants to merge 12 commits into
edwardkim:develfrom
jangster77:local/task511_v3
Closed

Task #511 v2 + #554: HWP3 Square wrap 보완6+8 (페이지네이션 안전) + 변환본 식별 휴리스틱#589
jangster77 wants to merge 12 commits into
edwardkim:develfrom
jangster77:local/task511_v3

Conversation

@jangster77

Copy link
Copy Markdown
Collaborator

Summary

PR #553 (close, cherry-pick rollback) + PR #556 (Task #554, OPEN) 통합 재PR.

작업지시자 회신 권장에 따라:

본 PR은 A2 전략wrap_around_pic_bottom_px / v_push_before / promoted_cps 메커니즘은 모두 제외 (Task #546 revert 영역 회피 + 직렬화 우려 영역 제거), wrap_precomputed IR 플래그 + cs_offset 단일 접근으로 page 4/8 결함 정정.

변경 영역 (8 commits)

Task #460 보완6, 8 — page 4/8 결함 정정

파일 변경 설명
src/model/paragraph.rs +5 wrap_precomputed: bool 필드 (derived, serializer 미참조)
src/parser/hwp3/mod.rs +27 wrap_precomputed 후처리 (multi-LineSeg + single-LineSeg cs>0 + 페이지 첫 문단 그림 케이스)
src/renderer/typeset.rs -3 / +9 `wrap_around_is_hwp3` 제거 → `para.wrap_precomputed` 사용 (CLAUDE.md HWP3 파서 규칙 준수)
src/renderer/layout.rs -19 / +6 HWP3 전용 분기 제거, IR 플래그로 통합
src/renderer/layout/paragraph_layout.rs +20 wrap_precomputed면 `line_cs_offset` 적용, 아니면 Task #489 `effective_col_x` (이중 적용 방지)

Task #554 — HWP3 변환본 페이지네이션 휴리스틱

파일 변경 설명
`src/parser/hwpx/header.rs` +29 `parse_hwpx_hwpml_version` (`<hh:head version="1.4">` 검출)
`src/parser/hwpx/mod.rs` +15 HWPX 헤더 분석 → origin 추정
`src/parser/mod.rs` +39 `apply_hwp3_origin_fixup` (HWP5 `(PS/Para<0.05) AND (CS/Para<0.15) AND (Para>50)` 휴리스틱 + 조건부 -1600 보정)
`src/main.rs` +21 `info` 명령에 Origin 추정 정보
`tests/issue_554.rs` +113 회귀 테스트 12개
`samples/hwp3-sample{,4,5}-hwp{5,x}.{hwp,hwpx}` binary HWP3 변환본 fixture 5개

문서 (Task #460 + #554)

PR #553 대비 본 PR 의 정정

영역 PR #553 본 PR (v2)
page 4/8 결함 ❌ 잔존 (Task #546 revert trade-off) ✅ 정정
`wrap_around_pic_bottom_px` retained (보완5 본질) 제외 (Task #546 회귀 회피)
`v_push_before` 필드 추가 (model 변경) 제외 (직렬화 우려 영역)
`promoted_cps` 필드 추가 (LineSeg) 제외
정정 메커니즘 보완6-13 (mod.rs +508 LOC) 보완6, 8 (mod.rs +27 LOC, model +5 LOC)
직렬화 정합성 model 변경 우려 derived 필드만, serializer 미참조

검증 결과

결정적 검증

  • `cargo build` 통과
  • `cargo test --lib` 1124 passed / 0 failed / 3 ignored
  • `cargo test --test issue_554` 12 passed / 0 failed
  • `cargo test --test issue_546` 통과 (exam_science.hwp 4 페이지 정합)
  • `cargo test` 통합 31 passed
  • `cargo clippy --lib` 0건

시각 판정 자료 (작업지시자 검증 필요)

`output/svg/pr_v2_after/hwp3-sample5_{004,008,016,022,027}.svg`:

페이지 기대 x (cs 기반) 실측 x 정합
page 4 529 (cs=35460) 529.5 (20개 인스턴스)
page 8 384 (cs=24560) 384.0 (12개)
page 16 338 (cs=21096) 337.4
page 22 407 (cs=26256) 406.7 (21개)
page 27 386 (cs=24724) 386.3

페이지네이션 회귀 검증

CLAUDE.md HWP3 파서 규칙 준수

  • HWP3 전용 분기 (`is_hwp3_precomputed` / `wrap_around_is_hwp3`) 모두 렌더러에서 제거
  • 포맷 독립적 IR 플래그 (`Paragraph.wrap_precomputed`) 로 통합
  • HWP3 전용 후처리는 `src/parser/hwp3/mod.rs` 안에만 존재

잔존 결함 (별도 후속 task 권고)

  1. page 27 그림+텍스트 y 정합: 보완7 (그림 전용 문단 height = 그림 높이) 시도했으나 HWP3 native pagination 회귀 (16→18, 64→65) 발견하여 본 PR에서 제외. 트러블슈팅 문서 `mydocs/troubleshootings/square_wrap_pic_bottom_double_advance.md` 권장 영역 — 옵션 1 (wrap-around 누적 height 추적) 정밀화 필요.

  2. HWP3 변환본 1개 -1 over-correct: hwp3-sample-hwp5/.hwpx (16 vs 15). 단일 -1600 보정의 본질적 한계 (Task HWP5/HWPX 페이지네이션 회귀: HWP3 변환본이 HWP3 원본보다 페이지 수 증가 #554 보고서 참조).

처리 요청

컨트리뷰터 메모

@edwardkim 작업지시자 회신의 권장 (페이지네이션 안전한 방식) 정합 — `wrap_around_pic_bottom_px` 메커니즘 (보완5 본질) 을 모두 제외하고, IR 플래그 단일 접근으로 page 4/8 결함만 정정. 직렬화 우려 영역 (`v_push_before`, `promoted_cps`) 도 제외.

🤖 Generated with Claude Code

jangster77 and others added 7 commits May 4, 2026 17:48
…ted IR 플래그)

- CLAUDE.md 위반 수정: is_hwp3_precomputed/wrap_around_is_hwp3 등 렌더러 내
  HWP3 전용 분기를 제거하고 포맷 독립적 IR 플래그(wrap_precomputed)로 대체
- Paragraph.wrap_precomputed: 파서가 LineSeg cs/sw를 사전 계산한 wrap zone 표시
- HWP3 파서에서 후처리로 wrap_precomputed 설정 (모든 vpos=0 & 일부 cs>0)
- layout_composed_paragraph: x_start에 line_cs_offset(LineSeg cs_px) 추가하여
  wrap_precomputed 문단의 텍스트 x 위치를 wrap zone 오른쪽으로 정확히 배치
- Pattern B (page 4: 그림/텍스트 별개 문단) 및 Pattern A (pages 8-12: 동일 문단)
  모두 올바른 x 위치 확인

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
wrap_precomputed 조건을 single-LineSeg(1줄) 문단에도 확장:
- tac=false 그림 없음 + cs>0 + sw>0: 그림 옆 wrap zone 단일줄 문단
  (예: pi=782 "$ mount /dev/hda3 /usr", pi=783 "$")
- tac=false 그림 있음 + 페이지 첫 문단(column_type=Page) + cs>0:
  그림과 텍스트가 동일 y에서 시작하는 패턴
  (예: pi=599 "9 AIX bootable..." - page 22, 그림이 바디 최상단)

제외: 그림 있음 + 중간 페이지 → 텍스트가 그림 y보다 위에서 시작
  (예: pi=779 "Figure 4-4.", pi=440 "Figure 4-1은..." → x=57 유지)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
이슈 edwardkim#554 (HWP5/HWPX 페이지네이션 회귀 — HWP3 변환본이 HWP3 원본보다 페이지
수 증가) 의 사전 진단 단계. read-only 분석으로 본질 파악.

Stage 1 진단 결과:
- HWP3 파서 -1600 HU 보정 (Task edwardkim#460) 은 한글97 마지막 줄 tolerance 모방
- HWP5/HWPX 파서/페이지네이션 미적용으로 변환본 페이지 +1 ~ +4 회귀
- HWPX 휴리스틱: <hh:head version="1.4"> (6/6 fixture 100%)
- HWP5 휴리스틱: PS/Para < 0.05 AND CS/Para < 0.15 AND Para > 50 (27/27 100%)

방안 C 채택 (작업지시자 승인): 한컴 변환본 식별 + 조건부 -1600 보정.
방안 A (단순 적용): 광범위 회귀 (-1/-1/-5).
방안 B (공통 페이지네이션 tolerance): Task edwardkim#546 패턴 위험.
방안 D (보정 제거): 페이지 폭증.

산출물:
- mydocs/plans/task_m100_554.md (수행계획서)
- mydocs/plans/task_m100_554_impl.md (구현계획서, 4 단계)
- mydocs/working/task_m100_554_stage1.md (광범위 진단 보고서)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
HWPX 변환본 식별: <hh:head version="1.4"> (HWP3 origin) vs "1.5"+ (직접 작성).
6/6 fixture 100% 정확 분류. 식별 시 모든 SectionDef.page_def.margin_bottom -=
1600 HU 보정 (post-process).

변경:
- src/parser/hwpx/header.rs (+28 LOC):
  parse_hwpx_hwpml_version() 신규 함수. <hh:head version="X.Y"> root element
  의 version 속성 추출. 헤더 root만 읽고 즉시 반환 (비용 최소).
- src/parser/hwpx/mod.rs (+13 LOC):
  hwpml_version == "1.4" 식별 후 sections.iter_mut() 으로 page_def
  margin_bottom 보정.

검증:
- hwp3-sample-hwpx.hwpx: 17 → 15 (정답 16, -1 잔존, Stage 1 예상)
- hwp3-sample5-hwpx.hwpx: 68 → 64 (정답 64, 정합)
- 표-텍스트.hwpx, 2025년 기부·답례품, table-vpos-01, tac-img-02:
  변화 없음 (hwpml=1.5 직접 작성, 휴리스틱 미적용)
- cargo test --lib 1113 passed
- cargo clippy --lib -- -D warnings 0건

산출물: mydocs/working/task_m100_554_stage2.md

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
HWP5 변환본 식별: ParaShape/Paragraph 비율 + CharShape/Paragraph 비율.
한컴은 HWP3 → HWP5 변환 시 PS/CS 를 거의 재사용하지 않고 매우 적은 수만
생성 (paragraph 1931 → ParaShape 14). 직접 작성본은 작성자가 다양한
스타일 사용으로 비율이 paragraph 와 비슷하거나 더 높다.

휴리스틱:
- (PS/Paragraph < 0.05) AND (CS/Paragraph < 0.15) AND (Paragraph > 50)
- 27 fixture 100% 분류 (Stage 1 진단)

변경:
- src/parser/mod.rs (+37 LOC):
  apply_hwp3_origin_fixup() 신규 함수. paragraph 수가 필요하므로
  parse_page_def 시점이 아닌 파싱 완료 후 post-process. strict + lenient
  두 진입점 모두 호출.

검증:
- hwp3-sample-hwp5.hwp: 17 → 15 (정답 16, -1 잔존)
- hwp3-sample4-hwp5.hwp: 38 → 36 (정답 36, 정합)
- hwp3-sample5-hwp5.hwp: 68 → 64 (정답 64, 정합)
- 일반 fixture 9개 baseline 동일 (회귀 0). 특히 단순 -1600 적용 시
  -5 회귀였던 2022년 국립국어원 업무계획.hwp 정합 (40 페이지).
- exam_kor.hwp PS/Para=0.076 (임계값 0.05 근처) — CS/Para=0.214 로 안전 분리.
- cargo test --lib 1113 passed
- cargo test --test issue_546 통과 (Task edwardkim#546 정합)

산출물: mydocs/working/task_m100_554_stage3.md

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
신규 회귀 테스트 12건:
- HWP3 변환본 정합 (3): hwp3-sample4-hwp5 36p, hwp3-sample5-hwp5 64p,
  hwp3-sample5-hwpx 64p
- 잔존 -1 over-correct 가드 (2): sample-hwp5/sample-hwpx 15p (정답 16,
  본질적 한계 — typeset.rs 정밀화 별도 task 권고)
- HWP3 원본 회귀 0 (2): hwp3-sample.hwp 16p, hwp3-sample5.hwp 64p
- 광범위 회귀 0 (5): 2022년 국립국어원 40p, exam_kor 20p, aift 77p,
  2025년 기부·답례품 30p, exam_science 4p (Task edwardkim#546 정합)

검증:
- cargo test --lib: 1113 passed (회귀 0)
- cargo test --test issue_554: 12 passed (신규)
- cargo test --test svg_snapshot: 6/6 passed
- cargo test --test issue_546/418/501/505/530: 모두 passed
- cargo clippy --lib -- -D warnings: 0건
- 광범위 sweep (samples/*.hwp{,x} 80+ fixture): 작업지시자 시각 검증
  hwp-3.0-HWPML.hwp 122 페이지 정합 (휴리스틱 false positive 회피)

산출물: mydocs/working/task_m100_554_stage4.md

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
src/bin/check_compat.rs (Stage 1 임시 진단 도구) 폐기 후 정식 명령
'rhwp info' 에 휴리스틱 결과 통합.

변경:
- src/main.rs (+21 LOC):
  show_info() 출력에 ParaShape/Paragraph 비율, CharShape/Paragraph 비율,
  Origin 추정 (HWP3 변환본 / 한컴 한글 직접 작성 / 판정 불가) 추가.

산출물:
- mydocs/report/task_m100_554_report.md (최종 결과 보고서)
- mydocs/orders/20260503.md 갱신 (Task edwardkim#554 완료)

Task edwardkim#554 종합:
- 정합 달성 (5건): hwp3-sample4-hwp5 36p, hwp3-sample5-hwp5 64p,
  hwp3-sample5-hwpx 64p, hwp-3.0-HWPML 122p (작업지시자 시각 검증),
  HWP3 원본 회귀 0
- 잔존 (-1 over-correct, 의도): hwp3-sample-hwp5/.hwpx 정답 16 vs 결과 15.
  단일 -1600 보정의 본질적 한계 — 페이지 break 알고리즘이 줄 단위 결정으로
  -400~-1600 범위 모두 동일 효과 (Stage 2-2 sweep 입증). typeset.rs
  페이지 break 정밀화는 별도 후속 task 권고.
- 별도 issue 권고: hwp3-sample4.hwp HWP3 자체 회귀 (39 vs 36, +3,
  Task edwardkim#554 범위 밖)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@jangster77

jangster77 commented May 4, 2026

Copy link
Copy Markdown
Collaborator Author

시각적 자료를 직접 보시면, 조금 더 보완해야 할 필요가 있습니다. 아직 완벽하지 않습니다.
hwp3-sample5-hwp5.hwp 파일을 보면, hwp3 포맷을 한글 2018 에서 hwp5 포맷으로 저장했는데도, rhwp-studio 에서 조차도 정상적으로 안보이네요. 이부분은 hwp5 파서에서 해결해야할듯 합니다.

@jangster77

Copy link
Copy Markdown
Collaborator Author

hwp5_wrap_precomputed_analysis.md
이 문제에 대해서 opus 에 질의했더니 이와 같은 답변이 오네요. 참고 부탁드립니다.

@edwardkim

Copy link
Copy Markdown
Owner

IR 쪽에 분기처리를 해야 할 모양입니다. ㅎㅎ
저도 좀더 공부해보겠습니다.

@jangster77

Copy link
Copy Markdown
Collaborator Author

document_ir_wrap_zone_standard_review.md
document IR 에서 좀 더 표준이 명확하면 좋겠습니다. 각 파서는 document IR 에서만 던지기만 하면 될듯해서요.
hwp3 파서도 거의 역어셈블 급입니다. hwp3 spec 이 안맞아서요.

@jangster77

Copy link
Copy Markdown
Collaborator Author

document_ir_parser_relationship_analysis.md
저도 전체적인 구조와 설계에 대해서 자세히 모르지만 ai 에 의한 분석결과만 첨부합니다.

edwardkim added a commit that referenced this pull request May 5, 2026
PR #589 (Task #511 v2 + Task #554, @jangster77) 1차 검토:
- 메인테이너 회신 3개 요청 (page 4/8 정정 / 페이지네이션 안전 /
  HWP 3.0 직렬화 round-trip) 모두 응답 정합 검증
- CLAUDE.md HWP3 파서 규칙 준수 (렌더러 HWP3 전용 분기 모두 제거)
- 결정적 재검증: cargo test --lib 1129 / issue_554 12 / issue_546 1 /
  issue_530/505/418/501 / svg_snapshot 6 / clippy 0 / build --release /
  WASM 4,569,773 bytes (devel baseline -12,772)
- 시각 판정 ★ 게이트 — output/svg/pr589_{before,after}/hwp3-sample5/
  + pr589_after/hwp3-sample5-hwp5/ 자료 생성
- 작업지시자 시각 판정 통과 확인

메모리 덤프 동기화: project_output_folder_structure.md 갱신
(PR 검토 SVG before/after 패턴 추가).
edwardkim added a commit that referenced this pull request May 5, 2026
…er77 7 commits + 시각 판정 ★ 통과)

PR #589 (Task #511 v2 + Task #554, @jangster77):
- PR #553 close 회신 응답 — page 4/8 결함 정정 후 재PR
- 옵션 A2 — wrap_precomputed IR 플래그 + cs_offset 단일 접근
- Task #546 회귀 영역 모두 회피 (wrap_around_pic_bottom_px 등 제외)
- HWP 3.0 직렬화 round-trip 정합 — derived 필드 + serializer 미참조

검증:
- cargo test --lib 1129 / issue_554 12 / issue_546 1 회귀 0
- WASM 4,569,773 bytes (-12,772 vs devel)
- 시각 판정 ★ 통과 (page 4/8 정정 + page 17/18/48 보완8 영향 + page 27 trade-off 수용)

PR #556 (Task #554 단독) close 처리 예정.
@edwardkim

Copy link
Copy Markdown
Owner

@jangster77 님 안녕하세요.

본 PR 의 7개 commit 모두 cherry-pick 후 devel merge 완료되었습니다 (5ba7f2e).

처리 결과

메인테이너 회신 3개 요청에 대한 응답 검증

CLAUDE.md HWP3 파서 규칙 준수

  • ✅ 렌더러의 HWP3 전용 분기 (wrap_around_is_hwp3 등) 모두 제거
  • ✅ HWP3 전용 후처리는 src/parser/hwp3/mod.rs 안에만 존재
  • ✅ 포맷 독립적 IR 플래그 (Paragraph.wrap_precomputed) 로 통합

검증

시각 판정 (★ 게이트)

작업지시자 시각 판정 결과:

1차 리뷰에서 시각판정에서 문제가 되었던 부분이 개선되었습니다. 정확하지도 않은 HWP 3.0 스펙으로 하나 하나 문제를 풀어가는 모습 멋지십니다!

PR #553 close 시 회신했던 page 4/8 정정 영역이 시각적으로도 회복되었음을 확인했습니다.

Task #554 통합

본 PR 본문의 요청대로 PR #556 (Task #554 단독) 도 close 처리합니다 — 본 PR 에 본질 통합됨.

잔존 결함 (별도 후속 task 권고)

PR 본문 §"잔존 결함" 1번 (page 27 그림+텍스트 y 정합 — 보완7 영역) + 2번 (HWP3 변환본 1개 -1 over-correct) 는 본 PR 의 명시된 trade-off 영역으로 수용했습니다. 별도 후속 task 로 다룰 영역으로 기록합니다.

처리 보고서: mydocs/pr/archives/pr_589_report.md (작성 후 push 됩니다).

PR #553 의 깊은 자기 검증 + opus 재질의 + IR 표준 분석 등 본질 추적 노력 위에 본 PR 의 정밀한 응답이 가능했습니다. 감사합니다.

@edwardkim edwardkim closed this May 5, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: mydocs/pr/archives/pr_589_report.md
  PR #553 → PR #589 재PR 의 메인테이너 회신 3개 요청 응답 검증 +
  cherry-pick 7 commits + 결정적 검증 + WASM + 시각 판정 ★ 통과
- 검토 보고서 archives 이동:
  mydocs/pr/pr_589_review.md → mydocs/pr/archives/pr_589_review.md
- 5/5 orders 신규 작성: mydocs/orders/20260505.md
  PR #589 처리 + Issue #598 (각주 삭제 기능) 등록 +
  인프라 정합 (local/devel 재생성 / 메모리 동기화 / 페르소나 덤프)
edwardkim added a commit that referenced this pull request May 5, 2026
…margin + indent — @planet6897 / Jaeook Ryu 2 commits + 시각 판정 ★ 통과)

PR #561 (Task #548, @planet6897 PR / Jaeook Ryu commit author):
- stacked PR (PR #560 위) — PR #560 이미 close + devel 적용 완료
- 본질 commits 2건 핀셋 cherry-pick (3de0505 + a0dad0d) 충돌 0
- test_548 RED → GREEN 전환 확인 (본 devel 에 RED+#[ignore] 로 이미 존재)

본질:
- effective_margin_left_line 헬퍼 (paragraph_layout 산식과 동일 단일 룰)
- 페이지 8 셀 5 line 0 [푸코] inline rect: x=131.04 → 155.60 (PDF 155.6)
- 3 분기 (paragraph 시작 / Picture target_line reset / Shape target_line reset)

검증:
- cargo test --lib --release 1130 passed (test_548 GREEN)
- cargo clippy 0건
- WASM 4,570,220 bytes (PR #589 baseline +447 bytes — table_layout.rs +79 LOC 정합)
- 광범위 회귀 sweep (3 샘플 39 페이지) 10 differ — 권위 영역 정합
- 시각 판정 ★ 통과 (한국어/영어 시험지 가독성 개선)

closes #548.
@jangster77 jangster77 deleted the local/task511_v3 branch May 5, 2026 06:29
jangster77 added a commit to jangster77/rhwp that referenced this pull request May 5, 2026
…ne helper

본질:
- PR edwardkim#589 머지 후 hwp3-sample5.hwp page 4 시각 결함 발견 (Issue edwardkim#604):
  pi=75 첫 3 줄 cs=0/sw=0 → 그림 좌측 (x=56.7) 에 텍스트 그려짐 → 그림과 겹침
- 본 결함의 본질: HWP3 파서 cs/sw 인코딩 결함 + IR 표준 부재로 인한 휴리스틱 누설
- 옵션 C (Document IR 표준 정합화) 채택 — Stage 1~4 분리 진행

Stage 1 변경:
- mydocs/tech/document_ir_lineseg_standard.md 신규 (+150 LOC) — LineSeg 필드별
  단위/원점/0 의미 명시. HWP5/HWPX/HWP3 각 파서 인코딩 책임 명시.
- src/model/paragraph.rs — LineSeg 필드 doc 정합 + is_in_wrap_zone(col_w_hu)
  helper 추가 (포맷 무관, 상태 무관, per-line 판정)
- 분석 자료 3 파일 mydocs/tech/ 로 이동 (git 추적 영역):
  document_ir_parser_relationship_analysis.md (16KB), wrap_zone_standard_review.md,
  hwp5_wrap_precomputed_analysis.md
- 분석 자료 + 계획서 5 파일의 /tmp/ 경로 → mydocs/tech/ 일괄 정정

검증:
- cargo build 통과
- cargo test --lib 1130 passed / 0 failed / 2 ignored
- cargo clippy --lib -- -D warnings 0건
- 호출처 변경 0 (Stage 2 에서 일괄 적용)

수행/구현 계획서 + 단계별 보고서 동봉:
- mydocs/plans/task_m100_604.md (수행계획서)
- mydocs/plans/task_m100_604_impl.md (구현계획서, Stage 1~4 본질)
- mydocs/working/task_m100_604_stage1.md (Stage 1 보고서)
- mydocs/orders/20260505.md (Task edwardkim#604 entry)

다음: Stage 2 — 렌더러 wrap_precomputed → is_in_wrap_zone 교체 + 필드 제거.
jangster77 added a commit to jangster77/rhwp that referenced this pull request May 5, 2026
… 부채 마무리)

본질:
- Stage 2 의 wrap_anchors 메타데이터 채널 도입 후, Paragraph.wrap_precomputed 필드
  제거 + HWP3 파서 후처리 30 LOC 청산. typeset.rs 매칭 분기를 anchor 종류 (Picture vs
  Table) 기반으로 본질화.
- HWP3 휴리스틱이 IR 에 누설되었던 wrap_precomputed 플래그를 청산. IR 의 포맷 독립성
  회복.

변경:
- src/renderer/typeset.rs:495~ 매칭 분기 본질화: anchor paragraph 의 controls 검사
  (Control::Picture / Control::Shape 안의 ShapeObject::Picture, !treat_as_char) 로
  Picture anchor 면 wrap_anchors 등록, Table anchor 면 흡수 (기존 흐름).
- src/model/paragraph.rs: wrap_precomputed 필드 제거 (struct 정의 + clone init).
- src/parser/hwp3/mod.rs: PR edwardkim#589 보완6/8 후처리 30 LOC 청산. typeset.rs + wrap_anchors
  채널로 정합 대체됨.
- src/renderer/{layout.rs, pagination.rs, layout/paragraph_layout.rs}: 잔존 주석 갱신
  (Task edwardkim#460 보완6 인용 → Task edwardkim#604 Stage 2 인용).

검증:
- cargo build + cargo build --tests 통과
- cargo test --lib 1130 passed (회귀 0)
- cargo clippy --lib -- -D warnings 0건
- cargo test --test issue_546 1 passed (Task edwardkim#546 정합)
- cargo test --test issue_554 12 passed (HWP3 변환본 정합)
- cargo test 통합 31 모두 통과

IR 부채 청산:
- IR (Paragraph) 에서 wrap_precomputed 필드 제거 — 포맷 독립성 회복
- HWP3 파서가 LineSeg cs/sw 만 정합 인코딩 책임 (별도 후처리 없음)
- typeset 의 매칭 분기 = anchor 종류 기반 본질 판정 (Picture/Table)

LOC: -53 / +30 (-23 net) 소스. 단계별 보고서 동봉.

다음: Stage 3 — HWP3 파서 cs/sw 인코딩 정정 (Issue edwardkim#604 결함 본질 정정).
jangster77 added a commit to jangster77/rhwp that referenced this pull request May 5, 2026
…결함 본질 정정)

본질:
- hwp3-sample5.hwp page 4 의 pi=75 첫 3 줄 cs=0/sw=0 결함 본질 정정.
- 원인: src/parser/hwp3/mod.rs:1399-1407 의 wrap zone pgy 범위 검사가
  `pgy >= pgy_start && pgy < pgy_end` 양방향 가드로, wrap text 문단의 첫 줄
  pgy 가 anchor 의 pgy_start 미만 인 경우 (예: 페이지 첫 문단) cs/sw=0 설정 →
  그림 좌측 (x=56.7) 에 텍스트 그려짐 → 그림과 겹침 (Issue edwardkim#604).

정정 (옵션 3a):
- src/parser/hwp3/mod.rs: pgy_start 가드 제거. pgy_end 만 검사하는 단방향 가드.
  본질: wrap text 문단의 모든 줄은 anchor 그림 우측에 정합 배치되어야 하며,
  pgy_start 미만의 줄도 wrap zone 의 일부. 그림 아래로 흘러간 줄 (cs=0 정상 줄)
  만 pgy_end 가드로 wrap zone 외 판정.

검증:
- pi=75 모든 LineSeg cs=35460, sw=15564 정합 (이전: 첫 3 줄 cs=0/sw=0)
- cargo test --lib 1130 passed (회귀 0)
- cargo test --test issue_546 (Task edwardkim#546 exam_science 4페이지 정합)
- cargo test --test issue_554 12 passed (HWP3 변환본 정합)
- cargo test 통합 31 모두 통과
- HWP3 native pages 회귀 0 (sample 16p, sample5 64p)

시각 판정:
- output/svg/task604_after/hwp3-sample5/hwp3-sample5_004.svg page 4
  x=529 (23 인스턴스, PR edwardkim#589 baseline 20 → 23 = pi=75 첫 3 줄 추가 정합)
- page 8/16/22/27 동일 정합 (cs/sw 기반 정합 분포)

본 단계의 본질적 가치:
- Issue edwardkim#604 결함 본질 정정
- HWP3 파서의 LineSeg cs/sw 인코딩 표준 정합 (mydocs/tech/document_ir_lineseg_standard.md)
- 한컴뷰어 page 4 정합 시각

다음: Stage 4 — 광범위 회귀 검증 + 시각 판정 ★ + 최종 보고서.
jangster77 added a commit to jangster77/rhwp that referenced this pull request May 5, 2026
본 task (Document IR 표준 정합화 + HWP3 wrap zone cs/sw 인코딩 정정) 의 최종 단계.
Stage 1~3 누적 결과 광범위 검증 + 시각 판정 자료 + 최종 결과 보고서 작성.

검증:
- cargo build + cargo build --release 통과
- cargo test --lib --release 1130 passed / 0 failed / 2 ignored
- cargo test --release 통합 31 모두 통과
- cargo clippy --lib -- -D warnings 0건

회귀 영역 (모두 정합):
- HWP3 native: hwp3-sample.hwp 16p / hwp3-sample5.hwp 64p (PR edwardkim#589 baseline 동일)
- Task edwardkim#546: exam_science.hwp 4페이지 / p2 단 0 items=37
- Task edwardkim#554 (HWP3 변환본 5개): hwp3-sample-hwp5 15p / -hwpx 15p /
  hwp3-sample4-hwp5 36p / hwp3-sample5-hwp5 64p / -hwpx 64p
- 통합 테스트 svg_snapshot 6/6, issue_546/554 통과

시각 판정 자료:
- output/svg/task604_after/hwp3-sample5/hwp3-sample5_{004,008,016,022,027}.svg
- page 4 x=529 분포: PR edwardkim#589 baseline 20 → 23개 (pi=75 첫 3 줄 추가 정합)

본질 정정 누적 효과:
- Issue edwardkim#604 결함 본질 정정 (pi=75 모든 ls cs/sw 정합)
- Document IR 표준 명문화 (mydocs/tech/document_ir_lineseg_standard.md)
- IR 부채 청산 (Paragraph.wrap_precomputed 필드 제거)
- typeset 출력 메타데이터 채널 (ColumnContent.wrap_anchors) 도입
- typeset 매칭 분기 anchor 종류 (Picture vs Table) 기반 본질화
- HWP3 파서 cs/sw 인코딩 정정 (pgy 단방향 가드)
- CLAUDE.md HWP3 파서 규칙 정합 (HWP3 휴리스틱 IR 누설 청산)

LOC 합계: +76 net (소스), +1100 (문서)

잔존 별도 task 권고:
- HWP3 폰트 크기/줄간격 처리 (한컴뷰어 13pt vs HWP5 v2024 9pt 차이)
- HWP3 LineSeg vertical_pos 누적 계산
- Task edwardkim#525 본질 재검토 (wrap_anchors 도입 후 layout_wrap_around_paras dead code 가능성)

문서:
- mydocs/report/task_m100_604_report.md (최종 보고서)
- mydocs/orders/20260505.md Task edwardkim#604 entry → 완료
edwardkim added a commit that referenced this pull request May 5, 2026
v0.7.9 후속 patch 사이클 (5/4 ~ 5/6).

## 신규 기능

- **CLI 바이너리 릴리즈** (Issue #608/#612, @almet 의 요청)
  - 4 플랫폼 GitHub Release 자산 첨부 (Linux x86_64 / macOS x86_64+aarch64 /
    Windows x86_64) + SHA-256 체크섬
- **PNG raster backend** (PR #599, @seo-rii) — render P4 단계
  - native Skia 기반 PageLayerTree → PNG export, native-skia feature gate
  - **AI 파이프라인 + VLM 연동 도입** (메인테이너 후속 정정):
    - --vlm-target claude (1568 longest edge / 1.15 MP, Claude Vision 정합)
    - --scale / --max-dimension (자동 scale 계산)
    - export-png CLI 명령 + 매뉴얼 (한글 + 영문 dual)
    - 한글 폰트 fallback chain + char 단위 fallback (공백 두부 정정) +
      --font-path 동적 로딩

## 외부 PR cherry-pick (13 PR / 7 컨트리뷰터)

- @planet6897 / Jaeook Ryu (협업): PR #587/#589/#561/#564/#570/#575/
  #580/#584/#592/#593/#567
- @oksure (Hyunwoo Park): PR #600 (closes #513)
- @seo-rii: PR #599 (refs #536)
- @cskwork / @johndoekim / @nameofSEOKWONHONG / @jangster77 — 사이클 누적

## 메인테이너 정정

Skia 폰트 영역 5개 정정 (한글 fallback / font-path / char-fallback /
VLM 옵션 / export-png CLI).

## 인프라

- CI 빌드 안정성 (Cargo.toml [[example]] required-features)
- 광범위 페이지네이션 회귀 sweep 도구 (164 fixture / 1,614 페이지 자동)

## 후속 이슈

- #613 (VLM 프리셋 확장)
- #614 (DPI 메타데이터)
- #615 (pua_oldhangul.rs U+F53A 한컴 정합)
- #598 (rhwp-studio 각주 삭제, 외부 컨트리뷰터 공개)

## 잔여 PR (v0.7.11 후속 patch)

PR #601, #602 (@oksure) / PR #607 (@dicebattle) / PR #609 (@jangster77,
Task #604) / PR #611 (@kihyunnn).

상세: CHANGELOG.md (한글) / CHANGELOG_EN.md (영문).
edwardkim pushed a commit that referenced this pull request May 7, 2026
본질:
- PR #589 머지 후 hwp3-sample5.hwp page 4 시각 결함 발견 (Issue #604):
  pi=75 첫 3 줄 cs=0/sw=0 → 그림 좌측 (x=56.7) 에 텍스트 그려짐 → 그림과 겹침
- 본 결함의 본질: HWP3 파서 cs/sw 인코딩 결함 + IR 표준 부재로 인한 휴리스틱 누설
- 옵션 C (Document IR 표준 정합화) 채택 — Stage 1~4 분리 진행

Stage 1 변경:
- mydocs/tech/document_ir_lineseg_standard.md 신규 (+150 LOC) — LineSeg 필드별
  단위/원점/0 의미 명시. HWP5/HWPX/HWP3 각 파서 인코딩 책임 명시.
- src/model/paragraph.rs — LineSeg 필드 doc 정합 + is_in_wrap_zone(col_w_hu)
  helper 추가 (포맷 무관, 상태 무관, per-line 판정)
- 분석 자료 3 파일 mydocs/tech/ 로 이동 (git 추적 영역):
  document_ir_parser_relationship_analysis.md (16KB), wrap_zone_standard_review.md,
  hwp5_wrap_precomputed_analysis.md
- 분석 자료 + 계획서 5 파일의 /tmp/ 경로 → mydocs/tech/ 일괄 정정

검증:
- cargo build 통과
- cargo test --lib 1130 passed / 0 failed / 2 ignored
- cargo clippy --lib -- -D warnings 0건
- 호출처 변경 0 (Stage 2 에서 일괄 적용)

수행/구현 계획서 + 단계별 보고서 동봉:
- mydocs/plans/task_m100_604.md (수행계획서)
- mydocs/plans/task_m100_604_impl.md (구현계획서, Stage 1~4 본질)
- mydocs/working/task_m100_604_stage1.md (Stage 1 보고서)
- mydocs/orders/20260505.md (Task #604 entry)

다음: Stage 2 — 렌더러 wrap_precomputed → is_in_wrap_zone 교체 + 필드 제거.
edwardkim pushed a commit that referenced this pull request May 7, 2026
본질:
- Stage 2 의 wrap_anchors 메타데이터 채널 도입 후, Paragraph.wrap_precomputed 필드
  제거 + HWP3 파서 후처리 30 LOC 청산. typeset.rs 매칭 분기를 anchor 종류 (Picture vs
  Table) 기반으로 본질화.
- HWP3 휴리스틱이 IR 에 누설되었던 wrap_precomputed 플래그를 청산. IR 의 포맷 독립성
  회복.

변경:
- src/renderer/typeset.rs:495~ 매칭 분기 본질화: anchor paragraph 의 controls 검사
  (Control::Picture / Control::Shape 안의 ShapeObject::Picture, !treat_as_char) 로
  Picture anchor 면 wrap_anchors 등록, Table anchor 면 흡수 (기존 흐름).
- src/model/paragraph.rs: wrap_precomputed 필드 제거 (struct 정의 + clone init).
- src/parser/hwp3/mod.rs: PR #589 보완6/8 후처리 30 LOC 청산. typeset.rs + wrap_anchors
  채널로 정합 대체됨.
- src/renderer/{layout.rs, pagination.rs, layout/paragraph_layout.rs}: 잔존 주석 갱신
  (Task #460 보완6 인용 → Task #604 Stage 2 인용).

검증:
- cargo build + cargo build --tests 통과
- cargo test --lib 1130 passed (회귀 0)
- cargo clippy --lib -- -D warnings 0건
- cargo test --test issue_546 1 passed (Task #546 정합)
- cargo test --test issue_554 12 passed (HWP3 변환본 정합)
- cargo test 통합 31 모두 통과

IR 부채 청산:
- IR (Paragraph) 에서 wrap_precomputed 필드 제거 — 포맷 독립성 회복
- HWP3 파서가 LineSeg cs/sw 만 정합 인코딩 책임 (별도 후처리 없음)
- typeset 의 매칭 분기 = anchor 종류 기반 본질 판정 (Picture/Table)

LOC: -53 / +30 (-23 net) 소스. 단계별 보고서 동봉.

다음: Stage 3 — HWP3 파서 cs/sw 인코딩 정정 (Issue #604 결함 본질 정정).
edwardkim pushed a commit that referenced this pull request May 7, 2026
본질:
- hwp3-sample5.hwp page 4 의 pi=75 첫 3 줄 cs=0/sw=0 결함 본질 정정.
- 원인: src/parser/hwp3/mod.rs:1399-1407 의 wrap zone pgy 범위 검사가
  `pgy >= pgy_start && pgy < pgy_end` 양방향 가드로, wrap text 문단의 첫 줄
  pgy 가 anchor 의 pgy_start 미만 인 경우 (예: 페이지 첫 문단) cs/sw=0 설정 →
  그림 좌측 (x=56.7) 에 텍스트 그려짐 → 그림과 겹침 (Issue #604).

정정 (옵션 3a):
- src/parser/hwp3/mod.rs: pgy_start 가드 제거. pgy_end 만 검사하는 단방향 가드.
  본질: wrap text 문단의 모든 줄은 anchor 그림 우측에 정합 배치되어야 하며,
  pgy_start 미만의 줄도 wrap zone 의 일부. 그림 아래로 흘러간 줄 (cs=0 정상 줄)
  만 pgy_end 가드로 wrap zone 외 판정.

검증:
- pi=75 모든 LineSeg cs=35460, sw=15564 정합 (이전: 첫 3 줄 cs=0/sw=0)
- cargo test --lib 1130 passed (회귀 0)
- cargo test --test issue_546 (Task #546 exam_science 4페이지 정합)
- cargo test --test issue_554 12 passed (HWP3 변환본 정합)
- cargo test 통합 31 모두 통과
- HWP3 native pages 회귀 0 (sample 16p, sample5 64p)

시각 판정:
- output/svg/task604_after/hwp3-sample5/hwp3-sample5_004.svg page 4
  x=529 (23 인스턴스, PR #589 baseline 20 → 23 = pi=75 첫 3 줄 추가 정합)
- page 8/16/22/27 동일 정합 (cs/sw 기반 정합 분포)

본 단계의 본질적 가치:
- Issue #604 결함 본질 정정
- HWP3 파서의 LineSeg cs/sw 인코딩 표준 정합 (mydocs/tech/document_ir_lineseg_standard.md)
- 한컴뷰어 page 4 정합 시각

다음: Stage 4 — 광범위 회귀 검증 + 시각 판정 ★ + 최종 보고서.
edwardkim pushed a commit that referenced this pull request May 7, 2026
본 task (Document IR 표준 정합화 + HWP3 wrap zone cs/sw 인코딩 정정) 의 최종 단계.
Stage 1~3 누적 결과 광범위 검증 + 시각 판정 자료 + 최종 결과 보고서 작성.

검증:
- cargo build + cargo build --release 통과
- cargo test --lib --release 1130 passed / 0 failed / 2 ignored
- cargo test --release 통합 31 모두 통과
- cargo clippy --lib -- -D warnings 0건

회귀 영역 (모두 정합):
- HWP3 native: hwp3-sample.hwp 16p / hwp3-sample5.hwp 64p (PR #589 baseline 동일)
- Task #546: exam_science.hwp 4페이지 / p2 단 0 items=37
- Task #554 (HWP3 변환본 5개): hwp3-sample-hwp5 15p / -hwpx 15p /
  hwp3-sample4-hwp5 36p / hwp3-sample5-hwp5 64p / -hwpx 64p
- 통합 테스트 svg_snapshot 6/6, issue_546/554 통과

시각 판정 자료:
- output/svg/task604_after/hwp3-sample5/hwp3-sample5_{004,008,016,022,027}.svg
- page 4 x=529 분포: PR #589 baseline 20 → 23개 (pi=75 첫 3 줄 추가 정합)

본질 정정 누적 효과:
- Issue #604 결함 본질 정정 (pi=75 모든 ls cs/sw 정합)
- Document IR 표준 명문화 (mydocs/tech/document_ir_lineseg_standard.md)
- IR 부채 청산 (Paragraph.wrap_precomputed 필드 제거)
- typeset 출력 메타데이터 채널 (ColumnContent.wrap_anchors) 도입
- typeset 매칭 분기 anchor 종류 (Picture vs Table) 기반 본질화
- HWP3 파서 cs/sw 인코딩 정정 (pgy 단방향 가드)
- CLAUDE.md HWP3 파서 규칙 정합 (HWP3 휴리스틱 IR 누설 청산)

LOC 합계: +76 net (소스), +1100 (문서)

잔존 별도 task 권고:
- HWP3 폰트 크기/줄간격 처리 (한컴뷰어 13pt vs HWP5 v2024 9pt 차이)
- HWP3 LineSeg vertical_pos 누적 계산
- Task #525 본질 재검토 (wrap_anchors 도입 후 layout_wrap_around_paras dead code 가능성)

문서:
- mydocs/report/task_m100_604_report.md (최종 보고서)
- mydocs/orders/20260505.md Task #604 entry → 완료
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants