Task #671: 표 셀 내부 paragraph 줄바꿈 시 다중 LINE_SEG 줄 겹침 정정 (closes #671)#673
Closed
jangster77 wants to merge 3 commits into
Closed
Task #671: 표 셀 내부 paragraph 줄바꿈 시 다중 LINE_SEG 줄 겹침 정정 (closes #671)#673jangster77 wants to merge 3 commits into
jangster77 wants to merge 3 commits into
Conversation
This was referenced May 7, 2026
- 수행계획서 / 구현계획서 작성 - 진단 도구 (examples/inspect_task671.rs / _v2.rs) — 셀 paragraph line_segs 검사 + recompose 정밀 진단 - 권위 자료 samples/계획서.hwp git tracked 등록 (HWP5 한컴 PARA_LINE_SEG 인코딩 부재 케이스 권위 영역) - Stage 1 보고서: composer::compose_lines fallback 의 단일 ComposedLine 압축이 본질 결함 위치로 식별. line_segs 비어 있는 셀 paragraph fallback 경로에서 텍스트 폭 측정 + 자동 줄바꿈 미수행 → 셀 너비 초과 텍스트 한 줄 그려져 줄겹침 시각 결함 refs edwardkim#671
본질: HWP5 일부 파일은 셀 paragraph 의 PARA_LINE_SEG 를 인코딩하지 않는다 (한컴이 layout 시 자동 계산). 본 환경 fallback (compose_lines 단일 ComposedLine 압축) 은 셀 너비 초과 텍스트가 한 줄에 그려져 줄겹침 시각 결함 발생. 신규 함수 (composer.rs): - recompose_for_cell_width(composed, para, cell_inner_width_px, styles) — 진입점 (3 중 가드: line_segs.is_empty() + lines.len()==1 + 폭 초과) - split_composed_line_by_width(line, max_width_px, styles) — 단어 경계 우선 + CJK 글자 단위 break 본질 룰 호출 위치 (6 곳): - table_layout.rs:1226 — 셀 layout 렌더링 경로 (핵심) - table_layout.rs:614/678/700 — resolve_row_heights 측정 fallback (caller + callee 시그니처 변경) - table_partial.rs:94/358 — 분할 표 측정 + layout - height_measurer.rs:527/712 — MeasuredTable 핵심 측정 (row_heights 정합 보장) 회귀 위험 영역 좁힘: - 본문 paragraph 무영향 (compose_paragraph 변경 없음) - HWPX 영역 무영향 - 정상 line_segs 인코딩된 셀 무영향 (1차 가드) - 단일 줄 텍스트 무영향 (3차 가드) 검증: - cargo test --lib --release: 1155 passed (회귀 0) - svg_snapshot: 6/6 - issue_546: 1/1 - issue_554: 12/12 - cargo clippy: 0 warnings refs edwardkim#671
광범위 페이지네이션 회귀 sweep: - 187 fixtures / 2013 pages BEFORE/AFTER - 차이 0 (회귀 위험 영역 완전 좁힘 입증) 핵심 fixture 개별 검증 (모두 차이 0): aift / exam_kor / exam_math / exam_science / synam-001 / footnote-01 / hwp3-sample / hwp3-sample4 / hwp3-sample5 / 계획서 시각 판정 (작업지시자 게이트웨이): - 셀 [13] r=3,c=1: 1줄 압축(겹침) → 2줄 정상 분리 ✅ - 셀 [21] r=5,c=1: 1줄 압축(겹침) → 3줄 분리 ✅ - 본 task 본질 영역 (줄겹침) 정정 완료 잔존 결함 영역 별도 분리: - TAC 표 (treat_as_char=true) 비례 축소 메커니즘 (height_measurer.rs:822-830) → Issue edwardkim#672 별도 등록 - feedback_hancom_compat_specific_over_general 정합 산출물: - mydocs/report/task_m100_671_report.md — 최종 결과 보고서 - mydocs/working/task_m100_671_stage3.md — Stage 3 단계별 보고서 - mydocs/orders/20260507.md — Task edwardkim#671 상태 갱신 + Issue edwardkim#672 등록 정보 closes edwardkim#671
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
closes #671 3 commits 단계별 보존 (작업지시자 직접 결정): - a1c9042 Stage 1: 본질 진단 + 권위 자료 보존 - 30fa295 Stage 2: 본질 정정 — recompose_for_cell_width 도입 - e2ddd65 Stage 3: 광범위 회귀 sweep + 최종 보고서 + orders 갱신 본질 정정: - samples/계획서.hwp 영역의 모든 셀 paragraph 영역의 line_segs.len() == 0 영역 — 한컴이 PARA_LINE_SEG 영역을 의도적으로 인코딩하지 않은 케이스 - composer::compose_lines fallback 영역의 단일 ComposedLine 압축 → 시각 결함 - 정정: recompose_for_cell_width(composed, para, cell_inner_width_px, styles) — composer.rs 신규 함수 + table_layout.rs / table_partial.rs / height_measurer.rs 6 곳 호출 3중 가드 (회귀 0): 1. para.line_segs.is_empty() — 한컴 인코딩 부재만 2. composed.lines.len() == 1 — fallback 단일 ComposedLine 만 3. 측정 폭 > cell_inner_width_px — 너비 안에 들어가면 분할 불필요 분할 전략: 단어 경계 (공백) 우선 + 단일 단어가 width 초과 시 글자 단위 break (CJK 안전) 본 환경 검증: - cherry-pick 영역: Stage 1+2 깨끗, Stage 3 orders 영역 ours - cargo test --release ALL PASS (1165 lib + svg_snapshot 7/7 + issue_546 1/1 + issue_554 12/12) - clippy clean - 광범위 sweep 7 샘플 170 페이지: same=170 / diff=0 ✅ - 권위 자료 (samples/계획서.hwp 143KB) 영구 보존 PR: #673 컨트리뷰터: @jangster77 (Taesup Jang) 잔존 분리: Issue #672 — TAC 표 비례 축소 시 셀 콘텐츠 클립 영역 (별도 본질)
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
closes #671 (자동보정 회귀 영역 정정 영역 통합) 본질: PR #673 (Task #671) 영역의 layout 단계 영역 정정 영역의 가드 #1 (line_segs.is_empty()) 영역이 자동보정 영역 영역의 LINE_SEG 영역 채움 영역 후 영역 거짓 영역으로 영역 → PR #673 영역의 정정 영역 미적용 영역 → 자동보정 영역에서 한 줄 겹침 회귀. 작업지시자 시각 판정 영역에서 발견: "그대로 보기 하면 2줄로 처리되지만 오히려 자동보정 선택하면 한줄로 겹쳐집니다." 자동보정 영역의 결함 본질: src/document_core/commands/document.rs:270 + :425 영역 영역 두 곳 영역 모두 reflow_line_segs(cell_para, col_width, ...) 영역 — column 폭 영역 사용. 주석 영역 의도: "셀 너비가 아직 불확정이므로 컬럼 너비를 근사값으로 사용. ... 실제 셀 내 줄바꿈은 테이블 레이아웃이 재수행한다." 그러나 본 환경 영역의 layout 영역 (PR #673) 영역의 가드 #1 영역으로 인해 재수행 영역 미작동 영역. 정정 (옵션 A1): - col_width 영역 → cell_inner_width 영역 (cell.width - cell.padding.left - cell.padding.right) - 두 곳 영역 (line 270 자동 + line 425 사용자 명시) 영역 모두 영역 동일 본질 영역 정정 - 자동보정 영역 자체 영역에서 셀 폭 영역으로 LINE_SEG 영역 채움 영역 → recompose_for_cell_width 영역의 가드 #1 (line_segs.is_empty()) 영역 우회 영역 → 본 환경 영역의 layout 영역의 multi-line 영역 분할 영역 정합 본 환경 검증: - cargo test --release ALL PASS (1165 lib + 회귀 0) - cargo clippy --release clean 작업지시자 결정: "A1 으로 진행해봅니다. 검증 할 수 있게 준비해주세요" PR: #673 컨트리뷰터: @jangster77 (Taesup Jang)
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
PR #673 (Task #671): 표 셀 내부 paragraph 줄바꿈 시 다중 LINE_SEG 줄 겹침 정정 - merge commit: a6645ed (3 commits 단계별 보존 no-ff merge) - 메인테이너 후속 commit: 4d354d2 (A1 자동보정 셀 폭 정정) - 본 환경 결정적 검증 1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13 + clippy clean - 광범위 sweep 7 샘플 170 페이지: same=170 / diff=0 - WASM 빌드 4,589,092 bytes - 작업지시자 1차 시각 판정 영역의 자동보정 회귀 발견 → A1 정정 → 2차 ★ 성공 본질: - recompose_for_cell_width 신규 함수 (composer.rs) + 3중 가드 - 한컴 LINE_SEG 비표준 영역의 본질 정정 영역 (project_hancom_lineseg_behavior) - 자동보정 영역의 col_width → cell_inner_width 영역 정정 (A1) 컨트리뷰터: @jangster77 (Taesup Jang) — 첫 사이클 잔존 분리: Issue #672 (TAC 표 비례 축소 — 별건 본질) closes #671 산출물: - mydocs/pr/archives/pr_673_review.md - mydocs/pr/archives/pr_673_report.md - mydocs/orders/20260508.md 갱신 - 메모리 룰 신규: feedback_fix_scope_check_two_paths
Owner
|
@jangster77 님 PR 처리 완료입니다. 본 환경 검증 결과: 결정적 검증 통과:
광범위 회귀 sweep (7 샘플 170 페이지): same=170 / diff=0 ✅ 메인테이너 후속 정정 (A1):
처리: 3 commits 단계별 보존 no-ff merge + 메인테이너 후속 commit (A1).
작업지시자 시각 판정:
본질 정정 영역의 정확성: `recompose_for_cell_width` 영역 (composer.rs) + 3중 가드 — 한컴 LINE_SEG 비표준 영역의 본질 영역의 자체 재계산 영역 정합 (`project_hancom_lineseg_behavior` 메모리 룰 정합). 잔존 영역 분리 정합: Issue #672 (TAC 표 비례 축소 영역) — 별건 본질 영역 분리 영역의 깔끔한 분리 영역. 처리 보고서: `mydocs/pr/archives/pr_673_report.md` closes #671 |
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
작업지시자 지적 영역 정정: "이 컨트리뷰터도 여러번 PR 하신 분입니다." 직접 점검 결과 (gh pr list --author jangster77 --state all): - @jangster77 (Taesup Jang) 영역의 PR 영역 누적 13건 - HWP 3.0 파서 영역의 핵심 영역 컨트리뷰터 (PR #451 부터 누적) - 이전 영역의 review/report/orders 영역의 "첫 사이클" 영역 표현 영역 정정 정정 영역: - mydocs/pr/archives/pr_673_review.md (3 곳) - mydocs/pr/archives/pr_673_report.md (2 곳) - mydocs/orders/20260508.md (2 곳) 메모리 룰 신규 등록: - feedback_contributor_cycle_check — PR review 시작 시 gh pr list --author 영역 영역으로 누적 점검 의무 영역. "첫 사이클" 영역 임의 추정 금지 영역. - 핵심 컨트리뷰터 영역 명단 영역 영구 보존
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
closes #672 3 commits 단계별 보존 (Task #672 영역만 — Task #671 영역 commits 영역은 PR #673 영역에서 이미 머지됨): - 071e952 Stage 1: 본질 진단 + 임계값 평가 - b524c4f Stage 2: 본질 정정 — TAC 표 비례 축소 임계값 강화 - d071d37 Stage 3: 광범위 회귀 sweep + 최종 보고서 + orders 갱신 본질 정정: - src/renderer/height_measurer.rs:805 영역 단일 분기 - 정정 전: raw > common + 1.0 (절대값 1px 임계값) - 정정 후: raw > common + max(common * 2%, 1px) - 본질: 측정 오차 / line_height 보정 부산물 영역의 미세한 불일치 영역에서 비례 축소 발동 영역 → 셀 콘텐츠 클립 영역. 한컴 권위 영역: 작은 차이 영역 비례 축소 안 함 (계획서.hwp 1.32% 차이 영역 3 줄 정상 표시). - 187 fixture sweep 영역: ≤2% 7 건 면제, ≥5% 11 건 그대로 (의도적 압축 보존) 본 환경 검증: - cherry-pick: Task #672 commits 만 (Task #671 commits 는 PR #673 영역에서 머지됨) - Stage 1+2 깨끗, Stage 3 orders 영역 ours - cargo test --release ALL PASS (1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13) - clippy clean - 광범위 sweep 7 샘플 170 페이지: same=167 / diff=3 - 2010-01-06 p5 (1.97% 차이 면제) - synam-001 p19 / p31 (0.38~0.94% 차이 면제) 작업지시자 가설 점검: PR #673 영역의 A1 (자동보정 셀 폭 정정) 영역만으로는 본 PR 영역의 본질 영역 미해결 영역. 두 영역의 본질 영역 다름: - A1: LINE_SEG 채움 영역의 셀 폭 영역 정정 영역 - Task #672: HeightMeasurer 영역의 row_heights 비례 축소 영역의 임계값 영역 PR: #675 컨트리뷰터: @jangster77 (Taesup Jang) — 14번째 사이클 PR 잔존 분리: Issue #674 → PR #678 (paragraph_layout 줄 위치 vs row_heights 정합)
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
PR #675 (Task #672): TAC 표 비례 축소 임계값 강화 — 작은 차이 (≤2%) 면제 - merge commit: 877e020 (3 commits 단계별 보존 no-ff merge) - 본질: height_measurer.rs:805 영역 단일 분기 — TAC_SHRINK_THRESHOLD_RATIO = 0.02 - 187 fixture sweep: ≤2% 7 건 면제 / ≥5% 11 건 보존 - 본 환경 결정적 검증 1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13 + clippy clean - 광범위 sweep 7 샘플 170 페이지: same=167 / diff=3 (영향 영역만) - WASM 빌드 4,589,098 bytes 작업지시자 가설 점검: "#674 PR 메인테이너 자동보정으로 #675 문제 해결?" → ❌ 미정합 - 그대로 보기 영역 SVG md5 다름 (b66efd77 → cc174155, -706 bytes) - 두 영역 본질 다름: - PR #673 + A1: LINE_SEG 채움 영역의 셀 폭 정정 (document.rs) - PR #675: HeightMeasurer row_heights 비례 축소 임계값 (height_measurer.rs) 작업지시자 시각 판정: - 자동보정 영역 ★ 정합 (셀내 2줄 컨텐츠 한컴처럼 정렬) - 그대로 보기 영역 클립핑 유지 (PR #678 영역 잔존) 작업지시자 결정: 머지 유지 영역 (PR #678 머지 시 자연 해소 영역) 잔존 분리: Issue #674 → PR #678 (paragraph_layout 줄 위치 vs row_heights) closes #672 산출물: - mydocs/pr/archives/pr_675_review.md - mydocs/pr/archives/pr_675_report.md - mydocs/orders/20260508.md 갱신
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
…보정 — 마지막 줄 시각 클립 정정 closes #674 3 commits 단계별 보존 (Task #674 영역만 — Task #671/#672 영역 commits 영역은 PR #673/#675 영역에서 머지됨): - fda8601 Stage 1: 본질 진단 — 24px 오프셋 식별 - f50297b Stage 2: 본질 정정 — calc_para_lines_height 보정 - 230099f Stage 3: 광범위 회귀 sweep + 최종 보고서 + orders 갱신 본질 정정: - src/renderer/layout/table_layout.rs:746 영역 calc_para_lines_height 영역 시그니처 영역 + corrected_line_height 영역 보정 적용 (height_measurer.rs 영역과 동일 로직) - 호출자 영역 시그니처 정정: calc_cell_paragraphs_content_height + calc_composed_paras_content_height - 본질: line_segs 부재 셀 paragraph 영역의 fallback line_height (raw 5.33px) 영역이 폰트 보정 (corrected 21.33px) 영역 안 받아 영역 mechanical_offset 영역 잘못 계산 영역 → text_y_start 영역 24px 위로 밀림 영역 → 마지막 줄 cell-clip 초과 영역 → 시각 클립 영역 본 환경 검증: - cherry-pick: Task #674 commits 만 (Task #671/#672 영역은 PR #673/#675 영역에서 머지) - Stage 1+2 깨끗, Stage 3 orders 영역 ours - cargo test --release ALL PASS (1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13) - clippy clean - 광범위 sweep 7 샘플 170 페이지: same=170 / diff=0 ✅ Task #671 ~ #674 시리즈 완성: - #671: 셀 paragraph line_segs 부재 영역 — composer.rs (recompose_for_cell_width) - #672: TAC 표 비례 축소 영역 임계값 — height_measurer.rs:822 (2% 가드) - #674: calc_para_lines_height corrected_line_height 영역 — table_layout.rs:746 PR: #678 컨트리뷰터: @jangster77 (Taesup Jang) — 15번째 사이클 PR (HWP 3.0 파서 영역의 핵심 영역) 선행 PR: #673 (Task #671) + #675 (Task #672) 영역 머지 영역 후 영역
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
…즈 완성) PR #678 (Task #674): paragraph_layout 측정 corrected_line_height 보정 - merge commit: f8b38cc (3 commits 단계별 보존 no-ff merge) - 본질: calc_para_lines_height 영역의 corrected_line_height 보정 누락 영역 → 24px 영역 mechanical_offset 잘못 계산 → text_y_start 24px 위로 밀림 → 클립 - 정정: table_layout.rs:746 영역 시그니처 + 보정 + 호출자 시그니처 정정 - 본 환경 결정적 검증 1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13 + clippy clean - 광범위 sweep 7 샘플 170 페이지: same=170 / diff=0 ✅ - WASM 빌드 4,589,700 bytes - 작업지시자 시각 판정 ★ 통과 (그대로 보기 + 자동보정 영역 모두 정합) 🎉 Task #671~#674 시리즈 완성: - PR #673 (#671) — 셀 paragraph line_segs 부재 영역 → composer.rs (recompose_for_cell_width) - A1 (메인테이너) — 자동보정 col_width → cell_inner_width (document.rs) - PR #675 (#672) — TAC 표 비례 축소 임계값 → height_measurer.rs (2% 가드) - PR #678 (#674) — calc_para_lines_height corrected_line_height → table_layout.rs @jangster77 (Taesup Jang) — 15번째 사이클 PR (HWP 3.0 파서 영역 핵심 컨트리뷰터) 한컴 LINE_SEG 비표준 영역의 자체 재계산 영역 정합 영역 도달 영역 (project_hancom_lineseg_behavior) closes #674 산출물: - mydocs/pr/archives/pr_678_review.md - mydocs/pr/archives/pr_678_report.md - mydocs/orders/20260508.md 갱신
edwardkim
added a commit
that referenced
this pull request
May 8, 2026
PR #673 (Task #671) 영역에서 권위 자료 영역으로 영역 영구 보존 영역 등록된 samples/계획서.hwp 영역 (143KB) 영역 — 컨트리뷰터 영역 요청 영역으로 영역 삭제. 작업지시자 결정 영역: "컨트리뷰터의 요청대로 계획서.hwp 는 삭제합니다." 영향 영역: - 결정적 검증 1165 lib + clippy clean (회귀 0) - 진단 도구 (examples/inspect_task671.rs, inspect_task671_v2.rs, inspect_task672.rs) 영역은 본 환경 영역의 다른 fixture 영역으로 영역 동작 가능 영역 - 본 환경 영역의 fixture 영역에서 본 파일 영역 사용 영역 부재 영역 Task #671~#674 시리즈 영역의 본질 정정 영역은 모두 영역 적용 영역 보존 영역 (samples/계획서.hwp 영역 영역 의존 부재 영역).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
요약
samples/계획서.hwp1페이지 표 셀에서 단일 paragraph 가 셀 너비에 맞춰 다중 줄로 줄바꿈될 때 두 줄 이상이 같은 y 좌표에 겹쳐 그려지던 결함 정정.closes #671
본질 진단
samples/계획서.hwp의 모든 셀 paragraph 가line_segs.len() == 0상태 — 한컴이 PARA_LINE_SEG 를 의도적으로 인코딩하지 않은 케이스 (다른 정상 HWP5 파일은 셀 paragraph 에 정상 인코딩).본질 정정
신규 함수 (
src/renderer/composer.rs)3 중 가드 (회귀 0 보장):
para.line_segs.is_empty()— 한컴 인코딩 부재만composed.lines.len() == 1— fallback 단일 ComposedLine 만cell_inner_width_px— 너비 안에 들어가면 분할 불필요분할 전략: 단어 경계 (공백) 우선 + 단일 단어가 width 초과 시 글자 단위 break (CJK 안전).
호출 위치 (6곳)
composer.rstable_layout.rs:1226table_layout.rs:614/678/700table_partial.rs:94/358height_measurer.rs:527/712회귀 위험 영역 좁힘
compose_paragraph변경 없음)feedback_rule_not_heuristic+feedback_hancom_compat_specific_over_general정합.검증
cargo build --releasecargo test --lib --releasecargo test --release --test svg_snapshotcargo test --release --test issue_546cargo test --release --test issue_554cargo clippy --release광범위 페이지네이션 회귀 sweep
samples/폴더 전체 187 fixture 페이지 수 BEFORE/AFTER 비교:핵심 fixture 개별 검증 — aift / exam_kor / exam_math / exam_science / synam-001 / footnote-01 / hwp3-sample / hwp3-sample4 / hwp3-sample5 / 계획서 모두 차이 0.
시각 판정
samples/계획서.hwp1페이지 표:본 PR 의 본질 영역 (셀 paragraph line_segs 부재 → 줄겹침) 정정 완료.
잔존 결함 영역 (별도 Issue)
본 PR 정정 후 노출된 잔존 영역 (셀 [21] 마지막 줄 ~0.88px 클립 + 셀 [52] 3번째 paragraph 클립):
height_measurer.rs:822-830TAC 표 (treat_as_char=true) 비례 축소 메커니즘본 PR 본질 영역 (line_segs 부재) 과 다른 본질 (TAC 표 권위 영역 불일치) 으로 분리 —
feedback_hancom_compat_specific_over_general정합.권위 자료
samples/계획서.hwp(143KB, HWP 5.x) — 본 PR 의 권위 재현 영역. git tracked 영구 보존 영역으로 등록 (작업지시자 결정).진단 도구
examples/inspect_task671.rs— 셀 paragraph line_segs 검사examples/inspect_task671_v2.rs— recompose 결과 정밀 진단산출물
src/renderer/composer.rs,src/renderer/layout/table_layout.rs,src/renderer/layout/table_partial.rs,src/renderer/height_measurer.rsexamples/inspect_task671.rs,examples/inspect_task671_v2.rssamples/계획서.hwpmydocs/plans/task_m100_671{,_impl}.md,mydocs/working/task_m100_671_stage{1,2,3}.md,mydocs/report/task_m100_671_report.md커밋 시퀀스 (3 단계)