Skip to content

Task #680: nested 1x1 wrapper 표 외곽 테두리 누락 정정#681

Closed
planet6897 wants to merge 2 commits into
edwardkim:develfrom
planet6897:pr-task680
Closed

Task #680: nested 1x1 wrapper 표 외곽 테두리 누락 정정#681
planet6897 wants to merge 2 commits into
edwardkim:develfrom
planet6897:pr-task680

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

요약

src/renderer/layout/table_layout.rs::layout_table 의 1x1 wrapper 분기가 외부 1x1 표를 무시하고 내부 nested 표만 직접 layout 하면서, 외부 1x1 표가 자료 박스 외곽 테두리 역할 (padding + border_fill 정의) 인 경우 외곽선이 SVG 출력에서 누락되던 결함 정정.

권위 자료

samples/exam_social.hwp 페이지 1 단 1 의 4번 자료 박스 (대화체):

  • 외부 1x1: padding=(850,850,850,850) (3mm), border_fill_id=6
  • 내부 6x3: 대화체 셀 16개 (그림 6개 포함, bin_id=1~6)
  • 한컴2022 PDF (pdf/exam_social-2022.pdf) 에서 외곽 박스 시각 정합

SVG 검증 (devel baseline d58217be)

grep -E '<rect [^/]*411\.92[^/]*' exam_social_001.svg 결과 width=411.92 rect 3개 — nested wrapper pi=15 외곽선 누락 확인:

pi 구조 SVG 외곽 rect (BEFORE)
1, 5 (단 0), 21 (단 1) simple 1x1 ✅ 출력
15 (단 1) nested 1x1+6x3 누락

정정 — wrapper 분기에 외곽선 추가

table_layout.rs:152 wrapper 분기 진입 시 3 조건 AND 만족 시 외곽 4개 라인 (좌/우/상/하) 을 col_node 에 추가:

# 조건 의도
A depth == 0 top-level 표만
B 외부 셀 padding != 0 (4 방향 OR) 자료 박스 의미 있음
C border_fill.borders 중 하나라도 BorderLineType::None 이 아님 테두리 정의

3 조건 모두 충족 시에만 외곽선 추가 → 회귀 영역 좁힘.

외곽 박스 size — nested layout 결과 사용

// width: nested 표 측정 너비
let nested_w = hwpunit_to_px(nested.common.width as i32, dpi);
// height: nested layout 실제 결과 (y_end - y_start)
let outer_h_actual = (y_end - outer_y).max(0.0);

외부 표 IR size (411.92×370.32) 가 아닌 nested 측정 결과 (390.65×343.88) 사용 → 내부 표 영역과 정확히 정합. 외부 표 IR size 사용 시 5번 박스 (y=935.83) 와 위치 부정합 발생.

4번 박스 외곽 SVG (AFTER)

좌: x=549.88, y=331.53 → 675.41  stroke=#000000 width=0.75
우: x=940.53, y=331.53 → 675.41
상: y=331.53, x=549.88 → 940.53
하: y=675.41, x=549.88 → 940.53

5번 박스 (y=935.83~1198.76) 와 ~260px 갭 — 겹침 없음.

회귀 차단 가드

tests/issue_nested_table_border.rs (1 통합 테스트):

  • nested_table_border_exam_social_p1_q4_outline_present — 페이지 카운트 4 + 4번 박스 외곽 4개 라인 좌표 검증

검증

항목 결과
cargo build --release ✅ 통과
cargo test --release --lib 1155 passed, 0 failed (회귀 0)
cargo test --release (통합) ✅ all GREEN
issue_nested_table_border ✅ 1/1
광범위 sweep (samples/ 187 fixture) 페이지 카운트 변동 0 (외곽 박스만 추가, 페이지 분할 로직 무관)

