Skip to content

Task #548: 셀 inline TAC Shape margin + indent 정정 (closes #548)#561

Closed
planet6897 wants to merge 9 commits intoedwardkim:develfrom
planet6897:pr-task548
Closed

Task #548: 셀 inline TAC Shape margin + indent 정정 (closes #548)#561
planet6897 wants to merge 9 commits intoedwardkim:develfrom
planet6897:pr-task548

Conversation

@planet6897
Copy link
Copy Markdown
Contributor

Summary

⚠️ Stacked PR Note

본 PR 은 PR #560 (Task #544) 위에 stack 됩니다. PR #560 의 commits (4건) 가 본 PR 의 ancestor 에 포함됨 — test_548 테스트가 PR #560 의 cherry-pick (05beb208) 에서 추가됐고, 본 PR 이 그 테스트의 #[ignore] 를 제거하는 의존 관계.

권장 merge 순서: PR #560 → PR #561.

본질

paragraph_layout (텍스트 경로) 와 table_layout (shape 경로) 가 inline shape 위치를 다르게 계산:

경로 x 산식 셀 5 line 0 결과
paragraph_layout (텍스트) col_x + effective_margin_left + ... 131.04 + 24.56 = 155.60 ✓
table_layout (shape, 수정 전) inner_area.x 131.04 ✗
table_layout (수정 후) inner_area.x + line_margin 155.60 ✓

effective_margin_left_line 헬퍼는 paragraph_layout 의 line_indent 산식과 동일 (단일 룰):

  • positive indent: line 0 에 +indent (첫줄 들여쓰기)
  • negative indent (hanging): line N≥1 에 +|indent|
  • indent=0: 모든 line 에 margin_left 만 적용

test fixup

