Skip to content

fix: Visual Diff 기반 렌더링 호환성 개선 — PUA 심볼 + 문단 테두리 + 표 외곽 테두리 (#249)#251

Merged
edwardkim merged 5 commits into
edwardkim:develfrom
seanshin:feature/pua-symbol-border-margin
Apr 23, 2026
Merged

fix: Visual Diff 기반 렌더링 호환성 개선 — PUA 심볼 + 문단 테두리 + 표 외곽 테두리 (#249)#251
edwardkim merged 5 commits into
edwardkim:develfrom
seanshin:feature/pua-symbol-border-margin

Conversation

@seanshin

Copy link
Copy Markdown

개요

Issue: #249

Visual Diff 파이프라인(한컴 PDF ↔ rhwp SVG 페이지별 픽셀 비교)을 통해 발견한 렌더링 불일치 3건 수정.

변경 사항

1. PUA 심볼 문자 렌더링 (8e5183c)

Wingdings 등 심볼 폰트의 PUA 영역(U+F000~F0FF) 문자를 유니코드 표준 문자로 변환.
SVG, Canvas, HTML 세 렌더러에 map_pua_bullet_char() 일관 적용.

2. 문단 border_fill margin 반영 (7e2c6eb)

border_fill rect 계산 시 margin_left/margin_right 적용.
테두리 박스 위치·폭이 텍스트 영역과 정확히 일치.

3. 표 외곽 테두리 fallback + clip_rect 개선 (3f0538d)

  • border_fill_id 설정 시 외곽 테두리 그리기, 셀 커버 영역 제외 처리
  • clip_rect를 콘텐츠 레이아웃 후 확정하여 표 외곽 테두리 클리핑 방지

검증

  • cargo test: 793개 전체 통과, 0 실패
  • Visual Diff 파이프라인으로 한컴 렌더링과 페이지별 비교 검증

문서

비포함 사항

hyoun mouk shin added 5 commits April 23, 2026 08:13
Wingdings 등 심볼 폰트의 PUA 영역(U+F000~F0FF) 문자를 유니코드
표준 문자로 변환하여 세 렌더러에서 정상 표시.

- ⇩⇧⇦⇨ 화살표, ●■◆ 도형, ✔☑ 체크마크
- SVG/Canvas/HTML 세 경로에 map_pua_bullet_char() 일관 적용
border_fill 렌더링 시 문단 여백(margin_left, margin_right)을
적용하여 테두리 박스가 텍스트 영역과 정확히 일치하도록 수정.
- table.border_fill_id가 설정된 경우 외곽 테두리 그리기 추가
- 셀로 커버된 영역을 제외하고 셀 미커버 영역에만 fallback 적용
- clip_rect를 콘텐츠 레이아웃 후 확정하여 표 외곽 테두리가 잘리지 않도록 수정
- mydocs/plans/task_m100_249.md — 수행계획서 (Visual Diff + PUA + 문단/표 테두리)
- mydocs/plans/task_m100_249_impl.md — 구현계획서 (3단계)
- mydocs/report/task_m100_249_report.md — 최종 결과보고서
- mydocs/plans/task_m100_250.md — 수행계획서 (Right Tab 정렬, 별도 PR)
@edwardkim

edwardkim commented Apr 23, 2026

Copy link
Copy Markdown
Owner

놀랍습니다. 이렇게 빠른 시간에 하이퍼-워터폴에 따라 PR 보내주시다니!
제가 지식의 증류가 과연 사람과 그 사람이 사용하는 클로드 코드에 전이가 될 수 있을까 하는 기대반 걱정반으로 시작한 프로젝트인데 2주도 안돼 이런 분을 보게 되다니!

@edwardkim

Copy link
Copy Markdown
Owner

@seanshin 감사합니다. 머지 완료했습니다.

어제 PR #234 의 리젝트 피드백을 모두 정확하게 반영해주셔서 재검토가 수월했습니다. 특히:

  • base 를 devel 로 정정하고 작업을 feature 브랜치로 분리하신 점
  • 메타 변경 (Cargo.toml / CHANGELOG / README) 을 릴리즈 시점으로 분리하신 점
  • Right Tab 정렬은 별도 이슈 Right Tab 정렬 수정: 목차 페이지 번호 정렬 오차 (선행 공백 처리) #250 으로 빼내어 범위를 깔끔히 하신 점
  • 수행계획서 / 구현계획서 / stage 1~3 완료보고서 / 최종 결과보고서까지 프로젝트의 하이퍼-워터폴 구조를 그대로 맞춰주신 점

FIRST_TIME_CONTRIBUTOR 첫 PR 에 이 정도로 프로젝트 규칙을 학습해주셔서 앞으로가 더 기대됩니다.

사전 검증 결과 (로컬):

  • 자동 머지 충돌 0
  • `cargo test --lib` 941 passed
  • `cargo clippy -- -D warnings` 0 warning

Visual Diff 파이프라인은 이번 PR 에 포함되지 않았지만, 다음 기여에서 공개해주시면 프로젝트의 회귀 검증 인프라 (PR #181 의 SVG snapshot 하네스와 병존) 에 큰 도움이 될 것 같습니다.

Right Tab (#250) PR 작성하실 때도 이번 방식 그대로 올려주시면 됩니다. 감사합니다.

edwardkim added a commit that referenced this pull request Apr 23, 2026
… + table border)

PR #251 (by @seanshin · #249) 머지 후 CI Build & Test 실패:
- test form_002_page_0 ... FAILED
- test table_text_page_0 ... FAILED

원인: PR #251 의 3가지 렌더 수정이 SVG 출력에 의도된 미세 변화를 발생시킴.
- PUA 심볼 문자 → 유니코드 표준 문자 (map_pua_bullet_char)
- 문단 border_fill margin 반영 (margin_left/right 적용)
- 표 외곽 테두리 fallback + 셀 미커버 영역 한정

determinism probe (render_is_deterministic_within_process) 는 통과 →
하네스 자체는 정상, golden 만 outdated.

UPDATE_GOLDEN=1 cargo test --test svg_snapshot 로 재생성 후 결정성 재검증.

Verification:
- cargo test --test svg_snapshot → 3 passed (form_002 + table_text + determinism)
- 두 번째 실행 back-to-back 결정성 유지
- 변경 규모: +3/-3 (PR #251 의 국소 렌더 수정 반영분만)

CI 실패 로그: run #24809115353

Refs #249 · #181 (hwpx snapshot harness)

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

Copy link
Copy Markdown
Author

감사합니다! 하이퍼-워터폴 구조 덕분에 단계별로 검증하면서 진행할 수 있었습니다. Right Tab(#250)도 동일한 방식으로 PR 올리겠습니다. Visual Diff 파이프라인은 이슈 #253에 상세히 공유드리겠습니다.

@seanshin

seanshin commented Apr 23, 2026 via email

Copy link
Copy Markdown
Author

edwardkim added a commit that referenced this pull request Apr 23, 2026
…ot 반영)

피드백 mydocs/feedback/manual_currency_audit.md 결정 반영. 최근 사이클의 주요 변경을
매뉴얼에 동기화하고, PR 처리 절차 매뉴얼을 신설.

[A] publish_guide.md
- 버전 예시 0.7.0 → 0.7.3 (현재 릴리즈 기준)
- 커맨드 예시 갱신 (git tag v0.7.3 등)
- 테스트 수치 783 → 941
- 신규 섹션 "브라우저 확장 버전 정책 (라이브러리와 이원화)" — v0.2.x 정책 명문화

[B] chrome_edge_extension_build_deploy.md → 통합 확장 매뉴얼로 확장
- 제목: "브라우저 확장 빌드 및 배포 매뉴얼 (Chrome/Edge/Firefox/Safari)"
- 빌드 크기 실측치 갱신 (WASM 3.9MB · 전체 23MB)
- 테스트 페이지에 06-security.html 추가
- 4.4 절 Firefox (AMO 제출 절차) + 4.5 절 Safari (macOS 전용 빌드) 신규

[C] browser_extension_dev_guide.md
- 제목: Safari/Chrome/Edge → Safari/Chrome/Edge/Firefox
- Service Worker vs Background Scripts 표에 Firefox 열 추가
- 9절 신규 "chrome.* vs browser.* 네임스페이스 차이"
- 10절 신규 "rhwp-shared/ 공통 모듈 + 심볼릭 링크 + dereference 빌드 패턴" (PR #214)
- 11절 신규 "Chrome onDeterminingFilename vs Firefox onCreated+onChanged"

[D] hyper_waterfall.md
- 783+ 테스트 → 941+ 테스트
- "1인 개발" → "1인 메인테이너 + Claude Code AI + 외부 기여자 9명 (v0.2.1 기준)"
- "v0.6.0 릴리즈" → "v0.5.0 공개 릴리즈 (뼈대 완성 지점)"

[E] e2e_verification_guide.md
- 신규 섹션 "SVG 회귀 검증 (Rust 유닛 테스트 기반)" — PR #181 하네스
- UPDATE_GOLDEN=1 사용법, 결정성 재확인 절차
- 경고: 렌더 영향 PR 머지 후 golden 재생성 필수 (PR #221 / #251 2회 재현)
- 신규 섹션 "향후 작업 — 한컴 PDF 기준 Visual Diff 하네스" — 이슈 #253

[F] onboarding_guide.md
- E2E 모드 설명 환경 일반화 (Windows Chrome → 로컬/컨테이너 헤드리스 · 호스트 Chrome/Chromium)

[G.2] 신규 mydocs/manual/pr_review_workflow.md
- PR 리뷰 · 통합 워크플로우 표준화
- 리뷰 문서 2종 (review + impl) 작성 절차
- 로컬 사전 검증 (빌드/테스트/Clippy/doctest/svg_snapshot)
- Admin merge 후 필수 후속 (이슈 close · 감사 코멘트 · devel sync · golden 재생성 · archives 이동)
- 재작업 요청 패턴 (PR #234#251 사례)
- 예외 케이스 (dependabot · 오래된 base · 대형 PR)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Apr 23, 2026
…ot 반영)

피드백 mydocs/feedback/manual_currency_audit.md 결정 반영. 최근 사이클의 주요 변경을
매뉴얼에 동기화하고, PR 처리 절차 매뉴얼을 신설.

[A] publish_guide.md
- 버전 예시 0.7.0 → 0.7.3 (현재 릴리즈 기준)
- 커맨드 예시 갱신 (git tag v0.7.3 등)
- 테스트 수치 783 → 941
- 신규 섹션 "브라우저 확장 버전 정책 (라이브러리와 이원화)" — v0.2.x 정책 명문화

[B] chrome_edge_extension_build_deploy.md → 통합 확장 매뉴얼로 확장
- 제목: "브라우저 확장 빌드 및 배포 매뉴얼 (Chrome/Edge/Firefox/Safari)"
- 빌드 크기 실측치 갱신 (WASM 3.9MB · 전체 23MB)
- 테스트 페이지에 06-security.html 추가
- 4.4 절 Firefox (AMO 제출 절차) + 4.5 절 Safari (macOS 전용 빌드) 신규

[C] browser_extension_dev_guide.md
- 제목: Safari/Chrome/Edge → Safari/Chrome/Edge/Firefox
- Service Worker vs Background Scripts 표에 Firefox 열 추가
- 9절 신규 "chrome.* vs browser.* 네임스페이스 차이"
- 10절 신규 "rhwp-shared/ 공통 모듈 + 심볼릭 링크 + dereference 빌드 패턴" (PR #214)
- 11절 신규 "Chrome onDeterminingFilename vs Firefox onCreated+onChanged"

[D] hyper_waterfall.md
- 783+ 테스트 → 941+ 테스트
- "1인 개발" → "1인 메인테이너 + Claude Code AI + 외부 기여자 9명 (v0.2.1 기준)"
- "v0.6.0 릴리즈" → "v0.5.0 공개 릴리즈 (뼈대 완성 지점)"

[E] e2e_verification_guide.md
- 신규 섹션 "SVG 회귀 검증 (Rust 유닛 테스트 기반)" — PR #181 하네스
- UPDATE_GOLDEN=1 사용법, 결정성 재확인 절차
- 경고: 렌더 영향 PR 머지 후 golden 재생성 필수 (PR #221 / #251 2회 재현)
- 신규 섹션 "향후 작업 — 한컴 PDF 기준 Visual Diff 하네스" — 이슈 #253

[F] onboarding_guide.md
- E2E 모드 설명 환경 일반화 (Windows Chrome → 로컬/컨테이너 헤드리스 · 호스트 Chrome/Chromium)

[G.2] 신규 mydocs/manual/pr_review_workflow.md
- PR 리뷰 · 통합 워크플로우 표준화
- 리뷰 문서 2종 (review + impl) 작성 절차
- 로컬 사전 검증 (빌드/테스트/Clippy/doctest/svg_snapshot)
- Admin merge 후 필수 후속 (이슈 close · 감사 코멘트 · devel sync · golden 재생성 · archives 이동)
- 재작업 요청 패턴 (PR #234#251 사례)
- 예외 케이스 (dependabot · 오래된 base · 대형 PR)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Apr 23, 2026
…archives)

[rhwp-firefox v0.2.1 — AMO 첫 등록 준비]

버전 정합:
- manifest.json: version 0.1.1 → 0.2.1 (rhwp-chrome / rhwp-safari 와 일치)
- package.json: 0.1.1 → 0.2.1
- (dev-tools-inject.js / content-script.js 는 manifest 단일 소스 패턴 — 수정 불필요)

manifest 정리 (web-ext lint 경고 제거):
- browser_specific_settings.gecko.data_collection_permissions 키 삭제
- 사유: Firefox 140+ 신규 키, strict_min_version 112 와 불일치
- 우리는 데이터 수집 안 함이 PRIVACY.md 에 명시되므로 키 자체 불필요

빌드 + 검증:
- rm -rf dist && npm run build (clean) — 18MB
- symlink dereference 정상 (download-interceptor-common.js 실체 파일)
- web-ext lint: errors 0, notices 0, warnings 21 (표준 WASM/Vite 패턴)
- output/amo/rhwp-firefox-0.2.1.zip 패키징 (12.4 MB · 52 파일)

AMO 메타 초안:
- mydocs/release/amo_submission_v0.2.1.md
- 제목/요약/상세 설명 (한국어 + 영문)
- Reviewer Notes (권한 사용 근거)
- 스크린샷 준비 가이드 (5종)
- 제출 절차 + 후속 작업

[부수 작업 — PR #251 archives 동반 커밋]
- mydocs/pr/archives/pr_251_review.md
- mydocs/pr/archives/pr_251_review_impl.md
(이전 PR #251 머지 시 archives 이동만 하고 미커밋 상태였음)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request Apr 23, 2026
[매뉴얼 chrome_edge_extension_build_deploy.md §4.4 보강]

rhwp-firefox v0.2.1 AMO 초기 제출 중 연속 마주친 4개 에러 기록:
1. data_collection_permissions 필수 (web-ext lint 경고보다 우선)
2. gecko_android strict_min_version placeholder 거부 (키 생략이 공식 옵트아웃)
3. gecko id 중복 (플랫폼 suffix 포함 권장)
4. 소스 코드 제출 필수 (GitHub URL 불가, zip 업로드 필수)

표 형식으로 에러 → 해결책 1:1 매핑. Reviewer Notes 필수 포함 8개 항목 체크리스트 +
빌드 지침 필수 포함 5개 항목 체크리스트 추가.

[오늘할일 mydocs/orders/20260423.md]

오늘 하루 대규모 작업 사이클 전체 기록:
1. 원격 동기화 (main cherry-pick + devel rebase)
2. PR #251 통합 + svg_snapshot CI 실패 핫픽스
3. Visual Diff 하네스 이슈 #253 등록 + @seanshin 코멘트
4. 자기검열 2차 라운드 (사이냅 거명 익명화 + 최상급 완화)
5. oosmetrics 배지 추가
6. README_EN 한글판 구조로 전면 동기화
7. 매뉴얼 7건 현행화 (+ pr_review_workflow 신규)
8. Firefox AMO 초기 제출 (4대 에러 연속 대응 후 접수 완료)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 1, 2026
PR #251 의 draw_text 영역 PUA 변환 영역 보존 + 한컴 PDF 정답지 캡처 영역
정합으로 매핑 표 정정. Supplementary PUA-A 영역 (0xF02B0~F02FF) 신규
분기 추가. gen-pua 서브명령 영역 검증 도구 추가. 작업지시자 시각 검증
통과 ★.

매핑 정정 (2개):
- U+0F0A0: ▪ U+25AA → · U+00B7 (Middle dot, synam-001 9회)
- U+0F0E8: ➤ U+27A4 → ➔ U+2794 (Heavy wide-headed arrow, kps-ai 4회)

Supplementary PUA-A 신규 매핑 (10개):
- U+F02B1~F02B9 → ① ~ ⑨ (U+2460~U+2468, mel-001/kps-ai)
- U+F02EF → · U+00B7 (KTX 회귀 영역)

3개 렌더러 (svg/web_canvas/html) 의 draw_text 에 PR #251 PUA 변환 보존:
let text = &text.chars().map(map_pua_bullet_char).collect::<String>();

검증 게이트:
- cargo test --lib pua_mapping 5/5 통과
- cargo test --test svg_snapshot 6/6 통과 (회귀 0)
- WASM 4.18 MB 빌드 성공
- 작업지시자 시각 검증 통과 (KTX p10 + samples/pua-test.hwp)

별도 영역 결함 (본 task 너머): Supplementary PUA-A 의 SVG 출력 누락
(UTF-16 surrogate pair 처리 결함 추정) — 별도 task 분리 권장.

closes #509

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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