CodeWF.Markdown.Themes 14.0.3

dotnet add package CodeWF.Markdown.Themes --version 14.0.3
                    
NuGet\Install-Package CodeWF.Markdown.Themes -Version 14.0.3
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CodeWF.Markdown.Themes" Version="14.0.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="CodeWF.Markdown.Themes" Version="14.0.3" />
                    
Directory.Packages.props
<PackageReference Include="CodeWF.Markdown.Themes" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add CodeWF.Markdown.Themes --version 14.0.3
                    
#r "nuget: CodeWF.Markdown.Themes, 14.0.3"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package CodeWF.Markdown.Themes@14.0.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=CodeWF.Markdown.Themes&version=14.0.3
                    
Install as a Cake Addin
#tool nuget:?package=CodeWF.Markdown.Themes&version=14.0.3
                    
Install as a Cake Tool

CodeWF.Markdown

基于 Avalonia 12 的 Markdown 渲染控件、排版主题和可运行示例。该仓库从 CodeWF.AvaloniaControls 拆分而来,只保留 Markdown 相关代码与文档。

更新日志:UpdateLog.md | 名称 | NuGet | 下载量 | | --- | --- | --- | | CodeWF.Markdown.Lite | NuGet | NuGet | | CodeWF.Markdown | NuGet | NuGet | | CodeWF.Markdown.Lite.Themes | NuGet | NuGet | | CodeWF.Markdown.Themes | NuGet | NuGet |

仓库规范

  • 当前版本:14.0.3,版本号统一维护在根目录 Directory.Build.props 的 <Version> 节点。
  • 14.0.0 起所有 NuGet 包只支持 net10.0(Mermaid 依赖仅提供 net10 资产);Demo 和测试同样使用 net10.0,构建与发布采用 .NET 10 SDK。
  • 根目录 logo.svg、logo.png、logo.ico 是唯一图标源,子工程只通过 MSBuild Link 引用,不维护图标副本。
  • 运行时帮助、Markdown 示例、内置备忘录、设计说明等业务文档按功能保留;仓库级入口文档使用根目录 README.md 和 UpdateLog.md。

包线说明(14.0.0 起,四个包)

按「是否引入第三方能力依赖」切分,基础与完整共用同一份渲染实现,不存在两套渲染代码:

包 依赖 能力
CodeWF.Markdown.Lite Avalonia、Markdig、CodeWF.AvaloniaControls 唯一一份渲染引擎:标题/段落/列表/引用/表格/链接/代码块(单色)/图片(替代文本)/公式(原文);不含任何第三方能力依赖
CodeWF.Markdown Lite + AvaloniaEdit + TextMateSharp + Sylinko.CSharpMath.Avalonia + Mermaider + AnimatedImage.Avalonia + Svg.Skia + SkiaSharp 能力增量:代码高亮、数学公式、Mermaid 图表、图片(GIF/SVG/预览窗)、PNG/PDF/Word/公众号 HTML 导出;并含编辑器控件(源码编辑器 MarkdownEditorView + 单栏实时编辑 MarkdownLiveEditorView)
CodeWF.Markdown.Lite.Themes Lite 控件模板 + 全部排版令牌 + 18 套排版主题
CodeWF.Markdown.Themes Lite.Themes + Markdown 完整包的样式入口(MarkdownFullThemes):在 Lite.Themes 之上叠加图片能力控件外观

安装组合

  • 基础能力:只装 CodeWF.Markdown.Lite.Themes(自动引入 Lite)→ 18 套排版主题可用,代码块单色、公式显示原文、图片显示替代文本。
  • 完整能力:只装 CodeWF.Markdown.Themes(自动引入 Markdown + Lite.Themes + Lite)→ 全能力 + 编辑器。
  • 编辑器随完整包提供,无需单独安装。

<Application.Styles>
  <FluentTheme />
  <markdownThemes:MarkdownFullThemes TypographyTheme="Simple" />
</Application.Styles>
// 注册完整包能力(命名空间与 13.x 完全一致,调用代码零改动)
CodeWF.Markdown.Highlighting.CodeWFMarkdownHighlightingExtensions.UseHighlighting();
CodeWF.Markdown.Images.CodeWFMarkdownImagesExtensions.UseImages();
CodeWF.Markdown.MathRendering.CodeWFMarkdownMathExtensions.UseMath();
CodeWF.Markdown.Mermaid.CodeWFMarkdownMermaidExtensions.EnsureRegistered();

13.x → 14.0.0 迁移

