Skip to content

Task #1008: HWP3 sample16 Shape/Text 정합 격차 종합 정정 (closes #1008)#1034

Closed
jangster77 wants to merge 12 commits into
edwardkim:develfrom
jangster77:local/task1008
Closed

Task #1008: HWP3 sample16 Shape/Text 정합 격차 종합 정정 (closes #1008)#1034
jangster77 wants to merge 12 commits into
edwardkim:develfrom
jangster77:local/task1008

Conversation

@jangster77

Copy link
Copy Markdown
Collaborator

Summary

samples/hwp3-sample16.hwp 의 한컴 한글 정답지 비교에서 발견된 4 격차 (A: Shape gradient / B: Shape border / C: HEAD numbering / D: 한글 spacing) 종합 정정. src/parser/hwp3/ 격리 (HWP5/HWPX/renderer 무수정).

본문 가설 정반대: 원본 issue 가설 ("HWP5 변환본 gradient 를 한컴이 strip — variant 가드로 simplify") 은 한컴 한글 정답지 시각 검증 결과 정반대 (gradient 있음 정답, HWP3 가 회귀). issue body + 수행/구현계획서 v2 재작성.

격차 + Fix

격차 A — HWP3 Shape 박스 배경 gradient IR 매핑

HWP3 raw Hwp3DrawingObjectGradientAttr (drawing.rs:149~170) 는 이미 파싱되었으나 Fill IR 구축에서 fill_type=Solid, gradient=None 하드코딩으로 데이터 무시. HWP5 매핑 contract (doc_info.rs:404) 와 동일 IR 주입.

격차 B — HWP3 Shape border LineType 2~7 → Solid normalize

HWP3 raw style=0x0002 (LineType=2 Dash per spec) 가 점선 렌더되나 한컴은 실선. HWP3 sample line_style 분포 sweep: 0x0002 는 sample16 한정 — narrow fix 회귀 risk 0.

격차 C — HWP3 heading decoration 휴리스틱 strip

HWP3 raw paragraph 가 "════...■ NUM.title ■════..." 형태 decoration text 를 plain text 로 저장 (sample16 pi=70: 52자). 한컴 변환기/viewer 모두 decoration strip. fixup_hwp3_heading_decoration 신규 휴리스틱 패턴 detection.

격차 D — HWP3 한글 spacing (CharShape dedupe + 폰트명 매핑)

Root cause 1: rep CharShape + inline shape change 가 같은 pos=0 으로 양쪽 push (pi=4: rep id=57 base_size=1000 + inline id=58 base_size=1400). 한컴 변환기 dedupe → mod.rs 의 char_shapes 빌드 후 dedupe loop 추가.

Root cause 2: HWP3 "신명조" vs HWP5 변환본 "HY신명조" 폰트명 mismatch — rhwp 내부 폰트 metric 평가가 다르게 평가되어 char advance drift. 한컴 변환기 mimic 으로 HWP3 parser 의 font_faces 로딩 시 매핑 (신명조→HY신명조, 고딕→HY고딕 등).

