Task #628: nested cell inline_shape_positions 키 충돌 정정 — 글상자 안 이미지 미렌더링#629
Closed
planet6897 wants to merge 1 commit into
Closed
Task #628: nested cell inline_shape_positions 키 충돌 정정 — 글상자 안 이미지 미렌더링#629planet6897 wants to merge 1 commit into
planet6897 wants to merge 1 commit into
Conversation
…안 이미지 미렌더링 exam_science.hwp 페이지 4 (20번 문항) 글상자 안 실린더 이미지가 SVG 출력에서 누락되던 결함 정정. 동일 페이지 19번(단일 nesting)은 정상이나 20번(외부 1x1 글상자 → 내부 2x3 표 → 셀 → 그림, 이중 nesting)만 발현. 근본 원인: PageRenderTree.inline_shape_positions 의 키 (section, para, control) 에서 para 가 (1) 섹션 단위 paragraph 인덱스 (2) 셀 내부 paragraph 인덱스 (cp_idx) 두 컨텍스트에서 동일 namespace 공유. 다른 paragraph 의 double-nested 셀 처리가 (0, 0, 1) 키를 점유 → 20번 외부 1x1 표 처리 시 stale 값을 보고 already_rendered_inline=true 오판 → table_layout.rs:1900 분기에서 내부 2x3 표의 layout_table 재귀 호출 스킵 → 그 안의 그림 미렌더. 수정: 키에 cell_path: Vec<(ctrl_idx, cell_idx, cell_para_idx)> 추가, 섹션 단위는 빈 Vec, 셀 단위는 nesting 경로 전체. set/get_inline_shape_position 시그니처에 cell_ctx: Option<&CellContext> 추가, 호출처 13곳 (셀 9 + 섹션 4) 일괄 패치. cursor_rect.rs hit-test 루프에 cell_path.is_empty() 가드 추가. 검증: - exam_science page 4: 3 → 4 images (20번 이미지 +1, x=568 y=783.92 width=376.65 height=101.81 = 99.7×26.9mm IR 정확 매칭) - exam_eng/math/kor/social + exam_science page 1-3 (5 샘플 55 페이지) SVG byte-identical (회귀 0) - cargo test --release --lib: 1134 passed - clippy 신규 경고 0 closes edwardkim#628 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 6, 2026
- Task #628 nested cell inline_shape_positions 키 충돌 정정 검토 - 본질 commit 04ce0d2 src 7 파일 (+62/-28) 단독 cherry-pick 가능 - 본 환경 검증: cargo test 1140 passed / clippy 0 / svg_snapshot 6/6 - 정량 측정: BEFORE 3 → AFTER 4 images (page 4), 위치 PR 본문 명세 100% 일치 - 광범위 sweep: 164 fixture / 1,684 페이지 / 차이 0 - WASM: 4,590,307 bytes (PR #578 baseline +7,151) - 옵션 A (핀셋 cherry-pick) 권장, 작업지시자 시각 판정 + 결정 대기 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 6, 2026
- 9.5.1 핀셋 cherry-pick (c353cfc, author Jaeook Ryu 보존) - 9.5.2 결정적 재검증 (1140 passed / clippy 0 / WASM 4,590,307 bytes) - 9.5.3 광범위 sweep 164 fixture / 1,684 페이지 / 차이 0 - 9.5.4 SVG byte 차이 + 정량 측정 (page 4 BEFORE 3 → AFTER 4 images) - 9.5.5 시각 판정 자료 안내 (output/svg/pr629_before vs pr629_after) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 6, 2026
…shape_positions 키 충돌 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과)
Owner
|
검토 + 핀셋 cherry-pick 머지 완료. 감사합니다. 처리 결과
결정적 재검증 (본 환경)
정량 측정 (PR 본문 100% 재현)
광범위 페이지네이션 회귀 sweep
메인테이너 시각 판정 결과★ 통과 — exam_science page 4 의 20번 글상자 안 실린더 이미지 정상 위치 출력 확인. 본 PR 의 본질
수고하셨습니다. |
edwardkim
added a commit
that referenced
this pull request
May 6, 2026
- mydocs/pr/archives/pr_629_report.md 신규 (처리 보고서) - mydocs/pr/pr_629_review.md → mydocs/pr/archives/pr_629_review.md 이동 - mydocs/orders/20260506.md 갱신 (PR #629 항목 추가, 잔존 PR 12 → 11) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 6, 2026
edwardkim
added a commit
that referenced
this pull request
May 6, 2026
- 9.5.1 핀셋 cherry-pick (5cdf8e5, author kihyunnn 보존) - 9.5.2 결정적 재검증 (1140 passed / clippy 0 / npm build 정합 / WASM 4,590,307 bytes) - 9.5.3 광범위 sweep 164 fixture / 1,684 페이지 / 차이 0 - 9.5.4 WASM 정량 정합 (PR #629 baseline 과 정확 일치 — Rust 영역 변경 0 정량 입증) - 9.5.5 web 환경 시각 판정 자료 안내 (vite dev server, 7가지 권위 영역 명시) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 7, 2026
PR #668 (@metahan88-droid) 본질 cherry-pick. 컨트리뷰터의 4 커밋 (045ac58 + 7112183 + d7a8dc4 + 29ae304)을 src + .claude/skills + tools/rhwp-ingest 영역만 single squash로 통합. mydocs 거버넌스 산출물 7파일은 PR #629 패턴에 따라 cherry-pick에서 제외. 신규 영역: - tools/rhwp-ingest/schema/ingest_schema_v1.json — JSON Schema v7, auto_number 명시 필드 - src/parser/ingest/{mod,schema}.rs — IngestDocument/Question/Choice/Media/Placement serde 모델 - src/document_core/builders/{mod,exam_paper}.rs — IngestDocument → Document IR 변환 - src/main.rs — `rhwp build-from-ingest <json> [--media-dir <dir>] -o <out.hwpx>` 신규 명령 - .claude/skills/rhwp-exam-ingest/SKILL.md + helpers 4종 — Claude Code Skill 인프라 - Cargo.toml — serde_json = "1" 추가 부수 변경: - search_query.rs Vec type 명시 (serde_json Vec inference 충돌 회피, 3 라인) - .gitignore — `.claude/skills/` negate 패턴 검증 (본 환경): - cargo test --release --lib: 1155 passed (parser::ingest 4 + builders 10 신규 포함, 회귀 0) - cargo test --release (전체): 모두 GREEN - cargo clippy --release --lib: 신규 경고 0 - cargo build --release: 무에러 - e2e 라운드트립: sample_minimal.json → HWPX 5,356 bytes (문제 3개, 문단 21개, ① ~ ⑤ 평문 보존) - 회귀 sweep: aift/exam_kor/exam_math/exam_science/aift.hwpx 195 페이지 export-svg 모두 정상 본 단계 한계 (후속 이슈 영역): - 이미지 → `[이미지: <ref>]` placeholder - 모든 ParaShape default(id=0) - 공유 지문 그룹 표현 부재 - (#665/#666/#667 영역은 메인테이너 권한 검토 후 마일스톤 분류) closes #660 (Task #660 Neumann 본 작업 1) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 7, 2026
…tahan88-droid 4 commits squash, closes #660) PR #668 (rhwp 첫 PR — @metahan88-droid) 본질 cherry-pick. PR #629 권위 자료 패턴 정합: - src + .claude/skills + tools/rhwp-ingest 영역 cherry-pick - mydocs 거버넌스 산출물 7파일 cherry-pick에서 제외 - author email 보존 (한 <han@han-ui-Macmini.local>) - single squash commit (4 본 작업 커밋 통합: 045ac58 + 7112183 + d7a8dc4 + 29ae304) 검증: - cargo test --release --lib: 1155 passed (parser::ingest 4 + builders 10 신규 포함) - cargo build --release: 무에러 - cargo clippy --release --lib: 신규 경고 0 - 회귀 sweep: aift/exam_kor/exam_math/exam_science/aift.hwpx 195 페이지 정상 - e2e 라운드트립: sample_minimal.json → HWPX 5,356 bytes (문제 3개, 문단 21개, ① ~ ⑤ 평문 보존) - Docker WASM 빌드: 4,598,886 bytes (v0.7.10 + serde_json + ingest 영역) 시각 게이트웨이 (rhwp-studio 웹 에디터): - sample_minimal.hwpx 변환 파이프라인 동작성 확인 - 발견: 1번 문제 두 번째 줄이 SVG에서는 1줄, WASM 웹 에디터에서는 2줄로 줄바꿈 (LineSeg simplistic 영역) - 본 한계는 PR 본문 명시 한계(ParaShape default + 이미지 placeholder)와 동일 영역에 속함 - 후속 이슈 #665 (placement 4모드 + ParaShape + Picture/BinData IR 빌드)에서 본격 해결 본 단계 한계 (후속 이슈): - 이미지 → [이미지: <ref>] placeholder - 모든 ParaShape default(id=0) - 공유 지문 그룹 표현 부재 - LineSeg simplistic (SVG/WASM 줄나눔 불일치) closes #660
4 tasks
edwardkim
pushed a commit
that referenced
this pull request
May 7, 2026
- mydocs/pr/archives/pr_668_review.md (신규) — PR #629 권위 자료 정합 검토 + 옵션 A/B/C 분류 + 검토 영역 1~6 - mydocs/pr/archives/pr_668_report.md (신규) — 본질 cherry-pick + 결정적 재검증 + 시각 게이트웨이 발견 사항(LineSeg simplistic 영역) - mydocs/orders/20260507.md — PR #668 (#660) 행 추가 (rhwp 첫 PR, 거버넌스 정합 모범 사례) PR #668 처리 정합: - PR #629 권위 자료 패턴 정합 (mydocs 영역 cherry-pick 제외, src + .claude/skills + tools/rhwp-ingest만 포함) - single squash commit 80535a3 (author 한 <han@han-ui-Macmini.local> 보존, Co-Authored-By Claude Opus 4.7) - devel merge 9fc8f32 + push 정합 - PR #668 close + Issue #660 close + 컨트리뷰터 한글 안내 코멘트 - 시각 게이트웨이 발견(LineSeg simplistic SVG/WASM 줄나눔 불일치)은 후속 #665에서 본격 해결 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim
added a commit
that referenced
this pull request
May 7, 2026
PR #621 의 외부 컨트리뷰터 거버넌스 산출물 영역 (수행 계획서 + 구현 계획서 + Stage 1 보고서 + 최종 보고서) 의 본 환경 명명 규약 영역 정합: - task_m07_617 → task_m100_617 일괄 정정 (m07 영역은 v0.7.x 약어 영역, 본 환경 m100 영역의 v1.0.0 마일스톤 정합 영역) - mydocs/plans/task_m100_617.md (수행 계획서) - mydocs/plans/task_m100_617_impl.md (구현 계획서) - mydocs/working/task_m100_617_stage1.md (단계별 보고서) - mydocs/report/task_m100_617_report.md (최종 보고서, PR 두 번째 commit 79ed72b 영역에서 추출) PR #629 / PR #668 의 본 환경 패턴 정합 — mydocs/ 거버넌스 산출물 영역의 외부 컨트리뷰터 영역 + 본 환경 명명 규약 영역의 정합 영역.
6 tasks
edwardkim
pushed a commit
that referenced
this pull request
May 13, 2026
#826) PR #832 (@jangster77) GitHub diff 기반 cherry-pick. mydocs 거버넌스 산출물 + pdf 권위 자료는 제외 (PR #629 패턴 정합). #824 — HWP3 임베디드 그림 external_path 오표시: parser/hwp3/mod.rs pic_type == 0 가드 1줄 #825 — 머리말/꼬리말 picture 선택 + dialog: ImageNode.header_footer_ref 필드 + HeaderFooterImageRef/HeaderFooterKind 신규 타입 layout_picture_full() + propagate_header_footer_ref() 후처리 get/set_header_footer_picture_properties WASM API rhwp-studio: findPictureAtClick headerFooter 전파 + picture-props-dialog 분기 #826 — HWP3 PUA U+F080F/U+F0827 글리프 fallback: paragraph_layout.rs map_pua_bullet_char 2 케이스 추가 U+F080F → U+2501 (━), U+F0827 → U+25A0 (■) 검증: - cargo test --release --lib: 1235 passed - cargo test issue_824/825/826: 9 passed (2+3+4) - CI: Build & Test / Canvas visual diff / CodeQL 전부 통과 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 13, 2026
PR #834 (@jangster77) GitHub diff 기반 cherry-pick. mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합). (A) Save As — file:save-as command 신규 + Ctrl+Shift+S 단축키 + 메뉴 항목 forceSaveAs 옵션으로 currentHandle 우회 → 항상 showSaveFilePicker (B) Cancel fallback — isUserCancelError() 헬퍼로 AbortError + NotAllowedError 통합 검출 권한 프롬프트 취소 시 fallback download 오발현 방지 검증: - tsc --noEmit: 관련 파일 에러 0 - CI: Build & Test / Canvas visual diff / CodeQL 전부 통과 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 13, 2026
…#842) PR #843 (@planet6897) GitHub diff 기반 cherry-pick. mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합). 결함 #4 — cross-run 우측탭 블록 폭 합산 + in-run RIGHT 인라인 탭 body_right 정렬 결함 #3 — 단 구분선 line type 6→Dash, 7→Dot 매핑 추가 결함 #2 — 헤더 바 TAC 표 좌측 위치 정정 (alphanumeric 글자 시 leading=0) 검증: - cargo test --release --lib: 1246 passed (회귀 0) - SVG before/after 비교: 헤더 바 x좌표 122→94 + 우측탭 항목 좌측 이동 확인 - 시각 판정 ★ 통과 (PDF 권위 자료 대비) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 13, 2026
PR #851 (@planet6897) GitHub diff 기반 cherry-pick. mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합). typeset.rs start_new_column_band() 추가: - 마지막 단 명시적 단나누기 시 같은 페이지 새 단-밴드 시작 - 배분(Distribute) 단에서만 적용, 일반(Normal/신문형) 단은 기존대로 새 페이지 - 떠다니는 개체가 있으면 새 페이지로 fallback 효과: shortcut.hwp 8→7페이지 (한컴 2022 PDF 정합) 회귀: 다른 다단 샘플 전부 무변화 검증: - cargo test --release --lib: 1246 passed (회귀 0) - SVG before/after: 8→7페이지 확인 - 시각 판정 ★ 통과 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 13, 2026
PR #856 (@planet6897) GitHub diff 기반 cherry-pick. mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합). typeset.rs 어울림 표 옆 문단 흡수 분기: - 첫 LINE_SEG만 비교 → 마지막 LINE_SEG도 wrap zone 일치 확인 - 불일치 시 일반 텍스트 배치로 폴백 - 21_언어 14페이지 pi=300 본문 누락 해소 검증: - cargo test --release --lib: 1246 passed (회귀 0) - SVG before/after: 14페이지 [A] 박스 아래 본문 정상 렌더 - 웹 에디터 시각 판정 ★ 통과 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 14, 2026
…atch (closes #857) PR #859 (@johndoekim) GitHub diff 기반 cherry-pick. mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합). cursor_rect.rs hit_test_native L648-666: - cell-context TextRun 후보 중 first-match → bbox 면적 최소 best-match - 외곽 1×1 wrapper placeholder가 inner cell TextRun을 선점하던 결함 해소 - Task #717 cell_bboxes selection과 동일 best-match 패턴으로 정책 통일 검증: - cargo test --release --lib: 1246 passed (회귀 0) - issue_table_vpos_01_page5_cell_hit_test: 13 passed - 웹 에디터 동작 판정 ★ 통과 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 14, 2026
PR #865 (@postmelee) GitHub diff 기반 cherry-pick. mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합). Task #717 hit-test 정밀도 향상 후 중첩 셀 입력 경로가 로컬 기준으로 잘려 "컨트롤 인덱스 범위 초과" 에러 발생하던 회귀 정정: - cursor_rect.rs — 중첩 표 결과를 문서 루트 기준 전체 cellPath로 보존 - rendering.rs — getPageOverlayImages 신규 API (입력 루프 렌더 비용 절감) - wasm_api.rs — WASM 바인딩 - rhwp-studio — page-renderer 캐시 최적화 + wasm-bridge 추가 검증: - cargo test --release --lib: 1246 passed (회귀 0) - issue_850_answer_sheet_name_hit_test: 3 passed - 웹 에디터 동작 판정 ★ 통과 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
edwardkim
pushed a commit
that referenced
this pull request
May 14, 2026
closes #864) PR #869 (@jangster77) GitHub diff 기반 cherry-pick. mydocs 거버넌스 산출물 제외 (PR #629 패턴 정합). Task #860 — BMP MIME 변환 (PNG 재인코딩) + viewBox 자동 확장 Task #864 — WMF image x/y point_s_to_absolute_point 변환 + HWP3 inline picture caption y_start 정합 + set_inline_shape_position 추가로 중복 emit 방지 + caption bottom까지 result_y 진행 (겹침 방지) + dump에 picture caption 정보 표시 fixture: hwp3-sample13/14 HWP3/HWP5/HWPX + PDF 권위 자료 검증: - cargo test --release --lib: 1246 passed (회귀 0) - cargo clippy: 경고 0 - SVG page 2/3/4 + 웹 에디터 시각 판정 ★ 통과 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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.
Summary
samples/exam_science.hwp페이지 4 (20번 문항) 글상자 안 실린더 이미지(bin_id=2, 99.7×26.9mm) 미렌더링 결함 정정. 19번 (단일 nesting) 정상 / 20번 (이중 nesting: 외부 1x1 글상자 → 내부 2x3 표 → 셀 → 그림) 만 발현하던 비대칭의 근본 원인을 fix.PageRenderTree.inline_shape_positions의 키(section, para, control)에cell_path차원을 추가하여 섹션 단위 vs 셀 단위 paragraph 인덱스 namespace 충돌 차단.근본 원인
키의
para가 두 가지 의미로 혼용됨:paragraph_layout호출 시 → 섹션 단위 paragraph 인덱스 (예: 119, 127)layout_table→ 셀 paragraph 호출 시 → 셀 내부 paragraph 인덱스 (cp_idx, 보통 0)서로 다른 셀 컨텍스트가 동일 키
(0, 0, 1)등을 공유 → 다른 paragraph 의 double-nested 셀 처리가 키를 미리 점유 → 20번 외부 1x1 표 처리 시already_rendered_inline=true오판 →table_layout.rs:1900분기에서 내부 2x3 표의layout_table재귀 호출 스킵 → 그 안의 그림 미렌더.수정
cell_path= 외→내 nesting 순서의(control_index, cell_index, cell_para_index)튜플 목록. 섹션 단위는 빈 Vec, 셀 단위는CellContext.path전체.set/get_inline_shape_position시그니처에cell_ctx: Option<&CellContext>추가, 호출처 13곳 일괄 패치 (셀 단위 9 + 섹션 단위 4).cursor_rect.rs:532의 hit-test 루프에cell_path.is_empty()가드 추가.변경 통계
회귀 위험 평가
None전달)은 기존(sec, para, ctrl, [])와 동등 → 기존 동작 유지Some(ctx)전달)은 stale-key 충돌 차단 → 의도된 변화만 (20번 이미지 +1)Test plan
x=568 y=783.92 width=376.65 height=101.81= 99.7×26.9mm IR 정확 매칭)cargo test --release --lib: 1134 passed, 0 failedcargo test --release(전체 workspace): 모두 GREENcargo clippy --release --lib: 신규 경고 0 (사전 존재 경고 2건 —table_ops.rs:1007,object_ops.rs:298의 panic-on-unwrap — 은 base branch 동일 발생, 본 변경 무관)closes #628
🤖 Generated with Claude Code