13.x 14.0.0
CodeWF.Markdown(核心渲染) CodeWF.Markdown.Lite(仅基础渲染时)或 CodeWF.Markdown(要完整能力时)
CodeWF.Markdown.Highlighting / .Math / .Mermaid / .Images / .Export 五个可选能力包 合并为 CodeWF.Markdown 一个包
CodeWF.Markdown.Themes 基础用 CodeWF.Markdown.Lite.Themes,完整用 CodeWF.Markdown.Themes
CodeWF.Markdown.Editor(13.2.0 新增) 并入 CodeWF.Markdown
MarkdownThemes(样式入口) 完整包改用 MarkdownFullThemes(MarkdownThemes 仍在 Lite.Themes)
能力扩展方法调用(UseHighlighting() 等) 不变(命名空间与扩展方法名全部保留)
目标框架 net8.0;net10.0;net11.0 统一 net10.0,net8 消费者需先升级

使用 Mermaid 能力包

// NuGet: CodeWF.Markdown(完整包)
CodeWF.Markdown.Mermaid.CodeWFMarkdownMermaidExtensions.EnsureRegistered();
// 或实例扩展:viewer.UseMermaid();

图片加载与导出辅助能力

CodeWF.Markdown 也提供可复用的 Markdown 图片工具,方便宿主应用把 Markdown 导出为可离线分发的文件。MarkdownImageSourceLoader 支持加载 data:image、本地路径、file:// 和 HTTP(S) 图片,相对路径会按当前 Markdown 文档路径解析,并尝试 URL 解码后的文件名。MarkdownImageRasterizer 可把已加载的 SVG、GIF 首帧和其他位图格式转换为静态 PNG 字节,PDF、PNG、Word 或其他导出链路可以直接嵌入图片,不必重复实现预览控件里的图片加载逻辑。

MarkdownDocumentExporter 为宿主应用提供一行调用的 PNG/PDF/Word 导出能力:

MarkdownDocumentExporter.ExportMarkdown(
    markdown,
    ExportKind.Pdf,
    "Simple",
    "article.pdf");

MarkdownDocumentExporter.ExportFile(
    @"C:\docs\article.md",
    ExportKind.Word,
    MarkdownTypographyThemes.Simple,
    "article.docx");

var document = new MarkdownExportDocument(markdown, filePath, fileName);
MarkdownDocumentExporter.Export(document, ExportKind.Png, "article.png");

内置 PNG/PDF/Word 导出器会复用公共图片加载与栅格化能力。Word 输出会把图片写入 word/media;PDF 输出会写入可选择文本,包含用于复制粘贴的 Unicode 文本映射,并把 Markdown 图片作为 PDF 图片内容嵌入,不再把整页压平成单张位图。

富 HTML 剪贴板辅助能力

MarkdownHtmlClipboard 和 MarkdownHtmlClipboardExtensions 为宿主应用提供可复用的富 HTML 剪贴板载荷,适合把 Markdown 渲染后的 HTML 复制到微信公众号、知乎、稀土掘金等网页编辑器。它会同时写入 text/plain、text/html、macOS public.html 和 Windows HTML Format;Windows 载荷使用带正确片段偏移的 UTF-8 CF_HTML 字节,避免 Chromium 系编辑器把带样式 HTML 当作普通文本显示。

Avalonia 剪贴板扩展的简单调用只需要当前 Markdown、排版主题和目标平台:

await clipboard.TrySetMarkdownHtmlAsync(
    markdown,
    MarkdownTypographyThemes.Simple,
    "wechat",
    MarkdownTypographySizes.Small);

await clipboard.SetMarkdownHtmlAsync(
    markdown,
    MarkdownExportStyle.Resolve("Simple", "Small"),
    CopyKind.Zhihu);

内置目标包括 CopyKind.Wechat、CopyKind.Zhihu 和 CopyKind.Juejin;字符串目标名由 MarkdownSocialCopyProfiles 解析,方便宿主应用直接复用菜单命令参数。基于 Markdown 字符串复制时,相对图片按当前工作目录解析;基于 Markdown 文件生成内容时,相对图片可按文件路径解析。后续新增发布平台时,应用可传入自定义 MarkdownSocialCopyProfile,继续复用同一套 CF_HTML 剪贴板写入能力。

粘贴方向可使用 MarkdownHtmlClipboard.Html2Markdown(htmlContent),把从网页复制到剪贴板的 HTML 转为 Markdown,覆盖标题、段落、链接、图片、列表、引用、代码块和表格等常见结构。转换器内置在 CodeWF.Markdown 中,不额外引入第三方包。

var markdown = MarkdownHtmlClipboard.Html2Markdown(htmlContent);

安装

Install-Package CodeWF.Markdown
Install-Package CodeWF.Markdown.Themes

使用方式

