i007.cc

i007.cc

优先队列-降维打击

05.价值资料

Markdig: 一个快速、强大、兼容CommonMark、可扩展的Markdown处理器

( 如需查看英文版本,请 点击这里 )

Markdig Build Status Coverage Status NuGetDonate

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.和罗马项目符号(iii等)媒体支持媒体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块,其内容保持原样(当前,支持mermaidnomnoml图)YAML Front Matter在不计算前件内容的情况下进行解析,并将其从HTML输出中丢弃(通常用于在MarkdownEditor中没有前面内容的预览)JIRA链接自动生成JIRA项目引用的链接(感谢@clarkd:https://github.com/clarkd/MarkdigJiraLinker)
  • 从Markdig版本0.20.0+开始,Markdig只与NETStandard 2.0NETStandard 2.1NETCoreApp 2.1NETCoreApp 3.1兼容。

如果您正在寻找对旧的.NETFramework3.5或4.0的支持,可以下载Markdig0.18.3

Third Party Extensions

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太慢了,所以不包括在下面的图表中:

BenchMark CPU Time

BenchMark Memory

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

如果您正在使用这个库,并发现它对您的项目有用,请考虑为它捐款!

Donate

Credits

感谢johnmacfarlane为CommonMark规范所做的出色工作,以及所有参与使Markdown成为更好标准的人!

没有这个巨大的基础,这个项目是不可能的。

也要感谢项目BenchmarkDotNet,它使基准测试变得如此容易设置!

一些解码部分(例如HTMLEntityHelper.cs)已经从CommonMark.NET变成re-used

感谢@clarkd在JIRA链接扩展上所做的工作(https://github.com/clarkd/MarkdigJiraLinker),现在包括在这个项目中!

Author

Alexandre MUTEL又名xoofx

发表回复