作者:imyzf概述内容作为结构化数据。——统一官网题词Unified是一套与文本处理相关的生态系统。结合其生态相关插件,可处理Markdown、HTML、自然语言等。统一库本身作为统一执行接口,作为执行者,调用其生态相关插件完成处理任务。从统一官网可以看出,目前统一使用比较广泛,包括Prettier、Node.js官网、Gatsby,都是使用统一的能力来完成一些功能。图:统一官网使用示例常见的使用场景包括:基于Markdown生成HTML页面和站点Markdown/HTML内容处理Markdown语法检查,格式化作为底层库,封装特定场景的工具目前国内对统一系统的介绍很少,本文将介绍统一系统的相关插件生态和工作原理,并分析一些使用示例,帮助读者了解统一系统的能力、原理和用途。插件生态图:统一生态相关插件remarkremark是Markdown相关插件的集合,提供Markdown解析、修改、转换为HTML的能力。目前提供的一些常用插件:remark-parse:提供解析Markdown的能力remark-gfm:提供GFM(GitHubflavoredmarkdown)支持remark-lint:提供Markdown代码检查能力remark-toc:提供Markdown文档目录生成功能remark-html提供将Markdown编译成HTML的能力完整的插件列表可以在这里找到,有150多个插件可供选择。我们可以使用这种便捷的方式在项目中调用remark:remark()//一键初始化Markdown解析器。processSync('#Hello,world!')//同步文本处理等同于以下方法:unified()//使用统一接口。use(remarkParse)//使用Markdown解析器插件。use(remarkStringify)//使用Markdown文本序列化插件.processSync('#Hello,world!')图:remark用法和转换示例另外需要说明的是,目前GitHub上有一个同名的项目gnab/remark,其官方网站是remarkjs.com。虽然也是Markdown相关的工具,但在统一生态中与remark无关。本文提到的remark官网为remark.js.org,大家在通过搜索引擎搜索相关资料时需要避免混淆。与remark类似,rehype是一组HTML相关的插件集合,提供HTML格式化、压缩、文档生成能力。相比之下,rehype的插件比较少,只有40多个,详细的插件列表可以参考插件列表文档。同时我们也可以使用rehype-remark和remark-rehype来实现两种语言的插件系统之间的连接。相互转换。例如,下面的例子可以将stdin输入的HTML内容转换成Markdown:'importremarkStringifyfrom'remark-stringify'constprocessor=unified().use(rehypeParse)//解析HTML.use(rehypeRemark)//转换为备注系统。use(remarkStringify)//将语法树转换为Markdown字符串process.stdin.pipe(stream(processor)).pipe(process.stdout)其他retext和redot是两个相对较小的系统,与上述两个相比,使用率和开发活动较少系统。它们的用途如下:retext:提供自然语言处理能力,包括拼写检查、纠错、可读性检查等redot:提供graphviz解析能力另外,在Markdown字段中,有两个名字不以开头的系统re、mdx和micromark,分别对应具体的Markdown使用场景:mdx:提供在Markdown文档中编写JSX的能力,实现文档中各种组件的引入,编写交互式文档micromark:一个极简的Markdown转换库,支持小型扩展数量多,适合简单的Markdown转换在HTML场景下,remark也复用了micromark的解析能力。具体可以参考项目文档,这里不再赘述。工作原理unified的核心机制是基于AST(abstractsyntaxtrees,抽象语法树)。当插件执行时,AST将传递给插件,可以通过多种方式进行处理。同时,也可以基于AST进行各种语言的转换,比如解析一个Markdown文档后,转成HTML进行处理,再转回Markdown。图:统一工作流程比如我们可以遍历插件中的AST,打印出所有heading节点:module.exports=()=>tree=>{visit(tree,'heading',node=>{console.log(node)})}上面例子中的visit方法来自于unist-util-visit工具,它提供了遍历节点的功能。unified使用称为unist或UST的AST标准来使同一工具能够在不同的语言中使用。例如,对于Markdown和HTML语言的AST,由于它们基于相同的标准,我们可以使用相同的访问API来实现相同的功能:visit(markdownAST,'images',transformImages)visit(htmlAST,'img',transformImgs)场景示例下面列举一些基于统一生态的使用场景,帮助大家进一步了解其使用方式。Node.js官网Node.js官网主要在语法检查和文档构建上使用unified:使用remark-cli检查Markdown文档,参考其package.json中的脚本配置使用unified进行文档构建,参考generate。mjsdumidumi的代码是为组件开发场景定制的文档工具。它的核心功能是将Markdown文档转换成HTML页面。查看它的源码,我们会发现它使用unified作为转换器,在remark/index.ts中引入unified,调用一系列自定义或者社区提供的插件进行处理。由于使用了大量自定义插件,dumi源码可以作为统一插件开发的优秀参考范例。比如参考link.ts,可以学习如何在Markdown中修改外部链接,通过修改AST在生成的页面上添加一个小链接图标,提醒用户这是外部站点的链接。文档源码:[云音乐官网](https://music.163.com/)转换为:
