v0.0.8 — Phase D/E: Styles · Controls accessors
🎯 Phase D + E 접근자 추가
pyhwpx 비교 분석에서 도출한 마지막 2개 Phase 완료.
🎛 Phase E — `app.controls` (완전 작동)
문서 내 모든 컨트롤 (표 · 그림 · 구역 · 하이퍼링크 · 북마크 등) 을 linked list 로 순회.
```python
전체 순회
for c in app.controls:
print(c.ctrl_id, c.user_desc)
[0] 'secd' '구역 정의'
[1] 'cold' '단 정의'
[2] 'tbl ' '표'
[3] '%hlk' '하이퍼링크'
검색
tbl = app.controls.find(desc="표")
all_tables = app.controls.find_all(ctrl_id="tbl")
그룹
groups = app.controls.by_ctrl_id() # {'tbl ': [...], '%hlk': [...]}
인스턴스 조작
tbl.select()
tbl.delete()
tbl.move_to()
```
🎨 Phase D — `app.styles` (구조 작동, HWPML parser best-effort)
문단 스타일 관리.
```python
app.styles.names # ['바탕글', '본문', ...]
app.styles["제목 1"].apply() # 이름으로 조회 + 적용
app.styles.apply("본문") # 단축 적용
app.styles.current # 현재 문단 스타일
app.styles.delete("unused", replace_with="본문")
app.styles.export("house.sty")
app.styles.import_from("house.sty")
app.styles.remove_unused()
```
::: {.callout-note}
Styles 는 HWP COM 이 스타일 목록을 직접 노출하지 않아 HWPML 블록 export → XML 파싱으로 구현. 일부 커서 상태에서 SaveBlockAs 가 실패할 수 있음. v0.0.9 에서 fallback 보강 예정.
:::
📊 현황
App 클래스 멤버 : 82 → 85 (+3 새 접근자)
Document 프록시를 통해 `doc.styles`, `doc.controls` 도 자동 지원.
✅ 호환성
100% backward compatible. 1,059 unit tests 통과.
🛣 다음 단계
- v0.0.9: Styles HWPML parser 튜닝 + MoveAccessor sub-grouping (REFACTORING_PLAN P1-3)
- v0.1.0: `app.charshape()` 완전 제거 + CharShape 중복 해소
Full changelog: v0.0.7...v0.0.8