contributor fork 의 test_548_cell_inline_shape_first_line_indent_p8 가 y 범위 [685, 690] 검사. 본 devel 측정 y≈698.43 (Task #479 미적용 trailing-ls 모델로 셀 y 위치가 fork 와 다름) → y 범위 [690, 710] 으로 조정.

Test plan

  • cargo test --lib --release: 1121 passed / 0 failed / 2 ignored — baseline +1 GREEN (test_548)
  • cargo clippy --release --lib: 신규 결함 0건 (pre-existing 2건 동일 baseline)
  • 페이지 8 셀 5 line 0 [푸코] rect: x=131.04 → 155.60 (PDF 155.6 ±0.0)
  • 광범위 회귀 sweep (6 샘플 73 페이지): 13 differ — 의도된 셀 안 inline TAC Shape margin/indent 적용. 회귀 검출 가능 영역 (paragraph 텍스트 위치, 일반 shape 위치) 0 변경
  • 작업지시자 시각 판정 통과
  • WASM 빌드 (Docker 환경, 별도)

처리 보고서

  • mydocs/pr/archives/pr_task548_report.md
  • mydocs/pr/archives/pr_task548_review.md

메모리 룰 적용

  • feedback_no_pr_accumulation — 새 PR 로 등록 (PR Layout Phase 0~2 + 옛한글 PUA + 누적 task fix (Task #435~#528, #549/#550) #551 잔존 누적 회피, 첫 적용 사례)
  • feedback_pdf_not_authoritative — 한컴 2010 PDF 정합 + 작업지시자 시각 판정 게이트
  • feedback_essential_fix_regression_risk — 6 샘플 73 페이지 광범위 회귀 검증
  • feedback_rule_not_heuristiceffective_margin_left_line 단일 룰

🤖 Generated with Claude Code

planet6897 and others added 9 commits May 4, 2026 09:57
… 산식 정정)

paragraph_layout.rs:
1. inner_pad 분기 제거 (line 693~717 → 693~700, -22 LOC)
   - has_visible_stroke / bs_left_px / bs_right_px / inner_pad_left/right 변수 모두 제거
   - margin_left = box_margin_left (단일 룰, 텍스트 inset 한 번만)
2. box_x/w 산식 정정 (line 2687~2691)
   - override 케이스: (ox, ow) — margin 미적용
   - 일반 케이스: (col_area.x, col_area.width) — margin 미적용
   - paragraph border outline = col_area 전체 (PDF 한컴 2010 정합)

integration_tests.rs:
- test_544_passage_box_coords_match_pdf_p4 의 #[ignore] 제거 → GREEN
- test_547_passage_text_inset_match_pdf_p4 의 #[ignore] 제거 → GREEN

검증:
- cargo test --lib: 1121 passed / 3 ignored (baseline 1119/5 → +2 GREEN, -2 ignored)
- 회귀 0건
- test_552_passage_box_top_gap_p2_4_6 (--ignored) GREEN 유지
  → Task edwardkim#552 가 Task edwardkim#544 (2) 효과 흡수 (Stage 1 finding 확정)

측정값:
- test_544: box_left_x 128.51 → 117.0 (PDF 117.0 ±2), box_width 425.1
- test_547: min_x 139.89 → 128.5 (PDF 128.5 ±2)

작업지시자 보고 증상 (글상자 우측 시프트) 직접 fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…y-pick @planet6897 1 commit)

옵션 A2 채택 — `05beb208` (Task edwardkim#544 v2 Stage 2) 단독 cherry-pick.
B1 진단 결과 본 devel 의 Task edwardkim#479 미적용 trailing-ls 모델 확인 →
당초 옵션 A3 (edwardkim#552 + v2 + v3) 의 모델 전환 위험 회피 → 최소 fix 채택.

- mydocs/pr/pr_551_review_v3_544_a2.md (검토 문서)
- mydocs/pr/pr_551_v3_544_a2_report.md (처리 보고서)
- mydocs/orders/20260504.md (오늘할일 신규)

closes edwardkim#544

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… (옵션 A2 — passage 글상자 우측 시프트 정정 — @planet6897 1 commit)

작업지시자 보고: "21_언어_기출_편집가능본.hwp 1/2/4/5/7/8/11/13/14 페이지
글상자가 오른쪽으로 밀려있음".

이슈 edwardkim#544 (closed) 재오픈 후 PR edwardkim#551 잔존 cherry-pick. 당초 옵션 A3
(edwardkim#552 + v2 + v3) 검토했으나 B1 진단 결과 본 devel 의 Task edwardkim#479 미적용
(pre-edwardkim#479 trailing-ls 항상 가산 모델) 확인 → edwardkim#552/v3 cherry-pick 시
모델 전환 위험. 옵션 A2 (`05beb208` 단독, edwardkim#547+edwardkim#544(1) 통합) 채택.

본질 정정 (paragraph_layout.rs):
1. box_x = col_area.x / box_w = col_area.width (margin 미적용,
   paragraph border outline = col_area 전체).
2. inner_pad 분기 제거 (visible-stroke + bs=0 인 경우 margin_left =
   box_margin_left + inner_pad_left 이중 적용 → 단일 적용).

측정 (페이지 4 [7~9]):
- 박스 left x: 128.51 → 117.17 (PDF 117.0)
- 박스 width: 402.5 → 425.17 (PDF 425.1)
- 본문 첫 글자 '평' x: 153.12 → 128.51 (PDF 128.5)
- 9 박스 (col 0/1) 모두 정합

검증:
- cargo test --lib 1120 / test_544+test_547 +2 GREEN / 회귀 0건
- clippy 0 신규 (pre-existing 2건 동일 baseline)
- 5 샘플 58 페이지 광범위 sweep: 38 differ (의도된 paragraph border
  정합 변경, visible-stroke paragraph text -11.33 px 좌측 시프트 의도)
- 회귀 검출 가능 영역 (비-border paragraph text) 0 변경
- 작업지시자 시각 판정 통과

cherry-pick 1 commit:
- 457d5f3 Task edwardkim#544 v2 Stage 2 (`05beb208` from @planet6897)

처리 보고서: mydocs/pr/pr_551_v3_544_a2_report.md
검토 문서: mydocs/pr/pr_551_review_v3_544_a2.md

closes edwardkim#544

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/pr/pr_551_review_v3_544_a2.md → archives/
- mydocs/pr/pr_551_v3_544_a2_report.md → archives/
- mydocs/orders/20260504.md: 처리 상태 갱신 (devel merge f6039f3 push + 이슈 edwardkim#544 close)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…indent

cherry-pick @planet6897 `9dc40ddb` (Task edwardkim#544 v2 Stage 3 — Phase C edwardkim#548).
원 commit 의 Phase C 만 본 사이클에서 cherry-pick (Task edwardkim#544 본질은
이미 별도 사이클에서 처리됨, PR edwardkim#560).

table_layout.rs (+41 LOC):
1. effective_margin_left_line 헬퍼 추가 (paragraph_layout 의 line_indent
   산식과 동일):
   - positive indent: line 0 에 +indent
   - negative (hanging): line N≥1 에 +|indent|
2. inline_x 산출 3 분기 (Left/Justify) 에 line_margin 가산:
   - paragraph 시작 (line 0)
   - Picture target_line reset (Task edwardkim#500 정합)
   - Shape target_line reset (Task edwardkim#500 + edwardkim#520 정합)
3. para_margin_left_px / para_indent_px 추출 (ParaShape 에서)

integration_tests.rs:
- test_548_cell_inline_shape_first_line_indent_p8 의 #[ignore] 제거 → GREEN

conflict resolution:
- src/renderer/layout/table_layout.rs Shape 분기 (line 1648-1693): incoming
  채택 (HEAD 빈 영역 + incoming block 삽입, surrounding context 불일치로
  auto-merge 실패, 의미는 단순 삽입)
- src/renderer/layout/integration_tests.rs: auto-merge

closes edwardkim#548

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
contributor fork 측정 y≈685-690 → 본 devel 측정 y≈698.43.
y 범위 [685, 690] → [690, 710] 으로 조정 (puko rect 식별).

원인: 본 devel 이 Task edwardkim#479 미적용 (pre-edwardkim#479 trailing-ls 항상 가산 모델)
이라 셀 y 위치가 contributor fork (Task edwardkim#479 적용) 와 다름.

cargo test --lib --release: 1121 passed / 0 failed / 2 ignored (test_548 GREEN).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/pr/pr_task548_review.md
- mydocs/pr/pr_task548_report.md
- mydocs/orders/20260504.md: Task edwardkim#548 사이클 추가

새 PR 등록 (PR edwardkim#551 잔존 누적 회피 — feedback_no_pr_accumulation
메모리 적용 첫 사례).

closes edwardkim#548

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ndent 정정 (cherry-pick @planet6897 1 commit + test fixup)

본 devel 측정 (페이지 8 셀 5 line 0 [푸코] rect): x=131.04 (PDF 155.6 와
-24.6 px 시프트). `table_layout.rs` 셀 안 inline TAC Shape 분기에
paragraph 의 margin_left + first_line_indent 미반영 결함.

본질 정정 (table_layout.rs +41 LOC):
1. effective_margin_left_line 헬퍼 추가 (paragraph_layout 와 동일 산식).
2. inline_x 산출 3 분기 (Left/Justify) 에 line_margin 가산.
3. para_margin_left_px / para_indent_px 추출.

측정 (수정 후): x=155.60 (PDF ±0.0).

검증:
- cargo test --lib 1121 / test_548 +1 GREEN / 회귀 0건
- clippy 0 신규
- 6 샘플 73 페이지 광범위 sweep: 13 differ (의도된 셀 안 inline TAC Shape margin/indent 적용)

cherry-pick 1 commit:
- 3de0505 Task edwardkim#548 (`9dc40ddb` from @planet6897)
- a0dad0d Task edwardkim#548 fixup (test_548 y 범위 본 devel 측정값 기준 조정)

처리 보고서: mydocs/pr/archives/pr_task548_report.md
검토 문서: mydocs/pr/archives/pr_task548_review.md

closes edwardkim#548

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/pr/pr_task548_review.md → archives/
- mydocs/pr/pr_task548_report.md → archives/

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 5, 2026
PR #561 (Task #548, @planet6897 / commit author Jaeook Ryu) 1차 검토:
- stacked PR (PR #560 위) — PR #560 은 이미 close + devel 적용 완료
- PR mergeable=CONFLICTING (PR base 시점 차이) 이지만
  본질 commit (3de0505 + a0dad0d) cherry-pick 충돌 0
- test_548 이 본 환경 devel 에 RED+#[ignore] 로 이미 존재
  (PR #560 cherry-pick 시 들어옴) — fix 적용 시 GREEN 전환 확인
- 단일 룰 (effective_margin_left_line) 정합 +
  Task #500/#520 정합 명시 + 페이지 8 셀 5 line 0 [푸코] rect 정정

권장 처리: 옵션 A — 핀셋 cherry-pick (3de0505 + a0dad0d) +
결정적 검증 + 작업지시자 시각 판정 (★ 게이트).
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.
@edwardkim
Copy link
Copy Markdown
Owner

@planet6897 @jangster77 님,

본 PR 의 본질 2 commits (3de05051 + a0dad0d3) 핀셋 cherry-pick 후 devel merge 완료되었습니다 (84bced9).

처리 결과

본질 cherry-pick

결정적 검증

  • cargo test --lib --release 1130 passed / 0 failed / 2 ignored (test_548 RED → GREEN)
  • cargo clippy --release --lib 0건
  • cargo test --test issue_546/554/svg_snapshot 모두 통과
  • Docker WASM 4,570,220 bytes (직전 baseline +447 bytes — table_layout.rs +79 LOC 정합)

광범위 회귀 sweep (본 환경)

Fixture 페이지 수 byte 차이
21_언어_기출_편집가능본 15 1 (page 8 — PR 본문 권위 영역)
exam_kor 20 7
exam_science 4 2
합계 39 10

시각 판정 (★ 게이트)

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

메인테이너 시각 판정 통과입니다. 이제 한국어, 영어 시험지는 제법 볼만하다는 느낌이 듭니다. 수고하셨습니다.

페이지 8 셀 5 line 0 [푸코] inline rect 의 x=131.04 → 155.60 (PDF 155.6) 정정이 시각적으로 회복되었음을 확인했습니다. 한국어/영어 시험지 영역의 가독성 개선 효과가 인정되었습니다.

Stacked PR 정합

PR #560 (Task #544) 은 이미 close + devel 적용 완료 (a30dca7 = 457d5f33 cherry-pick) 상태였고, 본 PR 은 그 위 stacked dependency 의 잔존 영역 (Task #548 ignore test) 만 핀셋 처리. test_548 이 본 devel 에 RED + #[ignore] 로 이미 존재했기에 fix 적용으로 GREEN 전환되는 깨끗한 흐름이었습니다.

단일 룰 정합

effective_margin_left_line 헬퍼가 paragraph_layout 의 line_indent 산식과 동일한 단일 룰을 따름 — 메모리 룰 feedback_rule_not_heuristic 정합. 셀 안 inline TAC Shape 분기 (Picture target_line reset / Shape target_line reset / paragraph 시작) 모두 동일 룰 적용.

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

본 PR 은 컨트리뷰터 두 분의 협업 흐름 (@planet6897 의 fork 9dc40ddb@jangster77 의 핀셋 cherry-pick 3de05051 + fixup a0dad0d3) 의 우수한 사례입니다. 감사합니다.

@edwardkim edwardkim closed this May 5, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: mydocs/pr/archives/pr_561_report.md
  PR #561 (Task #548, @planet6897 / @jangster77) 핀셋 cherry-pick
  2 commits + 결정적 검증 + WASM 4,570,220 bytes + 시각 판정 ★ 통과
- 검토 보고서 archives 이동:
  mydocs/pr/pr_561_review.md → mydocs/pr/archives/pr_561_review.md
- 5/5 orders 갱신: PR #561 항목 추가
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 (영문).
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