Task #721: 중첩 표 내 필드 값 설정 — nested_path 전체 탐색으로 field_range 인덱스 초과 수정#743
Task #721: 중첩 표 내 필드 값 설정 — nested_path 전체 탐색으로 field_range 인덱스 초과 수정#743oksure wants to merge 2 commits into
Conversation
get_para_mut_at_location이 nested_path[0]만 처리하여 2단계 이상 중첩된 표/글상자 내 필드에 접근 시 잘못된 문단을 반환하던 문제를 전체 nested_path를 순회하도록 수정. set_cell_field_text도 동일한 1단계 제한이 있어 함께 수정. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Fixes setFieldValue / setFieldValueByName failures (“field_range 인덱스 초과”) when fields are located inside deeply nested tables / text boxes by ensuring paragraph resolution walks the full nested_path rather than only the first entry.
Changes:
- Update
get_para_mut_at_locationto iterate through the entirenested_path, supporting arbitrary nesting depth. - Update
set_cell_field_textto traverse nested structures up to the final entry, then replace the target cell’s first paragraph text. - Improve some
InvalidFielderrors by including the nested-path index for easier debugging.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| let ctrl = para.controls.get_mut(*control_index) | ||
| .ok_or_else(|| HwpError::InvalidField("컨트롤이 표가 아님".into()))?; | ||
| if let Control::Table(ref mut table) = ctrl { |
| let new_len = value.chars().count(); | ||
| cell_para.char_offsets = (0..new_len).map(|i| i as u32).collect(); |
- set_cell_field_text 마지막 항목의 에러 메시지에 경로 인덱스 포함 - 셀 텍스트 교체 후 char_offsets를 naive (0..n) 대신 rebuild_char_offsets()로 재생성 (UTF-16 서로게이트 페어 반영) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Copilot 리뷰 피드백 반영 (c2f35ec): 에러 메시지에 경로 인덱스 포함 + char_offsets 재생성에 rebuild_char_offsets() 사용 |
…_range 인덱스 초과 정정 PR #743 (@oksure) 옵션 A 처리 — 2 commits cherry-pick + no-ff merge. 본질 정정 (1 file, +106/-52): - src/document_core/queries/field_query.rs: · get_para_mut_at_location: nested_path[0] 만 처리 (1단계 중첩) → for 루프 전체 순회 (임의 깊이 중첩 지원) · set_cell_field_text: 동일 패턴 — 마지막 항목 직전까지 중첩 탐색 + 마지막 항목에서 셀의 첫 문단 텍스트 교체 · set_field_text_at: get_para_mut_at_location 호출 → 자동 정합 정정 · 에러 메시지에 경로 인덱스 명시 (디버깅 편의성) 비대칭 결함 본질 (Issue #721): - collect_fields_from_paragraph 는 재귀로 nested_path 누적 (✅ 정합) - get_para_mut_at_location / set_cell_field_text 는 nested_path[0] 만 처리 (❌ 결함) - 한국 정부 공식 양식의 중첩 표 (표 안 표) ClickHere 필드 모두 setFieldValue 실패 Copilot 리뷰 반영 (commit c187b03): - set_cell_field_text 마지막 항목 에러 메시지에 경로 인덱스 포함 - 셀 텍스트 교체 후 char_offsets 를 naive (0..n) 대신 rebuild_char_offsets() 로 재생성 (UTF-16 서로게이트 페어 반영) 자기 검증: - cherry-pick 충돌 0건 (auto-merge 정합) - cargo build/test --release ✅ ALL GREEN - 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 ✅ (field_query 만 변경되어 SVG 무영향) - WASM 빌드 4.65 MB 작업지시자 웹 인터랙션 검증 ✅ 통과: - samples/k-water-rfp.hwp 24페이지 분리된 표 > 표 의 hitTest 인덱스 초과 오류 해결 확인 closes #721
- mydocs/pr/archives/pr_743_review.md: 검토 문서 archives 이동 - mydocs/pr/archives/pr_743_report.md: 처리 보고서 작성 · 중첩 표 내 필드 값 설정 (Issue #721 closes) · 컨트리뷰터 제기 비대칭 결함 (collect 재귀 ↔ get/set 1단계 만) 정확히 정정 · 작업지시자 웹 인터랙션 검증 ✅ 통과 (k-water-rfp.hwp 24페이지 분리된 표 > 표) - mydocs/orders/20260510.md: PR #743 항목 추가 (5/10 사이클 영역 영역 15건 처리)
|
@oksure 님, 검토 + 머지 완료했습니다. 처리 결과옵션 A (2 commits cherry-pick + no-ff merge `c4d506d4`) 로 처리. 충돌 0건 (auto-merge 정합). 컨트리뷰터 제기 문제 타당성 검증 ✅ 확정본 환경 소스 점검 결과 명백한 비대칭 결함 확인:
자기 검증
작업지시자 웹 인터랙션 검증 ✅ 통과`samples/k-water-rfp.hwp` 24페이지 분리된 표 > 표 영역에서 hitTest 인덱스 초과 오류 해결 확인. 한국 정부 양식의 중첩 표 ClickHere 필드 정합 동작. 본질 정정
처리 보고서: `mydocs/pr/archives/pr_743_report.md`. @oksure 님 20+ 사이클 컨트리뷰션 영역 — 5/10 사이클 영역 영역 PR #720/#723/#725/#728/#729/#730/#732/#734/#735/#737/#738/#739/#740/#742/#743 영역 15건 처리 완료 영역. |
문제
setFieldValueByName/setFieldValue를 호출할 때, 중첩 표 (표 안의 표) 내부에 있는 ClickHere 필드에서field_range 인덱스 초과에러가 발생합니다.근본 원인
get_para_mut_at_location이nested_path[0]만 처리하여, 2단계 이상 중첩된 표/글상자 내 필드에 접근 시 외부 표의 문단을 반환합니다. 이 문단에는 내부 필드의field_range가 존재하지 않으므로 인덱스 초과가 발생합니다.collect_fields_from_paragraph는 재귀적으로 중첩 구조를 탐색하여nested_path에 여러 항목을 추가하지만,get_para_mut_at_location은 첫 항목만 사용합니다.동일한 문제가
set_cell_field_text에도 존재합니다.수정 내용
get_para_mut_at_location:nested_path[0]고정 접근을for루프로 변경하여 전체nested_path를 순회. 임의 깊이의 중첩 표/글상자를 지원.set_cell_field_text: 동일하게 전체nested_path를 순회하도록 수정. 마지막 항목 직전까지 중첩 탐색 후, 마지막 항목에서 셀의 첫 문단 텍스트를 교체.검증
cargo test— 전체 통과 (1067 lib + 9 integration)cargo clippy -- -D warnings— 경고 0건Closes #721
감사합니다.