原生Markdown
Markdown语法最早由John Gruber于2004年创立。为了区分于后来出现的各种衍生Markdown语法,故称为原生Markdown。
虽然现在使用的Markdown与原生Markdown有所不同,但是衍生的众多Markdown语法也沿袭了很多原生Markdown的语法,所以学习原生的Markdown对学习Markdown有很大的帮助,特别是理解Markdown的理念。
原生Markdown将语法分成区块元素和行内元素:
- 区块元素:段落、标题、区块引用、列表(无序和有序)、区块代码、分割线
- 行内元素:链接、强调(粗体和斜体)、行内代码、图片
可以看出,原生Markdown支持的元素并不多,甚至连表格都不支持,只支持一些基本的元素。
衍生Markdown
自从John Gruber在2004年发布Markdown之后,Markdown进入了自由生长的状态,因为创始人John Gruber自2004年之后就没有更新过Markdown。
由于原生Markdown只是一个轻量级的标记语言,很多功能不具备。为了扩充功能,很多Markdown拓展语法被开发出来。其中,着名的有GFM、PHP Markdown Extra、MultiMarkdown、Pandoc Markdown等等。
1. GFM
原生Markdown发布后,最早在程序员圈内流行。由于Markdown的易读易写,而且对程序员很友好(支持块代码和行内代码),全球最大的代码托管平台Github引入了Markdown,并且对原生Markdown语法进行了拓展,并称之为Github Flavored Markdown,简称GFM。
与原生Markdown的主要不同:
- 采用围栏式(Fenced式)区块代码:在代码的上下一行用3个反引号,可选择性定义代码语种,并支持代码高亮。
- 列表嵌套方式:改为每次嵌套缩进两个空格。
- 支持列表任务:在每个项目列表加入[],完成任务使用[x],如- [x] 任务说明。
- 支持简单表格:
First Header | Second Header |
---|---|
Conter Cell | Conter Cell |
Conter Cell | Conter Cell |
注意:
① 两侧的竖线|可以省略。
② 第二行的每个单元格至少3个减号—。
③ 可以修改每列文字对齐方式:| :— | :—: | —: |。
- 支持使用emoji表情:如:sad:,显示为:sad:。
- 删除线(新增):用两个波浪号紧密包裹文字,如~~123。
2. PHP Markdown Extra
与原生Markdown的主要不同:
- 内嵌HTML:块标签可以缩进不超过3个空格,且可以在块标签中选择性使用Markdown语法。
- 文内跳转:可以为区块元素设置id和class属性,实现文章内部跳转。
- 区块代码:与GFM相似,可以使用围栏式在代码上下行使用3个或以上波浪号~~~包裹,也支持代码高亮。
- 表格:同GFM。
- 支持自定义列表
- 支持脚注:如[^1]:脚注内容,脚注名字必须唯一。
- 支持缩略语
- 强调:两字词中间的下划线不会被解释成强调。
3. MultiMarkdown
原生Markdown文档只能从纯文本转换为HTML。而MultiMarkdown则扩大了原生Markdown的转换范围,让其可以方便的转换成:
- HTML/XHTML
- LaTeX(which can be processed into a PDF)
- OpenDocument Text document
- OPML
为了更好的和其他格式兼容,MultiMarkdown借鉴了很多其他格式的语法功能。
与原生Markdown的主要不同:
- 支持元数据:标题、作者、日期等信息,兼容部分YAML。
- 支持交叉引用
- 支持添加链接和图片的属性
- 图片可以作为区块元素:如果一个图片语言独立成段,会被自动解释为区块元素,图片下会添加一行图片说明。
- 支持部分复杂表格:兼容PHP Markdown Extra的表格,同时支持多行表头、单元格横向合并、表格分区、表格下行表格说明等。
- 支持脚注:同PHP Markdown Extra。
- 支持参考文献(Citations)
- 支持定义列表:同PHP Markdown Extra。
- 支持缩略语(Abbreviations):同PHP Markdown Extra。
- 支持围栏式区块代码:上下行3到5个反引号包裹代码,可定义语法种类,选择性语法高亮。首尾行的反引号数量要一致。
- 支持MathJax公式
- 支持上标与下标
- 支持术语表
- 支持修订功能(CriticMarkup):可以显示修订痕迹
- 删除:{–删除的文本–}
- 添加:{++新增的文本++}
- 替换:{~~删除的文本~>新增的文本~~}
- 高亮:{==高亮的文本==}
- 备注:{>>备注文本<<}
- 支持内嵌HTML
- **支持内嵌其他文件:**txt、tet、fodt、html等。
- 换行方式改为行末使用\
- 支持目录
4. Pandoc’s Markdown
Pandoc本身是一个多格式文档的转换工具,所以Pandoc Markdown与MultiMarkdown的设计目的相似,使Markdown可以转换成更多的不同格式。因为Pandoc支持的格式很多,这也就使得Pandoc’s Markdown非常的丰富。
与原生Markdown的主要不同:
- 强制换行支持两种方式:行尾两个空格换行,反斜杠换行。
- Atx式标题(即井号式标题)之前一定要预留空行
- 区块引用之前一定要预留空行
- 围栏式区块代码之前必须留空行
- 支持行区块
- 可生成不同形式的列表
- 支持连续编号的范例清单
- 支持定义列表
- 支持简单表格、多行表格、格框表格和管线表格四种样式
- 支持文件标题区块(类似元数据)
- 支持删除线
- 支持上标下标
- 支持数学公式
- 支持内嵌TeX
5. CommonMark
由于创始人自2004年之后就没有更新过Markdown语法,众多的遗留问题没有得到解决,加上扩展语法的自由发展和Markdown编辑器的涌现,导致了很严重的方言和兼容性问题。因此,有人希望对Markdown语法进行规整和同意,建立一套Markdown的语法规范。
CommonMark正是这样的产物。CommonMark与一般的衍生语法不同,它的目的不是扩展Markdown的标准。
可惜此举得到Markdown创世人John Gruber的强力反对,所以至今CommonMark并没有得到广泛的认可。但是就CommonMark本身而言,它规范了Markdown的各项语法,有许多可取之处。
与原生Markdown的主要不同:
- 定义了优先级别:区块语法的优先级别大于行内语法。
- 支持围栏式区块代码
- 支持1)作为有序列表的项目标记
- 支持\作为换行符
- 列表嵌套采用行首内容对其,而非4个空格
- Setext式标题(即底线式标题)支持多行
CommonMark基本没有新增内容,主要是对语法规范进行说明,对理解Markdown很有帮助。