Yun Chan
9b7e5f0d0c
feat: Everything2Everything 양방향 변환 매트릭스 피보팅
...
EverythingToJpeg(N→JPEG 단방향)에서 Everything2Everything(N×M 매트릭스)으로
앱을 피보팅. 7개 Provider, 200+ 변환 쌍 지원.
리네이밍
- 디렉토리/솔루션/csproj/namespace/AssemblyName/MSIX Identity 일괄 치환
- 임시파일 prefix e2j_ → e2e_, 로고 라벨 E2J → E2E
아키텍처
- ConversionPair(input, output) 신규 + ProviderCapability.SupportedConversions
- IConverterProvider.ConvertAsync에 outputExtension 파라미터 추가
- ProviderRegistry를 Dictionary<(input, output), Provider> 매트릭스로 재작성
+ OutputsForInput / OutputsForFile 쿼리 API
- ConversionEngine: 출력 ext 라우팅, 동일 입출력 자동 skip,
서브폴더 suffix를 출력 ext에서 자동 도출
- ConvertOptions를 형식별 sub-record로 분리
(Jpeg/Png/Webp/Avif/Tiff/Pdf*/Html*/Ocr)
Provider 매트릭스
- MagickProvider: PNG/JPEG/WebP/AVIF/BMP/TIFF/GIF/PDF 양방향 + RAW/PSD 디코딩
(단일이미지→1페이지 PDF, GIF/TIFF→다페이지 PDF)
- HeicProvider: HEIC/HEIF → 이미지 7종
- PdfProvider: PDF → 이미지 6종 (PNG임베드 후 ImageMagick 인코딩)
- HtmlProvider: HTML/HTM → 이미지 + PDF (CDP printToPDF)
- DocxProvider/HwpxProvider: PDF + 이미지 7종 (LibreOffice 활용)
- OcrProvider 신규: 이미지/PDF → TXT/DOCX
(Windows.Media.Ocr + DocumentFormat.OpenXml, PDF는 페이지별 OCR 후 결합)
UI
- 사이드바 TARGET FORMAT을 동적 ComboBox로 (큐 파일 매트릭스의 교집합만 표시)
- 출력 형식별 색상 배지 + Quality 패널 라벨 동적
- OUTPUT DESTINATION hint도 출력 ext 기반 동적
CLI
- 신규 'to <ext> <files...>' verb (예: to png photo.heic doc.docx)
- help 텍스트 양방향 컨셉으로 갱신
셸 통합
- ContextMenuRegistrar 카스케이드로 재설계
(ExtendedSubCommandsKey + Everything2Everything.SubMenu.<ext>)
- 입력별 매트릭스에 따라 인기 출력 10종(JPEG/PNG/WebP/PDF/TXT/DOCX/AVIF/GIF/TIFF/BMP)
동적 노출, 마지막에 '변환…' 옵션
- 메뉴 라벨 'JPEG로 변환' → 'Everything2Everything으로 변환'
기타
- Core.csproj TFM net9.0-windows → net9.0-windows10.0.19041.0 (WinRT API용)
- DocumentFormat.OpenXml 3.1.0 NuGet 추가
- README 양방향 매트릭스 기준 전면 개편
- MSIX appxmanifest Description / IExplorerCommand DLL 라벨 갱신
빌드: 0 errors, 0 warnings
2026-05-07 13:40:08 +09:00
Yun Chan
0e752d76e2
ci: vcxproj를 packages.config 형식으로 복귀, BuildMsix가 nuget.exe 자동 처리
...
증상: VS 2022 Enterprise(GitHub windows-latest)에서 PackageReference 형식
vcxproj 빌드 시 ResolveNuGetPackageAssets가 "Sequence contains no elements"
오류로 실패. native vcxproj + PackageReference + msbuild restore 조합의
알려진 회귀.
해결:
- src/EverythingToJpeg.Shell/EverythingToJpeg.Shell.vcxproj: PackageReference
제거, packages.config + Microsoft.Windows.ImplementationLibrary.targets
imports 복귀, EnsureNuGetPackageBuildImports target 복귀.
- src/EverythingToJpeg.Shell/packages.config 재추가.
- packaging/BuildMsix.ps1: nuget.exe 없으면 dist.nuget.org에서 자동 다운로드,
packages.config 기반 restore를 packages/ 폴더에 수행.
- .gitignore: packages/, tools/ 제외.
이러면 사용자 PC(VS 2026)와 CI(VS 2022) 모두 동일한 흐름으로 빌드.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:20:45 +09:00
Yun Chan
784167ccff
feat: P4-P8 한방 마무리 — 자체서명 MSIX, 영구저장, 단축키, capability 알림
...
P4 — 자체 서명 MSIX 자동화
- packaging/BuildAndSign.ps1: 인증서 생성→PFX export→MSIX 빌드→서명을
한 스크립트로 일관 처리. 기존 인증서 있으면 재사용.
- Install-EverythingToJpeg.ps1: 기본 비밀번호 'EverythingToJpegDev' 자동
사용 (사용자 5대 PC 본인 사용 한정).
- 검증: 53MB 서명된 MSIX 산출, signtool 정상 통과(DigiCert TimeStamp 박힘).
P6 — Past Results 영구 저장
- HistoryStorage.cs: %LocalAppData%\EverythingToJpeg\history.jsonl 에
변환 결과 append. 시작 시 로드해서 _pastResults에 채움.
- 첫 실행에만 데모 시드, 이후엔 실데이터만 표시.
- Past Results의 Clear All은 영구 파일도 함께 삭제 (확인 다이얼로그 추가).
P7 — 정리 + 단축키
- 사용 안 하는 ConvertWindow.xaml/.cs 폐기 (코드 600줄 제거).
- KeyBinding 4개: Ctrl+O 파일 추가, Ctrl+Enter 변환, Esc 닫기, F5 새로고침.
- RelayCommand 헬퍼 클래스로 단축키 ICommand 패턴 구현.
P8 — Capability 자동 안내
- 시작 시 RequiresExternal Provider들의 가용성 비동기 체크.
- 외부 도구 미설치 형식이 있으면 사이드바 footer에
"⚠ N개 형식이 외부 도구를 기다립니다 (Diagnose 참조)" 한 줄 표시.
README — Phase 1~8 전체 진척, 단축키 표 정리.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 19:36:55 +09:00
Yun Chan
5750aed16f
Phase 3: HTML(WebView2) + HWP/HWPX(LibreOffice) 실구현
...
HTML / HTM
- HtmlProvider: STA 스레드 + WPF Dispatcher에서 WebView2 헤드리스 컨트롤러(HWND_MESSAGE) 생성
- CDP Page.captureScreenshot(captureBeyondViewport=true)으로 풀페이지 PNG 획득
- Magick.NET으로 JPEG 인코드, 알파/리사이즈/품질 옵션 일관 적용
- ConvertOptions: HtmlViewportWidth/Height, HtmlWaitMilliseconds, HtmlFullPage
HWP / HWPX
- HwpxProvider: LibreOffice headless --convert-to pdf + H2Orestart 확장 자동 감지
- DocxProvider 패턴 재사용 (소스→PDF→PdfProvider 위임)
- ExternalToolDetector.IsH2OrestartInstalled — uno_packages/extensions 검색
기타
- Core csproj: UseWPF=true (WebView2가 WPF 의존), Microsoft.Web.WebView2 1.0.3912.50 추가
- AppX 매니페스트에 .html/.htm/.hwp/.hwpx ItemType 추가
- 파일 다이얼로그 필터 확장
- 두 ComingSoon 상태였던 Provider가 이제 Available/RequiresExternal로 노출됨
검증
- 솔루션 Release 빌드 통과
- MSIX 38개 페이로드 패키징 성공 (WebView2 SDK 포함)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:23:47 +09:00
Yun Chan
f2c8610ff6
Phase 2: MSIX 패키지 + IExplorerCommand 셸 익스텐션
...
C++ 셸 익스텐션 (src/EverythingToJpeg.Shell/)
- WRL RuntimeClass 패턴으로 IExplorerCommand 두 핸들러 구현
- Quick(빠른 변환) / Dialog(설정 창) verb를 다른 CLSID로 분리
- Invoke()에서 EverythingToJpeg.exe로 verb + 파일 경로 전달
- VS 2026 빌드 검증, /utf-8 한글 라벨 지원
MSIX 패키징 (packaging/)
- Package.appxmanifest: com:SurrogateServer + desktop4:FileExplorerContextMenus
- 26개 확장자 × 2 verb 자동 노출
- BuildMsix.ps1: dotnet publish + msbuild + makeappx 일관 파이프라인
- CreateDevCert.ps1 / Install-EverythingToJpeg.ps1: 자체 서명 인증서 워크플로
- GenerateAssets.ps1: placeholder 로고 자동 생성
CI/CD
- .github/workflows/release.yml: 태그 푸시 시 미서명 MSIX 자동 빌드 + 첨부
검증
- 50MB MSIX 산출 확인 (packaging/dist/EverythingToJpeg-x64.msix)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:03:16 +09:00
Yun Chan
8fa4a613d7
초기 커밋: Phase 1 — 레지스트리 기반 컨텍스트 메뉴 + 핵심 변환 파이프라인
...
- Provider 추상화(IConverterProvider + ProviderCapability) — Available/RequiresExternal/ComingSoon 1급 시민
- 변환 구현: Magick(이미지·RAW·GIF·TIFF), HEIC/HEIF(libheif decode→Magick encode), PDF(PDFium), DOCX(Word COM 또는 LibreOffice 자동 감지)
- ComingSoon 스텁: HTML, HWP/HWPX (UI 노출, 컨텍스트 메뉴 등록 자동 제외)
- WPF + WPF-UI 4.3 Fluent 2 UI: 메인 창(드래그&드롭, Provider 카드), 변환 창(썸네일·옵션·진행률), 빠른 변환 진행 창, 진단 창
- 단일 EXE에 verb 라우팅: quick / dialog / register / unregister / diagnose / help
- HKCU SystemFileAssociations 기반 컨텍스트 메뉴 등록 (Win11 "추가 옵션 표시"에 노출)
- README, packaging/ Phase 2 placeholder 포함
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 12:50:35 +09:00