Skip to content

Latest commit

 

History

27 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MarkdownHelp

Markdown 도움말을 공통 Skia renderer로 그리고 Avalonia, WPF, WinUI 3, Uno의 화면 캔버스에 직접 표시하는 라이브러리입니다. 네 UI 프레임워크 모두 재사용 가능한 SkiaMarkdownCanvas를 제공하며, 제품 렌더링 경로에 PNG 파일을 만들지 않습니다. 네 패키지 모두 첫 실행 가이드 오버레이를 제공하며, Avalonia 패키지는 본문, 툴팁과 별도 도움말 창도 제공합니다.

구조

MarkdownHelp.Core
  ├─ UI와 무관한 reader 상태
  └─ IMarkdownGuideOverlay + 안내 탐색·저장·배치·공통 visual token

MarkdownHelp.Skia
  ├─ Markdig + RichTextKit + CSharpMath + SkiaSharp
  ├─ 재생 가능한 MarkdownRenderFrame (SKPicture)
  ├─ IMarkdownFrameCanvas (공개 adapter 계약)
  └─ MarkdownCanvasSession (frame 수명·확대·extent)
       ├─ MarkdownHelp.Avalonia  → backend SKCanvas
       ├─ MarkdownHelp.Wpf       → SKElement
       ├─ MarkdownHelp.WinUI     → SKXamlCanvas
       └─ MarkdownHelp.Uno       → SKCanvasElement
  • MarkdownHelp.Core는 페이지 이동과 50–400% 확대 상태를 공유합니다.
  • MarkdownHelp.Skia는 제목, 본문, 중첩 목록, 정렬 표, 코드, 인용문, 상대 이미지, inline/display TeX 수식과 Mermaid flowchart subset을 한 번 구현합니다.
  • IMarkdownFrameCanvas는 네 플랫폼 control의 SetFrame, SetZoom, ReleaseFrame, 논리 크기 계약을 컴파일 단계에서 통일합니다.
  • MarkdownCanvasSession은 프레임 소유권과 50–400% 확대 범위, 논리/화면 크기를 프레임워크와 무관하게 관리합니다.
  • IMarkdownGuideOverlayMarkdownGuideController는 열기, 이전·다음·완료, 최초 한 번 표시 상태와 카드 배치를 네 프레임워크에서 같은 방식으로 처리합니다.
  • MarkdownGuideVisualTokens는 Avalonia 디자인을 기준으로 카드 380×500, 24px 안쪽 여백, 332px Markdown frame, 최소 34px 헤더, 12px 구역 간격, 34px 원형 표식과 공통 색상을 한 곳에서 정의합니다.
  • MarkdownHelp.Avalonia, .Wpf, .WinUI, .Uno는 얇은 화면 어댑터이며 같은 MarkdownRenderFrame을 각 프레임워크의 실제 Skia surface에 재생하고, 각 UI의 좌표·입력·컨트롤 형식에 맞는 MarkdownGuideOverlay를 제공합니다.

제품 렌더링 경로에는 임시 PNG 파일이 없습니다. 확대할 때 같은 vector frame을 재생하므로 글자와 도형이 원본 bitmap 해상도에 묶이지 않습니다.

설치

패키지는 nuget.org에 있습니다. 쓰는 UI 프레임워크의 패키지 하나만 추가하면 MarkdownHelp.CoreMarkdownHelp.Skia는 의존성으로 함께 따라옵니다.

dotnet add package MarkdownHelp.Avalonia --prerelease
dotnet add package MarkdownHelp.Wpf      --prerelease
dotnet add package MarkdownHelp.WinUI    --prerelease
dotnet add package MarkdownHelp.Uno      --prerelease

UI 없이 렌더링만 필요하면(서버 측 이미지 생성, 자체 캔버스 어댑터 작성 등) MarkdownHelp.Skia만 추가해도 됩니다.

패키지 대상 프레임워크 내용
MarkdownHelp.Core net8.0 reader 상태, 가이드 계약, visual token
MarkdownHelp.Skia net8.0 Markdown 레이아웃과 Skia 벡터 렌더링
MarkdownHelp.Avalonia net8.0 캔버스, 본문 view, 툴팁, 도움말 창, 가이드 오버레이
MarkdownHelp.Wpf net9.0-windows10.0.19041.0 캔버스, 가이드 오버레이
MarkdownHelp.WinUI net10.0-windows10.0.19041.0 캔버스, 가이드 오버레이
MarkdownHelp.Uno net9.0 캔버스, 가이드 오버레이

현재 버전은 0.1.0-alpha.6 시험판이므로 --prerelease(또는 PackageReference에 명시적 버전)가 필요합니다. 버전별 변경 내역은 CHANGELOG.md를 참고하세요. WinUI 어댑터는 SkiaSharp.Views.WinUI에 맞춰 .NET 10을 쓰며, unpackaged 앱은 현재 경계의 manifest 안내를 함께 확인하세요.

PackageReference로 직접 적을 때는 다음과 같습니다.

<PackageReference Include="MarkdownHelp.Avalonia" Version="0.1.0-alpha.6" />

바로 이어지는 캔버스 사용 예Avalonia 도움말 사용 예가 최소 사용 코드입니다.

동작 화면

Avalonia WPF
Avalonia reader WPF reader
WinUI 3 Uno
WinUI reader Uno reader

도움말 UI

본문과 크기 조절 가능한 Markdown 도움말 툴팁

MarkdownHelpToolTip은 실제 Flyout 안에서 스크롤과 크기 조절을 지원합니다. 문서 기준 상대경로 이미지도 같은 source resolver로 읽습니다.

프로그램 시작 시 한 번 표시되는 Markdown 화면 안내

MarkdownGuideOverlay는 기존 화면 위에 대상 강조와 vector Markdown 설명 카드를 표시합니다. 완료·닫기 상태를 저장하고 사용자가 원할 때 다시 열 수 있습니다. Avalonia, WPF, WinUI, Uno 구현은 모두 Core의 같은 탐색·저장 계약을 사용합니다.

Avalonia, WPF, Uno, WinUI 가이드 오버레이 비교

네 guide demo는 GuideDemoVisualTokens의 24px 페이지 간격과 107/107/140px 동작 단추 폭을 공유합니다. 실제 오버레이는 MarkdownGuideVisualTokens의 380×500px 카드, 332px Markdown frame과 최소 34px 헤더를 사용합니다. 헤더는 고정 높이가 아니라 MinHeight로 적용해 DPI나 테마가 바뀌어도 내용이 잘리지 않습니다.

캔버스 사용 예

렌더링 코드는 공통이고 캔버스 형식만 프레임워크별 패키지에서 선택합니다.

using var renderer = new MarkdownHelp.Skia.SkiaMarkdownRenderer();
var frame = renderer.CreateFrame(markdown, 900);

MarkdownHelp.Skia.IMarkdownFrameCanvas canvas =
    new MarkdownHelp.Wpf.SkiaMarkdownCanvas();
// Avalonia, WinUI, Uno 구현도 같은 인터페이스를 사용합니다.
canvas.SetFrame(frame, zoom: 1);
canvas.SetZoom(1.5f);

SetFrame에 넘긴 frame의 소유권은 canvas로 이동합니다. 새 frame으로 교체하거나 canvas를 해제하면 이전 frame도 함께 해제됩니다.

Avalonia 도움말 사용 예

using MarkdownHelp.Avalonia;

var source = MarkdownHelpSource.FromResource(
    "avares://YourApp/Help/settings.md");

var view = new MarkdownHelpView(source);
MarkdownHelpToolTip.Attach(infoButton, source);
MarkdownHelpWindow.Show(source, "설정 도움말", ownerWindow);

가이드 오버레이 구성과 상태 저장 정책은 Avalonia 패키지 설명서를 참고하세요.

멀티플랫폼 가이드 오버레이

각 패키지는 플랫폼의 실제 대상 컨트롤을 받는 MarkdownGuideStep과 루트 패널의 마지막 자식으로 배치하는 MarkdownGuideOverlay를 제공합니다. WPF, WinUI, Uno의 설명 본문은 SkiaMarkdownCanvas에 직접 그려지며 PNG를 만들지 않습니다.

var guide = new MarkdownHelp.Wpf.MarkdownGuideOverlay(
[
    new(previousButton, "이전 페이지", "## 이전 문서로 이동합니다.", "이전 단추를 누릅니다."),
    new(zoomButton, "확대", "수식과 도형도 **vector**로 확대됩니다.", "확대 단추를 누릅니다.")
]);
rootGrid.Children.Add(guide);
guide.ShowOnce("reader-guide:v1", new MarkdownHelp.Core.JsonFileMarkdownGuideStateStore(statePath));

다른 프레임워크도 namespace와 대상 컨트롤 형식만 바뀌며 Show, ShowOnce, Previous, Next, GoToStep, CloseIMarkdownGuideOverlay의 동일한 API입니다. 네 구현은 진행률·닫기 헤더, 제목, 가변 높이 Markdown, 동작 힌트, 이전·다음 탐색의 같은 5행 카드 구조를 사용합니다. PreviousButton, NextButton, CloseButton, StepMarkers, GuideCard도 모두 공개되어 자동화 시험과 제품 테마 조정에 쓸 수 있습니다. 공통 scrim 배치는 현재 대상 영역을 투명하게 비워 원래 컨트롤의 색과 내용을 유지하고, 나머지 화면만 어둡게 처리합니다.

예제

# Avalonia 공통 reader 화면
dotnet run --project examples/MarkdownHelp.Avalonia.Demo

# Avalonia 첫 실행 가이드 오버레이
dotnet run --project examples/MarkdownHelp.Avalonia.GuideDemo

# Uno 첫 실행 가이드 오버레이
dotnet run \
  --project examples/MarkdownHelp.Uno.Demo/MarkdownHelp.Uno.GuideDemo \
  -f net9.0-desktop

# Uno Skia Desktop
dotnet run \
  --project examples/MarkdownHelp.Uno.Demo/MarkdownHelp.Uno.Demo \
  -f net9.0-desktop

Windows에서는 다음 예제를 실행할 수 있습니다. WinUI는 .NET 10 SDK가 필요합니다.

