Markdown学习笔记(2)- Markdown基本概念

Markdown学习笔记(2)- Markdown基本概念


本章目标

上一篇文章里,我们已经对Markdown和CommonMark有了基本的认识,从这篇文章开始,我们将以CommonMark的规定为基准,讨论一些Markdown的语法细节。这篇文章主要讨论和Markdown相关的基本概念:组成Markdown文档的文字和文字块。


字符和行

任何字符序列都是有效的Markdown文档。虽然没有规定文档的编码,但默认情况下Markdown文档编码格式应为Unicode编码的一种,比如:UTF-8,因此,每个字符通常是一个Unicode码点。不同的文档解析器有不同的编码要求。

也是Markdown中构成文档的重要概念,一行文本由一个或多个字符的序列构成,并以行尾的换行符或回车组成。行尾也可以是文件末尾,或回车符与换行符的组合。

空格,行首3个或3个以下的空格将被忽略。由于Html的特性,行内多个连续空格会被显示成1个(但是保存的文件中仍会有多个空格)。

空行指的是只含有空白的一行。空行仅能由空格、制表符、换行符、换页符、回车符组成。

Tab代表制表符,Markdown中制表符不会被Markdown解释器变成四个空格保存,被翻译成Html的Markdown文档中将保留Tab这个符号。
但Tab具有和四个空格相同的行为:比如当被放在行首时,Tab和四个空格都代表“接下来这一行是一个代码块”(详见上一篇文章的代码块小节)。

>是Markdown中引用段落的标记,这种标记后面常常跟随一个空格。Markdown符号标记后的那个空格会被视为标记符号和内容的分隔符,而不会被视为内容的一部分。

下面的例子将更详细地说明这种情况。在下面的例子中,>标记符后面跟着一个Tab,这个Tab将会被视为4个空格,这4个空格中的第一个空格将会被视为引用标记符>和引用内容的分隔符,因此引用内容仅被视为由3个空格开始的内容。

例子:> foo

效果:

foo

块结构和内联结构

我们可以将Markdown文档视为由一系列文本块和结构体等元素构成的文档。这些元素包括,段落,引用内容,列表,标题,代码块等。文本块是这些元素的集合。
一些Markdown文本本身在语义上包含其他的文本块(如段落文本块、代码块文本块、引用内容文本块和列表文本块这些文本块),这种文本的结构就是块结构。块结构是一种广泛的抽象概念。
另外一些Markdown文本在语义上包含一些内联的标识符(如内联代码片段标识符、标题标识符(内联)、内联链接标识符、内联图片标识符。我们称这些结构为内联文本),这种文本的结构就是内联结构。

如果同一段文本里同时有表示构成块结构的Markdown符号标记和表示构成内联结构的Markdown符号标记。那么,表示构成块结构的Markdown语法标记会先起作用。

例子:

- `one

- two`

效果:
- one
- two

这个例子里,表示构成列表的-符号和内联代码片段标识符`同时出现。在Markdown中,列表是一个块结构而内联代码片段标识符构成了一个内联结构。

因此,列表标记先起作用了,把`one

two`

看成了两个列表项的文本,因此`并没有生效。

这意味着Markdown的解析可以分两步进行:首先,可以识别文档的块结构;其次,针对每个块结构的文本行、标题等内联结构进行分析。因此一个块元素的内联解析不会影响任何其他块结构的内联解析。

容器文本块(Container blocks)和非容器文本块(leaf blocks)

Markdown中的文本块可以分两种,一种可以含有其他的文本块,叫容器文本块;另一种不能,叫非容器文本块(leaf blocks)。leaf这种说法来自算法中,树这种数据结构里的leaf node这个概念。leaf node(叶子结点),是和根节点对应的概念,意思是这个节点下没有子节点了。leaf block借用的就是leaf node中leaf的意思。

Have A Break

接下来的文章中,我们将分别通过非容器文本块、容器文本块 和 内联结构 三个维度了解Markdown符号更富有细节的用法。稍作休息,我们在下篇文章再见。

原文链接:,转发请注明来源!

发表评论

要发表评论,您必须先登录