MD4C代表“ C的Markdown for C”,这正是该项目的意义。
简而言之,Markdown是此README.md文件写入的标记语言。
如果您不熟悉它,以下资源可以解释更多:
MD4C是C在C中的Markdown解析器实现,具有以下功能:
合规性:通常,MD4C旨在符合最新版本的Commonmark规范。目前,我们完全符合Commonmark 0.31。
扩展: MD4C支持一些常见和接受的扩展。见下文。
性能: MD4C非常快。
紧凑度: MD4C解析器在一个源文件和一个标头文件中实现。除标准C库外,没有其他依赖关系。
嵌入: MD4C解析器在其他项目中很容易重复使用,其API非常简单:实际上只有一个函数md_parse() 。
推动模型: MD4C解析完整的文档,并调用应用程序提供的几个回调功能,以告知其大约每个块的开始/结尾,每个跨度的开始/结束以及任何文本内容。
可移植性: MD4C在Windows和Posix符合OSS上构建和工作。 (至少只要平台提供C标准库(包括堆内存管理),也应该在大多数其他平台上运行它应该很容易。)
编码:默认情况下,MD4C期望输入文档的UTF-8编码。但是可以汇编以识别仅ASCII控制字符(即禁用所有Unicode特定代码),或者(在Windows上)期望UTF-16(即,在Windows上通常称为“ unicode”)。请参阅下面的更多详细信息。
允许许可证: MD4C可根据MIT许可获得。
如果您只需要解析Markdown文档,则需要包括md4c.h并针对MD4C库( -lmd4c )链接;或或者将md4c.[hc]直接在您的代码库中,因为解析器仅在单个C源文件中实现。
主要提供的功能是md_parse() 。它在Markdown语法中采用文本,并将其指向指向结构,该结构为多个回调函数提供指针。
当md_parse()处理输入时,它调用回调(输入或离开任何降压块或跨度时;以及输出文档的任何文本内容时),允许应用程序将其转换为另一种格式或将其渲染到屏幕上。
如果您需要将Markdown转换为HTML,请包括md4c-html.h ,并针对MD4C-HTML库( -lmd4c-html )链接;或或者将源md4c.[hc] , md4c-html.[hc]和entity.[hc]中的代码库中。
要转换降价输入,请调用md_html()函数。它采用降价输入并调用提供的回调功能。回调用HTML输出的块馈送。典型的回调实现只会将块附加到缓冲区中或将其写入文件。
默认行为是仅识别由COONMARK规范定义的Markdown语法。
但是,有了适当的标志,可以调整行为以实现一些扩展:
使用标志MD_FLAG_COLLAPSEWHITESPACE ,将非平凡的空格折叠成一个空间。
使用标志MD_FLAG_TABLES ,支持GitHub式表。
使用标志MD_FLAG_TASKLISTS ,支持GitHub式任务列表。
使用标志MD_FLAG_STRIKETHROUGH ,启用了罢工 - 跨度跨度(在tilde标记中包含文本, ~foo bar~ )。
使用标志MD_FLAG_PERMISSIVEURLAUTOLINKS允许的URL自动链接(未包含在<和>中)。
使用FLAG MD_FLAG_PERMISSIVEEMAILAUTOLINKS ,支持宽松的电子邮件自动链接(未包含在<和>中)。
使用FLAG MD_FLAG_PERMISSIVEWWWAUTOLINKS允许的www autoLinks无需指定任何方案(例如www.example.com )。然后,MD4C假设http:方案。
使用FLAG MD_FLAG_LATEXMATHSPANS乳胶数学跨度( $...$ )和乳胶显示数学跨度( $$...$$ )。 (请注意,HTML渲染器将它们逐字输出,以自定义标签<x-equation> 。)。
使用FLAG MD_FLAG_WIKILINKS ,支持Wiki-Style链接( [[link label]]和[[target article|link label]] ])。 (请注意,HTML渲染器将它们输出以自定义标签<x-wikilink> 。)
使用标志MD_FLAG_UNDERLINE ,下划线( _ )表示下划线,而不是普通的重点或强调。
Concommark(某些人认为是错误的功能)的一些功能可能会被以下标志禁用:
使用标志MD_FLAG_NOHTMLSPANS或MD_FLAG_NOHTMLBLOCKS ,RAW内线HTML或RAW HTML块分别被禁用。
使用FLAG MD_FLAG_NOINDENTEDCODEBLOCKS ,缩进的代码块被禁用。
CONCORMARK规范声明任何Unicode代码点的序列都是有效的CONCORMARK文档。
但是,在仔细检查下,Unicode在解析Markdown文档时在几种非常具体的情况下扮演着任何角色:
为了在处理重点和强烈重视时检测单词边界,需要对Unicode字符的某些分类(无论是空间还是标点符号)。
对于(不敏感的)链接参考标签与相应的链接参考定义的匹配,使用Unicode案例折叠。
用于将html实体( & )和数字字符引用(例如# ಫ )转化为其Unicode等效物。
但是请注意,MD4C在渲染器/应用程序上将此翻译留下;由于渲染器应该真正知道输出编码以及是否真的需要执行这种翻译。 (例如,当渲染器输出HTML时,它可能会使实体未经翻译并将工作推荐给Web浏览器。)
MD4C依赖于Commark的此属性,并且实现在很大程度上是编码不可思议的。大多数MD4C代码仅假定您选择的编码与ASCII兼容。即128以下的编码点具有与ASCII相同的数值。
任何输入MD4C都不理解,仅将其视为文档文本的一部分,并发送到渲染器的回调函数不变。
MD4C必须了解Unicode的两种情况(单词边界检测和链接参考匹配)按以下预处理器宏指定(如构建MD4C时指定)所指定的处理。
如果定义了预处理器宏MD4C_USE_UTF8 ,则MD4C假定utf-8对于单词边界检测和链接标签的案例不敏感匹配。
当这些宏都没有明确使用时,这是默认行为。
在Windows上,如果定义了预处理器宏MD4C_USE_UTF16 ,则MD4C使用WCHAR代替char ,并假设在这些情况下编码UTF-16。 (UTF-16是Windows开发人员通常称之为“ Unicode”,Win32API通常可以使用的。)
请注意,由于此宏还会影响md4c.h中的类型,因此在构建MD4C以及包括md4c.h时,您必须定义宏。
另请注意,仅在解析器( md4c.[hc] )中支持这。 HTML渲染器不支持此功能,您将必须编写自己的自定义渲染器来使用此功能。
如果定义了预处理器宏MD4C_USE_ASCII ,则MD4C仅假定ASCII输入。
这有效地意味着不会将非ASCII的空格或标点字符识别为这样,并且链接参考匹配仅适用于ASCII字母( [a-zA-Z] )。
在md4c.h中的评论中,解析器的API已得到很好的记录。同样,在其标题md4c-html.h中描述了降压到HTML API。
还有Wiki项目提供了一些更全面的文档。但是请注意,这是不完整的,并且某些细节可能已经过时了。
问:MD4C与其他Markdown解析器相比如何?
答:其他一些实现将Markdown解析器和HTML生成器组合到隐藏在接口后面的单个纠缠代码中,该代码只允许从Markdown转换为HTML。如果您想以任何其他方式处理输入,它们通常是无法使用的。
其次,大多数解析器(如果不是全部;至少在C/C ++语言的范围内)都是完全类似DOM的解析器:它们构造了整个Markdown文档的抽象语法树(AST)表示。这需要时间,这会导致更大的内存足迹。
只要您需要,建造AST就完全可以。如果不这样做,就记忆消耗而言,使用MD4C的可能性很大,较少饥饿。
最后但并非最不重要的一点是,某些Markdown解析器以幼稚的方式实施。当以巧妙的输入模式喂食时,它们可能会表现出二次解析时间(甚至更糟)。 MD4C仍然可以在一小部分中解析的内容可能会变成很长的几分钟或可能与它们的数小时。因此,当使用这种幼稚的解析器来处理不受信任的来源的输入时,拒绝服务攻击的可能性就成为了真正的危险。
无论使用哪种疯狂的输入MD4C解析器,我们提供了很多努力,以提供线性解析时间。 (如果您遇到导致亚线性解析时间的输入模式,请随时犹豫并将其报告为错误。)
问:MD4C是否执行任何输入验证?
答:不。我们为此感到自豪。 :-)
CONCORMARK规范指出,任何Unicode字符的序列都是有效的标记文档。 (实际上,这或多或少总是意味着UTF-8编码。)
换句话说,根据规范,是否以某种方式破坏了某种降级语法构造并不重要。如果破碎,它将不会被识别,而解析器应该将其视为逐字文字。
MD4C进一步迈出了一步:它将任何字节序列视为有效的输入,完全遵循Gigo Philosophy(垃圾中的垃圾,垃圾)。即任何不正确的UTF-8字节序列都将作为文本的一部分传播到相应的回调。
如果您需要验证输入是一个良好的UTF-8文档,则必须自己进行。最简单的方法是简单地验证整个文档,然后再将其传递给MD4C解析器。
MD4C覆盖MIT许可证,请参阅文件LICENSE.md 。
端口和与其他语言的绑定:
CONCORMARK-D:MD4C端口到D语言。
MARKDOWN-WASM:MD4C端口到WebAssembly。
PYMD4C:MD4C的Python绑定
使用MD4C的软件:
imgui_md:亲爱的imgui
Markdown Monolith汇编器:用于构建基于浏览器的书籍的命令行工具。
Qownnotes:具有Markdown支持和OwnCloud / NextCloud Integration的普通文本记事本和托多斯管理器。
QT:跨平台C ++ GUI框架。
Textosaurus:基于QT和Scintilla的跨平台文本编辑器。
8:跨平台串联编程语言。