시각 영향

  • 4번 박스 외곽 4개 라인 (stroke=#000000, width=0.75) 출력
  • 내부 6×3 셀들은 wrapper 분기 그대로 → 시각 위치 변경 없음
  • 다른 nested 표 케이스: 외부 셀 padding=0 또는 border_fill borders 모두 None 인 경우 (pure wrapper) 가드 미발동, 기존 동작 유지

주의 사항 (정합 한계)

본 정정은 외곽 박스만 추가. 외부 셀 padding (3mm) 영역 적용은 미포함 — 내부 표가 외곽 박스 가장자리까지 닿음. 한컴2022 PDF 는 padding 안쪽으로 내부 표 inset.

padding 정합은 별도 후속 영역 (wrapper 분기 본질 정정 또는 nested padding inset). 본 PR 은 "박스가 안 보임" 결함의 1차 정정 — 박스 외곽이 시각상 표시되는 영역 충족.

Test plan

  • cargo test --release --lib (1155 passed)
  • cargo test --release --test issue_nested_table_border (1/1)
  • cargo build --release
  • samples/ 187 fixture 페이지 카운트 sweep (회귀 0)
  • grep 으로 4번 박스 외곽 4개 라인 좌표 검증 (390.65×343.88, x=549.88940.53, y=331.53675.41)
  • 메인테이너 시각 판정 (rhwp-studio web editor 또는 SVG 출력)

Closes #680

🤖 Generated with Claude Code

planet6897 and others added 2 commits May 7, 2026 22:56
`src/renderer/layout/table_layout.rs::layout_table` 의 1x1 wrapper 분기는
외부 1x1 표를 무시하고 내부 nested 표만 직접 layout 한다. 외부 1x1 표가
자료 박스 외곽 테두리 역할 (padding + border_fill 정의) 인 경우 외곽선이
SVG 출력에서 누락되었다.

샘플:
- samples/exam_social.hwp 페이지 1 단 1 4번 자료 박스 (pi=15)
  - 외부 1x1: padding=(850,850,850,850), border_fill_id=6
  - 내부 6x3: 대화체 셀 16개 (그림 6개 포함)
  - 한컴2022 PDF (pdf/exam_social-2022.pdf) 에서 외곽 박스 시각 정합

정정: wrapper 분기 진입 시 다음 조건 AND 만족 시 외곽 4개 라인을
col_node 에 추가 (회귀 영역 좁힘):

  A) depth == 0 (top-level 표)
  B) 외부 셀 padding ≠ 0 (자료 박스 의미 있음)
  C) border_fill 의 borders 중 하나라도 None 아님 (테두리 정의)

외곽 박스 size 는 외부 표 IR size 가 아니라 nested layout 결과 사용:
  - width: nested.common.width (nested 표 측정 너비)
  - height: y_end - y_start (nested layout 실제 결과 높이)

→ 내부 표 영역과 정확히 정합. 외부 표 IR size (411.92×370.32) 사용 시
   nested 측정 결과 (390.65×343.88) 와 차이로 5번 박스와 위치 부정합.

회귀 차단 가드: tests/issue_nested_table_border.rs (1 통합 테스트)
- 4번 박스 외곽 4개 라인 좌표 검증 (390.65×343.88, x=549.88~940.53,
  y=331.53~675.41)

검증:
- cargo test --release --lib: 1155 passed (회귀 0)
- cargo test --release (통합): all GREEN
- issue_nested_table_border 1/1
- build --release
- 광범위 sweep (samples/ 187 fixture): 페이지 카운트 변동 0
  (외곽 박스만 추가, 페이지 분할 로직 무관)

