theniceangel / markdown-it-analysis

Source code analysis of markdown-it
5 stars 2 forks source link

👉系列二:Ruler & Token #3

Open theniceangel opened 5 years ago

theniceangel commented 5 years ago

前言

要想理清 MarkdownIt 源码的来龙去脉,必须要清楚两个基础类—— Ruler & Token。

Token

俗称词法单元。

md 接收一个字符串,经过一系列的 parser 的处理,变成了一个个 token,接着调用 render 对应的rule,将 token 作为输入,最后输出 HTML 字符串。

先来看下 Token 的定义,位于 lib/token.js

function Token(type, tag, nesting) {

  this.type     = type;

  this.tag      = tag;

  this.attrs    = null;

  this.map      = null;

  this.nesting  = nesting;

  this.level    = 0;

  this.children = null;

  this.content  = '';

  this.markup   = '';

  this.info     = '';

  this.meta     = null;

  this.block    = false;

  this.hidden   = false;
}

接下来看一下原型上的方法。

Token 小结

Token 是 MarkdownIt 内部最基础的类,也是最小的分割单元。它是 parse 的产物,也是 output 的依据。

Ruler

再来看下 MarkdownIt 另外的一个类 —— Ruler,可以认为它是职责链函数的管理器。因为它内部存储了很多 rule 函数,rule 的职能分为两种,一种是 parse rule,用来解析用户传入的字符串,生成 token,另一种是 render rule,在产出 token 之后,再根据 token 的类型调用不同的 render rule,最终吐出 HTML 字符串。

先从 constructor 说起。

function Ruler() {
  this.__rules__ = [];

  this.__cache__ = null;
}

再来分析一下原型上各个方法的作用。