[Phase L15] WSL·환율·BMI·Markdown 핸들러 4종 추가

WslHandler.cs (신규, ~275줄, prefix=wsl):
- wsl --list --verbose 서브프로세스 기반 distro 목록 (Encoding.Unicode)
- 상태별 아이콘: Running=\uE768, Stopped=\uE756
- 서브커맨드: stop [all/distro] · default <distro> · 이름 검색 실행
- wt.exe(Windows Terminal) 우선 실행, 없으면 UseShellExecute 폴백
- Data 튜플: launch / shutdown / terminate / set_default

CurrencyHandler.cs (신규, ~185줄, prefix=currency):
- KRW/USD/EUR/JPY/CNY/GBP/HKD/TWD/SGD/AUD/CAD/CHF/MYR/THB/VND 15개 통화 내장
- currency 100 usd → KRW 환산, currency 100 usd eur → 크로스 환산
- 한글 별칭(달러/엔/위안/유로 등) 지원
- currency rates → 전체 환율표
- JPY/KRW/VND 소수점 0자리, 기타 2자리 포맷

BmiHandler.cs (신규, ~210줄, prefix=bmi):
- bmi 170 65 → BMI 지수 + WHO 아시아태평양 기준 판정 + 적정 체중
- bmi 170 65 30 m → Harris-Benedict 기초대사량 + 5단계 활동 칼로리
- bmi ideal 170 → 키 기준 정상/과체중/비만 체중 범위 계산
- GetGrade(): 저체중/정상/과체중/비만1단계/비만2단계 switch expression

MdHandler.cs (신규, ~280줄, prefix=md, partial class):
- 클립보드 Markdown 자동 읽기 (ContainsText/GetText)
- md toc: 앵커 생성 포함 TOC 목차 생성
- md strip: Regex 기반 마크다운 기호 완전 제거 → 순수 텍스트
- md count: 줄/단어/문자/제목/코드블록/목록/링크/이미지/볼드 통계
- md links / md images: URL 목록 추출
- [GeneratedRegex] 소스 생성기 활용 (partial class 필수)

App.xaml.cs (수정): Phase L15 핸들러 4종 RegisterHandler 추가
docs/LAUNCHER_ROADMAP.md (수정): Phase L15 섹션 추가 ( 완료)
빌드: 경고 0, 오류 0
This commit is contained in:
2026-04-04 15:05:45 +09:00
parent f9c4bc0122
commit bf0a1dce74
6 changed files with 1085 additions and 0 deletions

View File

@@ -277,6 +277,16 @@ public partial class App : System.Windows.Application
// L14-4: 시스템 폰트 목록 (prefix=font)
commandResolver.RegisterHandler(new FontHandler());
// ─── Phase L15 핸들러 ─────────────────────────────────────────────────
// L15-1: WSL 관리 (prefix=wsl)
commandResolver.RegisterHandler(new WslHandler());
// L15-2: 환율 변환기 (prefix=currency)
commandResolver.RegisterHandler(new CurrencyHandler());
// L15-3: BMI·건강 계산기 (prefix=bmi)
commandResolver.RegisterHandler(new BmiHandler());
// L15-4: Markdown 분석기 (prefix=md)
commandResolver.RegisterHandler(new MdHandler());
// ─── 플러그인 로드 ────────────────────────────────────────────────────
var pluginHost = new PluginHost(settings, commandResolver);
pluginHost.LoadAll();