当前位置: 首页 > Web前端 > HTML

Unified简介,强大的结构化文本处理工具

时间:2023-03-28 15:14:49 HTML

作者: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/)转换为:云音乐官网……react-markdownreact-markdown作为remark系统的一部分,是一个上层-基于统一生态的layer封装,提供了一个能够渲染Markdown的React组件。在React框架中,使用react-markdown比直接使用remark将Markdown转为HTML然后使用dangerouslySetInnerHTML渲染更安全、可靠、易用。图:react-markdown的工作原理上图展示了react-markdown的工作原理,过程如下:通过remark将Markdown转换为对应的AST——mdast使用remark插件对mdast进行处理并转换mdast通过remark-rehypeAST转HTML——hat使用rehype插件处理hast使用React组件将hast渲染成React元素上面的整个过程其实就是将Markdown渲染成HTML的一般过程,也可以作为我们实现类似库时的参考。关于作者统一生态目前共有333个开源项目(截至2022.01.05),其核心开发者为TitusWormer。从Wormer的个人网站可以了解到,他来自荷兰,毕业于阿姆斯特丹应用科技大学,曾在该大学担任讲师。作为一名全职开源贡献者,我一共维护了超过535个项目,50%的时间都投入到统一项目中。能够以一己之力为开源社区做出如此巨大的贡献,是非常令人钦佩的。关于他是如何管理统一组织的,大家可以参考统一集体文档进一步了解。本文由网易云音乐前端团队发布。未经授权禁止任何形式的转载。我们常年招前端、iOS、Android。如果你要跳槽,又恰好喜欢云音乐,那就加入我们吧grp.music-fe(at)corp.netease.com!