在 App.axaml 引入主题包:

<Application
    xmlns="https://github.com/avaloniaui"
    xmlns:markdown="https://codewf.com">
    <Application.Styles>
        <FluentTheme />
        <markdown:MarkdownThemes />
    </Application.Styles>
</Application>

可以在 MarkdownThemes 上设置全局默认,也可以在 MarkdownViewer 上设置单个 Viewer 覆盖。TypographyTheme 和 TypographySize 可不填,默认是 Basic 和 Normal。

<UserControl
    xmlns="https://github.com/avaloniaui"
    xmlns:md="https://codewf.com">
    <ScrollViewer
        HorizontalScrollBarVisibility="Disabled"
        VerticalScrollBarVisibility="Auto">
        <md:MarkdownViewer
            Markdown="{Binding Markdown}"
            TypographyTheme="Simple"
            TypographySize="Small" />
    </ScrollViewer>
</UserControl>

示例工程包含实时编辑、样例文档加载、排版主题切换和增量渲染压力测试。

扩展个性化排版主题

内置主题名继续使用 MarkdownTypographyThemes.Simple 这样的字符串常量,而不是改成 enum,是为了让宿主应用可以注册自己的主题 Key。自定义主题复用内置主题同一套资源 Key:

MarkdownTypographyThemeRegistry.Register(
    "MyCompanyBlue",
    () => new ResourceDictionary
    {
        [MarkdownStyleKeys.TextBrushResource] = new SolidColorBrush(Color.Parse("#1F2937")),
        [MarkdownStyleKeys.MutedTextBrushResource] = new SolidColorBrush(Color.Parse("#64748B")),
        [MarkdownStyleKeys.AccentBrushResource] = new SolidColorBrush(Color.Parse("#0E88EB")),
        [MarkdownStyleKeys.BorderBrushResource] = new SolidColorBrush(Color.Parse("#BFDBFE")),
        [MarkdownStyleKeys.ParagraphFontSizeResource] = 16d,
        [MarkdownStyleKeys.ParagraphLineHeightResource] = 28d,
        [MarkdownStyleKeys.Heading1FontSizeResource] = 32d,
        [MarkdownStyleKeys.CodeBlockFontSizeResource] = 13d
    });

MarkdownThemes.OverrideTypographyResources(
    Application.Current!,
    "MyCompanyBlue",
    MarkdownTypographySizes.Normal);

var exportStyle = MarkdownThemes.CreateExportStyle("MyCompanyBlue");
MarkdownDocumentExporter.ExportMarkdown(markdown, ExportKind.Pdf, exportStyle, "article.pdf");

最简单的导出和自媒体复制 API 会通过 MarkdownExportStyle.Resolve 解析内置主题名和排版尺寸。如果应用需要完全接管导出外观,也可以直接构造并传入 MarkdownExportStyle。如果应用已有自己的 XAML 资源字典,可以注册 () => new MyCompanyMarkdownResources(),并在需要共享自定义资源时通过 MarkdownThemes.CreateExportStyle(...) 生成导出样式,让预览、PNG/PDF/Word 导出和自媒体复制 HTML 都从同一套排版资源解析样式。

仓库结构

  • src/CodeWF.Markdown:完整 MarkdownViewer 类库
  • src/CodeWF.Markdown.Themes:完整版本控件模板和排版主题
  • src/CodeWF.Markdown.Sample:完整版本示例工程
  • tests/CodeWF.Markdown.Tests:渲染和差异服务测试
  • CodeWF.Markdown.slnx:Markdown 类库、示例和测试的解决方案视图

构建

dotnet restore CodeWF.Markdown.slnx
dotnet build CodeWF.Markdown.slnx --no-restore

打包 NuGet:

.\pack.bat

发布示例工程到 win-x64 和 linux-x64:

.\publish_Markdown.bat

CI/CD:自动发布 NuGet 包

推送 v* 标签(例如 v13.0.0.1)会触发 .github/workflows/publish-nuget.yml,一次发布七个包:CodeWF.Markdown、CodeWF.Markdown.Themes、CodeWF.Markdown.Highlighting、CodeWF.Markdown.Math、CodeWF.Markdown.Mermaid、CodeWF.Markdown.Images、CodeWF.Markdown.Export(含 snupkg 符号包),完成后自动创建 GitHub Release(同时由 publish-demo 工作流产出五平台 Demo 安装包)。

包版本号以 Directory.Build.props 的 <Version> 为准,打标签前先升版本——nuget.org 拒绝重复的版本号;标签与 <Version> 不一致时工作流仅告警不阻断。认证使用 NuGet Trusted Publishing:工作流通过 nuget/login@v1 以 OIDC 令牌换取一次性发布凭据,仓库不保存任何 secret。nuget.org 侧的 API key 需绑定本仓库与工作流文件名 publish-nuget.yml(Scopes 勾选 Push,Glob 建议收窄为 CodeWF.*);这类 key 创建后 7 天内需成功发布一次才会转永久有效。

手工发布步骤:

# 1. 升版本:修改 Directory.Build.props 的 <Version>(或用 UpdateAssemblyVersion.ps1)并提交
# 2. 打标签并推送,触发发布
git tag -a v13.0.0.1 -m "CodeWF.Markdown v13.0.0.1"
git push origin v13.0.0.1
# 3. 在 GitHub Actions 观察 publish-nuget 运行,完成后到 nuget.org 核对七个包的新版本

许可证

MIT,详见 LICENSE。

第三方开源组件审计

检查时间:2026-05-23。检查范围包括 NuGet 元数据、恢复后的 project.assets.json、NuGet.org 信息以及上游源码/许可证链接。优先接受 MIT / Apache-2.0 / BSD。

本次整改:

  • 将 Semi.Avalonia.AvaloniaEdit 替换为开源 Avalonia.AvaloniaEdit。
  • 示例工程移除 AvaloniaEditSemiTheme,编辑器渲染改为使用开源 AvaloniaEdit 控件和本仓库自己的 Markdown 主题。
包 协议 源码/项目地址 结论
AnimatedImage.Avalonia Apache-2.0 https://github.com/whistyun/AnimatedImage 通过
Avalonia / Avalonia.Desktop / Avalonia.Fonts.Inter / Avalonia.Themes.Fluent MIT https://github.com/AvaloniaUI/Avalonia 通过
Avalonia.AvaloniaEdit MIT https://github.com/AvaloniaUI/AvaloniaEdit 通过
CommunityToolkit.Mvvm MIT https://github.com/CommunityToolkit/dotnet 通过
Lang.Avalonia.Json MIT https://github.com/dotnet9/Lang.Avalonia 自研开源包
Markdig BSD-2-Clause https://github.com/xoofx/markdig 通过
Semi.Avalonia MIT https://github.com/irihitech/Semi.Avalonia 通过,仅示例使用开源主体包
Svg.Controls.Skia.Avalonia / Svg.Skia MIT https://github.com/wieslawsoltes/Svg.Skia 通过
Sylinko.CSharpMath.Avalonia MIT https://github.com/Sylinko/CSharpMath.Avalonia 通过
TextMateSharp / TextMateSharp.Grammars MIT https://github.com/danipen/TextMateSharp 通过
VC-LTL EPL-2.0 https://github.com/Chuyu-Team/VC-LTL5 源码开放,按“非优先但可追溯”规则通过
YY-Thunks MIT https://github.com/Chuyu-Team/YY-Thunks 通过
Microsoft.NET.Test.Sdk MIT https://github.com/microsoft/vstest 测试依赖,通过
xunit / xunit.runner.visualstudio Apache-2.0 https://github.com/xunit/xunit 测试依赖,通过

传递依赖检查结论:Avalonia、AnimatedImage、SkiaSharp、Svg.Skia、CSharpMath、TextMateSharp 等链路均有公开源码,许可证为 MIT 或 BSD-style。有效项目文件中不再包含 Semi.Avalonia.AvaloniaEdit。

包版本维护约定

XML 文件统一使用两个空格缩进。Directory.Packages.props 统一承载 NuGet 中央包管理开关和包版本变量,包括 AvaloniaVersion 等共享版本属性;Directory.Build.props 仅保留项目构建、编译选项和 NuGet 元数据。仓库如引用 VC-LTL、YY-Thunks,这两个兼容旧版操作系统的特殊包必须使用最新预览版。

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
14.0.3 0 10/8/2026
14.0.2 0 10/8/2026
13.1.1 34 10/6/2026
13.0.0.1 49 10/6/2026
13.0.0 47 10/6/2026
12.1.2.14 60 10/3/2026
12.1.2.13 250 10/1/2026
12.1.2.12 95 10/1/2026
12.1.2.11 101 9/24/2026
12.1.2.10 97 9/23/2026
12.1.2.9 92 9/22/2026
12.1.2.2 99 9/20/2026
12.1.2.1 122 9/8/2026
12.1.1.3 133 8/13/2026
12.1.1.2 209 8/4/2026
12.1.1.1 123 7/30/2026
12.1.0.1 136 7/14/2026
12.0.5.2 147 6/24/2026
12.0.4.3 143 6/8/2026
12.0.4.1 144 6/2/2026
Loading failed