Skip to content

Task #1556: 다단락 누름틀 필드 고아 fieldEnd 8유닛 시프트 수정 (HWPX serializer)#1561

Merged
jangster77 merged 2 commits into
edwardkim:develfrom
planet6897:pr-task1556
Jun 26, 2026
Merged

Task #1556: 다단락 누름틀 필드 고아 fieldEnd 8유닛 시프트 수정 (HWPX serializer)#1561
jangster77 merged 2 commits into
edwardkim:develfrom
planet6897:pr-task1556

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

개요

HWPX serializer 의 "컨트롤 슬롯 8유닛 시프트"(#1556) 잔여 결함 수정.
근본 원인은 다단락(문단 경계를 넘는) CLICK_HERE 누름틀 필드의 고아 <hp:fieldEnd> 였다.

근본 원인

  • 파서의 field_stack문단 단위라 begin·end 가 다른 문단인 필드를 연결하지 못한다.
  • 종료 문단의 고아 fieldEnd 는 \u{0004}(8유닛)만 차지하고 Control·FieldRange 둘 다
    미생성 → IR 에 8유닛 슬롯을 표현할 산출물이 없어 직렬화 시 소실 → char_offset/count −8.
  • 증거(dt2854): 문단 0.16 cc 38→30, cs[1].pos 37→29 (정확히 −8), controls=0.

해결

  • IR: Paragraph.orphan_field_ends(OrphanFieldEnd { char_idx, begin_id_ref, field_id }).
  • 파서: fieldEnd 의 beginIDRef/fieldid 포착, 짝 없는 fieldEnd 를 고아로 기록.
  • 직렬화기: emit_orphan_field_end 로 같은 위치에 <hp:fieldEnd> 복원.
    inferred_control_slot_count 에서 orphan_field_ends.len() 차감으로 슬롯 추정 정합(핵심).

검증

회귀 가드

  • 실문서: samples/hwpx/field-multipara-clickhere.hwpx (공개 행정문서, baseline 게이트 자동 봉인).
  • 합성: task1556_multipara_field_parse_serialize_parse_roundtrip.

범위

HWPX serializer 전용. HWP5 F1(#1554)·F2'(#1555) 와 무관. HWP3/HWP5 공통 모듈 무수정.

다단락(문단 경계를 넘는) CLICK_HERE(누름틀) 필드에서, 종료 마커가 있는 문단의
고아 `<hp:fieldEnd>` 가 8유닛 슬롯을 IR 로 표현하지 못해 직렬화 시 소실되어
char_offset/char_count 가 8 시프트되는 결함을 수정.

- 원인: 파서의 field_stack 이 문단 단위라 begin·end 가 다른 문단인 필드는
  연결되지 않음. end 문단은 Control·FieldRange 둘 다 없어 8유닛 슬롯 산출물 부재.
- 해결: Paragraph.orphan_field_ends 로 고아 fieldEnd(위치+beginIDRef+fieldid) 기록,
  직렬화기가 같은 위치에 fieldEnd 복원. inferred_control_slot_count 에서
  orphan_field_ends.len() 차감으로 슬롯 추정 정합.

검증: 대표 실문서 diff=1→0, 2023-01-05 코퍼스 IR_DIFF 24→1(잔여 1건은 별개
그림 BinData 결함), 단위 테스트 5건, hwpx_roundtrip_baseline 무회귀, 전체 cargo test 무회귀.
회귀 가드: samples/hwpx/field-multipara-clickhere.hwpx + 합성 roundtrip 테스트.
# Conflicts:
#	src/parser/hwpx/section.rs
@jangster77 jangster77 merged commit 97dc001 into edwardkim:devel Jun 26, 2026
8 checks passed
@jangster77

Copy link
Copy Markdown
Collaborator

@planet6897 감사합니다. 최신 devel 반영 중 충돌이 있어 PR branch에 수동 merge commit을 추가했고, 충돌 지점은 #1556 고아 fieldEnd 테스트와 #1512 고유 field id 테스트를 모두 보존하는 방식으로 해결했습니다.

로컬 확인:

  • cargo fmt --check: pass
  • git diff --check: pass
  • cargo test --release --lib task1556: 5 passed
  • cargo test --release --lib task1512: 1 passed

원격 검증 결과:

  • Build & Test: pass
  • CodeQL/Analyze: pass
  • WASM Build: skipped

merge commit: 97dc0017cf76a89ea990407fe419d069f9a909d8
관련 이슈 #1556 은 자동 close 되지 않아 수동으로 close 처리하겠습니다.

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.

2 participants