Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【自荐工具】 一个零外部依赖的 Markdown 及其扩展语法的解析器和渲染器 #1855

Open
guanghechen opened this issue Jul 20, 2021 · 0 comments

Comments

@guanghechen
Copy link

guanghechen commented Jul 20, 2021

  • yozora: 一个基于中间件思想的、零外部依赖的 Markdown 解析器,用于将 Markdown 字符串转成 Markdown AST

  • yozora-react: 一个基于 React 的 Markdown 渲染器,用于将 Markdown AST 渲染成 React 组件

yozora.demo.mp4

✨ Features

  • 完整支持了 GFM 规范 中提到的所有规则,并通过了几乎所有由规范中的示
    例改造成的测试用例(除了示例 https://github.github.com/gfm/#example-653,因为
    渲染器 不打算支持原生的 HTML Tag,所以懒得做标签过滤,如果有需
    要自行做一下过滤就好了)。

    可参见 @yozora/parser-gfm or @yozora/parser-gfm-ex 以获得进一步信息。

  • 健壮性

    • 所有代码都采用 Typescript 编写,拥有严格地静态类型检查的保障;
    • 使用 eslint 和 prettier 约束编码风格,规避了偏僻语法及 shadow variables 之类
      易于出错的问题;
    • 使用了大量的测试用例进行测试;
  • 干净,零第三方依赖。

  • 高性能

    • 解析复杂度为字符串长度乘以分词器列表长度,已经达到了理论复杂度的下界;

    • 解析器的 API 支持流式读入(采用生成器/迭代器进行输入),支持边读入边解析
      (暂仅限于块级数据);

    • 在读入字符串时,会将其预处理成字符编码及位置信息,使用 NodePoint
      数据类型承载。在分词阶段通过扫描 NodePoint 的方式完成匹配,
      虽然匹配过程更麻烦些,但理论上性能比正则表达式的匹配方式少一些常数;

    • 小心地处理数组新建/连接操作,整个扫描阶段尽量复用数组,仅通过下标索引来圈定
      匹配范围,并应用了不少策略减少重复匹配/解析操作。

  • 兼容性,解析器解析出的 AST 与 Mdast 中定义的相兼容。即便以后
    如果部分数据类型不兼容,也可以很容易通过 @yozora/ast-util 中提供的 API 去
    遍历 AST 以进行适配修改。

  • 可扩展性,yozora 采用中间件的方式,由内部算法驱动分词器列表完成解析工作,因而
    易于创建并集成自定义的分词器。此项目中已实现了一些 GFM 中未提到的
    数据类型的分词器,如 @yozora/tokenizer-admonition, @yozora/tokenizer-footnote
    等,且均已内置于 @yozora/parser 中。

@guanghechen guanghechen changed the title 一个零外部依赖的 Markdown 及其扩展语法的解析器和渲染器 【自荐工具】 一个零外部依赖的 Markdown 及其扩展语法的解析器和渲染器 Jul 20, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants