Skip to content

fix(api): getPageTextLayout 표시 문자열과 모델 오프셋 분리 (#7909) - #8182

Merged
postmelee merged 4 commits into
develfrom
codex/issue-7909-display-text
Oct 24, 2026
Merged

postmelee merged 4 commits into
develfrom
codex/issue-7909-display-text

Conversation

@postmelee

@postmelee postmelee commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

꼬리말 자동 쪽번호가 SVG에는 표시되지만 getPageTextLayout(0)에서 누락되는 문제를 수정합니다.

원인

렌더 트리는 모델 문자열 text와 표시 문자열 display_text를 분리하지만, 텍스트 레이아웃 API는 모델 문자열만 내보냈습니다. 자동번호처럼 화면에 생성되는 문자열을 API 소비자가 확인할 수 없었습니다.

변경 내용

  • 표시 치환이 있는 런에 선택 필드 displayText와 displayCharX를 추가합니다.
  • 기존 text, charX, charStart, 문서·셀 식별자와 bbox를 보존해 선택·커서·편집 오프셋을 유지합니다.
  • 표시 문자열은 displayText ?? text, 표시 경계는 displayCharX ?? charX로 선택합니다. 빈 표시 문자열도 유효합니다.
  • 표시 문자열의 Unicode scalar 수가 N이면 경계는 N+1개이며, 런 원점 기준입니다. 표시 인덱스를 편집 오프셋으로 사용하지 않으며, 편집에는 기존 hit-test·선택·커서 API를 사용합니다.

변경은 읽기 전용 export 계약에 한정하며, 그림·사각형 배치(#7910)는 변경하지 않습니다. 자세한 사용법은 API 계약 문서에 있습니다.

검증

검증 결과
회귀 검사 7개 수정 전 4 FAIL / 3 PASS → 수정 후 7 PASS
HWP/HWPX 표시 계약 공개 원본, 자동번호 보존 no-picture 대조, 혼합 PAGE/TOTAL_PAGE, 일반 문구·자동번호 없는 문단 통과
모델 호환성 기존 JSON 필드와 선택·커서·편집 오프셋 보존 확인
문자열 경계 빈 표시값, 비 BMP 문자, escaping, 긴 파일명, 필드 갱신·재저장 통과
전체 release-test 11,369 PASS / 0 FAIL, 기존 제외 45건
Native Skia 3종 4,041 + 2 + 14 PASS, 기존 ignore 12건
fmt·native/WASM32/workspace Clippy·workspace build 통과
최적화 WASM·Node/Chromium API·git diff --check 통과

공개 첨부의 control_footer_nopicture.hwp에는 자동번호도 없어 일반 문구 대조로 사용했습니다. 그림·사각형만 제거하고 자동번호를 유지한 HWP/HWPX 대조본은 별도로 생성했습니다. 출처와 해시는 fixture 설명에 기록했습니다.

변경 문서의 메타데이터·상대 링크 오류는 0건입니다. 저장소 전체 문서 메타데이터 검사는 기존 오류 20건으로 실패하며, 결과보고서에 구분해 기록했습니다.

남은 확인 사항

  • 실제 API 소비자 앱에서 표시 문자열과 편집 오프셋을 구분하는지 사용자 확인이 필요합니다. 원본과 자동번호 보존 대조본의 번호 표시를 확인하고, 파일명처럼 여러 표시 글자로 확장되는 필드 뒤를 선택·편집해 삽입 위치가 유지되는지 확인하세요.
  • 비공개 HWPX 원본, HWP3 자동번호의 별도 검사, 한컴 Print PDF와의 시각 일치는 미검증입니다.

Refs #7909

Copy link
Copy Markdown
Collaborator Author

검토 판정은 승인 — 읽기 전용 표시 문자열 export 계약 범위입니다. 검토 head: d097a922ae469778d4860816c747512e059754b6. 추가로 수정 요청할 코드 결함은 발견하지 못했습니다.

  • optional displayText/displayCharX와 replay_positions_for(display)를 추적했고 기존 text/charX/charStart/bbox·셀 식별자 및 모델 오프셋이 유지됨을 확인했습니다. 조판·paint·저장 모델 변경은 없습니다.
  • 이번 직접 실행: Native focused 7 PASS / 0 FAIL(같은 suite 255건 filter 제외), PR base를 고정한 manifest 정책 검사 PASS. fixture 4개 SHA-256과 Git blob 일치를 확인했습니다.
  • code candidate a46cf501의 Full CI는 lint·Native Skia·archive A/B/C/D·frontend package가 실제 성공했습니다. 해당 candidate 뒤에는 review·오늘할일 문서만 변경됐고 최신 preflight의 재사용 판정도 확인했습니다. 이번에 전체 Rust/Skia/WASM을 다시 실행했다고 주장하지 않습니다.

실제 외부 소비자 앱, 비공개 HWPX, HWP3 별도 focused와 한컴 Print PDF 비교는 미검증으로 유지합니다. 소비자 앱은 표시 인덱스와 편집 모델 오프셋을 분리해 확인해야 합니다. 사용자가 이 범위의 리뷰 기록 반영 및 최신 CI 확인 후 병합을 명시적으로 승인했습니다. 같은 source branch의 review 문서를 갱신한 뒤 새 head CI·병합 가능 상태를 확인해 squash merge하겠습니다. self APPROVE 이벤트와 운영 배포는 수행하지 않습니다.

@postmelee
postmelee merged commit 3536e72 into devel Oct 24, 2026
34 checks passed

Copy link
Copy Markdown
Collaborator Author

검토와 squash merge를 완료했습니다. 감사합니다.

  • Merge commit: 3536e72819e165dbe959ee42cfd4e4cf8db33ce7
  • 정식 리뷰 기록과 오늘할일을 같은 source branch에 반영해 원 PR과 함께 병합했습니다. 별도 문서 PR은 만들지 않았습니다.
  • 최종 head 66b6a7d747da28d6daf5396e9b16cf0dcab78f3d의 CI·Build & Test·CodeQL/Render Diff/Adapter/Proptest preflight·정책 status가 성공했고 실패·대기 check 없이 병합했습니다. preflight의 fast_pass=true, candidate d097a922ae469778d4860816c747512e059754b6 재사용을 확인했습니다. 이 candidate의 원래 코드 검증은 a46cf501 Full CI로 추적되며 이후 변경은 리뷰·오늘할일 문서뿐입니다.
  • 이번 직접 실행은 Native focused 7 PASS / 0 FAIL 및 base 고정 manifest 정책 검사 PASS입니다. fixture 4개 해시·Git blob을 대조했습니다. 전체 Rust/Skia/WASM 결과는 기존 세션·정확한 code candidate CI 증거로 구분했습니다.
  • 먼저 병합한 PR #8180을 포함하는 devel과 merge-tree·공백·문서 링크·양쪽 작업 기록 보존을 재검사했습니다. 로컬 devel도 최종 upstream/devel로 fast-forward했습니다.
  • 실제 소비자 앱의 표시/편집 인덱스 구분, 비공개 HWPX·HWP3 별도 검사·한컴 PDF 비교는 미검증입니다. 이슈 #7909는 현재 OPEN이며 수동 종료하지 않았습니다.

운영 배포는 수행하지 않았습니다.

jangster77 added a commit that referenced this pull request Oct 24, 2026
Refs #7445

기존 완료 문서의 표 분할·저장 글줄·각주·글꼴·그림/출력 경계를 공통 로직에서 보정하고 내용 소속·순서·보존 회귀를 정리합니다. 별도 PR의 sample16 HWP5 2024 HWP/HWPX·2010 별칭은 제외하며 대표 이슈 전체 해결을 주장하지 않습니다.

검증 code head: 8ba0980
review·오늘할일 trailing: 8310b92
고정 base: 3536e72

전체 nextest 11,766 PASS/0 FAIL/45 skip, 필수 로컬 게이트와 실제 지원 소비72관측을 확인했습니다. Native/fresh WASM 각49조건·1,772쪽의 최저 raw93.06876%/92.99291%,90% 미달·후보 쪽수 차이·devel 대비2%p 이상 하락0입니다. source77/e7 전쪽 raster의 생산 근거를 검증하여196 TSV를 다시 산출했으며8ba 전쪽 재캡처로 기록하지 않습니다. 현재 실제 소비와 #8180/#8182 기능 보존은 새로 실행했습니다.

새 Rust 회귀228개(integration224·unit4)를 현재 전체 실행의 실제 PASS와 대조했습니다. Mac WASM은 locked wrapper --no-opt 로컬 대체 빌드입니다. 셀프 리뷰·검증/확대 판독 기록·대표 review/overlay와 오늘할일을 포함합니다. KTX 제목 획/그림자와 giant API 회귀 복구 등 미해결 하위 이슈는 별도 추적합니다.
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.

1 participant