Task #1025: 페이지보다 큰 단일 표 셀 내부 분할 (intra-cell line split) (closes #1025)#1033
Closed
planet6897 wants to merge 1 commit into
Closed
Task #1025: 페이지보다 큰 단일 표 셀 내부 분할 (intra-cell line split) (closes #1025)#1033planet6897 wants to merge 1 commit into
planet6897 wants to merge 1 commit into
Conversation
…oses edwardkim#1025) 페이지보다 큰 단일 표 셀(rowspan 라벨 셀이 걸친 행의 거대 row_span==1 셀)이 edwardkim#993 컷 모델에서 원자 처리되어 본문 초과·잘림되던 문제(edwardkim#993/edwardkim#1022 후속) 해결. 행블록(row-block) 컷: - advance_row_block_cut (table_layout.rs): rowspan 블록 [b_start,b_end) 셀을 (row,col) 순서로 순회, 거대 row_span==1 셀을 줄 단위 분할. rs>1 라벨 셀은 첫 조각 소비·연속 조각 공란. parity 단위테스트(단일행=advance_row_cut 동등). - PageItem::PartialTable.is_block_split 플래그: page-larger 블록 분할만 블록-셀 컷으로 해석, 일반 분할(form-002 등)은 per-row 유지 → 무회귀. - 렌더러(table_partial.rs): is_block_split 시 rowspan 행 포함, rowspan_block_range/ block_cut_index 로 블록-셀 인덱싱(높이·줄범위). rs>1 라벨 셀 연속 공란. - 연속분 행-스킵 가드를 블록 컷에서 스킵(컷 보존), mid-page 분할은 진짜 page-larger(block_h>base_available)일 때만(아니면 deferred). 결과(AI 184p, 한컴 2022 PDF 정합): LAYOUT_OVERFLOW 27→25, 거대 셀 pi=272(854px)· pi=324(143px) 해소. PMR-007 표가 한컴 p63→p64 와 정합(거대 셀 문단 분할+헤더 반복 +rs=2 라벨 연속 공란). svg_snapshot 8/8, lib 1310, clippy 0. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
edwardkim
added a commit
that referenced
this pull request
May 20, 2026
@planet6897 23번째 PR (분할 표·측정 시리즈 5번째 마지막 마디: #1003→#1004→#1024→#1032→#1033). page-larger 단일 표 셀 (PMR-007 세부내용 셀 25문단 ≈ 1024px) 이 rowspan 라벨 셀 (rs=2) 이 걸친 행에 있어 `advance_row_cut` 의 row_span==1 셀만 다루는 #993 컷 모델에서 원자 처리되어 본문 143px 초과·용지 밖 잘림. row-block 컷으로 일반화. 본질: - src/renderer/layout/table_layout.rs (+170): `advance_row_block_cut` 신규 — rowspan 블록 [b_start, b_end) 셀을 (row,col) 순서로 순회, 거대 row_span==1 셀 줄 단위 분할, rs>1 라벨 셀 첫 조각 전량 소비 + 연속 조각 공란. + `row_block_cells` / `row_block_content_height` 헬퍼 (페이지네이터·렌더러 단일 권위). + parity 단위 테스트 2건 (단일 비-rowspan 행 = advance_row_cut 동등 + rowspan 거대 셀 분할). - src/renderer/pagination.rs (+6): PageItem::PartialTable.is_block_split 플래그 추가 — page-larger 분할만 새 모드, 기존 분할 (form-002 등) 은 false 유지 (backward-compatible). - src/renderer/layout/table_partial.rs (+170/-29): is_block_split=true 렌더 — rowspan 행 포함, rowspan_block_range/block_cut_index 로 블록-셀 인덱싱, rs>1 라벨 셀 연속 공란. - src/renderer/typeset.rs (+83/-6): mid-page 분할 게이트 (block_h > base_available 일 때만 진짜 page-larger 활성, 아니면 deferred). 연속분 행-스킵 가드 블록 컷에서 스킵 (컷 보존). - src/renderer/{layout.rs, page_number.rs, pagination/engine.rs, document_core/queries/rendering.rs} 최소 변경. 검증 (본 환경): - cargo test --release --lib **1319 passed** (+2 block_cut tests) - cargo test --release --tests 모든 통합 passed (issue_852 5/5 + svg_snapshot 8/8 + table-vpos-01 13/13 + issue_938 3/3 등) - cargo fmt --all --check clean - cargo clippy 통과 - sweep 7 fixtures: **diff=0 전체** — page-larger 케이스가 공개 fixture 에 없음. PR #1031/#1032 회귀 부재 + 일반 분할 form/일반 fixture 무변경 입증 - WASM Docker 빌드 4.89MB (+30KB) + rhwp-studio 동기화 - 작업지시자 시각 판정 통과 cherry-pick 자연 통합: - PR base = a52859d (PR #1032 이전), origin/devel = 5263f53 - cherry-pick auto-merge 로 PR #1031 (build_page_borders) + PR #1032 (HeightCursor / vpos_snap_current_height 13건) 영역 자동 보존 - PR #1033 변경 (advance_row_block_cut + is_block_split) 통합 검증 권위 PR 본문 명시 (AI 184p 비공개 RFP, 본 환경 미접근): - LAYOUT_OVERFLOW 27→25 - pi=272 세부 셀 (854.9px) 해소 - pi=324 PMR-007 (143.9px) 2-프래그먼트 분할 한컴 2022 PDF 정합 @planet6897 분할 표·측정 시리즈 마무리 (#1003+#1004+#1024+#1032+#1033). closes #1025 Co-Authored-By: Jaeook Ryu <planet6897@users.noreply.github.com>
Owner
|
Merged via cherry-pick (commit ece1734, author @planet6897 보존) into devel 본 환경 검증 통과: cargo test 1319 + 통합 + clippy/fmt + sweep 7 fixtures diff=0 + WASM 4.89MB + 작업지시자 시각 판정. PR base = a52859d (PR #1032 이전), origin/devel = 5263f53 (PR #1032 머지 후). cherry-pick auto-merge 로 PR #1031 (build_page_borders) + PR #1032 (HeightCursor 13건) 영역 자동 보존 — 세 PR 영역 양립. @planet6897 분할 표·측정 시리즈 마무리 (#1003+#1004+#1024+#1032+#1033) — 5번째 마지막 마디. closes #1025 |
edwardkim
added a commit
that referenced
this pull request
May 20, 2026
PR #1033 (closes #1025) 머지 후속 처리: - mydocs/pr/archives/pr_1033_review.md (검토 문서 archives 이동) - mydocs/orders/20260520.md (PR #1033 entry 추가) - rhwp-studio/public/{rhwp.d.ts,rhwp.js,rhwp_bg.wasm} (WASM 4.89MB 동기화) @planet6897 분할 표·측정 시리즈 마무리 5번째 마지막 마디 (#1003+#1004+#1024+#1032+#1033). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 20, 2026
…격차 종합 정정 @jangster77 25+번째 PR (paper_based outline 시리즈 #1011/#1015/#1031 마무리 후 HWP3 sample16 정합 시리즈 진입). samples/hwp3-sample16.hwp 한컴 한글 정답지 비교 4 격차 종합 정정. src/parser/hwp3/ 격리 엄격 (HWP5/HWPX/renderer 무수정). 본문 가설 정반대 발견: 원본 이슈 가설(HWP5 변환본 gradient strip) 이 한컴 한글 정답지 시각 검증 결과 정반대로 판명 (gradient 가 정답, HWP3 회귀). issue body + 수행/구현계획서 v2 재작성 — feedback_visual_judgment_authority 모범 사례. 본질 (2 코드 + 1 test + 9 문서): - 격차 A — HWP3 Shape gradient IR 매핑 (drawing.rs:792~830): HWP3 raw Hwp3DrawingObjectGradientAttr 가 이미 파싱되었으나 Fill IR 구축에서 fill_type=Solid 하드코딩으로 데이터 무시. HWP5 doc_info.rs:404 와 동일 contract 로 GradientFill 주입. - 격차 B — Shape border LineType 2~7 → Solid normalize (drawing.rs:758~785): HWP3 raw style=0x0002 (LineType=2 Dash) 가 점선 렌더되나 한컴은 실선. sample16 한정 분포 — narrow fix 회귀 risk 0. - 격차 C — HWP3 heading decoration 휴리스틱 strip (mod.rs:2870~2960): "═════■ 1.추진목적 ■═════" 형태 decoration 을 fixup_hwp3_heading_decoration + strip_heading_decoration 패턴 detection 으로 strip. 한컴 변환기 mimic. - 격차 D-1 — CharShape dedupe (mod.rs:1869~1900): 같은 start_pos 에 rep + inline shape change 양쪽 push 시 마지막 (inline override) 유지. - 격차 D-2 — 폰트명 매핑 (mod.rs:2570~2585, 2908~2924): "신명조"→"HY신명조" 등 5 legacy 매핑 + font.alt_name 원본 보존. HWP3 SVG 좌표가 HWP5 변환본과 byte-for-byte 일치. 검증 (본 환경): - cargo test --release --lib 1319 passed - cargo test --release --tests 모든 통합 passed - cargo test --release --test issue_1008_gradient **4/4 passed**: hwp3_sample16_business_box_has_gradient, _border_solid, _heading_decoration_stripped, _font_name_mapped_to_hwp5_convention - cargo fmt --all --check clean - sweep 9 fixtures: hwp3-sample16 **44 diff** (의도된 본 PR 본질, 페이지 수 64→64 불변) / 다른 8 fixtures (HWP5/HWPX 변환본 + sample10/11/sample + exam_kor/aift/biz_plan) **diff=0** — HWP3 격리 검증, PR #1031/#1032/ #1033 회귀 부재 - SVG 본질 검증: cover <radialGradient id="grad1" #c8ccf8→#ffffff> 추가 + 폰트 "신명조"→"HY신명조" 매핑 - WASM Docker 빌드 4.89MB + rhwp-studio 동기화 - 작업지시자 시각 판정 통과 squash 적용: - PR base = 5263f53 (PR #1032 후 docs commit) — PR #1033 (01a8c75) 미흡수 - cherry-pick 직접 머지 대신 본질 파일만 origin/devel 위에 squash 적용 (src/parser/hwp3/{drawing.rs, mod.rs} + tests/issue_1008_gradient.rs + 문서 8 파일, 총 11 파일) - 결과: PR #1033 영역 (src/renderer/*, advance_row_block_cut, is_block_split) 자동 보존 + 본 PR 본질 적용 한계 (PR 본문 명시): - 휴리스틱 (격차 C): HWP3 spec 미참조 패턴 detection — 의도된 "═══...■...■═══" typography 회귀 risk. sweep diff=0 으로 1차 입증 - 폰트 매핑 5 legacy 한정: 다른 명칭 발견 시 확장 필요 - 공백 cosmetic 비범위: rhwp "1.추진목적" vs 한컴 "1. 추진목적" period 뒤 공백 — HWP3 raw 부재, 한컴 자동 삽입 closes #1008 Co-Authored-By: Taesup Jang <tsjang@gmail.com>
This was referenced May 20, 2026
edwardkim
added a commit
that referenced
this pull request
May 20, 2026
…류 + native/WASM 동기화 @HaimLee-4869 4번째 기여 (1차 옵션 B 보류 후 KTX 회귀 가드 + rebase 후 재제출). 휴먼명조/HY중고딕/HY신명조/HY견명조 폰트의 좁은 구두점 (U+2018 ', U+2019 ', U+2027 ‧) 폭이 한컴 대비 ~4px 과대 문제 fix. 폰트 메트릭 DB fullwidth 잘못 기록 + WASM path 동기화 누락이 본질. 본질 (3 hunks, 모두 src/renderer/layout/text_measurement.rs): - H1. is_narrow_punctuation 확장 — DB 미수록 폴백 path 정정 (U+2018, U+2019, U+2027 추가). - H2. measure_char_width_embedded narrow override — DB fullwidth 정정 (em/2 = 0.5em → 0.3em, glyph_w >= em_size 조건으로 정상 DB 값 영향 0). - H3. wasm_internals::measure_char_width_hwp narrow 분기 추가 — WASM path 동기화 (native EmbeddedTextMeasurer 와 일관). ★ native + WASM 두 path 정책 (본가 PR #900 패턴 정합, PR #1021 영역 확정): rhwp 의 문자 폭 측정은 native CLI (EmbeddedTextMeasurer) 와 rhwp-studio Canvas (WasmTextMeasurer 영역 wasm_internals::measure_char_width_hwp) 두 구현으로 병존. char/layout fix 는 두 path 동시 점검 필수. 재제출 변경 (PR 본문 "C8+C9 소스 로직 변경 없음"): - 최신 devel rebase (bbd38e8, PR #1033 머지 후 base) - **KTX 회귀 가드 신규** tests/issue_874_ktx_toc_page_number_right_align.rs (98 lines) — render_page_svg_native SVG 의 페이지번호 digit max_x < 695.0 단언. 정상 ≤690.8 / 회귀 시 ≈699.76. PR #1021 정합 영구화. - golden 갱신 (issue-157 굴림체 + issue-617 HY신명조). issue-267 KTX golden 보존 (1차 검토 시 변경됐던 영역, 본 재제출에서 정정). 검증 (본 환경): - cargo test --release --lib 1319 passed + 통합 모두 passed - cargo test --release --test issue_874_ktx_toc_page_number_right_align **1 passed** (페이지번호 정합 정량 입증) - cargo test --release --test svg_snapshot **8/8 passed** (issue_267_ktx_toc_page 포함) — KTX golden 무회귀 - cargo fmt --all --check clean - sweep 7 fixtures (550 SVGs): 32 diff = 모두 본 PR 본질 (KTX 9 휴먼명조 / hwp3-sample16-hwp5 1 + exam_kor 17 + aift 5 HY신명조 narrow 정합) / 페이지 수 회귀 부재 / 함초롬바탕 / Pretendard / 맑은 고딕 무영향 - KTX page 002 (목차) 페이지번호 좌표 BEFORE = AFTER (1차 회귀 부재) - WASM Docker 빌드 4.89MB + rhwp-studio 동기화 - 작업지시자 시각 판정 통과 (KTX 페이지번호 정합 유지 + 휴먼명조 narrow 정합 한컴 정답지 정합) 1차 검토 회귀 원인 재정정: - 1차 보고서 (mydocs/pr/archives/pr_1026_report.md) 의 "H2 분기 순서 변경" 추정이 잘못된 분석으로 판명. 진짜 원인은 1차 cherry-pick + UPDATE_GOLDEN 일괄 갱신 (issue-267 KTX golden 도 함께 변경) 또는 통째-파일 교체로 PR #1021 코드 유실 (KTX 회귀 가드 코드 본문 명시). - 본 PR 재제출에서 KTX 회귀 가드 (issue_874) 영구화 + issue-267 golden 보존으로 1차 결함 정정. 회귀 영향 (의도적 분리): - 함초롬바탕 / Pretendard / 맑은 고딕: DB narrow 정확 기록, 영향 0 - U+00B7 ('·' Middle Dot): 본가 Task #257 + #630 영역 이미 처리. Task #630 "DB 전각 측정 유지 결정" trade-off 충돌 없음 - 다른 punctuation (콤마, 마침표, 콜론 등): 분기 조건 영향 0 별도 PR 권장 영역 (PR 본문 명시): - U+00B7 본문 영역 시각 NG: Task #630 context-aware 처리 후속 - U+2014 / U+2016 등 다른 General Punctuation block - HY family fallback 메트릭 보정 (별도 트랙) Refs PR #1021 Co-Authored-By: HaimLee-4869 <j_haim4869@naver.com>
edwardkim
pushed a commit
that referenced
this pull request
May 21, 2026
#1037) HWP3 → HWP5 변환본 의 raw ParaShape 값이 한컴 변환기에 의해 2× scaled 저장되는 quirk 를 parser 단계 normalize + 문단모양 dialog margin/indent 표시 산식을 raw_ps 직접 사용 + HWP3/HWP5 변환본 unit semantic 차이 분기로 한컴 정답 정합 달성. 3 본질 코드 파일: - src/parser/mod.rs (+16): is_hwp3_variant 직후 ParaShape margin_left/right + indent + spacing_before/after /= 2 (한컴 변환기 2× quirk parser 단계 normalize) - src/renderer/style_resolver.rs (+5/-4): 종전 variant_div=4 (Task #1001 case-specific 보정) → uniform variant_div=2 — parser normalize 후 normal HWP5 동등 처리 - src/document_core/commands/formatting.rs (+20/-1): build_para_properties_json dialog margin/indent 산식 raw_ps 직접 + variant 분기 (HWP3 native: effective first-line = margin_left + min(0, indent), HWP5 변환본: raw 직접) 효과 (sample16 p452 / p97 동일 paragraph 비교): - dialog 4 필드 한컴 정합: 왼쪽 40 / 오른쪽 10 / 내어쓰기 20 / 문단위 8.5 - HWP3 + HWP5 변환본 모두 한컴 정답 정합 - rendering 무변동: spacing_before /2 + variant_div /2 = 종전 /4 동등 → 페이지 수 64 + PR #1036 alignment 60/64 유지 - 회귀 부재 sweep: 변환본 9종 + HWP3 + 일반 fixture 모두 페이지 수 무변동 작업지시자 시각 검증 — "(3) 원격지 재해복구센터(DR: Disaster Recovery) 구축" paragraph 에서 한컴 / rhwp HWP3 / rhwp HWP5 변환본 dialog 완전 정합. 자동 검증: - cargo build --release ✓ warning 0 - cargo clippy --release --lib -- -D warnings ✓ clean - cargo fmt --all -- --check ✓ clean - cargo test --release --lib ✓ 1308 passed (PR #1036 회귀 가드 양립) - cargo test --release --tests ✓ FAILED 0 - CI 모두 SUCCESS (Build & Test / CodeQL / Canvas visual diff) PR #1036 (Task #1035, closed) 잔존 후속: - PR #1036 의 alignment 60/64 (93.75%) 달성 후 잔존 미정합 4 페이지 + p23 overflow 의 본질 = HWP5 변환본 paragraph height 2× — 본 PR 정정 - PR base bbd38e8 (PR #1033 머지 후) 로 multi-merge 상태 — 본질 3 코드 파일만 origin/devel (402e0ce = PR #1036 머지 후) 위에 cherry-pick squash 적용 Stage 4 negative result (PR 본문 명시): - page break vpos==0 휴리스틱: Recall 31.6%, FP 4 (부적합) - p23 overflow line_seg 합성 옵션 B': Task #1010 회귀 (+24 페이지) - 잔존 2 이슈 (p23 overflow + page_break_before 손실) 별도 task 분리 권고 closes #1037 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 21, 2026
…malize + Dialog 한컴 정합 fix @jangster77 (Taesup Jang) PR #1040 — closes #1037 (M100, v1.0.0). PR #1036 (Task #1035, 방금 머지) 잔존 본질 해결. 핵심: - HWP3 → HWP5 변환본 ParaShape margin/indent/spacing 2× quirk parser 단계 normalize - Dialog 4 필드 한컴 정합 (왼쪽 40 / 오른쪽 10 / 내어쓰기 20 / 문단위 8.5 — HWP3 + HWP5 변환본 모두 정합) - style_resolver variant_div 종전 4 (case-specific Task #1001) → uniform 2 단순화 - build_para_properties_json raw_ps 직접 사용 + is_hwp3_variant 분기 검증: - cargo test --release --lib: 1319 passed (PR #1036 회귀 가드 양립) - cargo test --release --tests: FAILED 0 (전체 통합) - cargo clippy --release --lib -D warnings: clean - cargo fmt --check: clean - 10 fixture BEFORE/AFTER diff = 0 (rendering 무변동 정량 입증) - 작업지시자 시각 판정 통과 (dialog 4 필드 한컴 정합) PR base bbd38e8 (PR #1033 머지 후) → origin/devel 402e0ce (PR #1036 머지 후 + docs) cherry-pick squash. 본질 3 코드 파일 + Task #1037 plans/working/report 7 문서 적용. 잔존 후속 (PR 본문 명시): p23 overflow + page_break_before 손실 별도 task 분리 권고.
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.
문제 (#993/#1022 후속)
페이지보다 큰 단일 표 셀(요구사항 명세 표 PMR-007 의 세부내용 셀, 25문단 ≈ 1024px)이 rowspan 라벨 셀(상세설명, rs=2)이 걸친 행에 있어,
advance_row_cut이row_span==1셀만 다루는 #993 컷 모델에서 원자 처리 → 분할 불가 → 본문 143px 초과·용지 밖 잘림.해결 — 행블록(row-block) 컷
advance_row_block_cut(table_layout.rs): rowspan 블록[b_start,b_end)셀을(row,col)순서로 순회, 거대row_span==1셀을 줄 단위 분할. rs>1 라벨 셀은 첫 조각 소비·연속 조각 공란. parity 단위테스트(단일행=advance_row_cut동등).PageItem::PartialTable.is_block_split플래그: page-larger 블록 분할만 블록-셀 컷으로 해석, 일반 분할(form-002 등)은 per-row 유지 → 무회귀.table_partial.rs): is_block_split 시 rowspan 행 포함,rowspan_block_range/block_cut_index로 블록-셀 인덱싱(높이·줄범위), rs>1 라벨 셀 연속 공란.block_h > base_available)일 때만(아니면 deferred).검증 (AI 제안요청서 184p, 한컴 2022 PDF 정합)
한컴 PDF 시각 재판정(pi=324 PMR-007): rhwp 분할이 한컴 2022 PDF p63→p64 와 정확히 일치 — ① 거대 셀 문단 경계 분할, ② 헤더 행 반복, ③ rs=2 라벨 셀(상세설명/세부내용) 연속 페이지 공란.
비범위
🤖 Generated with Claude Code