diff --git a/Project_Roadmap.md b/Project_Roadmap.md index cdddf34..f950e25 100644 --- a/Project_Roadmap.md +++ b/Project_Roadmap.md @@ -10,23 +10,24 @@ WPF `RichTextBox`/`FlowDocument`를 **순수 C# + Avalonia `TextLayout`**로 바 --- -## ✅ 현재 상태 (2026-09-19) +## ✅ 현재 상태 (2026-09-20) - **게시**: `v1.2.1`(2026-09-08) — nuget.org. 이력: 0.9.0(07-12) → 1.0.0(07-31, API 동결) → 1.1.0(08-08) → 1.2.0/1.2.1(09-08). -- **미릴리스**: 09-09 이후 라운드(대체 텍스트 ~ 라운드32) 전부 `CHANGELOG.md` `[Unreleased]`. 공개 API **추가만 24건** - (`PublicAPI.Unshipped.txt`, 제거·시그니처 변경 없음) → 다음은 **minor(1.3.0)**. -- **검증**: 빌드 0 warn · unit **1111** + render **41** 그린 · 3-OS CI(Windows/Linux/macOS) 그린. +- **미릴리스**: 09-09 이후 라운드(대체 텍스트 ~ 라운드33)와 **호스트 API 3건**이 전부 `CHANGELOG.md` `[Unreleased]`. + 공개 API **추가만**(`PublicAPI.Unshipped.txt`, 제거·시그니처 변경 없음) → 다음은 **minor(1.3.0)**. +- **검증**: 빌드 0 warn · unit **1151** + render **41** 그린 · 3-OS CI(Windows/Linux/macOS) 그린. - **의존성**: Avalonia **12.1** 이상(12.0.x는 Shift+Enter 2회로 `TextLayout` 무한 루프 — 엔진 버그라 상향이 유일한 수정). **기능 (전부 동작·테스트 그린)** - 인라인 서식(굵게/기울임/밑줄/취소선·글꼴·크기·색·형광펜·하이퍼링크), 문단(정렬·줄간격(HWP식 %)·들여쓰기·제목·목록·인용) - **표**: 병합, 열/행 리사이즈, Tab 내비, 셀=블록 컨테이너(다중 문단·그림·구분선·**중첩 표**), **인라인 표**(HWP식 글자처럼), - 드래그 크기 지정 삽입, 셀 세로 정렬, F5 셀 블록 선택, 표·그림 끌어 옮기기(Ctrl=복사) + 드래그 크기 지정 삽입, 셀 세로 정렬, F5 셀 블록 선택, 표·그림 끌어 옮기기(Ctrl=복사), 행·열 공개 API - **그림**: 블록/인라인, 모서리·가로·세로 손잡이, 교체·저장, 대체 텍스트, 표시 크기 디코드 - 찾기/바꾸기(찾기 막대·Ctrl+F/H·F3), undo/redo(64MB 예산), 우클릭 메뉴(HWP식), Word 표준 단축키 - 클립보드(내부 리치·CF_HTML·외부 HTML/RTF·이미지·Excel/TSV→표), **HTML/JSON/RTF/.flow** 입출력 -- CJK **IME**, 페이지 보기, 인쇄, **벡터 PDF**(Skia + HarfBuzz 글꼴 추리기, 불가 시 래스터) -- 드롭인 `RichEditorView`(에디터+툴바+찾기 막대+상태바), `ToolbarLevel`, `IsReadOnly`+`Allow*`, 현지화(ko/en) +- CJK **IME**, 페이지 보기(용지·방향·**여백 네 변**·머리글/바닥글/쪽번호), 인쇄, **벡터 PDF**(Skia + HarfBuzz 글꼴 추리기, 불가 시 래스터) +- 드롭인 `RichEditorView`(에디터+툴바+찾기 막대+상태바), `ToolbarLevel`, `IsReadOnly`+`Allow*`, 현지화(ko/en), + 호스트가 읽는 **단축키 표**(`RichEditorShortcuts`) **완료된 마일스톤**: Phase 1~6 · P(페이지/인쇄) · N0~N6(NuGet) · A(셀 안 블록) · B(인라인 표) · G1(기하 워커 통합) · G2(문단 순회 워커 재귀화) · 1.0 준비 P1~P5(상호작용 테스트 인프라 · 렌더 픽셀 · 상호운용 · 성능 실측 · API 리뷰). @@ -35,14 +36,16 @@ G2(문단 순회 워커 재귀화) · 1.0 준비 P1~P5(상호작용 테스트 ## 🎯 남은 일 -**1. 다음 릴리스(1.3.0) 경계 결정** — 두 안 중 택일(미결): -- (a) 지금 쌓인 미릴리스분만으로 1.3.0 게시 -- (b) 원래 계획한 호스트 API 3건(아래 백로그 위 3줄, 위험 순: 표 API → 단축키 공개 → 페이지 여백)까지 넣고 게시 +**1. 1.3.0 게시** — 계획했던 호스트 API 3건이 2026-09-20에 전부 들어왔다(표 행·열 · 단축키 표 공개 · 페이지 여백, +PR #48·#49·#50). 경계 결정은 끝났고 남은 것은 게시 작업뿐이다. 게시 절차: `` → Unshipped를 Shipped로 이관 → CHANGELOG `[Unreleased]` → 버전 → README 배지(en/ko) → PR로 3-OS CI → `v1.3.0` 태그 push(**사람이 실행**, Trusted Publishing) → **nuget.org 패키지 페이지 육안 확인**. -**2. 포트(WinUIRichEditor)로 넘길 것** (포트 쪽 반영 여부 확인 필요) +**2. 실기 확인 대기** — 페이지 여백(PR #50): 여백을 바꿨을 때 머리글·바닥글·쪽번호가 띠 안에 앉는지, 인쇄·PDF의 +여백이 화면과 같은지. 헤드리스는 위치를 재기만 하고 눈으로는 못 본다. + +**3. 포트(WinUIRichEditor)로 넘길 것** (포트 쪽 반영 여부 확인 필요) - 그림 손잡이 vs 열 경계 우선순위: **선택된 그림 손잡이 우선**(여기 방식)으로 포트를 맞춘다 (사용자 결정 2026-09-19) - 테스트 `CtrlU_AtALinksEnd_LeavesTheLinkAlone`(라운드19에서 여기만 추가) @@ -93,9 +96,6 @@ G2(문단 순회 워커 재귀화) · 1.0 준비 P1~P5(상호작용 테스트 ## 🔵 백로그 (착수 미정) -- **표 행/열 조작 공개 API** — `TableInsertRow`/`TableDeleteColumn` 등이 private. 모델 직접 조작은 undo·캐시 무효화를 건너뛴다. 추가성. -- **`RichEditorShortcuts` 공개** — 자체 툴바를 만드는 호스트가 제스처 표를 읽을 수 없다. 추가성. -- **페이지 여백 API** - **문서 암호화(`.flow`)** — 설계 완료(07-31): 매직 헤더 + AES-256-GCM + PBKDF2-SHA256 600k, 암호화 파일은 zip이 아니게. 무의존성(PBKDF2 600k = 124ms). **미결**: Argon2id용 의존성 1개 수용 여부. - 단락 경계 넘는 Find(줄바꿈 포함 검색어만, 실사용 극저) · HWP/XLS(구) 붙여넣기 · blockquote/중첩 목록 깊이 정밀화