Skip to content

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

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

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

Conversation

@oksure
Copy link
Copy Markdown
Contributor

@oksure oksure commented May 7, 2026

요약

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>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

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
Copy link
Copy Markdown
Contributor Author

oksure commented May 7, 2026

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건
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