시각 영향: 4번 박스 외곽 4개 라인 (stroke=#000000, width=0.75) 출력.
내부 6×3 셀들은 wrapper 분기 그대로 → 시각 위치 변경 없음.

주의 사항: 본 정정은 외곽 박스만 추가. 외부 셀 padding (3mm) 영역
적용은 미포함 (내부 표가 외곽 박스 가장자리까지 닿음). 한컴2022 PDF
는 padding 안쪽으로 내부 표 inset — 이는 별도 후속 영역 (wrapper
분기 본질 정정 또는 nested padding inset).

Closes edwardkim#680

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CI Build & Test 실패 원인 정정: clippy::needless_late_init lint 위반 2건.
outer_x_for_box / outer_w_for_box 를 분리 선언 후 단일 경로 대입 패턴 →
대입 시점에 let 바인딩으로 통합.

분기 없이 단일 경로로 대입되는 코드 흐름이라 늦은 초기화 불필요.
기존 동작 변경 없음 (clippy 경고만 해소).

검증:
- cargo build --release ✅
- cargo test --release --test issue_nested_table_border ✅ (1/1)
edwardkim added a commit that referenced this pull request May 8, 2026
closes #680

2 commits 단계별 보존:
- 1787731 Task #680: nested 1x1 wrapper 표 외곽 테두리 누락 정정
- 2eca210 Task #680: clippy needless_late_init 정정 (CI rustc 1.95.0)

본질 정정:
- src/renderer/layout/table_layout.rs:152 wrapper 분기 영역에 외곽선 추가
- 3 조건 AND 가드: depth==0 + 외부 셀 padding != 0 + border_fill borders not None
- nested 측정 결과 영역 사용 영역 (외부 표 IR size 영역 사용 시 5번 박스 위치 부정합)
- 외곽 4개 라인 (좌/우/상/하) col_node 추가

본 환경 검증:
- cherry-pick 충돌 0건 (Auto-merging table_layout.rs)
- cargo test --release ALL PASS 1165 lib + svg 7/7 + clippy clean
- issue_nested_table_border ❌ 실패 (hardcoded 좌표 영역 PR #679 머지 후 영역 시프트 ~6.67px)
- 외곽선 4개 라인 영역 SVG 영역 정상 출력 영역 (직접 grep 영역 검증)

PR: #681
컨트리뷰터: @planet6897 (Jaeuk Ryu) — 30+ 사이클 핵심 컨트리뷰터
작업지시자 시각 검증: 'wasm 빌드해보세요' 영역 (웹 에디터 안 보임 영역 영역 점검)
edwardkim added a commit that referenced this pull request May 8, 2026
PR #681 (Task #680): nested 1x1 wrapper 표 외곽 테두리 누락 정정
- merge commit: e8671d6 (2 commits 단계별 보존 no-ff merge)
- 본질: table_layout.rs:152 wrapper 분기 영역에 외곽선 추가
  (3 조건 AND 가드 + nested 측정 결과 영역 사용)
- 본 환경 결정적 검증 1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13 + clippy clean
- 회귀 차단 가드 hardcoded 좌표 fragility 발견 (PR #679 머지 후 ~6.67px 시프트)
- WASM 빌드 4,597,064 bytes
- 작업지시자 시각 판정: 1차 stale WASM 회귀 → 2차 WASM 빌드 후 ★ 통과

잔존 후속: (a) 회귀 차단 가드 hardcoded 좌표 정정 (b) padding 정합 (외부 셀 padding 3mm inset)

컨트리뷰터: @planet6897 (Jaeuk Ryu) — 30+ 사이클 핵심 컨트리뷰터

closes #680
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 님 30+ 사이클 PR 처리 완료입니다.

본 환경 검증 결과:

결정적 검증 통과:

  • `cargo test --release` → ALL PASS (1165 lib + svg_snapshot 7/7 + issue_546/issue_554 13/13)
  • `cargo clippy --release` → clean

광범위 회귀 sweep: 회귀 0 ✅

4번 박스 외곽선 SVG 직접 검증:
```
좌: x="549.88" y1="324.87" y2="668.75" stroke="#000000" width="0.75"
우: x="940.53" y1="324.87" y2="668.75"
상: y="324.87" x1="549.88" x2="940.53"
하: y="668.75" x1="549.88" x2="940.53"
```
→ 4 라인 모두 영역 정상 출력 영역 ✅

WASM 빌드 (`pkg/rhwp_bg.wasm` 4,597,064 bytes) 후 작업지시자 시각 판정:

  • 1차 (WASM 빌드 전 영역): 외곽선 부재 영역 — dev server 영역 stale WASM 영역 영역
  • 2차 (WASM 빌드 후 영역): ★ 통과 — "웹 캔바스로 기존 박스가 안 보이던 문제가 해결되었음을 확인했습니다."

처리: 2 commits 단계별 보존 no-ff merge.

  • merge commit: `e8671d62`
  • devel push: `89c872ef..2fd3ea7`

본질 정정 영역의 정확성: `table_layout.rs:152` wrapper 분기 영역의 외곽선 추가 영역 — 3 조건 AND 가드 (depth==0 + outer padding != 0 + border_fill borders not None) + nested 측정 결과 영역 사용 영역 (외부 표 IR size 영역 영역 5번 박스 위치 부정합).

회귀 차단 가드 영역의 fragility 영역: `tests/issue_nested_table_border.rs` 영역의 hardcoded 좌표 (y=331.53/675.41) 영역 영역 PR #679 (Task #676) 영역 머지 후 영역 ~6.67px 시프트 영역 영향 영역 영역 → 본 환경 (y=324.87/668.75) 영역과 정합 부재 영역. 본 PR 본질 (외곽선 4 라인 SVG 정상 출력) 영역 정합 영역. 후속 영역 정정 권장 영역.

잔존 영역 분리 (PR 본문 명시):

  • padding 정합 영역 (외부 셀 padding 3mm 영역 inset 적용 영역) — 별도 후속 영역
  • 회귀 차단 가드 hardcoded 좌표 정정 영역 — 별도 후속 영역

처리 보고서: `mydocs/pr/archives/pr_681_report.md`

closes #680

@edwardkim edwardkim closed this May 8, 2026
edwardkim added a commit that referenced this pull request May 8, 2026
closes #677

1 commit (2a400aa):
- pi=16 PartialParagraph y 누적 결함 정정 (layout.rs:2120-2147)
- U+F081C HWP PUA 채움 문자 폭 0 정정 (text_measurement.rs)
- 한컴 워터마크 모드 변환 미적용 정정 (svg.rs + web_canvas.rs)

본 환경 검증:
- cherry-pick 충돌 0건
- cargo test --release ALL PASS (1165 lib + svg_snapshot 8/8 (issue_677 신규 포함) + issue_546/issue_554 13/13 + clippy clean)
- issue_nested_table_border 영역 잔존 영역 (PR #681 hardcoded 좌표 fragility)
- 광범위 sweep 7 샘플 170 페이지: same=169 / diff=1 (aift p1 영역 PR #687 정정 부수 영향 영역)

핵심 시각 판정 게이트:
- samples/복학원서.hwp p1: pi=16 overflow 273.1→2.5px, 3×3 표 x=716→63.69, 워터마크 정합
- samples/aift.hwp p1: 인라인 TAC + PartialParagraph 패턴 영역의 +8.43px 시프트 (정정 부수 영향 영역)

PR: #687
컨트리뷰터: @planet6897 (Jaeuk Ryu) — 30+ 사이클 핵심 컨트리뷰터
edwardkim added a commit that referenced this pull request May 8, 2026
CI failure 영역 본질:
PR #681 영역의 회귀 차단 가드 영역 영역 PR #679 (Task #676 trailing empty paragraph)
영역 머지 영역 후 영역 ~6.67px 시프트 영역 영향 영역 영역 hardcoded 좌표
(y=331.53/675.41) 영역 영역 본 환경 (y=324.87/668.75) 영역과 정합 부재 영역으로
영역 실패 영역. CI 영역에서도 영역 동일 실패 영역 (devel 영역 push 후 영역).

PR #687 (Task #677) 영역의 layout.rs:2120-2147 영역 정정 영역 영역 추가 영역으로
영역 인라인 TAC + PartialParagraph 패턴 영역의 fixture 영역 (aift, exam_social) 영역
영역 영역 시프트 영역 영향 영역 영역 추가 영역 발생 영역.

정정 (메인테이너 hardcoded 좌표 영역 fragility 정정):
- y 좌표 영역 hardcoded 영역 회피 영역
- x 좌표 영역 (lx=549.88, rx=940.53) 영역과 stroke 영역 본질 영역만 영역 검증
- 외곽선 4 라인 영역의 본질 (좌수직 / 우수직 / 수평) 영역 영역 검증 영역

본 정정 영역 영역 테스트 영역만 영역 변경 영역 (src 영역 영역 무영향) 영역 → WASM
영역 재빌드 영역 불필요 영역.

Refs #680 #677
edwardkim added a commit that referenced this pull request May 8, 2026
PR #687 (Task #677): 복학원서.hwp PDF 정합 결함 정정
- merge commit: f0dec67 (1 commit cherry-pick no-ff merge)
- 본질 3 결함: pi=16 PartialParagraph y 누적 + U+F081C 폭 + 워터마크 모드 변환
- 본 환경 결정적 검증 1165 lib + svg_snapshot 8/8 + issue_546/issue_554 13/13 + clippy clean
- 광범위 sweep 7 샘플 170 페이지: same=169 / diff=1 (aift p1 부수 영향 영역)
- WASM 빌드 4,595,889 bytes
- 작업지시자 시각 판정 ★ 통과

CI Failure 메인테이너 후속 정정 (commit abef8ca):
- PR #681 영역 회귀 차단 가드 hardcoded 좌표 fragility 영역
  → y 좌표 hardcoded 회피 + x 좌표 + stroke 본질만 검증

컨트리뷰터: @planet6897 (Jaeuk Ryu) — 30+ 사이클 핵심 컨트리뷰터

closes #677

산출물:
- mydocs/pr/archives/pr_687_review.md
- mydocs/pr/archives/pr_687_report.md
- mydocs/orders/20260508.md 갱신
- 회귀 차단 가드 영구 보존: tests/svg_snapshot.rs + tests/golden_svg/issue-677/
edwardkim added a commit that referenced this pull request May 9, 2026
…t 미반영 정정

본질: layout_table + height_measurer 두 곳의 1×1 wrapper unwrap 분기가
flat_map(...).find_map(...) 으로 셀 paragraphs 전체에서 첫 nested 표만
가져와, paragraphs 가 2개 이상인 경우 두 번째 nested 표가 통째 누락.
table-vpos-01.hwpx 5쪽 외부 1×1 셀 (paras=2: 1×1 헤더 + 11×3 그리드)
에서 11×3 그리드 시각 누락 + 외부 표 height 778.8px → 57.72px 부족.

PR 정정 (Stage 1 + Stage 3 fix): 두 곳에 4 조건 가드 (1×1 단일 셀 +
paragraphs.len()==1 + controls.len()==1 nested table + visible text 없음).

메인테이너 충돌 해결 통합 정정:
PR #681 (Task #680, 자료 박스 외곽 테두리) 가 동일 1×1 wrapper 분기에
외곽선 추가 분기를 삽입한 상태에서 PR #694 의 controls.len()==1 가드를
그대로 적용하면 exam_social.hwp pi=15 (paragraphs=1, controls=2 — 정렬
마커 + nested 표) 케이스에서 unwrap + 외곽선 분기까지 회귀 누락.

→ controls.len()==1 가드 제거, paragraphs.len()==1 만 본질 가드 보존,
   find_map 으로 정렬 마커 등 다른 control 무시하고 첫 nested table 만
   추출. 두 곳 (table_layout.rs + height_measurer.rs) 동일 정정.

검증:
- cargo test --release: lib 1166 + 통합 ALL GREEN (issue_nested_table_border
  1/1, svg_snapshot 8/8 — PR #681 회귀 가드 보존 확인)
- cargo clippy --release: 본 변경 신규 경고 0
- cargo build --release: 통과

Closes #688

Co-Authored-By: Jaeuk Ryu <jaeook.ryu@gmail.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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