Task #511 v2 + #554: HWP3 Square wrap 보완6+8 (페이지네이션 안전) + 변환본 식별 휴리스틱#589
Task #511 v2 + #554: HWP3 Square wrap 보완6+8 (페이지네이션 안전) + 변환본 식별 휴리스틱#589jangster77 wants to merge 12 commits into
Conversation
…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>
|
시각적 자료를 직접 보시면, 조금 더 보완해야 할 필요가 있습니다. 아직 완벽하지 않습니다. |
|
hwp5_wrap_precomputed_analysis.md |
|
IR 쪽에 분기처리를 해야 할 모양입니다. ㅎㅎ |
|
document_ir_wrap_zone_standard_review.md |
|
document_ir_parser_relationship_analysis.md |
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 패턴 추가).
…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 처리 예정.
|
@jangster77 님 안녕하세요. 본 PR 의 7개 commit 모두 cherry-pick 후 devel merge 완료되었습니다 ( 처리 결과메인테이너 회신 3개 요청에 대한 응답 검증
CLAUDE.md HWP3 파서 규칙 준수
검증
시각 판정 (★ 게이트)작업지시자 시각 판정 결과:
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 로 다룰 영역으로 기록합니다. 처리 보고서: PR #553 의 깊은 자기 검증 + opus 재질의 + IR 표준 분석 등 본질 추적 노력 위에 본 PR 의 정밀한 응답이 가능했습니다. 감사합니다. |
- 처리 보고서 추가: 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 재생성 / 메모리 동기화 / 페르소나 덤프)
…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.
…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 교체 + 필드 제거.
… 부채 마무리) 본질: - 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 결함 본질 정정).
…결함 본질 정정) 본질: - 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 — 광범위 회귀 검증 + 시각 판정 ★ + 최종 보고서.
본 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 → 완료
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 (영문).
본질: - 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 교체 + 필드 제거.
본질: - 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 결함 본질 정정).
본질: - 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 — 광범위 회귀 검증 + 시각 판정 ★ + 최종 보고서.
본 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 → 완료
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.rswrap_precomputed: bool필드 (derived, serializer 미참조)src/parser/hwp3/mod.rssrc/renderer/typeset.rssrc/renderer/layout.rssrc/renderer/layout/paragraph_layout.rsTask #554 — HWP3 변환본 페이지네이션 휴리스틱
문서 (Task #460 + #554)
PR #553 대비 본 PR 의 정정
mod.rs+508 LOC)mod.rs+27 LOC, model +5 LOC)검증 결과
결정적 검증
시각 판정 자료 (작업지시자 검증 필요)
`output/svg/pr_v2_after/hwp3-sample5_{004,008,016,022,027}.svg`:
페이지네이션 회귀 검증
CLAUDE.md HWP3 파서 규칙 준수
잔존 결함 (별도 후속 task 권고)
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 추적) 정밀화 필요.
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