Skip to content

fix: rhwpDev 디버깅 툴킷 결함 수정 — paragraph 식별 + 다중 매치 (#449)#684

Closed
oksure wants to merge 2 commits into
edwardkim:develfrom
oksure:contrib/rhwpdev-toolkit-v2
Closed

fix: rhwpDev 디버깅 툴킷 결함 수정 — paragraph 식별 + 다중 매치 (#449)#684
oksure wants to merge 2 commits into
edwardkim:develfrom
oksure:contrib/rhwpdev-toolkit-v2

Conversation

@oksure

@oksure oksure commented May 7, 2026

Copy link
Copy Markdown
Contributor

요약

PR #602 cherry-pick 후 메인테이너 시각 판정에서 식별된 결함 두 건을 수정합니다.

결함 #1: paragraph 식별 부정확 (본문 vs 셀 내부 충돌)

getPageTextLayout이 반환하는 runs의 parentParaIdx/controlIdx/cellIdx 필드를 활용하여 본문 paragraph와 셀 내부 paragraph를 구분합니다.

  • containerKey(): body paragraphs → "body", cell-internal → "cell[p0,c0,i0]" 형식
  • showAllIds() 출력에 container 컬럼 추가
  • 중복 제거 키에 container 포함 → 0:body:0:00:cell[p0,c0,i0]:0:0
  • findNearest() 결과에도 container 정보 포함

Before: samples/aift.hwp paragraph 0 에서 본문 텍스트(" * 사업계획서...") 대신 셀 내부 텍스트("※ ") 표시
After: 본문과 셀 내부가 별도 행으로 구분됨

결함 #2: 다중 매치 미처리

search(text)searchText를 반복 호출하여 문서 전체의 모든 매치를 수집합니다.

  • 반환 타입: SearchResultSearchResult[]
  • console.table로 전체 매치 목록 출력
  • 매치 없을 때만 console.warn

변경 파일

검증

  • cargo test --lib: 1066 passed, 0 failed
  • cargo clippy -- -D warnings: clean
  • TypeScript: rhwp-dev.ts, main.ts 에러 없음

관련 이슈

fixes #449 (후속 결함 영역)


PR #602 cherry-pick 이후의 후속 수정입니다.

Issue edwardkim#449 cherry-pick 후 메인테이너 시각 판정에서 식별된 결함 두 건 수정:

1. paragraph 식별 부정확 (본문 vs 셀 내부 충돌)
   - getPageTextLayout runs의 parentParaIdx/controlIdx/cellIdx 필드를
     활용하여 container context (body/cell[p,c,i]) 키 생성
   - showAllIds에 container 컬럼 추가, 중복 제거 키에 포함
   - findNearest 결과에 container 정보 포함

2. 다중 매치 미처리
   - search(text)가 searchText를 반복 호출하여 모든 매치 수집
   - SearchResult 단건 → SearchResult[] 배열 반환
   - console.table로 전체 매치 목록 출력

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the rhwpDev debugging toolkit used by rhwp-studio to improve paragraph identification (body vs. cell-internal context) and to return/print all matches for document text searches, addressing follow-up defects found after cherry-picking #602.

Changes:

  • Add container context derived from getPageTextLayout() run metadata to disambiguate body paragraphs vs. cell-internal paragraphs in showAllIds() / findNearest().
  • Update search(text) to collect and return all matches across the document (return type becomes an array).
  • Initialize the toolkit during app startup via initRhwpDev(wasm).

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
rhwp-studio/src/main.ts Wires initRhwpDev(wasm) into the app initialization flow.
rhwp-studio/src/core/rhwp-dev.ts Adds the window.rhwpDev toolkit implementation with container-aware IDs and multi-match search.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread rhwp-studio/src/main.ts Outdated
await loadWebFonts([]); // CSS @font-face 등록 + CRITICAL 폰트만 로드
msg.textContent = 'WASM 로딩 중...';
await wasm.initialize();
initRhwpDev(wasm);
Comment thread rhwp-studio/src/core/rhwp-dev.ts Outdated
Comment on lines +45 to +49
let layout: string;
try {
layout = (wasm as any).doc.getPageTextLayout(p);
} catch { continue; }
const data = JSON.parse(layout);
Comment thread rhwp-studio/src/core/rhwp-dev.ts Outdated
try {
layout = (wasm as any).doc.getPageTextLayout(page);
} catch { return null; }
const data = JSON.parse(layout);
- initRhwpDev(wasm)을 import.meta.env.DEV 조건 안으로 이동하여
  프로덕션 빌드에서 디버그 API 노출 방지
- showAllIds()의 JSON.parse(layout)을 try/catch 블록 안으로 이동
- findNearest()의 JSON.parse(layout)도 동일하게 에러 핸들링 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@oksure

oksure commented May 7, 2026

Copy link
Copy Markdown
Contributor Author

Copilot 리뷰 피드백 반영 완료 (c72e5e5):

  1. main.ts:99 — DEV 게이트 추가: initRhwpDev(wasm) 호출을 import.meta.env.DEV 조건 안으로 이동. 프로덕션 빌드에서 window.rhwpDev 노출 방지.

  2. rhwp-dev.ts:49showAllIds JSON.parse 에러 처리: JSON.parse(layout)을 기존 try/catch 블록 안으로 통합. 잘못된 JSON 반환 시 해당 페이지를 건너뛰고 계속 진행.

  3. rhwp-dev.ts:110findNearest JSON.parse 에러 처리: 동일하게 JSON.parse(layout)을 try/catch 안으로 이동. 파싱 실패 시 null 반환.

cargo test + cargo clippy -- -D warnings 통과 확인.

edwardkim added a commit that referenced this pull request May 7, 2026
PR #684 cherry-pick 결과 영역에서 main.ts 영역의 initRhwpDev 영역 import 영역 중복 영역 발생 영역 — 본 환경 영역의 PR #602 영역 결과 (line 28 import + line 38-40 외부 호출 영역) 와 PR #684 영역의 c72e5e5 commit 영역 (initialize() 함수 안 DEV 게이트 영역 안 호출 영역) 영역 동시 영역 존재 영역 → TypeScript TS2300 영역 에러 영역.

PR #684 의 본질 영역 정합 영역으로 line 38-40 영역 제거:
- line 28 영역 import 영역 유지 (본 환경 PR #602 영역 결과)
- line 38-40 영역의 외부 호출 영역 제거 (PR #684 의 의도 영역 — initialize() 안 DEV 게이트 영역 안 호출 영역만 활성 영역)
- line 99-100 영역의 if (import.meta.env.DEV) { initRhwpDev(wasm); } 영역 유지 (PR #684 c72e5e5 영역 결과)

검증:
- npm run build TypeScript 타입 체크 + dist 빌드 통과 (index-21tD9d3W.js 691,386)

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 #684 의 search() 영역의 break 조건이 (!r || !r.found) 영역만 영역으로 영역, search_text_native 영역의 wrap-around 영역 동작 영역에서 무한 루프 영역 발생 영역 (마지막 매치 이후 → body_hits[0] + wrapped=true + found=true 반환 → break 안 됨 → 처음 매치부터 영역 반복).

옵션 B 정정 (작업지시자 결정):

1. SearchResult 인터페이스에 wrapped?: boolean 영역 추가 (본 환경 core/types.ts 영역 정합)

2. wrap-around 가드 영역 — r.wrapped = true 시 break

3. 반복 횟수 한계 영역 — MAX_MATCHES = 10000 (방어 영역, 실 사용 한도 충분)

4. 후진 가드 영역 — 다음 매치 위치가 직전 위치보다 앞이거나 같으면 break (sec/para/charOffset 비교)

검증:
- npm run build TypeScript + Vite 빌드 통과
- 작업지시자 권위: aift.hwp 영역 등 다중 매치 영역 영역의 wrap-around 영역 발견 → 정정 영역 후속 영역

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

Copy link
Copy Markdown
Owner

PR #684 처리 결과

cherry-pick 머지 완료 (2 commits 단계별 보존 + 본 환경 정정 보강 2 commits). PR #684 close + Issue #449 close.

처리 옵션

옵션 A — 2 commits 단계별 cherry-pick (44d532e 본질 + 9792fee Copilot 리뷰 반영) + 본 환경 정정 보강 (f73177a main.ts 중복 import 영역 정정 + a1ea189 search() 무한 루프 가드 추가).

본 환경 결정적 검증 (모두 통과)

항목 결과
cargo test --lib --release 1157 passed (회귀 0)
cargo clippy --lib --release -- -D warnings 0
cargo build --release 통과
Docker WASM 빌드 4,572,439 bytes (PR #636 baseline 동일)
rhwp-studio npm run build TypeScript 타입 체크 + dist 빌드 통과 (index-21tD9d3W.js 691,386)

본 환경 정정 보강 영역

f73177a — main.ts 중복 import + 외부 호출 영역 정정

PR #684 cherry-pick 결과 영역에서 initRhwpDev 영역 import 영역 중복 영역 발생 (TS2300):

→ line 38-40 영역의 외부 호출 영역 제거 (PR #684 의 의도 영역 정합) + line 28 import + line 99-100 DEV 게이트 안 호출 영역 유지.

a1ea189 — search() 무한 루프 가드 (옵션 B)

작업지시자 직접 영역 무한 루프 영역 위험 영역 발견 — for (;;) 영역의 break 조건이 (!r || !r.found) 영역만 영역으로 영역, search_text_native 영역의 wrap-around 영역 동작 영역 (마지막 매치 이후 → body_hits[0] + wrapped=true + found=true 반환) 영역에서 무한 루프 영역 발생 영역.

옵션 B 정정 (작업지시자 결정):

  1. SearchResult 인터페이스 영역 — wrapped?: boolean 영역 추가 (본 환경 core/types.ts:590 영역 정합)
  2. wrap-around 가드 영역 — r.wrapped = true 영역 시 break
  3. 반복 횟수 한계 영역 — MAX_MATCHES = 10000
  4. 후진 가드 영역 — 다음 매치 위치 영역이 직전 위치 영역보다 앞이거나 같으면 break

메인테이너 Chrome 웹 콘솔 영역 검증 결과

작업지시자 평가:

  • rhwpDev.findNearest(618) 통과 — closest paraIdx=0 (cell[p0,c2,i0], distance=618) "※ " (결함 baseline/line_height/line_spacing 역공학 #1 정정 영역의 container 정보 정합)
  • ⚠️ rhwpDev.search(text) 미정합 — 별도 이슈 영역 등록 영역 영역 분리 (4 가드 영역 적용 영역 후에도 영역 동작 영역 미정합)

후속 이슈 #692 등록: rhwpDev.search(text) 다중 매치 영역 동작 불완전 (wrap-around 가드 추가 후에도 잔존)

충돌 처리

cherry-pick 결과

devel push: b051dd0..a1ea189.

cherry-pick author oksure + Co-Authored-By Claude Opus 4.6 (2 commits) 보존.

본 PR 의 결함 #1 (paragraph 식별 영역) 정정 영역 정합 + 결함 #2 (다중 매치 영역) 정정 영역 무한 루프 가드 추가 영역 + 메인테이너 Chrome 웹 콘솔 영역 검증 영역 통과 영역 (findNearest) + 후속 영역 분리 (search) 패턴 모두 정합.

@edwardkim edwardkim closed this May 7, 2026
edwardkim added a commit that referenced this pull request May 7, 2026
PR #684 (Issue #449 후속 정정 — rhwpDev 디버깅 툴킷 결함 두 건) 처리 완료 후속 영역:
- mydocs/pr/archives/pr_684_review.md (1차 검토 + 옵션 분석)
- mydocs/pr/archives/pr_684_report.md (처리 결과 + 본 환경 정정 보강 + Chrome 웹 콘솔 검증)

처리 결과:
- 옵션 A: 2 commits cherry-pick + 본 환경 정정 보강 2 commits
- devel commits: 44d532e 본질 + 9792fee Copilot 반영 + f73177a main.ts 정정 + a1ea189 search() 가드 (옵션 B)
- 메인테이너 Chrome 웹 콘솔 검증: findNearest 통과 + search 미정합 (Issue #692 후속)
- PR #684 close + Issue #449 close + Issue #692 신규 등록

본 사이클 (5/7~5/8) PR 처리 누적: 15건
edwardkim added a commit that referenced this pull request May 8, 2026
PR #638 (Task #634, 한컴 호환 쪽번호) close 영역 + PR #641 (Task #639, cover-style 룰) close 영역 처리:
- 두 PR 모두 devel 반영 부재 (작업지시자 결정 영역 정합)
- 컨트리뷰터 (@planet6897) 영역의 후속 PR #711 (Task #705) 영역에서 본질 정정 영역 진행

PR #638 영역의 본질 결함 발견:
- pagination/engine.rs 셀 안 PageHide 무시 (page 2 쪽번호 결함의 본질)
- layout.rs hide_border/hide_fill 가드 부재
- main.rs dump 셀 안 PageHide 분기 부재
→ 컨트리뷰터에게 정석 처리 안내 댓글 등록 영역

PR #641 영역의 cover-style 휴리스틱:
- 본 환경 결함 영역의 우회 (workaround) 영역으로 분석
- 174 샘플 영역 중 영향 페이지 2 영역만 매칭 (PR #711 영역의 6 샘플 영역 영역 영역)
- 작업지시자 결정: 본 PR close + PR #711 본질 정정으로 재검토 영역

archives 이동:
- mydocs/pr/archives/pr_638_review.md
- mydocs/pr/archives/pr_641_review.md
- mydocs/pr/archives/pr_641_close_report.md (close 결정 + supersede 안내)

5/8 orders 영역 신규:
- mydocs/orders/20260508.md
- PR #684 (5/8 처리 완료) + PR #638 (close) + PR #641 (close, supersede PR #711) entry

본 사이클 (5/7~5/8) close 패턴 누적:
- PR #638 (본질 결함 발견)
- PR #641 (우회 접근 → PR #711 supersede)
- 메인테이너 게이트웨이 방식의 권위 사례 영역 강화 누적

본 사이클 PR 처리 누적: 17건 (15 merged + 2 closed)
edwardkim added a commit that referenced this pull request May 11, 2026
…매치 근본 정정

@oksure — Issue #692 (PR #684 영역 4 가드 적용 후에도 미정합, 작업지시자 직접 검증
영역 영역 발견): rhwpDev.search(text) 반복 호출 방식 영역 다중 매치 불완전.

근본 결함:
- search_text_native 단건 검색 영역 영역 h.char_offset > from_char (strict greater-than)
  → 위치 0 영역 시작 매치 누락
- 반복 호출 방식 영역 영역 wrap-around / 후진 / 반복 횟수 한계 종료 조건 정합 부재

본질 (6 files, +202/-0):
- Rust: search_all_text_native (+45, search_all 내부 함수 영역 일괄 반환)
  + searchAllText WASM 바인딩 (+13)
- TypeScript: SearchHit 인터페이스 (+16, sec/para/charOffset/length/cellContext)
  + searchAllText 래퍼 (+5) + rhwp-dev.ts 재작성 (+121, 반복 호출 → 일괄 호출)
  + main.ts DEV 모드 initRhwpDev 호출 (+2)

리뷰 반영 commit (2f4ba94): 인코딩 깨짐 수정 + SearchHit.para 의미 문서화.

본 환경 충돌 수동 해결 + 정정 commit (4f763f1):
- rhwp-dev.ts: incoming (PR) 측 우선 — searchAllText 기반 재작성
  (PR #684 의 4 가드 + SearchResult 인터페이스 폐기)
- main.ts: initRhwpDev 중복 import 제거 (cherry-pick auto-merge 결과 정정)
- types.ts / wasm-bridge.ts / search_query.rs / wasm_api.rs: auto-merge

자기 검증: tsc + cargo test/clippy ALL GREEN, WASM 4.6 MB 재빌드
시각 판정: 작업지시자 DEV mode 콘솔 검증 ✅ 통과
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.

3 participants