转包AST转换器与包办AST转换器

林一二2022年07月02日 20:02

有的转换器函数接受「带孩」节点(Parent Node),也就是除了需要渲染节点本身以外,还需要考虑如何渲染这个节点带的孩子。这种渲染器就会将孩子的渲染转包给其他渲染器,它一般不自己转包,而是让 all 函数作为中介来处理,避免脏了自己的手。

例如「容器」节点,它可能会带任意类型的孩子,所以我们除了渲染一层 div 容器元素以外,还需要在渲染出的容器元素里用之前介绍的 all 函数渲染其所有孩子: all(node.children)。而 all 函数里会调用 one 函数,one 函数则会去查表找每个元素用什么渲染器来渲染。如果容器里又套了容器,则这样转了一圈之后就又会转回「容器」渲染器了。

有的转换器则是只接受「丁克」节点,例如文本节点,一个节点就渲染出一段文本返回了了事,这种节点渲染器最为省事,把所有事情都包办了,事情到此为止,不会再被层层转包出去了,是真正在办实事的好节点。

有一种和「丁克」渲染器很类似的「吞树」渲染器会一次性吞掉一整块树,例如渲染到代码块节点时,虽然代码块里每个段落都是一个独立的文本节点,但代码块渲染器可以选择直接把整棵树处理一下传给 codemirror npm 包,用社区提供的渲染器来做具体的渲染,而不是自己造轮子去写渲染代码块细节的所有丁克渲染器。