효과: HWP3 SVG 좌표가 HWP5 변환본과 byte-for-byte 일치 (\" @131.69 → 세 @137.69 → ... → 한 @408.37).

핵심 변경 (2 파일)

격차 파일 / 라인
A src/parser/hwp3/drawing.rs:792~830
B src/parser/hwp3/drawing.rs:758~785
C src/parser/hwp3/mod.rs:2870~2960
D-1 src/parser/hwp3/mod.rs:1869~1900
D-2 src/parser/hwp3/mod.rs:2570~2585, 2908~2924

다른 parser (HWP5/HWPX) / renderer / model 무수정 — parser/hwp3/ 격리 규칙 정합.

Test plan

  • cargo build --release: warning 0
  • cargo clippy --release --lib -- -D warnings: clean
  • cargo fmt --check: clean
  • cargo test --release --lib: 1307 passed; 0 failed
  • cargo test --release --test issue_1008_gradient: 4 passed (격차 A/B/C/D 회귀 가드)
  • cargo test --release --tests: 전체 integration FAILED 0
  • 페이지 수 sweep 25 fixture (HWP3 11 + HWP5/HWPX 변환본 + exam_*/aift/biz_plan): 회귀 0
  • HWP3 SVG 좌표 HWP5 변환본과 byte-for-byte 정합 단언 (격차 D)
  • 작업지시자 한컴 한글 정답지 시각 검증 (HWP3 cover RFP 박스 + 사업개요 1.추진목적 + 5p Ⅱ.제안일반사항 영역)

회귀 가드 (tests/issue_1008_gradient.rs)

  • hwp3_sample16_business_box_has_gradient
  • hwp3_sample16_business_box_border_solid
  • hwp3_sample16_heading_decoration_stripped
  • hwp3_sample16_font_name_mapped_to_hwp5_convention

한계

  • 휴리스틱 (격차 C): fixup_hwp3_heading_decoration 은 HWP3 spec 미참조 패턴 detection — 의도된 ═══...■...■═══ typography 회귀 risk. 25 fixture sweep 회귀 0.
  • 폰트 매핑 (격차 D): 5 legacy 명칭만 매핑. 다른 명칭 발견 시 확장 필요.
  • 공백 cosmetic (격차 C): rhwp "1.추진목적" vs 한컴 "1. 추진목적" period 뒤 공백 — HWP3 raw 자체에 공백 부재, 한컴이 자동 삽입. 본 PR 범위 외.

Closes #1008

🤖 Generated with Claude Code

jangster77 and others added 10 commits May 20, 2026 17:13
Issue edwardkim#1008 본문 가설 (HWP5 변환본 gradient strip) 이 한컴 한글 정답지 시각
검증 결과 정반대임 확인 — issue body + 수행/구현 계획서 v2 재작성.

격차별 진단 결과:

격차 A (HWP3 박스 배경 gradient 누락, HWP3 한정):
- src/parser/hwp3/drawing.rs:149~170 에 Hwp3DrawingObjectGradientAttr 이미 정의
- drawing.rs:252-253 에서 basic_attr.has_gradient() 시 파싱 ✓
- 그러나 drawing.rs:792-806 의 Fill IR 구축에서 하드코딩으로 무시
- HWP5 매핑 비교 완료 (step→blur, 2-stop colors, empty positions)
- Stage 2: drawing.rs 단일 파일 단순 매핑 추가

격차 B (Shape border 실선/점선, HWP3 + HWP5 공통):
- HWP3 raw_attr=0x0002, HWP5 raw_attr=0xc0010043 — 둘 다 LineType 2/3 점선 해석
- 한컴 viewer 는 둘 다 실선 — LineType 의미 단언 필요
- Stage 4: parser 또는 renderer 측 정합

격차 C (HWP3 HEAD numbering ■ 마커, HWP3 한정):
- src/parser/hwp3/johab.rs:81 0x3441 → 0x25A0 (■) 매핑 발견
- HWP3 numbering 영역의 marker char 가 johab 0x3441 로 저장
- HWP5 변환본은 marker strip — HWP3 도 동일 처리 필요
- Stage 3: HEAD/numbering detection + marker 처리

격차 D (HWP3 한글 공백 누락) — renderer 측 문제로 단언:
- parser 추출 텍스트는 공백 모두 포함 (dump 확인)
- visual rendering 단계에서 char_position / text run 분할 오류
- 작업지시자 결정으로 본 task 에 포함 유지
- Stage 5: renderer 영역 진단

baseline SVG 보존: output/poc/pr1008/before/

Stage 2 (격차 A) 진행 준비 완료 — drawing.rs:792-806 매핑 추가.

Refs edwardkim#1008

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
PR edwardkim#1003 cherry-pick 사고 이전에 이미 누락되어 있던 HWP3 raw stream 의
Hwp3DrawingObjectGradientAttr (drawing.rs:149~170) IR 매핑을 추가. 종전
drawing.rs:792~806 의 Fill 구축은 `fill_type=Solid, gradient=None` 으로
하드코딩하여 파싱된 gradient_attr 이 무시되었음.

매핑 contract (HWP5 doc_info.rs:404 와 동일):
- kind → gradient_type
- angle/center_x/center_y → angle/center_x/center_y
- step → blur
- start_color + end_color → colors: vec![start, end] (2-stop)
- positions: vec![] → renderer (utils.rs:167) 가 균등 분포

dump 단언:
- hwp3-sample16 pi=71 (사업개요 추진목적 박스): 채우기 Solid → Gradient
- hwp3-sample16 pi=5 (cover RFP 박스): 채우기 Solid → Gradient

SVG element count:
- hwp3-sample16 cover (_001.svg): linearGradient 0 → 2
- hwp3-sample16 사업개요 (_003.svg): linearGradient 0 → 2
- HWP5 변환본 무변동 (2 → 2)

회귀 sweep:
- cargo test --release --lib: 1307 passed
- cargo test --release --tests: 모두 passed (FAILED 0)
- cargo clippy --release --lib -- -D warnings: clean
- cargo fmt --check: clean
- HWP3 sample 11종 + HWP5 변환본 + 일반 fixture (exam_*, aift, biz_plan): 페이지 수 회귀 0

회귀 가드 추가: tests/issue_1008_gradient.rs (HWP3 sample16 pi=71 Rectangle
fill.fill_type == Gradient + colors 2-stop 단언).

Refs edwardkim#1008

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
HWP3 raw paragraph 의 "════...■ NUM.title ■════..." 형태 heading decoration text
가 plain text 로 저장됨 (sample16 pi=70: 52 chars "════════════════════■
1.추진목적 ■════════════════════..."). 한컴 변환기 HWP3→HWP5 는 decoration
을 strip 하여 clean text 만 보존 (HWP5 pi=70: 7 chars "1. 추진목적"). 한컴
한글 viewer 도 동일 strip 으로 추정 — HWP3 spec 미명문화이나 작업지시자
시각 정답 단언.

Fix: fixup_hwp3_heading_decoration 신규 — parse_hwp3() 종단에 추가.
strip_heading_decoration():
- 선행 ═ 5개 이상 (보수적, 산발적 사용 회피)
- 후행 ═ 5개 이상 (대칭)
- 양끝 trim 후 ■ 로 둘러싸인 substring 존재
- 비매치 시 None → 원본 유지 (no-op)

dump 단언:
- pi=70 "════...■ 1.추진목적 ■════..." → "1.추진목적" (decoration strip)
- pi=73 "2. 추진방향" (decoration 없음) → 변경 없음 (패턴 비매치)

SVG (hwp3-sample16_003.svg):
- '═' chars: 다수 → 0
- '■' chars: 다수 → 0
- heading "1.추진목적" 6자만 page 상단 y=142 단독 렌더

회귀 sweep:
- cargo test --lib: 1307 passed
- cargo test --test issue_1008_gradient: 2 passed (격차 A + C)
- clippy/fmt: clean
- HWP3 sample 8종 페이지 수 회귀 0 (휴리스틱 over-aggressive 없음)

한계 (개선 권고):
- 공백 정합 차이: rhwp "1.추진목적" vs 한컴 "1. 추진목적" (period 뒤 공백).
  HWP3 raw 자체에는 "1.추진목적" — 한컴이 자동 공백 삽입하는 것으로 추정.
  현 stage 에서는 over-aggressive risk 로 추가 휴리스틱 미도입.
- 의도된 ═══...■...■═══ typography 회귀 risk — 현재 단언 sweep 에서 회귀 0.

회귀 가드 추가: tests/issue_1008_gradient.rs hwp3_sample16_heading_decoration_stripped.

Refs edwardkim#1008

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
본 task 는 issue edwardkim#1008 의 4 격차 (A: gradient / B: border / C: HEAD numbering /
D: 공백) 중 격차 A + C 를 완료하고 B + D 는 후속 작업으로 남김.

완료:
- 격차 A: HWP3 Shape gradient IR 매핑 (drawing.rs)
- 격차 C: heading decoration 휴리스틱 strip (mod.rs fixup_hwp3_heading_decoration)

후속:
- 격차 B: Shape border 실선/점선 LineType 비트 해석
- 격차 D: HWP3 한글 공백 시각 누락 (renderer 영역)

작업지시자 시각 검증 통과 (HWP3 cover RFP 박스 + 사업개요 1.추진목적 박스
한컴 한글 정답지 정합).

issue edwardkim#1008 stays OPEN — 격차 B + D 후속 진행 예정.

Refs edwardkim#1008

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…Solid normalize

HWP3 raw line_style=2 (Dash per HWP5 spec) 인 sample16 pi=71 사업개요 박스가
점선으로 렌더 (SVG stroke-dasharray="6 3"). 한컴 한글 viewer 정답 = 실선.
한컴 viewer 는 HWP3 LineType 2~7 (Dash/Dot/일점쇄선 등) 을 solid 로 렌더하는
동작 — HWP3 spec 미명문화이나 작업지시자 시각 정답 단언.

Fix: drawing.rs:758~775 의 border_line.attr 산출 확장 — LineType 2~7 시
LineType 비트만 1 (Solid) 로 normalize:
- raw_attr & 0x3F == 0 && width > 0 → Solid (Task edwardkim#877 기존)
- raw_attr & 0x3F in 2..=7         → Solid (Task edwardkim#1008 신규)
- 외 → raw 유지

HWP3 line_style 분포 sweep:
- sample10/11/13/14/4/5: 없음 또는 0x0000
- sample16: 0x0001 + 0x0002 (2 sample16 한정)
- sample19: 0x0001

→ narrow fix, 다른 HWP3 fixture 회귀 risk 0 단언.

dump 단언:
- pi=71 사업개요 박스: style=0x0002 → 0x0001 (Solid)
- pi=5 cover RFP 박스: style=0x0001 (변화 없음)

SVG (hwp3-sample16_003.svg):
- BEFORE: stroke-dasharray="6 3" 점선
- AFTER:  dasharray 제거, 실선 렌더

회귀 sweep:
- cargo test --lib: 1307 passed
- cargo test --test issue_1008_gradient: 3 passed (격차 A+B+C)
- clippy/fmt: clean
- HWP3 sample 9종 + HWP5/HWPX 변환본 + 일반 fixture (exam_*, aift, biz_plan):
  페이지 수 회귀 0

한계: HWP5 변환본 (hwp3-sample16-hwp5) 동일 박스도 점선 렌더 중 (attr=0xc0010043
LineType=3 Dot). 본 stage 는 HWP3 한정 fix (사용자 "HWP5 정상" 발언). HWP5
variant fix 필요 시 후속 또는 사용자 결정.

회귀 가드 추가: hwp3_sample16_business_box_border_solid (border attr LineType==1).

Refs edwardkim#1008

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
HWP3 raw 의 char_shapes 빌드 시 rep CharShape + inline shape change 가 같은
pos=0 으로 모두 push 되어 데이터 무결성 깨짐 (sample16 pi=4: rep id=57
base_size=1000 + inline id=58 base_size=1400 두 entry 가 pos=0 에 공존).
한컴 변환기는 HWP3→HWP5 변환 시 dedupe 하여 inline override 만 유지.

Fix: mod.rs:1869~1900 의 char_shapes 빌드 후 dedupe loop 추가 — 같은
start_pos 에 후속 CharShape 시 마지막 (inline override) 만 유지.

dump 단언 (AFTER):
- pi=4 HWP3: 4 → 3 CharShape (rep id=57 제거됨)
- HWP5 변환본과 동일 구조 (3개)

격차 D 잔존:
SVG 좌표 직접 변동 없음 (leading spaces 는 invisible glyph). 잔존 visual
drift (HWP3 vs HWP5 char-by-char 3-7px 누적) 의 root cause 는 font_ids
차이 (HWP3 id=58/59 font_ids[0]=1, HWP5 id=21/27 font_ids[0]=4) 및 renderer
의 폰트 metric 처리 영역 — 본 task 범위 외, 별도 issue 로 후속 추적 권고.

회귀 sweep:
- cargo test --lib: 1307 passed
- cargo test --test issue_1008_gradient: 3 passed (격차 A+B+C)
- clippy/fmt: clean
- HWP3/HWP5/HWPX 전체 페이지 수 회귀 0 (25 fixture sweep)

Refs edwardkim#1008

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Stage 5 첫 fix (CharShape pos dedupe) 후에도 visual drift 잔존 (HWP3 vs HWP5
변환본 char x 좌표 3-7px 누적 diff). 진단 test 로 root cause 추가 단언:

- HWP3 CharShape id=59 font_ids[0]=1 → group 0 idx 1 = "신명조"
- HWP5 변환본 id=27 font_ids[0]=4 → "한양신명조" (= HY신명조)

→ HWP3 raw 의 "신명조" 와 HWP5 변환본의 "HY신명조" 가 rhwp 내부에서
다른 폰트 metric 으로 평가되어 char advance drift 발생. 한컴 변환기는
HWP3→HWP5 변환 시 "신명조" → "한양신명조" 매핑 적용 (legacy name → 표준
명칭).

Fix: HWP3 parser 의 font_faces 로딩 시 동일 매핑 적용
(hwp3_font_name_to_hwp5):
- 신명조/신명 → HY신명조
- 고딕 → HY고딕
- 중고딕 → HY중고딕
- 견고딕 → HY견고딕
- 그래픽 → HY그래픽

Font.alt_name 에 원본 명칭 보존 (트레이싱 + 디버깅).

SVG 좌표 정합 단언 (사업개요 캡션 paragraph 4):
- HWP3 BEFORE:  "@131.69 → 세@134.69 → ... → 한@401.21
- HWP3 AFTER:   "@131.69 → 세@137.69 → ... → 한@408.37 (HWP5 변환본 정합)
- HWP5 변환본:  "@131.69 → 세@137.69 → ... → 한@408.37

→ HWP3 SVG 좌표가 HWP5 변환본과 byte-for-byte 일치. SVG font-family 의
첫 폰트가 동일 ("HY신명조") → 동일 fallback chain → 동일 폰트 metric.

회귀 sweep:
- cargo test --lib: 1307 passed
- cargo test --test issue_1008_gradient: 4 passed (격차 A+B+C+D 모두)
- cargo test --tests: FAILED 0
- clippy/fmt: clean
- 페이지 수 sweep 25 fixture: 회귀 0

회귀 가드 추가: hwp3_sample16_font_name_mapped_to_hwp5_convention.

Refs edwardkim#1008

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Stage 1~5 v2 종결:
- 격차 A: HWP3 Shape gradient IR 매핑 (drawing.rs)
- 격차 B: HWP3 Shape border LineType 2~7 → Solid (drawing.rs)
- 격차 C: HWP3 heading decoration 휴리스틱 strip (mod.rs)
- 격차 D: HWP3 CharShape pos dedupe + 폰트명 한컴 변환기 mimic 매핑 (mod.rs)

작업지시자 시각 검증 통과 (HWP3 cover + 사업개요 + 5p Ⅱ.제안일반사항 영역
한컴 한글 정답 정합). HWP3 SVG 좌표가 HWP5 변환본과 byte-for-byte 일치.

closes edwardkim#1008 (PR merge 시점에 자동 close 예정)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…다중 line 정리)

PR edwardkim#1034 CI 의 cargo fmt --all 검사 실패 — issue_1008_gradient.rs:119 의
method chain (doc.doc_info.font_faces.first().expect(...)) 가 line length
초과로 다중 line 으로 분할되어야 함. local 의 cargo fmt --check (--all 없음)
은 통과했으나 CI 의 --all 적용 시 추가 정리 발생.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@edwardkim edwardkim self-requested a review May 20, 2026 13:59
@edwardkim edwardkim added the enhancement New feature or request label May 20, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone May 20, 2026
edwardkim added a commit that referenced this pull request May 20, 2026
…격차 종합 정정

@jangster77 25+번째 PR (paper_based outline 시리즈 #1011/#1015/#1031
마무리 후 HWP3 sample16 정합 시리즈 진입). samples/hwp3-sample16.hwp
한컴 한글 정답지 비교 4 격차 종합 정정. src/parser/hwp3/ 격리 엄격
(HWP5/HWPX/renderer 무수정).

본문 가설 정반대 발견: 원본 이슈 가설(HWP5 변환본 gradient strip) 이
한컴 한글 정답지 시각 검증 결과 정반대로 판명 (gradient 가 정답, HWP3
회귀). issue body + 수행/구현계획서 v2 재작성 — feedback_visual_judgment_authority
모범 사례.

본질 (2 코드 + 1 test + 9 문서):
- 격차 A — HWP3 Shape gradient IR 매핑 (drawing.rs:792~830):
  HWP3 raw Hwp3DrawingObjectGradientAttr 가 이미 파싱되었으나 Fill IR
  구축에서 fill_type=Solid 하드코딩으로 데이터 무시. HWP5 doc_info.rs:404
  와 동일 contract 로 GradientFill 주입.
- 격차 B — Shape border LineType 2~7 → Solid normalize (drawing.rs:758~785):
  HWP3 raw style=0x0002 (LineType=2 Dash) 가 점선 렌더되나 한컴은 실선.
  sample16 한정 분포 — narrow fix 회귀 risk 0.
- 격차 C — HWP3 heading decoration 휴리스틱 strip (mod.rs:2870~2960):
  "═════■ 1.추진목적 ■═════" 형태 decoration 을 fixup_hwp3_heading_decoration
  + strip_heading_decoration 패턴 detection 으로 strip. 한컴 변환기 mimic.
- 격차 D-1 — CharShape dedupe (mod.rs:1869~1900):
  같은 start_pos 에 rep + inline shape change 양쪽 push 시 마지막
  (inline override) 유지.
- 격차 D-2 — 폰트명 매핑 (mod.rs:2570~2585, 2908~2924):
  "신명조"→"HY신명조" 등 5 legacy 매핑 + font.alt_name 원본 보존.
  HWP3 SVG 좌표가 HWP5 변환본과 byte-for-byte 일치.

검증 (본 환경):
- cargo test --release --lib 1319 passed
- cargo test --release --tests 모든 통합 passed
- cargo test --release --test issue_1008_gradient **4/4 passed**:
  hwp3_sample16_business_box_has_gradient, _border_solid,
  _heading_decoration_stripped, _font_name_mapped_to_hwp5_convention
- cargo fmt --all --check clean
- sweep 9 fixtures: hwp3-sample16 **44 diff** (의도된 본 PR 본질, 페이지
  수 64→64 불변) / 다른 8 fixtures (HWP5/HWPX 변환본 + sample10/11/sample
  + exam_kor/aift/biz_plan) **diff=0** — HWP3 격리 검증, PR #1031/#1032/
  #1033 회귀 부재
- SVG 본질 검증: cover <radialGradient id="grad1" #c8ccf8→#ffffff> 추가
  + 폰트 "신명조"→"HY신명조" 매핑
- WASM Docker 빌드 4.89MB + rhwp-studio 동기화
- 작업지시자 시각 판정 통과

squash 적용:
- PR base = 5263f53 (PR #1032 후 docs commit) — PR #1033 (01a8c75)
  미흡수
- cherry-pick 직접 머지 대신 본질 파일만 origin/devel 위에 squash
  적용 (src/parser/hwp3/{drawing.rs, mod.rs} + tests/issue_1008_gradient.rs
  + 문서 8 파일, 총 11 파일)
- 결과: PR #1033 영역 (src/renderer/*, advance_row_block_cut, is_block_split)
  자동 보존 + 본 PR 본질 적용

한계 (PR 본문 명시):
- 휴리스틱 (격차 C): HWP3 spec 미참조 패턴 detection — 의도된
  "═══...■...■═══" typography 회귀 risk. sweep diff=0 으로 1차 입증
- 폰트 매핑 5 legacy 한정: 다른 명칭 발견 시 확장 필요
- 공백 cosmetic 비범위: rhwp "1.추진목적" vs 한컴 "1. 추진목적" period
  뒤 공백 — HWP3 raw 부재, 한컴 자동 삽입

closes #1008

Co-Authored-By: Taesup Jang <tsjang@gmail.com>
@edwardkim

Copy link
Copy Markdown
Owner

Merged via squash (commit 787d49e, author @jangster77 Taesup Jang 보존) into devel 2eac935b.

본 환경 검증 통과: cargo test 1319 + 통합 + issue_1008 4/4 + sweep 9 fixtures (hwp3-sample16 44 diff 의도된 본 PR 본질, 다른 8 fixtures diff=0) + WASM 4.89MB + 작업지시자 시각 판정.

PR base = 5263f53 (PR #1032 후 docs commit), origin/devel = bbd38e8 (PR #1033 머지 후). PR head 의 마지막 devel merge 가 PR #1033 미흡수 → cherry-pick 직접 머지 대신 본질 파일 (src/parser/hwp3/*.rs + tests/issue_1008_gradient.rs + 문서 8) 만 origin/devel 위에 squash 적용으로 PR #1033 영역 (advance_row_block_cut, is_block_split) 자동 보존.

closes #1008

@edwardkim edwardkim closed this May 20, 2026
edwardkim added a commit that referenced this pull request May 20, 2026
PR #1034 (closes #1008) 머지 후속 처리:
- mydocs/pr/archives/pr_1034_review.md (검토 문서 archives 이동)
- mydocs/orders/20260520.md (PR #1034 entry 추가)
- rhwp-studio/public/{rhwp.d.ts,rhwp.js,rhwp_bg.wasm} (WASM 4.89MB 동기화)

@jangster77 HWP3 sample16 정합 시리즈 진입 (#1008 본 PR + #1035 후속).
src/parser/hwp3/ 격리 엄격 (CLAUDE.md 규칙 정합).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 21, 2026
- mydocs/pr/archives/pr_1040_review.md (이동)
- mydocs/pr/archives/pr_1040_report.md (최종 보고서 신규)
- mydocs/plans/archives/task_m100_1037.md + task_m100_1037_impl.md (이동)
- mydocs/orders/20260521.md PR #1040 항목 추가

PR #1040 (closes #1037, @jangster77 30번째 기여): HWP5 변환본 ParaShape
unit normalize + Dialog 한컴 정합 fix. parser 단계 ParaShape /= 2
normalize + style_resolver variant_div 4 → uniform 2 + build_para_properties_json
raw_ps 직접 사용 + is_hwp3_variant 분기.

squash merge (devel c6fb7f2) + 10 fixture BEFORE/AFTER diff = 0
(rendering 무변동 정량 입증) + Dialog 4 필드 한컴 정합 시각 판정 통과 +
WASM 4.90MB 동기화. PR #1036 alignment 60/64 + 페이지 수 64 완전 보존.

HWP3 sample16 정합 시리즈 (PR #1031/#1034/#1036/#1040) 마무리.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants