diff --git a/MarkdownView.slnx b/MarkdownView.slnx index e6e3c23..f49ce9c 100644 --- a/MarkdownView.slnx +++ b/MarkdownView.slnx @@ -1,7 +1,6 @@ - diff --git a/global.json b/global.json new file mode 100644 index 0000000..fc6cb0d --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "msbuild-sdks": { + "Uno.Sdk": "6.5.31" + } +} diff --git a/samples/WinUI.Markdown.Sample/MarkdownViewTest.csproj b/samples/WinUI.Markdown.Sample/MarkdownViewTest.csproj index 4795760..3a2ef74 100644 --- a/samples/WinUI.Markdown.Sample/MarkdownViewTest.csproj +++ b/samples/WinUI.Markdown.Sample/MarkdownViewTest.csproj @@ -1,20 +1,30 @@ - + - WinExe - net10.0-windows10.0.19041.0 - 10.0.17763.0 + net10.0-desktop + $(TargetFrameworks);net10.0-windows10.0.19041.0 + Exe WinUI.Markdown.Sample + win-x64;win-arm64;linux-x64;linux-arm64;osx-arm64;osx-x64 + false + true + WinUI.Markdown.Sample + com.aadhil-kh.winui-markdown-sample + 1.0 + 1 + LeXtudio + SkiaRenderer; + enable + enable + + + true + true + 10.0.17763.0 + None app.manifest x86;x64;ARM64 - x64 - win-x64 - win-x86;win-x64;win-arm64 win-$(Platform).pubxml - true - false true - enable - enable @@ -27,7 +37,7 @@ - + @@ -36,15 +46,16 @@ Tools extension to be activated for this project even if the Windows App SDK Nuget package has not yet been restored. --> - + + + + - - - + - + true diff --git a/samples/WinUI.Markdown.Sample/Platforms/Desktop/Program.cs b/samples/WinUI.Markdown.Sample/Platforms/Desktop/Program.cs new file mode 100644 index 0000000..a9c3dcb --- /dev/null +++ b/samples/WinUI.Markdown.Sample/Platforms/Desktop/Program.cs @@ -0,0 +1,20 @@ +using Uno.UI.Hosting; + +namespace MarkdownViewTest; + +internal static class Program +{ + [STAThread] + public static void Main(string[] args) + { + var host = UnoPlatformHostBuilder.Create() + .App(() => new App()) + .UseX11() + .UseLinuxFrameBuffer() + .UseMacOS() + .UseWin32() + .Build(); + + host.Run(); + } +} diff --git a/src/WinUI.Markdown/Aliases.cs b/src/WinUI.Markdown/Aliases.cs new file mode 100644 index 0000000..afa5d6a --- /dev/null +++ b/src/WinUI.Markdown/Aliases.cs @@ -0,0 +1,15 @@ +// On Uno, bridge the Microsoft.UI.Xaml.Documents/Controls namespaces to our +// UnoRichText implementations via global using aliases. +// On Windows (WINDOWS_APP_SDK) the native WinUI types are used as-is. +#if !WINDOWS_APP_SDK +global using RichTextBlock = LeXtudio.UI.Xaml.Controls.RichTextBlock; +global using InlineCollection = LeXtudio.UI.Xaml.Documents.InlineCollection; +global using Paragraph = LeXtudio.UI.Xaml.Documents.Paragraph; +global using Run = LeXtudio.UI.Xaml.Documents.Run; +global using Bold = LeXtudio.UI.Xaml.Documents.Bold; +global using Italic = LeXtudio.UI.Xaml.Documents.Italic; +global using Span = LeXtudio.UI.Xaml.Documents.Span; +global using LineBreak = LeXtudio.UI.Xaml.Documents.LineBreak; +global using InlineUIContainer = LeXtudio.UI.Xaml.Documents.InlineUIContainer; +global using Hyperlink = LeXtudio.UI.Xaml.Documents.Hyperlink; +#endif diff --git a/src/WinUI.Markdown/Controls/MarkdownView.xaml.cs b/src/WinUI.Markdown/Controls/MarkdownView.xaml.cs index 6ec0923..ded8ed0 100644 --- a/src/WinUI.Markdown/Controls/MarkdownView.xaml.cs +++ b/src/WinUI.Markdown/Controls/MarkdownView.xaml.cs @@ -159,9 +159,13 @@ private IMarkdownRenderer EnsureRenderer(RenderMode effectiveRenderMode) ResetRenderer(); _activeRenderMode = effectiveRenderMode; +#if WINDOWS_APP_SDK _renderer = effectiveRenderMode == RenderMode.WebView2 ? new WebView2Renderer() : new NativeRenderer(); +#else + _renderer = new NativeRenderer(); +#endif _renderer.LinkClicked += _linkClickedHandler; PART_Root.Children.Clear(); diff --git a/src/WinUI.Markdown/MarkdownView.csproj b/src/WinUI.Markdown/MarkdownView.csproj index 8b33ab6..17d374a 100644 --- a/src/WinUI.Markdown/MarkdownView.csproj +++ b/src/WinUI.Markdown/MarkdownView.csproj @@ -1,26 +1,40 @@ - + - net10.0-windows10.0.19041.0 - 10.0.17763.0 + net10.0-desktop + $(TargetFrameworks);net10.0-windows10.0.19041.0 WinUI.Markdown WinUI.Markdown - true false false enable enable + true false WinUI.Markdown A WinUI 3 MarkdownView control with native and WebView2 renderers. WinUI 3 Markdown control with native rendering, WebView2 rendering, Auto fallback, and theme support. + MIT + true + snupkg + + + true + true + 10.0.17763.0 + $(DefineConstants);WINDOWS_APP_SDK + + + + + + - diff --git a/src/WinUI.Markdown/Renderers/MarkdownRenderPlanner.cs b/src/WinUI.Markdown/Renderers/MarkdownRenderPlanner.cs index 0d13026..f2a1d8a 100644 --- a/src/WinUI.Markdown/Renderers/MarkdownRenderPlanner.cs +++ b/src/WinUI.Markdown/Renderers/MarkdownRenderPlanner.cs @@ -8,6 +8,7 @@ internal static class MarkdownRenderPlanner { public static MarkdownRenderPlan Resolve(RenderMode requestedMode, MarkdownDocument document, bool allowWebView2Fallback) { +#if WINDOWS_APP_SDK if (requestedMode is RenderMode.Native or RenderMode.WebView2) { return new MarkdownRenderPlan(requestedMode, string.Empty); @@ -22,6 +23,15 @@ public static MarkdownRenderPlan Resolve(RenderMode requestedMode, MarkdownDocum return allowWebView2Fallback ? new MarkdownRenderPlan(RenderMode.WebView2, fallbackReason) : new MarkdownRenderPlan(RenderMode.Native, fallbackReason); +#else + if (requestedMode is RenderMode.Native or RenderMode.WebView2) + { + return new MarkdownRenderPlan(RenderMode.Native, string.Empty); + } + + var fallbackReason = GetFallbackReason(document); + return new MarkdownRenderPlan(RenderMode.Native, fallbackReason); +#endif } private static string GetFallbackReason(MarkdownDocument document) diff --git a/src/WinUI.Markdown/Renderers/WebView2Renderer.cs b/src/WinUI.Markdown/Renderers/WebView2Renderer.cs index 420cd8e..7b2d2c0 100644 --- a/src/WinUI.Markdown/Renderers/WebView2Renderer.cs +++ b/src/WinUI.Markdown/Renderers/WebView2Renderer.cs @@ -1,3 +1,4 @@ +#if WINDOWS_APP_SDK using System.Net; using Markdig; using Microsoft.UI.Xaml; @@ -78,3 +79,4 @@ private static string BuildHtmlShell(string body, MarkdownTheme theme) """; } } +#endif diff --git a/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs b/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs index e116a85..1cb6315 100644 --- a/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs +++ b/src/WinUI.Markdown/Visitors/NativeMarkdownVisitor.cs @@ -62,6 +62,7 @@ private FrameworkElement RenderBlock(MarkdigBlock block, int nestingLevel) }; } +#if WINDOWS_APP_SDK private TextBlock RenderHeading(HeadingBlock heading) { var sizeIndex = Math.Clamp(heading.Level - 1, 0, _theme.HeadingSizes.Length - 1); @@ -76,11 +77,25 @@ private TextBlock RenderHeading(HeadingBlock heading) Margin = new Thickness(0, heading.Level == 1 ? 0 : _theme.HeadingSpacingBefore, 0, _theme.HeadingSpacingAfter) }; } +#else + private RichTextBlock RenderHeading(HeadingBlock heading) + { + var sizeIndex = Math.Clamp(heading.Level - 1, 0, _theme.HeadingSizes.Length - 1); + var block = CreateRichTextBlock(); + block.FontSize = _theme.HeadingSizes[sizeIndex]; + block.FontWeight = HeadingWeight(sizeIndex); + block.Margin = new Thickness(0, heading.Level == 1 ? 0 : _theme.HeadingSpacingBefore, 0, _theme.HeadingSpacingAfter); + var paragraph = new Paragraph(); + AppendInlines(paragraph.Inlines, heading.Inline); + block.Blocks.Add(paragraph); + return block; + } +#endif private RichTextBlock RenderParagraph(ParagraphBlock paragraph, int skipLeadingCharacters = 0) { var block = CreateRichTextBlock(); - var xamlParagraph = new Microsoft.UI.Xaml.Documents.Paragraph(); + var xamlParagraph = new Paragraph(); AppendInlines(xamlParagraph.Inlines, paragraph.Inline, skipLeadingCharacters); block.Blocks.Add(xamlParagraph); return block; @@ -145,7 +160,7 @@ private ScrollViewer RenderCodeBlock(CodeBlock code) { var text = code.Lines.ToString(); var block = CreateRichTextBlock(); - var paragraph = new Microsoft.UI.Xaml.Documents.Paragraph(); + var paragraph = new Paragraph(); _syntaxHighlighter.Append(paragraph.Inlines, text, code is FencedCodeBlock fenced ? fenced.Info : null); block.Blocks.Add(paragraph); block.FontFamily = _theme.CodeFont; @@ -225,7 +240,7 @@ private Grid RenderTable(Table table, int nestingLevel) private RichTextBlock RenderRawText(string text) { var block = CreateRichTextBlock(); - block.Blocks.Add(new Microsoft.UI.Xaml.Documents.Paragraph { Inlines = { new Run { Text = text } } }); + block.Blocks.Add(new Paragraph { Inlines = { new Run { Text = text } } }); return block; } diff --git a/tests/WinUI.Markdown.Tests/WinUI.Markdown.Tests.csproj b/tests/WinUI.Markdown.Tests/WinUI.Markdown.Tests.csproj index 1d31ade..87bc4ac 100644 --- a/tests/WinUI.Markdown.Tests/WinUI.Markdown.Tests.csproj +++ b/tests/WinUI.Markdown.Tests/WinUI.Markdown.Tests.csproj @@ -1,21 +1,39 @@ - + - net10.0-windows10.0.19041.0 + net10.0-desktop + $(TargetFrameworks);net10.0-windows10.0.19041.0 Exe - 10.0.17763.0 - true false + true + SkiaRenderer; enable enable false + + true + true + 10.0.17763.0 + + + + + + Exe + + - - + + + + diff --git a/tests/WinUI.Markdown.Tests/app.manifest b/tests/WinUI.Markdown.Tests/app.manifest new file mode 100644 index 0000000..5b70aa4 --- /dev/null +++ b/tests/WinUI.Markdown.Tests/app.manifest @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + PerMonitorV2 + + + \ No newline at end of file