Markdown-it 的数据结构及解析过程
markdown-it
中是以 Token
来标识整个文档及里面的元素,可以认为它就是 html
中标签的抽象
解析时,将首先把整个md文件的内容抽象成一个大的 Token
,接着渲染这个 Token
,得到 html
。抽象的过程分为不断迭代的两小步,直至文档尾。第一小步先解析块级元素(block),比如代码段、段落、引用等;第二小步解析行内元素(inline),比如图片、文字。每一步都对应相应的提取规则(Rule)。
得到 Token
后,使用 render()
函数进行渲染,渲染的时候也有相应的规则,不过这些规则只针对行内元素。
具体过程描述如上,详细的处理规则可以通过接下来的实例进一步理解。
源码仓库地址: https://github.com/markdown-it/markdown-it/tree/master/lib
下面两部分的代码均可写在 vuepress
的配置文件中:.vuepress/config.js
- markdown.extendMarkdown(md => {...})
自定义图片处理规则(inline)
这部分其实没什么用,因为一开始的目的是把图片居中,想着在包裹图片的<p>
加一个text-align:center
样式,所以首先想着把图片搞出来处理,结果发现应该是从段落入手。然后这部分是实验的代码,边对照着源码敲出来的,不得不佩服 markdown-it
的开发者,把js写成了c语言,各种指针的调用,阅读起来难度有点大,极具挑战性。
1 | // 先将原先的图片处理规则禁用 |
设置图片居中
这部分代码是把 markdown-it
源码中的 lib/rules_block/paragraph.js
paragraph.js 处理部分直接抄过来,然后改了一行,往 <p>
的属性中加入了图片居中的样式。
1 | // 自定义 block 段落中的图片显示 |