dotnet run --project examples/MarkdownHelp.Wpf.Demo
dotnet run --project examples/MarkdownHelp.WinUI.Demo
dotnet run --project examples/MarkdownHelp.Wpf.GuideDemo
dotnet run --project examples/MarkdownHelp.WinUI.GuideDemo

네 reader는 experiments/markdown-rendering의 같은 복합 Markdown fixture를 사용해 목록·표·수학식·Mermaid와 페이지 이동, 확대, 패닝, flyout을 비교합니다. 네 guide demo는 MarkdownHelp.GuideDemoSupport의 같은 세 단계 Markdown과 guide key를 사용하며, 플랫폼별 오버레이를 IMarkdownGuideOverlay로 다룹니다. 대상 강조, 전체 단계 번호, 이전·다음·완료, JSON 최초 실행 상태와 다시 보기 흐름도 동일합니다. 데모 전용 화면 치수는 GuideDemoVisualTokens, 제품 오버레이 치수와 색상은 MarkdownGuideVisualTokens가 각각 단일 기준입니다.

빌드와 시험

dotnet build src/MarkdownHelp.Core/MarkdownHelp.Core.csproj
dotnet build src/MarkdownHelp.Skia/MarkdownHelp.Skia.csproj
dotnet build src/MarkdownHelp.Avalonia/MarkdownHelp.Avalonia.csproj
dotnet build src/MarkdownHelp.Wpf/MarkdownHelp.Wpf.csproj
dotnet build src/MarkdownHelp.WinUI/MarkdownHelp.WinUI.csproj
dotnet build src/MarkdownHelp.Uno/MarkdownHelp.Uno.csproj
dotnet test tests/MarkdownHelp.Avalonia.Tests/MarkdownHelp.Avalonia.Tests.csproj
dotnet test tests/MarkdownHelp.Wpf.Tests/MarkdownHelp.Wpf.Tests.csproj
dotnet test tests/MarkdownHelp.WinUI.Tests/MarkdownHelp.WinUI.Tests.csproj
dotnet test tests/MarkdownHelp.Uno.Tests/MarkdownHelp.Uno.Tests.csproj
dotnet pack src/MarkdownHelp.Skia/MarkdownHelp.Skia.csproj -o artifacts/packages
dotnet pack src/MarkdownHelp.Avalonia/MarkdownHelp.Avalonia.csproj -o artifacts/packages
dotnet pack src/MarkdownHelp.Wpf/MarkdownHelp.Wpf.csproj -o artifacts/packages
dotnet pack src/MarkdownHelp.WinUI/MarkdownHelp.WinUI.csproj -o artifacts/packages
dotnet pack src/MarkdownHelp.Uno/MarkdownHelp.Uno.csproj -o artifacts/packages

버전별 변경 내역은 CHANGELOG.md에 있습니다.

가이드 디자인 비교는 Windows에서 네 앱을 모두 1200×800으로 실행하고 단계 1과 별도 검증 단계 3을 각각 세 번 캡처해 수행했습니다. 반복 캡처는 플랫폼별로 픽셀 차이가 없었고, Avalonia 기준 WPF의 RMSE는 단계 1에서 0.1002, 단계 3에서 0.0903이었습니다. 남은 차이는 주로 각 프레임워크의 네이티브 글꼴 메트릭과 기본 컨트롤 테마입니다. 재현 스크립트와 기준은 experiments/guide-overlay-parity/windows에 있습니다.

배포

여섯 패키지는 nuget.org Trusted Publishing(OIDC)으로 배포합니다. 장기 API 키를 저장하지 않고, v* 태그를 푸시하면 .github/workflows/publish.yml이 임시 키를 받아 push 합니다. 정책 등록과 릴리스 절차는 docs/nuget-publishing.md에 있습니다.

배포된 패키지가 실제로 동작하는지는 nuget-smoke/로 확인합니다. 리포 내부 테스트는 ProjectReference로 돌기 때문에 패키징 문제를 잡지 못합니다.

./nuget-smoke/run-smoke.sh 0.1.0-alpha.6

아래 데모들도 참조만 배포 패키지로 바꿔 그대로 실행할 수 있습니다.

dotnet run --project examples/MarkdownHelp.Avalonia.Demo "-p:UseMarkdownHelpPackages=true"

현재 경계

  • 링크 hit-test와 실행 정책, 부분 텍스트 선택, 구조화된 접근성 tree는 아직 없습니다.
  • Mermaid는 flowchart/graphTD, TB, LR, 기본 node와 label 간선만 지원합니다.
  • WinUI 어댑터는 SkiaSharp.Views.WinUI 3.119.4의 지원 대상에 맞춰 .NET 10을 사용합니다. unpackaged 앱은 SkiaSharp 네이티브 WinRT 클래스를 application manifest에 등록해야 하며 예제의 app.manifest를 기준으로 삼을 수 있습니다.
  • Avalonia, WPF, Uno, WinUI 예제는 Windows에서 같은 문서 화면과 직접 canvas 렌더링을 확인했습니다.

About

Reusable Markdown help views, tooltips, and windows for Avalonia applications.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages