Markdig: 一个快速、强大、兼容CommonMark、可扩展的Markdown处理器
( 如需查看英文版本,请 点击这里 )
Markdig


Markdig是一个快速、强大、兼容CommonMark、可扩展的Markdown处理器。
注意:存储库正在构建中。会有一个专门的网站和适当的文件在某个时候!
您可以尝试在线Markdig,并将其与babelmark3上的其他实现进行比较
Features
- 非常快速的解析器和html呈现器(no-regexp),在GC压力方面非常轻。见基准
- 抽象语法树,语法树有精确的源代码位置,在构建Markdown编辑器时非常有用。签出MarkdownEditor以获取由Markdig支持的Visual Studio!
- 转换为HTML
- 通过了600多个来自最新CommonMark规范的测试(0.29)
- 包括CommonMark的所有核心元素:包括GFM fenced代码块。
- 可扩展的体系结构甚至核心的Markdown/CommonMark解析都是可插入的,因此它允许禁用内置Markdown/Commonmark解析(例如禁用HTML解析)或更改行为(例如用
@更改头的匹配#) - Built-in有20多个扩展名,包括:2种表:管道表(灵感来自GitHub表和PanDoc-Pipe表)网格表(灵感来自PanDoc-Grid表)Extra-emphasis(灵感来自PanDoc-emphasis和Markdown-it)通过
~~,下标~上标^插入++标记的==特殊属性或附加的HTML属性(灵感来自PHPMarkdown Extra-特殊属性)定义列表(灵感来自PHPMarkdown Extra-定义列表)脚注(灵感来自PHPMarkdown Extra-Footnotes)Auto-identifiers用于标题(类似于Pandoc-Auto-Identifiers)Auto-links如果文本以http://或https://或ftp://或mailto:或www.xxx.yyy任务列表开头,则生成链接。额外的项目符号列表,支持alpha bulleta.b.和罗马项目符号(i,ii等)媒体支持媒体url(youtube,vimeo,mp4…etc.(受此CommonMark讨论的启发)缩写(灵感来自PHPMarkdown Extra-缩写)引文文本,通过包含""...""(受此CommonMark讨论的启发)类似于fenced代码块:::的自定义容器来生成正确的<div>...</div>(受此CommonMark讨论的启发)图(灵感来自于此CommonMark讨论)此CommonMark讨论)页脚(灵感来自于此CommonMark讨论)数学/乳胶扩展,通过将$$用于块,将$用于内联数学(受此CommonMark讨论的启发)软线作为硬线表情符号支持(灵感来自Markdown-it)SmartyPants(灵感来自大胆的Fireball-SmartyPants)Bootstrap类(为了输出bootstrap类)图扩展每当一个fenced代码块包含一个特殊的关键字,它将被转换成一个div块,其内容保持原样(当前,支持mermaid和nomnoml图)YAML Front Matter在不计算前件内容的情况下进行解析,并将其从HTML输出中丢弃(通常用于在MarkdownEditor中没有前面内容的预览)JIRA链接自动生成JIRA项目引用的链接(感谢@clarkd:https://github.com/clarkd/MarkdigJiraLinker) - 从Markdig版本
0.20.0+开始,Markdig只与NETStandard 2.0、NETStandard 2.1、NETCoreApp 2.1和NETCoreApp 3.1兼容。
如果您正在寻找对旧的.NETFramework3.5或4.0的支持,可以下载Markdig0.18.3。
Third Party Extensions
- WPF/XAML Markdown Renderer:
markdig.wpf - WPF/XAML Markdown Renderer:
Neo.Markdig.Xaml - 语法突出显示:
Markdig.SyntaxHighlighting - 嵌入式C脚本:
Markdig.Extensions.ScriptCs
Documentation
存储库正在建设中。会有一个专门的网站和适当的文件在某个时候!
虽然还没有专门的文档,但是您可以从specs文档中找到如何使用这些扩展。
同时,你可以在我的博客文章“为.NET实现Markdown Engine”中看到一篇关于Markdig的“幕后”文章
Download
Markdig作为NuGet包提供:
另外,Markdig.SignedNuGet包还提供签名的程序集。
Usage
API的主要入口点是Markdig.Markdown类:
默认情况下,没有任何选项,Markdig使用的是普通的CommonMark解析器:
var result = Markdown.ToHtml("This is a text with some *emphasis*");
Console.WriteLine(result); // prints: <p>This is a text with some <em>emphasis</em></p>
为了激活大多数高级扩展(除了Emoji、SoftLine as HardLine、Bootstrap、YAML Front Matter、JiraLinks和SmartyPants)
// Configure the pipeline with all advanced extensions active
var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
var result = Markdown.ToHtml("This is a text with some *emphasis*", pipeline);
您可以查看描述所有可操作扩展的MarkdownExtensions(通过修改MarkdownPipeline)
Build
为了构建Markdig,您需要安装.NET核心RTM
License
此软件是在BSD-Clause2许可证下发布的。
Benchmarking
这是针对各种实现的基准测试的早期预览:
C implementations:
- cmark(版本:0.25.0):引用CommonMark的C实现,不支持扩展
- Moonshine(版本::流行的CMarkdown处理器
.NET implementations:
- Markdig(版本:0.5.x):本身
- CommonMark.NET(master)(版本:0.11.0):CommonMark实现.NET,不支持扩展,cmarkCommonMark.NET(pipe_tables):一个CommonMark.NET的演化,支持扩展,尚未发布
- MarkdownDeep(版本:1.5.0):另一个.NET实现
- MarkdownSharp(版本:1.13.0):开源的Markdown处理器的实现,以堆栈溢出为特色,基于regexp。
- Marked.NET(版本:1.0.5)原始marked.js项目的端口
- Microsoft.DocAsCode.MarkdownLite(版本:2.0.1)由docfx项目使用
JavaScript/V8 implementations:
- Strike.V8(版本:1.5.0)marked.js运行在Google V8中(不是基于.NET)
结果分析:
- Markdig大约比MarkdownSharp快x100倍,比docfx快30倍
- 在CPU领域中,竞争非常激烈,而且通常比其他实现更快(不是在功能上等同)
- 分配和GC压力减少15%到30%
因为Marked.NET、MarkdownSharp和DocAsCode.MarkdownLite太慢了,所以不包括在下面的图表中:


x86的性能:
BenchmarkDotNet-Dev=v0.9.7.0+
OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Core(TM) i7-4770 CPU 3.40GHz, ProcessorCount=8
Frequency=3319351 ticks, Resolution=301.2637 ns, Timer=TSC
HostCLR=MS.NET 4.0.30319.42000, Arch=32-bit RELEASE
JitModules=clrjit-v4.6.1080.0
Type=Program Mode=SingleRun LaunchCount=2
WarmupCount=2 TargetCount=10
Method | Median | StdDev |Scaled | Gen 0 | Gen 1| Gen 2|Bytes Allocated/Op |
--------------------------- |------------ |---------- |------ | ------ |------|---------|------------------ |
Markdig | 5.5316 ms | 0.0372 ms | 0.71 | 56.00| 21.00| 49.00| 1,285,917.31 |
CommonMark.NET(master) | 4.7035 ms | 0.0422 ms | 0.60 | 113.00| 7.00| 49.00| 1,502,404.60 |
CommonMark.NET(pipe_tables) | 5.6164 ms | 0.0298 ms | 0.72 | 111.00| 56.00| 49.00| 1,863,128.13 |
MarkdownDeep | 7.8193 ms | 0.0334 ms | 1.00 | 120.00| 56.00| 49.00| 1,884,854.85 |
cmark | 4.2698 ms | 0.1526 ms | 0.55 | -| -| -| NA |
Moonshine | 6.0929 ms | 0.1053 ms | 1.28 | -| -| -| NA |
Strike.V8 | 10.5895 ms | 0.0492 ms | 1.35 | -| -| -| NA |
Marked.NET | 207.3169 ms | 5.2628 ms | 26.51 | 0.00| 0.00| 0.00| 303,125,228.65 |
MarkdownSharp | 675.0185 ms | 2.8447 ms | 86.32 | 40.00| 27.00| 41.00| 2,413,394.17 |
Microsoft DocfxMarkdownLite | 166.3357 ms | 0.4529 ms | 21.27 |4,452.00|948.00|11,167.00| 180,218,359.60 |
x64的性能:
BenchmarkDotNet-Dev=v0.9.6.0+
OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz, ProcessorCount=8
Frequency=3319351 ticks, Resolution=301.2637 ns, Timer=TSC
HostCLR=MS.NET 4.0.30319.42000, Arch=64-bit RELEASE [RyuJIT]
JitModules=clrjit-v4.6.1080.0
Type=Program Mode=SingleRun LaunchCount=2
WarmupCount=2 TargetCount=10
Method | Median | StdDev | Gen 0 | Gen 1 | Gen 2 | Bytes Allocated/Op |
--------------------- |---------- |---------- |------- |------- |------ |------------------- |
TestMarkdig | 5.5276 ms | 0.0402 ms | 109.00 | 96.00 | 84.00 | 1,537,027.66 |
TestCommonMarkNet | 4.4661 ms | 0.1190 ms | 157.00 | 96.00 | 84.00 | 1,747,432.06 |
TestCommonMarkNetNew | 5.3151 ms | 0.0815 ms | 229.00 | 168.00 | 84.00 | 2,323,922.97 |
TestMarkdownDeep | 7.4076 ms | 0.0617 ms | 318.00 | 186.00 | 84.00 | 2,576,728.69 |
Donate
如果您正在使用这个库,并发现它对您的项目有用,请考虑为它捐款!

Credits
感谢johnmacfarlane为CommonMark规范所做的出色工作,以及所有参与使Markdown成为更好标准的人!
没有这个巨大的基础,这个项目是不可能的。
也要感谢项目BenchmarkDotNet,它使基准测试变得如此容易设置!
一些解码部分(例如HTMLEntityHelper.cs)已经从CommonMark.NET变成re-used
感谢@clarkd在JIRA链接扩展上所做的工作(https://github.com/clarkd/MarkdigJiraLinker),现在包括在这个项目中!
Author
Alexandre MUTEL又名xoofx
