Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
192 commits
Select commit Hold shift + click to select a range
ed47f36
chore(deps): update skia-safe requirement from 0.93.1 to 0.97.0
dependabot[bot] May 11, 2026
8f94dc6
chore(deps-dev): bump vite from 8.0.10 to 8.0.11 in /rhwp-studio
dependabot[bot] May 11, 2026
16ebbcd
chore(deps-dev): bump workbox-window from 7.4.0 to 7.4.1 in /rhwp-studio
dependabot[bot] May 11, 2026
68c25ca
chore(deps-dev): bump @types/chrome in /rhwp-studio
dependabot[bot] May 11, 2026
7f26c3b
Merge pull request #802 from edwardkim/dependabot/npm_and_yarn/rhwp-s…
edwardkim May 11, 2026
6104c15
Merge pull request #803 from edwardkim/dependabot/npm_and_yarn/rhwp-s…
edwardkim May 11, 2026
7d31f6c
Merge pull request #805 from edwardkim/dependabot/npm_and_yarn/rhwp-s…
edwardkim May 11, 2026
7663280
chore(deps-dev): bump puppeteer-core in /rhwp-studio
dependabot[bot] May 11, 2026
7275aae
Merge pull request #806 from edwardkim/dependabot/npm_and_yarn/rhwp-s…
edwardkim May 11, 2026
ffdcb1a
Merge pull request #800 from edwardkim/dependabot/cargo/devel/skia-sa…
edwardkim May 11, 2026
5ac2362
chore(deps): update resvg requirement from 0.45 to 0.47
dependabot[bot] May 11, 2026
7f285b3
Merge pull request #801 from edwardkim/dependabot/cargo/devel/resvg-0.47
edwardkim May 11, 2026
8181f42
chore(deps-dev): bump vite-plugin-pwa in /rhwp-studio
dependabot[bot] May 11, 2026
6ebb03b
Merge pull request #804 from edwardkim/dependabot/npm_and_yarn/rhwp-s…
edwardkim May 11, 2026
6b2fcd7
feat: Alt/Option+Arrow 단어 단위 커서 이동 구현 (#223)
oksure May 11, 2026
a32895b
fix: Copilot 리뷰 반영 — 주석 수정 + 셀 텍스트 슬라이스 최적화
oksure May 11, 2026
7c0418f
fix: Alt+Delete 영역 표 안/외 분기 정정 (PR #794 후속)
edwardkim May 11, 2026
76e242c
Merge PR #794 (Part of #223): feat Alt/Option+Arrow 단어 단위 커서 이동
edwardkim May 11, 2026
df16e41
PR #794 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
2efe20c
fix: 표 셀 내부 드래그 선택 시 셀 컨텍스트 보호 (#669)
oksure May 11, 2026
58176ed
Merge PR #795 (closes #669): fix 표 셀 내부 드래그 선택 시 셀 컨텍스트 이탈 방지
edwardkim May 11, 2026
724ef0d
PR #795 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
795a132
feat: add text ir v2 layer contract
seo-rii May 10, 2026
098db01
Merge PR #797 (Refs #536): render — add Text IR v2 compatibility cont…
edwardkim May 11, 2026
bfac61d
PR #797 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
394f114
feat(rhwp-studio): align paragraph map for control diff after shift
May 4, 2026
b2b7f2c
chore(rhwp-studio): 비교/이력 UI와 WasmBridge 보조 API 통합 (devel 동기화 후 stash…
May 5, 2026
09eff8f
feat(rhwp-studio): 문서 비교·이력 커맨드 및 메뉴/단축키 연결
May 5, 2026
41b49c7
Task #571: rhwp-studio 문서 비교·이력(diff 위치 라벨, 대화상자 스타일) 및 골든 SVG 갱신
May 11, 2026
867a907
fix: PR #799 정정 — actual.svg 테스트 임시 파일 제거
edwardkim May 11, 2026
6b9ad9e
Merge PR #799 (closes #571 part 1/3): rhwp-studio 문서 비교·이력 + diff-eng…
edwardkim May 11, 2026
56abf4d
PR #799 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
01edfad
fix: 줄 끝 이동 후 줄 시작 이동 시 커서 미동작 수정 (#785)
oksure May 11, 2026
a0d1622
address review: moveVertical에서 atLineEnd 초기화 누락 수정
oksure May 11, 2026
6aa4afd
chore(rhwp-studio): Task #516 진단 console.log 3개소 제거
edwardkim May 11, 2026
3960b3b
Merge PR #807 (closes #785): 줄 끝 이동 후 줄 시작 이동 시 커서 미동작 수정
edwardkim May 11, 2026
c7cb079
PR #807 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
b2a229f
fix: WasmBridge에 getSectionCount() 래퍼 추가
oksure May 11, 2026
4d6af01
fix: moveToDocumentEnd 다중 구역 문서 지원 (#784)
oksure May 11, 2026
f2ab6e0
fix(rhwp-studio): Ctrl+↑/↓ 이전/다음 문단 이동 — 한컴 표준 정합 (PR #808 후속)
edwardkim May 11, 2026
ca729bd
Merge PR #808 (closes #784): moveToDocumentEnd 다중 구역 문서 지원
edwardkim May 11, 2026
e969471
PR #808 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
3d59db1
feat: 쪽 새 번호로 시작 — insertNewNumber WASM API + dialog UI (#791)
oksure May 11, 2026
05a3f5e
address review: start_num 범위 검증 + 이벤트명 정정
oksure May 11, 2026
f285df1
fix: Copilot 리뷰 반영 — new-page-num canExecute에 !inTable 가드 추가
oksure May 11, 2026
47ef8fc
Merge PR #809 (closes #791): 쪽 새 번호로 시작 — insertNewNumber WASM API + …
edwardkim May 11, 2026
d7acd9c
PR #809 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
f372a4e
feat: 메뉴 열린 상태 단일 키 hotkey 항목 활성 인프라 (#792)
oksure May 11, 2026
3cdf7a6
address review: hotkey 경로에서도 data-* params 전달
oksure May 11, 2026
e1be8d9
Merge PR #810 (closes #792): 메뉴 열린 상태 단일 키 hotkey 항목 활성 인프라
edwardkim May 11, 2026
86a1b81
PR #810 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
4f113dc
feat: F5 본문 블록 선택 모드 + F3 영역 확장 선택 (#220)
oksure May 11, 2026
59a01de
address review: enterBlockSelectionMode에서 anchor 강제 설정
oksure May 11, 2026
dc6aa7a
fix: PR #811 정정 — getSectionCount 중복 정의 제거
edwardkim May 11, 2026
d8e641a
Merge PR #811 (closes #220 partial — 4단계): F5 본문 블록 선택 + F3 영역 확장
edwardkim May 11, 2026
c2de7ba
PR #811 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
79291f3
fix: master page 글상자 더블클릭 시 첫 페이지 jump 방지 (#686)
oksure May 11, 2026
eab2290
address review: ppi=0 가드 개선 — 주석 정정 + updateCaret 제거
oksure May 11, 2026
744ca7b
Merge PR #812 (closes #686): master page 글상자 더블클릭 시 첫 페이지 jump 방지
edwardkim May 11, 2026
d8db833
PR #812 처리 후속: 보고서 + archives 이동 + 5/11 orders 갱신
edwardkim May 11, 2026
925443a
PR #813 처리 후속: 보고서 + archives + 5/11 orders 갱신 (옵션 C close)
edwardkim May 11, 2026
03a3307
fix: searchAllText API 추가 — rhwpDev.search() 다중 매치 정합성 수정 (#692)
oksure May 11, 2026
2f4ba94
address review: 인코딩 깨짐 수정 + SearchHit.para 의미 문서화
oksure May 11, 2026
4f763f1
fix: PR #814 정정 — main.ts initRhwpDev 중복 import 제거
edwardkim May 11, 2026
306159c
Merge PR #814 (closes #692): searchAllText API + rhwpDev.search() 다중 …
edwardkim May 11, 2026
147dc7d
PR #814 처리 후속: 보고서 + archives + 5/11 orders 갱신
edwardkim May 11, 2026
2d3a274
feat(rhwp-studio): rhwpDev.goto(hit, options?) 메서드 + 교육용 help() 확장
edwardkim May 11, 2026
2169914
docs(npm/editor): README 영역 영역 rhwpDev 디버깅 도구 사용법 추가
edwardkim May 11, 2026
6a1c979
PR #815 처리 후속: 보고서 + archives + 5/11 orders 갱신 (옵션 C close)
edwardkim May 11, 2026
68bd45e
PR #817 처리 후속: 보고서 + archives + 5/12 orders 신규 (옵션 C close)
edwardkim May 11, 2026
f1abc87
perf: enable LTO + codegen-units=1 + strip for release builds
oksure May 11, 2026
9ccb0c3
chore: strip=debuginfo로 변경 (panic backtrace 보존)
oksure May 11, 2026
f5abcf8
Merge PR #818 (closes #790): release 빌드에 LTO + codegen-units=1 + stri…
edwardkim May 11, 2026
2bd50a3
PR #818 처리 후속: 보고서 + archives + 5/12 orders 갱신
edwardkim May 11, 2026
151da00
feat: Ctrl+Backspace 단어 삭제 + Cmd+Backspace 줄 시작 삭제 (PR #819 착안, close…
May 13, 2026
e8cb19c
Merge local/devel: PR #819 처리 (옵션 B — Ctrl/Cmd+Backspace 메인테이너 직접 구현,…
May 13, 2026
960c056
PR #819 처리 후속: 검토 보고서 archives + 오늘할일(5/13) 신규
May 13, 2026
89a516c
fix: SVG generic_fallback이 영문 세리프 폰트명을 인식하도록 개선
oksure May 11, 2026
7d2f740
test: generic_fallback 회귀 테스트 추가 + 주석 정정
oksure May 11, 2026
00aefd9
Merge local/devel: PR #820 cherry-pick (SVG 폰트 폴백 체인 영문 세리프 인식 개선 — @…
May 13, 2026
6fd7a90
feat: Ctrl+Delete 단어 단위 전방 삭제 (PR #821 착안, Ref #260)
May 13, 2026
b07e5c4
Merge local/devel: PR #821 처리 (옵션 B — Ctrl+Delete 단어 전방 삭제 메인테이너 직접 구…
May 13, 2026
c87dce1
PR #819/#820/#821 처리 후속: 검토 보고서 archives + 오늘할일(5/13) 갱신
May 13, 2026
03fc656
docs: add codex memory dump
edwardkim May 13, 2026
69de629
feat: Ctrl+ㄷ 한글 IME 매핑 추가 (PR #822 착안)
May 13, 2026
8bd8577
Merge local/devel: PR #822 처리 (Ctrl+ㄷ 한글 IME 매핑 추가 — devel 흡수 후 미구현 1…
May 13, 2026
3cfc962
fix: 중고딕 계열 폰트 SVG/HTML font-weight 500 적용 (#585)
oksure May 11, 2026
7902947
fix: Copilot 리뷰 반영 — doc comment + case-insensitive ASCII 매칭
oksure May 11, 2026
fe0db8a
test: 중고딕 font-weight 500 SVG/HTML 렌더링 테스트 추가 + golden 갱신
oksure May 11, 2026
e71e5c5
Merge local/devel: PR #829 cherry-pick (중고딕 계열 폰트 font-weight 500 적용 …
May 13, 2026
da036f3
feat: 이미지 파일 드래그 앤 드롭으로 삽입 (#307)
oksure May 11, 2026
358b051
fix: 이미지 드롭 시 try/finally로 blob URL 누수 방지 + decode 실패 처리
oksure May 11, 2026
c5a357d
Merge local/devel: PR #830 cherry-pick (이미지 드래그 앤 드롭 삽입 — @oksure 2 c…
May 13, 2026
1bb6384
feat: sample11.hwp 머리말 영역 결함 3건 통합 정정 (closes #824, closes #825, clos…
jangster77 May 13, 2026
6f87893
Merge local/devel: PR #832 cherry-pick (sample11.hwp 머리말 영역 결함 3건 통합 …
May 13, 2026
8194be6
feat: 다른 이름으로 저장 + 저장 cancel fallback 정정 (closes #833)
jangster77 May 13, 2026
0aedfbb
Merge local/devel: PR #834 cherry-pick (다른 이름으로 저장 + 저장 cancel fallba…
May 13, 2026
0b213df
fix: 이미지(Picture) 회전/대칭 버튼 동작 + 선택 BBox 회전 반영 (closes #831)
oksure May 13, 2026
3aac78c
Merge local/devel: PR #835 cherry-pick + BBox 회전 보강 (이미지 회전/대칭 버튼 — @…
May 13, 2026
08af19b
feat: GlyphRun layer variant contract 추가 (PR #840, @seo-rii)
seo-rii May 13, 2026
249e565
Merge local/devel: PR #840 cherry-pick (GlyphRun layer variant contra…
May 13, 2026
16b210f
fix: shortcut.hwp PDF 정합성 3건 — 우측탭 정렬·단 구분선 점선·헤더 바 위치 (closes part o…
planet6897 May 13, 2026
f35902b
Merge local/devel: PR #843 cherry-pick (shortcut.hwp PDF 정합성 3건 — @pl…
May 13, 2026
75d76f8
feat: SwiftUI native read bindings — Swift Package + XCFramework + Rh…
May 13, 2026
03a3f0d
Merge local/devel: PR #845 cherry-pick (SwiftUI native read bindings …
May 13, 2026
7f72cb4
5/13 사이클 마무리: 오늘할일 갱신 (PR 13건 처리 — 머지 12 + close 1)
May 13, 2026
7468c93
feat: 다단 마지막 단 단나누기 시 같은 페이지 새 단-밴드 — 배분 단 한정 (closes #846, closes #849)
planet6897 May 13, 2026
3c8f701
fix: 어울림 Square wrap 표 아래로 흐르는 문단 누락 수정 (closes #855)
planet6897 May 13, 2026
a77d121
fix: 중첩 표 c=2 column 셀 클릭 misroute 정정 — first-match → min area best-m…
johndoekim May 13, 2026
2f94ae1
fix: 답안지 성명 칸 입력 회귀 정정 — 중첩 표 hit-test 루트 기준 경로 보존 (closes #850)
postmelee May 14, 2026
735d305
fix: EMF/WMF image 렌더 + HWP3 picture caption + 중복 emit 정정 (closes #86…
jangster77 May 14, 2026
d4ece84
test: issue_703 통합재정통계 #[ignore] 해제 — Task #676 정정 후 GREEN 확인 (closes…
planet6897 May 14, 2026
a466e2e
fix: shortcut.hwp 정합성 — 소제목 spacing + 헤더 띠 band + 우측 탭 정렬 + 스케일 도형 글꼴…
planet6897 May 14, 2026
4beb6b0
fix: integrate task 888 hwpx hwp save compatibility
edwardkim May 14, 2026
cd1cf9f
docs: record task 888 visual verification
edwardkim May 14, 2026
71a9b3f
fix: enable hwp save for hwpx studio documents
edwardkim May 14, 2026
535141e
fix: HWP5/HWPX 외부 참조 image 정합 — Picture.external_path 전달 (closes #873)
jangster77 May 14, 2026
8d224c8
5/14 사이클 마무리: 오늘할일 갱신 (PR 11건 처리 — 머지 10 + 리뷰 1)
May 14, 2026
3efbaed
fix: normalize HWPX winBrush no-pattern fills
edwardkim May 14, 2026
cb680c1
fix: 머리말/꼬리말 picture 회전/대칭 버튼 정정 — PR #835 후속 (closes #831)
jangster77 May 14, 2026
6c42ee9
feat: HWPX fragment paste support (closes #880)
dragonnite1221-lgtm May 14, 2026
47c3e75
feat: Text IR v2 diagnostics and schema closure — P13 (PR #881, @seo-…
seo-rii May 15, 2026
1579dc8
Revert "feat: HWPX fragment paste support (closes #880)"
May 15, 2026
8ebf0ed
fix: 외부 클립보드 붙여넣기 우선순위 정정 — marker token 검증 + 중첩 표 보정 (closes #871)
postmelee May 15, 2026
c4c1beb
feat: 저장되지 않은 변경사항 보호 — dirty state + beforeunload + 저장 확인 모달 (Ref #886)
postmelee May 15, 2026
dcf64b4
fix: hwp3-sample16.hwp WASM 로드 정합 + 시각 정합 (closes #877)
jangster77 May 15, 2026
183c5d0
fix: Task #877 잔존 — picture 중복 emit 해소 + HWPX self-closing run + 페이지 …
jangster77 May 15, 2026
ff914fd
fix: sample16 ◦ 글머리 오추가 해소 + WMF 한글 글리프 표시 (closes #896)
jangster77 May 15, 2026
dec86dd
fix: pic2.hwp Square + TopAndBottom wrap 처리 정밀화 (closes #901)
jangster77 May 15, 2026
7a84349
fix: 수식 Canvas/WASM 렌더 + tab 정합 — SVG/native 경로 동기화 (closes #900)
planet6897 May 15, 2026
72a6bbc
fix: 바탕쪽 표 outer_margin_top 미적용 정정 (closes #898)
planet6897 May 15, 2026
0494117
feat: HY 계열 한국어 별칭 8종 추가 — 폴백 메트릭 보정 (closes #885)
planet6897 May 15, 2026
9f81351
fix: CharShape start_pos를 visible char index로 해석 (closes #884)
planet6897 May 15, 2026
586d914
feat: Text IR v2 P14 — GlyphOutline variant adoption + backend select…
seo-rii May 16, 2026
4715cd4
Task #836 Stage 1: Endnote 수집 — typeset.rs pagination에서 Control::Endn…
May 16, 2026
2a3a82b
Task #836 Stage 2 (WIP): Endnote paragraphs 본문 2단 흐름 투입
May 16, 2026
6738448
Task #836 Stage 2: Endnote vpos offset 정합 + 미주 번호 prepend
May 16, 2026
f7b7682
Merge local/task836: Task #836 Stage 1~2 Endnote 수집 + 본문 2단 흐름 렌더 (WIP)
May 16, 2026
4bb1128
fix: 쪽테두리 종이기준/본문기준 bit 해석 반전 정정 (closes #920)
May 16, 2026
dbb1a59
fix: 머릿말 표 header_area 내 정확 위치 — line_anchor_offset 머릿말 제외 (closes #924)
May 16, 2026
e3554f5
fix: svg_snapshot 회귀 수정 (is_header 파라미터) + Cargo.toml repository URL 정정
May 16, 2026
d4a32ab
chore: wasm-pack 0.14.0 → 0.15.0 업데이트
May 16, 2026
c1eb48c
Task #926 WIP: Endnote 인라인 마커 '문N)' 형식 변경
May 16, 2026
469d80d
chore: checkpoint task 903 investigation
edwardkim May 15, 2026
2bb1bf2
chore: checkpoint task 903 hwpx-h-01 probes
edwardkim May 16, 2026
afb8e47
fix(hwpx2hwp): stabilize hwpx-h-01 hwp export
edwardkim May 16, 2026
f515375
fix(hwpx2hwp): keep table attr guard for stage54
edwardkim May 16, 2026
d125af9
docs(hwpx2hwp): record hwp export compatibility rules
edwardkim May 16, 2026
8714c60
test(hwpx2hwp): update adapter expectations
edwardkim May 16, 2026
b8710d9
test(hwpx2hwp): ignore artifact-dependent probes
edwardkim May 16, 2026
54af7a0
fix: 본문 Endnote 인라인 마커 '문N)' 표시 (closes #926)
May 17, 2026
e94b1d0
feat: CanvasKit replay policy diagnostics — P15 (PR #925, @seo-rii)
seo-rii May 17, 2026
b69a30c
chore: remove accidental actual.svg from git
May 17, 2026
a7d6768
fix: reflow_linesegs_on_demand 후 vpos 일관성 재계산 (closes #927)
jangster77 May 17, 2026
2278198
fix: 쪽 테두리 쪽기준 spacing 방향 정정 — 본문에서 바깥쪽
May 17, 2026
baf40eb
feat: exam_kor p5 <보 기> 박스 시각 회귀 3건 수정 (cherry-pick PR #933, closes #…
May 17, 2026
5bc6334
Merge local/devel: PR #933 cherry-pick (exam_kor p5 <보 기> 박스 시각 회귀 3건…
May 17, 2026
d89b689
fix: HWP3 ch=9 탭 spec §10.5 정합 처리 — hwp3-sample19 파싱 실패 수정 (cherry-pi…
May 17, 2026
98ed08c
Merge local/devel: PR #934 cherry-pick (HWP3 ch=9 탭 spec 정합, closes #…
May 17, 2026
37e4ede
feat: BehindText 워터마크 overlay 줌 정합화 (cherry-pick PR #939, refs #931)
May 17, 2026
68cc0b4
Merge local/devel: PR #939 cherry-pick (BehindText 워터마크 줌 정합화, refs #…
May 17, 2026
2899b21
fix: 글상자 글꼴 축소 등방 확대 한정 + 계수 정정 (cherry-pick PR #941, closes #930)
May 17, 2026
f0df7d3
Merge local/devel: PR #941 cherry-pick (글상자 글꼴 축소 등방 확대 한정, closes #930)
May 17, 2026
dda184f
feat: 복학원서 서명란 PUA U+F012B→(인) 치환 + U+F081C filler 숨김 (cherry-pick PR…
May 17, 2026
8c6ec23
Merge local/devel: PR #947 cherry-pick (복학원서 PUA 서명란 렌더링, refs #937)
May 17, 2026
97fc027
docs: hwp_spec_errata.md 취소선 마크다운 이스케이프 (cherry-pick PR #953)
May 17, 2026
1b9eda8
Merge local/devel: PR #953 cherry-pick (docs 취소선 이스케이프)
May 17, 2026
e0e8e11
fix(serializer): OLE Storage BinData 4-byte size prefix 복원 (cherry-pi…
May 17, 2026
016e694
Merge local/devel: PR #954 cherry-pick (OLE Storage BinData size pref…
May 17, 2026
bb3f40a
fix: 쪽 테두리 paper-based outline 강제 (#920 비트 해석 회귀 정정, closes #952)
jangster77 May 17, 2026
b31e38f
Merge PR #956 (closes #952 Issue 1): 쪽 테두리 paper-based outline 강제
edwardkim May 17, 2026
eb58656
PR #956 처리 후속: 보고서 + archives + 5/17 orders 갱신
edwardkim May 17, 2026
ee07938
fix: 빈 caption phantom advance 정정 — sample16 page 18 본문 다음 페이지 밀림 해소 …
jangster77 May 17, 2026
0b63077
Merge PR #958 (closes #957, #952 Issue 2): 빈 caption phantom advance 정정
edwardkim May 17, 2026
d65e1cf
PR #958 처리 후속: 보고서 + archives + 5/17 orders 갱신
edwardkim May 17, 2026
03f2105
fix: horz_rel_to=Column picture 가 column 외부 emit 시 cursor advance ski…
jangster77 May 17, 2026
586e3cc
Merge PR #961 (closes #959, #952 Issue 3): horz_rel_to=Column picture…
edwardkim May 17, 2026
5ff0086
PR #961 처리 후속: 보고서 + archives (Issue #952 종결)
edwardkim May 17, 2026
11b6d41
fix: line break 직전 inline TAC control 의 line 매핑 정정 — 시험지 page 2 cases…
jangster77 May 17, 2026
415b9d8
Merge PR #963 (closes #960): line break 직전 inline TAC control line 매핑 정정
edwardkim May 17, 2026
c8c42f6
PR #963 처리 후속: 보고서 + archives + 5/17 orders 갱신
edwardkim May 17, 2026
371fd2b
fix: 글상자 내부 inline equation duplicate emit 차단 — 시험지 page 2 <보기> textb…
jangster77 May 17, 2026
808f419
Merge PR #964 (closes #962): 글상자 내부 inline equation duplicate emit 차단
edwardkim May 17, 2026
5f23938
PR #964 처리 후속: 보고서 + archives + 5/17 orders 갱신 (연속 5 PR 완결)
edwardkim May 17, 2026
1a89042
fix: WMF SetTextAlign vertical bits 파싱 정정 + baseline y shift 정합 — WMF…
jangster77 May 17, 2026
235e049
Merge PR #966 (closes #965, ports PR #918 Stage 33-A): WMF SetTextAli…
edwardkim May 17, 2026
e459ee0
PR #966 처리 후속: 보고서 + archives + 5/17 orders 갱신
edwardkim May 17, 2026
fbdd443
fix: 빈 paragraph + 다음 [쪽나누기] case 단독 page 차단 — HWP3 sample18 페이지 수 +2…
jangster77 May 17, 2026
d0c2575
Merge PR #968 (closes #967): 빈 paragraph + 다음 [쪽나누기] case 단독 page 차단
edwardkim May 17, 2026
974855f
PR #968 처리 후속: 보고서 + archives + 5/18 orders 갱신 (@jangster77 PR 시리즈 완결)
edwardkim May 17, 2026
a094777
chore(release): v0.7.12
edwardkim May 17, 2026
0ff97de
Merge local/devel: v0.7.12 릴리즈 준비
edwardkim May 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Cargo.lock

# Output (렌더링 결과물)
/output/
/dist/swift/

# Docker
.docker/
Expand Down Expand Up @@ -89,3 +90,4 @@ rhwp-firefox/*.zip
rhwp-safari/dist/
rhwp-safari/HWP Viewer/
rhwp-safari/.DS_Store
samples/issue836/
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,42 @@

이 프로젝트의 주요 변경 사항을 기록합니다.

## [0.7.12] — 2026-05-18

> v0.7.11 후속 patch 사이클 (5/12~18) — 외부 기여자 다수 PR 19건 머지 + 본 사이클 @jangster77 PR 시리즈 7건 (#956~#968). 416 files / +64383 / -3323.

### 핵심 변경

- **원 Issue #952 (1 통합 → 5 분리 결함) 완결** — @jangster77 진단 방법론 (부분 해결 + 명확한 분리, archive/task936 "9회 시도 + 5회 revert" 대조 교훈):
- Issue 1 (#956): 쪽 테두리 paper-based outline 강제 — `#920` 비트 해석 회귀 정정 (5+ samples 한컴 viewer 실측 정합)
- Issue 2 (#958, #957): sample16 page 18 빈 caption phantom advance 정정 (RHWP_DEBUG_TAC_CURSOR)
- Issue 3 (#961, #959): 시험지 page 1 문9 — horz_rel_to=Column picture column 외부 emit advance skip
- Issue 4 (#963, #960): 시험지 page 2 cases formula off-by-one — has_line_break line 마지막 run end-position TAC 포함
- Issue 5 (#964, #962): 시험지 page 2 보기 textbox inline equation duplicate emit 차단
- **WMF SetTextAlign vertical bits 정정** (#966, #965): `mode & VTA_TOP(=0)` 항상-true 버그 → WMF [MS-WMF] 2.1.2.18 spec 정합 (PR #918 거대 PR Stage 33-A root cause ~60 lines 단독 포팅)
- **HWP3 sample18 페이지 수 +2 inflate 정정** (#968, #967): 빈 paragraph + [쪽나누기] + overflow case 단독 page 차단 (v2 정밀화 — aift.hwp snapshot 회귀 해소)
- **release 빌드 LTO + codegen-units=1 + strip** (#818, #790): rhwp CLI -28% (14→10 MB) / WASM -6.5% (4.6→4.3 MB)
- **rhwp-studio 신규 기능** (5/12~18): F5 본문 블록 선택 + F3 영역 확장 (#811/#220) + 메뉴 hotkey 인프라 (#810/#792) + 쪽 새 번호로 시작 (#809/#791) + searchAllText API + rhwpDev.goto (#814/#692) + Task #571 문서 비교·이력 분리 PR 1/3 (#799/#571)
- **HWP3/WMF/EMF 렌더링 정정** (5/12~18): EMF/WMF image 콘텐츠 렌더 (#860/#864) + HWP3 ch=9 탭 spec §10.5 (#934/#929) + 다수 외부 PR cherry-pick (#933/#939/#941/#947/#953/#954 등)

### 외부 PR (19 머지 + @jangster77 시리즈 7)

5/12~18 누적 외부 기여자 PR 19건 cherry-pick + 본 세션 @jangster77 7 PR (#956~#968) — 각 PR cargo test 1288 + 광범위 sweep 169 페이지 회귀 0 + 작업지시자 시각 판정 일관 검증.

### 잔존

- HWPX sample18-hwp5.hwpx +7 inflate (별도 task)
- `samples/hwp3-sample18.hwp` fixture 별도 추가 권장 (#968 회귀 가드)

## [0.7.11] — 2026-05-11

> v0.7.10 후속 patch 사이클 (5/10 + 5/11) — 외부 기여자 다수 PR 30+ 머지. (CHANGELOG.md 소급 보강 — v0.7.11 릴리즈 시 누락분)

- **Skia native raster 단계적 진전** (Issue #536): P8 (#761) Layer IR contract hardening + P9 (#769) text replay parity + P11 (#797) Text IR v2 compatibility contract
- **HWP3 native 렌더링** (#753): hwp3-sample10.hwp Oracle 763 페이지 8 단계 정정 + Git LFS pdf-large/ 격리
- **rhwp-studio 인터랙션** (#781/#786~#818): scrollbar drag + chord 키 Ctrl+N→Ctrl+M (Chrome reserved shortcut 회피) + 한글 IME chord e.code 판별 + 표 셀 pattern_type 가드 + Alt/Option+Arrow 단어 이동 (#794) + 표 셀 드래그 셀 컨텍스트 (#795) + 줄 끝/문서 끝 커서 (#807/#808)
- **rhwp-studio editor 신규 기능**: 표 편집 Undo/Redo + 표 크기 조절 SnapshotCommand + 셀 편집 다수 + 다단/새 번호 dialog + Ctrl/Cmd+Arrow / Ctrl+E 단축키

## [0.7.10] — 2026-05-06

> v0.7.9 후속 patch 사이클 — 외부 기여자 7명 흡수 (PR 13건 cherry-pick) + AI 파이프라인 / VLM 연동 도입 + CLI 바이너리 릴리즈 파이프라인 (Issue #608/#612).
Expand Down
25 changes: 25 additions & 0 deletions CHANGELOG_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,31 @@ This document records the major changes of the rhwp project.

> 한국어 버전은 [CHANGELOG.md](CHANGELOG.md) 를 참조하세요.

## [0.7.12] — 2026-05-18

> Patch cycle following v0.7.11 (May 12–18) — 19 external contributor PRs merged + @jangster77 PR series of 7 (#956–#968). 416 files / +64383 / -3323.

### Key Changes

- **Original Issue #952 (1 umbrella → 5 separated defects) completed** — @jangster77 diagnostic methodology (partial fix + clear separation):
- Issue 1 (#956): force paper-based page border outline — fixes `#920` bit-interpretation regression (verified against 5+ samples in Hancom viewer)
- Issue 2 (#958, #957): sample16 page 18 empty caption phantom advance fix
- Issue 3 (#961, #959): exam page 1 Q9 — horz_rel_to=Column picture out-of-column emit advance skip
- Issue 4 (#963, #960): exam page 2 cases formula off-by-one — include end-position TAC in last run of has_line_break line
- Issue 5 (#964, #962): exam page 2 example textbox inline equation duplicate emit block
- **WMF SetTextAlign vertical bits fix** (#966, #965): `mode & VTA_TOP(=0)` always-true bug → WMF [MS-WMF] 2.1.2.18 spec compliance (ported root cause ~60 lines from large PR #918 Stage 33-A)
- **HWP3 sample18 page count +2 inflate fix** (#968, #967): block standalone page for empty paragraph + [page break] + overflow case (v2 refinement — resolves aift.hwp snapshot regression)
- **Release build LTO + codegen-units=1 + strip** (#818, #790): rhwp CLI -28% (14→10 MB) / WASM -6.5% (4.6→4.3 MB)
- **rhwp-studio new features** (May 12–18): F5 block selection + F3 expand (#811) + menu hotkey infra (#810) + start with new page number (#809) + searchAllText API + rhwpDev.goto (#814) + Task #571 document compare/history split PR 1/3 (#799)

## [0.7.11] — 2026-05-11

> Patch cycle following v0.7.10 (May 10–11) — 30+ external contributor PRs merged. (CHANGELOG_EN.md retroactive supplement — omitted at v0.7.11 release)

- **Skia native raster incremental progress** (Issue #536): P8 (#761) Layer IR contract hardening + P9 (#769) text replay parity + P11 (#797) Text IR v2 compatibility contract
- **HWP3 native rendering** (#753): hwp3-sample10.hwp Oracle 763-page 8-stage fix + Git LFS pdf-large/ isolation
- **rhwp-studio interactions** (#781/#786–#818): scrollbar drag + chord key Ctrl+N→Ctrl+M + Korean IME chord e.code detection + Alt/Option+Arrow word navigation (#794) + table cell drag context (#795)

## [0.7.10] — 2026-05-06

> Post-v0.7.9 patch cycle — Absorbed 7 external contributors (13 PR cherry-picks) + introduced AI pipeline / VLM integration + CLI binary release pipeline (Issues #608/#612).
Expand Down
13 changes: 9 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
[package]
name = "rhwp"
version = "0.7.11"
version = "0.7.12"
edition = "2021"
description = "HWP file viewer and editor written in Rust, targeting WebAssembly"
license = "MIT"
repository = "https://github.com/pureink-studio/rhwp"
repository = "https://github.com/edwardkim/rhwp"

[lib]
crate-type = ["cdylib", "rlib"]
Expand Down Expand Up @@ -49,11 +49,11 @@ native-skia = ["dep:resvg", "dep:skia-safe"]
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
svg2pdf = "0.13"
usvg = "0.45"
resvg = { version = "0.45", optional = true }
resvg = { version = "0.47", optional = true }
pdf-writer = "0.12"
subsetter = "0.2"
ttf-parser = "0.25"
skia-safe = { version = "0.93.1", optional = true, default-features = false, features = ["binary-cache", "embed-icudtl", "pdf", "textlayout"] }
skia-safe = { version = "0.97.0", optional = true, default-features = false, features = ["binary-cache", "embed-icudtl", "pdf", "textlayout"] }

[target.'cfg(target_arch = "wasm32")'.dependencies]
web-sys = { version = "0.3", features = [
Expand Down Expand Up @@ -150,3 +150,8 @@ unexpected_cfgs = { level = "allow", check-cfg = ['cfg(feature, values("tracing"
[[example]]
name = "pr599_png_gateway"
required-features = ["native-skia"]

[profile.release]
lto = true
codegen-units = 1
strip = "debuginfo"
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ FROM rust:latest
# wasm 타겟 및 wasm-pack 설치
RUN rustup target add wasm32-unknown-unknown \
&& rustup component add clippy \
&& cargo install wasm-pack
&& cargo install wasm-pack@0.15.0

# 호스트 사용자 UID/GID로 실행 (빌드 산출물 소유권 문제 방지)
ARG UID=1000
Expand Down
11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ v0.7.x 배포 주기 누적 외부 기여자: [@ahnbu](https://github.com/ahnbu)
### Multi-Renderer Backends (멀티 렌더러 백엔드)
- `PageRenderTree` can be lowered into a `PageLayerTree` paint IR before backend replay.
- P1 public surfaces are Rust native `DocumentCore::build_page_layer_tree(page)` and WASM `getPageLayerTree(page)`.
- Layer JSON starts at `schemaVersion: 1`, uses `unit: "px"`, and uses `coordinateSystem: "page-top-left"` to match the existing page render coordinates.
- Layer JSON starts at `schemaVersion: 1`, uses additive `schemaMinorVersion` / `resourceTableMinorVersion`, `unit: "px"`, and `coordinateSystem: "page-top-left-y-down"` to match the existing page render coordinates.
- Compatible schema changes should be additive; incompatible JSON shape changes require a schema version bump.
- **Legacy SVG** remains the default compatibility output.
- **Layered SVG** can be exercised with `RHWP_RENDER_PATH=layer-svg`.
Expand All @@ -220,10 +220,14 @@ v0.7.x 배포 주기 누적 외부 기여자: [@ahnbu](https://github.com/ahnbu)
- P5 adds native Skia equation replay from `EquationNode.layout_box`, so equations are no longer placeholder boxes in the PNG path.
- P5 replays the existing equation layout tree directly; it does not add CanvasKit equation replay or native form replay.
- P6 adds native Skia `RawSvg` fragment rasterization through `resvg`, with external file href loading disabled.
- P11 adds the Text IR v2 compatibility contract: `textSources`, per-`TextRun` source spans, paint style metadata, run placement/clusters, feature arrays, and explicit special text visual ops. `TextRun` remains the fallback replay path.
- P12 adds guarded `GlyphRun` sidecar variants, font blob/face identity metadata, and a shape-lowering API. Canvas2D/layered SVG still use `TextRun` fallback; native Skia also keeps the fallback until exact blob-backed typeface replay is wired. Normal lowering does not emit glyph ids until a shaping pass explicitly inserts them.
- P14 adds guarded `GlyphOutline` sidecar variants and backend text variant selection diagnostics. Existing renderers still keep the `TextRun` fallback path.
- P15 adds diagnostics-only CanvasKit replay policy planning through `getCanvasKitReplayPlan(page, mode)`. `default` mode forbids hidden Canvas2D overlays, while `compat` mode reports transition overlays explicitly.
- CI covers the native Skia path with `cargo test --features native-skia skia --lib`; the feature is not available on `wasm32` targets.
- The initial native Skia path is a PNG raster backend with core image/equation/raw-svg replay; CanvasKit, resource interning/cache, complex text shaping, advanced image parity, and native form replay stay as follow-up work.
- The initial native Skia path is a PNG raster backend with core image/equation/raw-svg replay; CanvasKit glyph replay, exact native glyph replay, real font blob extraction, complex text shaping, advanced image parity, and native form replay stay as follow-up work.
- C ABI export is intentionally left for a later PR.
- `ResourceArena` is reserved in `PageLayerTree`; binary resource interning is not implemented yet.
- `ResourceArena` now reserves font blob storage and font resource identity for glyph replay; document image/SVG interning stays as follow-up work.
- This phase establishes the frontend/backend boundary for later CanvasKit and fuller native Skia backends.

### Web Editor (웹 에디터)
Expand Down Expand Up @@ -540,6 +544,7 @@ graph TB
- [HWP LINE_SEG vpos 이해](https://github.com/edwardkim/rhwp/wiki/HWP-LINE_SEG-vpos-이해) — 줄 분할 vpos 이해
- [HWP Tab Leader Rendering](https://github.com/edwardkim/rhwp/wiki/HWP-Tab-Leader-Rendering) — Tab leader 렌더링
- [Export API 사용 가이드](https://github.com/edwardkim/rhwp/wiki/Export-API-사용-가이드) — exportHwp / exportHwpx API
- [HWPX2HWP Probe 추적 온보딩](https://github.com/edwardkim/rhwp/wiki/HWPX2HWP-Probe-%EC%B6%94%EC%A0%81-%EC%98%A8%EB%B3%B4%EB%94%A9) — HWPX→IR→HWP 저장 손상/한컴 호환성 probe 추적법
- [Cloudflared 로 rhwp-studio 외부 HTTPS 접근](https://github.com/edwardkim/rhwp/wiki/Cloudflared-로-rhwp-studio-외부-HTTPS-접근)
- [Hyper-Waterfall 문서 체계 가이드](https://github.com/edwardkim/rhwp/wiki/Hyper‐Waterfall-문서-체계-가이드)
- [Investigation PR 가이드](https://github.com/edwardkim/rhwp/wiki/Investigation-PR-가이드)
Expand Down
2 changes: 1 addition & 1 deletion bindings/Native/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ publish = false

[lib]
name = "rhwp_native_ffi"
crate-type = ["cdylib"]
crate-type = ["cdylib", "staticlib"]

[dependencies]
rhwp_core = { package = "rhwp", path = "../.." }
46 changes: 46 additions & 0 deletions bindings/Native/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ pub extern "C" fn rhwp_export_markdown(
})
}

#[no_mangle]
pub extern "C" fn rhwp_read_text(input_path: *const c_char, page: i32) -> *mut c_char {
ffi_result(|| {
let input_path = read_utf8(input_path, "input_path")?;
read_text(Path::new(&input_path), normalize_page(page)?)
})
}

#[no_mangle]
pub extern "C" fn rhwp_string_free(ptr: *mut c_char) {
if ptr.is_null() {
Expand Down Expand Up @@ -94,6 +102,25 @@ fn export_text_to_dir(
Ok(success_json(page_count, &written, None))
}

fn read_text(input_path: &Path, target_page: Option<u32>) -> Result<String, String> {
let data = fs::read(input_path)
.map_err(|e| format!("파일을 읽을 수 없습니다 - {}: {}", input_path.display(), e))?;
let doc = HwpDocument::from_bytes(&data).map_err(|e| format!("HWP 파싱 실패 - {}", e))?;
let page_count = doc.page_count();
let pages = select_pages(page_count, target_page)?;

let mut extracted = Vec::new();
for page_num in pages {
let mut text = doc
.extract_page_text_native(page_num)
.map_err(|e| format!("페이지 {} 텍스트 추출 실패 - {:?}", page_num, e))?;
ensure_trailing_newline(&mut text);
extracted.push((page_num, text));
}

Ok(text_json(page_count, &extracted))
}

fn export_markdown_to_dir(
input_path: &Path,
output_dir: &Path,
Expand Down Expand Up @@ -313,6 +340,25 @@ fn error_json(error: &str) -> String {
format!("{{\"ok\":false,\"error\":\"{}\"}}", json_escape(error))
}

fn text_json(page_count: u32, pages: &[(u32, String)]) -> String {
let pages_json = pages
.iter()
.map(|(index, text)| {
format!(
"{{\"index\":{},\"text\":\"{}\"}}",
index,
json_escape(text)
)
})
.collect::<Vec<_>>()
.join(",");

format!(
"{{\"ok\":true,\"pageCount\":{},\"pages\":[{}]}}",
page_count, pages_json
)
}

fn json_escape(s: &str) -> String {
let mut out = String::with_capacity(s.len());
for ch in s.chars() {
Expand Down
1 change: 1 addition & 0 deletions bindings/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ This directory separates the shared native ABI from language-specific bindings.

- `Native/`: Rust `cdylib` crate that exposes the C ABI used by bindings.
- `csharp/`: C# P/Invoke wrapper over the shared native library.
- `swift/`: Swift Package wrapper over the shared native library.

Add new language bindings as sibling folders under `bindings/`.
2 changes: 2 additions & 0 deletions bindings/swift/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.build/
DerivedData/
31 changes: 31 additions & 0 deletions bindings/swift/Package.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// swift-tools-version: 5.9

import PackageDescription

let package = Package(
name: "Rhwp",
platforms: [
.macOS(.v12),
.iOS(.v13),
],
products: [
.library(
name: "Rhwp",
targets: ["Rhwp"]
),
],
targets: [
.systemLibrary(
name: "CRhwpNative",
path: "Sources/CRhwpNative"
),
.target(
name: "Rhwp",
dependencies: ["CRhwpNative"]
),
.testTarget(
name: "RhwpTests",
dependencies: ["Rhwp"]
),
]
)
59 changes: 59 additions & 0 deletions bindings/swift/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# RHWP Swift Binding

Swift wrapper for the shared native ABI in `bindings/Native`.

The package exposes:

- `Rhwp.readText(inputFile:page:)`
- `Rhwp.exportText(inputFile:outputDirectory:page:)`
- `Rhwp.exportMarkdown(inputFile:outputDirectory:page:)`
- `RhwpDocumentTextView(inputFile:page:)` for SwiftUI text display

The export methods return `RhwpExportResult`; direct reads return
`RhwpDocumentText`. All methods throw `RhwpError` when the native call fails.

## SwiftUI Display

```swift
import Rhwp
import SwiftUI

struct DocumentScreen: View {
let fileURL: URL

var body: some View {
RhwpDocumentTextView(inputFile: fileURL)
}
}
```

## Build the Native Library

From the repository root:

```sh
cargo build --manifest-path bindings/Native/Cargo.toml
```

The Swift module links against `rhwp_native_ffi`, so the built dynamic library
must be discoverable by the app or test host at link/runtime.

For local SwiftPM tests on macOS:

```sh
cd bindings/swift
swift test -Xlinker -L../../bindings/Native/target/debug
```

For app integration, package the native library as an `XCFramework` from the
repository root:

```sh
./scripts/package-swift-xcframework.sh
```

The archive is written under `dist/swift/` and contains
`RhwpNative.xcframework`, `LICENSE`, and this README.

By default, the iOS simulator slice includes Apple Silicon (`arm64`). Set
`INCLUDE_IOS_SIM_X86_64=1` when an Intel simulator slice is also required.
5 changes: 5 additions & 0 deletions bindings/swift/Sources/CRhwpNative/module.modulemap
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module CRhwpNative [system] {
header "rhwp_native_ffi.h"
link "rhwp_native_ffi"
export *
}
17 changes: 17 additions & 0 deletions bindings/swift/Sources/CRhwpNative/rhwp_native_ffi.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef RHWP_NATIVE_FFI_H
#define RHWP_NATIVE_FFI_H

#ifdef __cplusplus
extern "C" {
#endif

char *rhwp_export_text(const char *input_path, const char *output_dir, int page);
char *rhwp_export_markdown(const char *input_path, const char *output_dir, int page);
char *rhwp_read_text(const char *input_path, int page);
void rhwp_string_free(char *value);

#ifdef __cplusplus
}
#endif

#endif
Loading
Loading