Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yozorajs/yozora
A customizable markup parser for resolving markdown-like syntax strings into AST and vice versa.
https://github.com/yozorajs/yozora
gfm markdown markdown-ast markdown-parser mdast yozora
Last synced: 5 days ago
JSON representation
A customizable markup parser for resolving markdown-like syntax strings into AST and vice versa.
- Host: GitHub
- URL: https://github.com/yozorajs/yozora
- Owner: yozorajs
- License: mit
- Created: 2020-01-15T12:18:20.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2025-01-13T07:55:48.000Z (17 days ago)
- Last Synced: 2025-01-23T11:38:05.219Z (7 days ago)
- Topics: gfm, markdown, markdown-ast, markdown-parser, mdast, yozora
- Language: TypeScript
- Homepage: https://yozora.guanghechen.com
- Size: 45.3 MB
- Stars: 151
- Watchers: 4
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README-zh.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
Yozora
> 参见 [Yozora 文档][yozora-docs] (或 [备用地址][yozora-docs2]) 以获得更多信息。
>
> https://user-images.githubusercontent.com/42513619/129205123-6a1983c4-6a86-4c80-83d6-02bdbf70edbf.mp4
## 🎉 什么是 "yozora" ?
**_yozora_** 是日语「よぞら」的罗马音,意为“夜空”,取自*世界の終わり*乐队的『_花鳥風月_』中的歌词。
此项目是一个 monorepo,目的是实现一个高度可扩展的、可插拔式 Markdown 解析器。它采用了中间件的思想,
由核心算法 [@yozora/core-parser][] 调度分词器(如 [@yozora/tokenizer-autolink][])完成解析工作。准确
地说,_yozora_ 是一个将 Markdown 语法或其扩展语法编写的字符串解析成抽象语法树(AST)的算法。## ✨ Features
- 🔖 完整地支持了 [GFM 规范][gfm-spec] 中提到的所有规则,并通过了几乎所有由规范中的示例改造成的测试
用例(除了由示例 https://github.github.com/gfm/#example-653 所展示的标签过滤规则, 因为我不打算让
[Yozora AST 的 React 渲染器][yozora-react] 支持原生的 HTML 标签,所以懒得做标签过滤,如果有需要可
以自行做一下过滤)。可参见 [@yozora/parser-gfm] or [@yozora/parser-gfm-ex] 以获得进一步信息。
- 🚀 健壮性:
- 所有代码都采用 Typescript 编写,拥有严格地静态类型检查的保障;
- 使用 eslint 和 prettier 约束编码风格,规避了偏僻语法及 shadow variables 之类易于出错的问题;
- 使用了大量的测试用例进行测试;- 💚 干净,零第三方依赖。
- ⚡️ 高性能
- 解析复杂度为字符串长度乘以分词器列表长度,已经达到了理论复杂度的下界;
- 解析器的 API 支持流式读入(采用生成器/迭代器进行输入),支持边读入边解析(暂仅限于块级数据);
- 在读入字符串时,会将其预处理成字符编码及位置信息,使用 [NodePoint][src-NodePoint] 数据类型承载。
在分词阶段通过扫描 [NodePoint][src-NodePoint] 的方式完成匹配,虽然匹配过程更麻烦些,但理论上性能
比正则表达式的匹配方式少一些常数;- 小心地处理数组新建/连接操作,整个扫描阶段尽量复用数组,仅通过下标索引来圈定匹配范围,并应用了不
少策略减少重复匹配/解析操作。- 🩹 兼容性,解析器解析出的 AST 与 [Mdast][mdast-homepage] 中定义的相兼容。即便以后如果部分数据类型
不兼容,也可以很容易通过 [@yozora/ast-util][] 中提供的 API 去遍历 AST 以进行适配修改。- 🎨 可扩展性,yozora 采用中间件的方式,由内部算法驱动分词器列表完成解析工作,它带了如下能力:
- 易于创建并集成自定义的分词器
- 所有的分词器均可自由装载/卸载此项目中已实现了一些 [GFM][gfm-spec] 中未提到的数据类型的分词器,如
[@yozora/tokenizer-admonition][], [@yozora/tokenizer-footnote][] 等,且均已默认内置于
[@yozora/parser][] 中。如果你不喜欢其中的某些,可以任意卸载它们。## Usage
- [@yozora/parser][]: (**推荐**)内置了所有分词器的 Markdown 解析器。
```typescript
import YozoraParser from '@yozora/parser'const parser = new YozoraParser()
parser.parse('source content')
```- [@yozora/parser-gfm][]: 支持 [GFM 规范][gfm-spec] 的 Markdown 解析器。内置了支持 [GFM 规
范][gfm-spec] 中提到的所有语法(**不包含**规范中提到的扩展语法,如
[table][@yozora/tokenizer-table])的分词器。```typescript
import GfmParser from '@yozora/parser-gfm'const parser = new GfmParser()
parser.parse('github flavor markdown contents')
```- [@yozora/parser-gfm-ex][]: 支持 [GFM 规范][gfm-spec] 的 Markdown 解析器。内置了支持 [GFM 规
范][gfm-spec] 中提到的所有语法(**包括**规范中提到的扩展语法,如
[table][@yozora/tokenizer-table])的分词器。```typescript
import GfmExParser from '@yozora/parser-gfm-ex'const parser = new GfmExParser()
parser.parse('github flavor markdown contents (with gfm extensions enabled)')
```- 将 AST 转换成标记语言(类似markdown)内容
```typescript
import { DefaultMarkupWeaver } from '@yozora/markup-weaver'const weaver = new DefaultMarkupWeaver()
weaver.weave({
"type": "root",
"children": [
{
"type": "paragraph",
"children": [
{
"type": "text",
"value": "emphasis: "
},
{
"type": "strong",
"children": [
{
"type": "text",
"value": "foo \""
},
{
"type": "emphasis",
"children": [
{
"type": "text",
"value": "bar"
}
]
},
{
"type": "text",
"value": "\" foo"
}
]
}
]
}
]
})
// => emphasis: **foo "*bar*" foo**
```### Overview
- Parsers
| Parser | Description |
| :------------------------ | :-------------------------------------------------------------------------------------------------------------------------- |
| [@yozora/parser][] | 内置了本仓库所有分词器的 Markdown 解析器 |
| [@yozora/parser-gfm][] | 内置了支持 [GFM 规范][gfm-spec] 中提到的所有语法(不包含规范中提到的扩展语法,如 [table][@yozora/tokenizer-table])的分词器 |
| [@yozora/parser-gfm-ex][] | 内置了支持 [GFM 规范][gfm-spec] 中提到的所有语法(包括规范中提到的扩展语法,如 [table][@yozora/tokenizer-table])的分词器 |- Weavers
| Weaver | Description |
| :------------------------ | :----------------------------- |
| [@yozora/markup-weaver][] | Weave AST into markup content. |- Tokenizers
| Tokenizer | Description |
| :---------------------------------------- | :----------------------------------------------------------------------------------------------------------------- |
| [@yozora/tokenizer-admonition][] | Resolve admonitions |
| [@yozora/tokenizer-autolink][] | Resolve [GFM Autolinks][gfm-autolink] |
| [@yozora/tokenizer-autolink-extension][] | Resolve [GFM Autolinks (extension)][gfm-autolink-extension] |
| [@yozora/tokenizer-blockquote][] | Resolve [GFM blockquotes][gfm-blockquote] |
| [@yozora/tokenizer-break][] | Resolve [GFM hard line breaks][gfm-hard-line-break] and [GFM soft line breaks][gfm-soft-line-break] |
| [@yozora/tokenizer-definition][] | Resolve [GFM link reference definitions][gfm-link-reference] |
| [@yozora/tokenizer-delete][] | Resolve [GFM strikethrough (extension)][gfm-delete] |
| [@yozora/tokenizer-ecma-import][] | Resolve ECMAScript `import` statements |
| [@yozora/tokenizer-emphasis][] | Resolve [GFM emphasis and strong emphasis][gfm-emphasis] |
| [@yozora/tokenizer-fenced-code][] | Resolve [GFM fenced code blocks][gfm-fenced-code] |
| [@yozora/tokenizer-footnote][] | Resolve footnotes |
| [@yozora/tokenizer-footnote-definition][] | Resolve footnote definitions |
| [@yozora/tokenizer-footnote-reference][] | Resolve footnote references |
| [@yozora/tokenizer-heading][] | Resolve [GFM ATX headings][gfm-atx-heading] |
| [@yozora/tokenizer-html-block][] | Resolve [GFM HTML blocks][gfm-html-block] |
| [@yozora/tokenizer-html-inline][] | Resolve [GFM raw HTML][gfm-html-inline] |
| [@yozora/tokenizer-image][] | Resolve [GFM images][gfm-image] |
| [@yozora/tokenizer-image-reference][] | Resolve [GFM reference images][gfm-image-reference] |
| [@yozora/tokenizer-indented-code][] | Resolve [GFM indented code blocks][gfm-indented-code] |
| [@yozora/tokenizer-inline-code][] | Resolve [GFM code spans][gfm-inline-code] |
| [@yozora/tokenizer-inline-math][] | Resolve inline formulas |
| [@yozora/tokenizer-link][] | Resolve [GFM links][gfm-link] |
| [@yozora/tokenizer-link-reference][] | Resolve [GFM reference links][gfm-link-reference] |
| [@yozora/tokenizer-list][] | Resolve [GFM lists][gfm-list] (with [GFM list items][gfm-list-item] and [GFM task list items][gfm-list-task-item]) |
| [@yozora/tokenizer-math][] | Resolve block formulas |
| [@yozora/tokenizer-paragraph][] | Resolve [GFM paragraphs][gfm-paragraph] |
| [@yozora/tokenizer-setext-heading][] | Resolve [GFM setext headings][gfm-setext-heading] |
| [@yozora/tokenizer-table][] | Resolve [GFM tables][gfm-table] |
| [@yozora/tokenizer-text][] | Resolve [GFM textual contents][gfm-text] |
| [@yozora/tokenizer-thematic-break][] | Resolve [GFM thematic breaks][gfm-thematic-break] |- Utils
| Package | Description |
| :------------------------- | :-------------------------------- |
| [@yozora/ast][] | Yozora 中所有的 AST 节点类型 |
| [@yozora/ast-util][] | 处理 AST 的工具函数库 |
| [@yozora/character][] | 处理字符编码的工具库 |
| [@yozora/core-parser][] | Yozora 解析器的核心算法 |
| [@yozora/core-tokenizer][] | Yozora 分词器相关的接口和工具函数 |
| [@yozora/invariant][] | A simple invariant function |- Scaffolds
| Package | Description |
| :----------------------------- | :--------------------------------------- |
| [@yozora/jest-for-tokenizer][] | 测试分词器的测试库,并包含大量的测试用例 |## 💡 FAQ
- 如何在 gatsby 中使用 yozora?
- 参见 [@yozora/gatsby-transformer][] 和 [@yozora/gatsby-images][]
- 如何实现自定义的分词器?
- 参见 [@yozora/core-tokenizer][] 以获得分词器的生命周期函数细节;
- 参见 [@yozora/jest-for-tokenizer][] 以获得测试自定义分词器相关的信息;
- 参考 [@yozora/core-parser][] 和 [@yozora/parser][] 以获得如何使用自定义分词器的信息;
另外,同样推荐参考现有的 [分词器][github-tokenizers],以实现一个自定义的版本。
## 💬 Contact
- [Github issues](https://github.com/yozorajs/yozora/issues)
## 📄 License
Yozora 使用 [MIT 许可证](https://github.com/yozorajs/yozora/blob/main/LICENSE) 进行授权。
## Related
- [✨光和尘一直想要一个清爽博客][ghc-post-yozora]: 为什么要写这个项目。
- [@yozora/react-markdown][]: 一个用于将 Yozora AST 渲染成 React 组件的库。
- [@yozora/html-markdown][]: 一个用于将 Yozora AST 渲染成 HTML 字符串的库。[ghc-post-yozora]: https://me.guanghechen.com/essay/tada/
[gfm-spec]: https://github.github.com/gfm/
[github-tokenizers]: https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers
[src-NodePoint]: https://github.com/yozorajs/yozora/blob/main/packages/character/src/types.ts#L10
[yozora-docs]: https://yozora.guanghechen.com/
[yozora-docs2]: https://yozorajs.github.io/
[yozora-react]: https://github.com/yozorajs/yozora-react
[@yozora/gatsby-transformer]:
https://github.com/yozorajs/gatsby-scaffolds/blob/main/packages/gatsby-transformer#readme
[@yozora/gatsby-images]:
https://github.com/yozorajs/gatsby-scaffolds/blob/main/packages/gatsby-images#readme
[@yozora/html-markdown]: https://github.com/yozorajs/yozora-html/tree/main/packages/markdown
[@yozora/react-markdown]: https://github.com/yozorajs/yozora-react/tree/main/packages/markdown[live-examples]: https://yozora.guanghechen.com/docs/package/root#live-examples
[docpage]: https://yozora.guanghechen.com/docs/package/root
[homepage]: https://github.com/yozorajs/yozora/tree/release-2.x.x/.#readme
[gfm-spec]: https://github.github.com/gfm
[mdast-homepage]: https://github.com/syntax-tree/mdast
[@yozora/ast]: https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/ast#readme
[@yozora/ast-util]: https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/ast-util#readme
[@yozora/character]: https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/character#readme
[@yozora/core-parser]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/core-parser#readme
[@yozora/core-tokenizer]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/core-tokenizer#readme
[@yozora/invariant]: https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/invariant#readme
[@yozora/markup-weaver]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/markup-weaver#readme
[@yozora/jest-for-tokenizer]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/jest-for-tokenizer#readme
[@yozora/parser]: https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/parser#readme
[@yozora/parser-gfm]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/parser-gfm#readme
[@yozora/parser-gfm-ex]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/packages/parser-gfm-ex#readme
[@yozora/tokenizer-admonition]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/admonition#readme
[@yozora/tokenizer-autolink]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/autolink#readme
[@yozora/tokenizer-autolink-extension]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/autolink-extension#readme
[@yozora/tokenizer-blockquote]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/blockquote#readme
[@yozora/tokenizer-break]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/break#readme
[@yozora/tokenizer-definition]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/definition#readme
[@yozora/tokenizer-delete]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/delete#readme
[@yozora/tokenizer-ecma-import]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/ecma-import#readme
[@yozora/tokenizer-emphasis]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/emphasis#readme
[@yozora/tokenizer-fenced-block]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/fenced-block#readme
[@yozora/tokenizer-fenced-code]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/fenced-code#readme
[@yozora/tokenizer-footnote]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/footnote#readme
[@yozora/tokenizer-footnote-definition]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/footnote-definition#readme
[@yozora/tokenizer-footnote-reference]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/footnote-reference#readme
[@yozora/tokenizer-heading]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/heading#readme
[@yozora/tokenizer-html-block]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/html-block#readme
[@yozora/tokenizer-html-inline]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/html-inline#readme
[@yozora/tokenizer-image]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/image#readme
[@yozora/tokenizer-image-reference]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/image-reference#readme
[@yozora/tokenizer-indented-code]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/indented-code#readme
[@yozora/tokenizer-inline-code]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/inline-code#readme
[@yozora/tokenizer-inline-math]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/inline-math#readme
[@yozora/tokenizer-link]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/link#readme
[@yozora/tokenizer-link-reference]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/link-reference#readme
[@yozora/tokenizer-list]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/list#readme
[@yozora/tokenizer-math]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/math#readme
[@yozora/tokenizer-paragraph]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/paragraph#readme
[@yozora/tokenizer-setext-heading]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/setext-heading#readme
[@yozora/tokenizer-table]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/table#readme
[@yozora/tokenizer-text]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/text#readme
[@yozora/tokenizer-thematic-break]:
https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/thematic-break#readme
[@yozora/react-admonition]:
https://github.com/yozorajs/yozora-react/tree/main/packages/admonition#readme
[@yozora/react-blockquote]:
https://github.com/yozorajs/yozora-react/tree/main/packages/blockquote#readme
[@yozora/react-break]: https://github.com/yozorajs/yozora-react/tree/main/packages/break#readme
[@yozora/react-delete]: https://github.com/yozorajs/yozora-react/tree/main/packages/delete#readme
[@yozora/react-emphasis]:
https://github.com/yozorajs/yozora-react/tree/main/packages/emphasis#readme
[@yozora/react-code]: https://github.com/yozorajs/yozora-react/tree/main/packages/code#readme
[@yozora/react-code-live]:
https://github.com/yozorajs/yozora-react/tree/main/packages/code-live#readme
[@yozora/react-footnote-definitions]:
https://github.com/yozorajs/yozora-react/tree/main/packages/footnote-definitions#readme
[@yozora/react-footnote-reference]:
https://github.com/yozorajs/yozora-react/tree/main/packages/footnote-reference#readme
[@yozora/react-heading]: https://github.com/yozorajs/yozora-react/tree/main/packages/heading#readme
[@yozora/react-image]: https://github.com/yozorajs/yozora-react/tree/main/packages/image#readme
[@yozora/react-inline-code]:
https://github.com/yozorajs/yozora-react/tree/main/packages/inline-code#readme
[@yozora/react-inline-math]:
https://github.com/yozorajs/yozora-react/tree/main/packages/inline-math#readme
[@yozora/react-link]: https://github.com/yozorajs/yozora-react/tree/main/packages/link#readme
[@yozora/react-list]: https://github.com/yozorajs/yozora-react/tree/main/packages/list#readme
[@yozora/react-list-item]:
https://github.com/yozorajs/yozora-react/tree/main/packages/list-item#readme
[@yozora/react-markdown]:
https://github.com/yozorajs/yozora-react/tree/main/packages/markdown#readme
[@yozora/react-math]: https://github.com/yozorajs/yozora-react/tree/main/packages/math#readme
[@yozora/react-paragraph]:
https://github.com/yozorajs/yozora-react/tree/main/packages/paragraph#readme
[@yozora/react-strong]: https://github.com/yozorajs/yozora-react/tree/main/packages/strong#readme
[@yozora/react-table]: https://github.com/yozorajs/yozora-react/tree/main/packages/table#readme
[@yozora/react-text]: https://github.com/yozorajs/yozora-react/tree/main/packages/text#readme
[@yozora/react-thematic-break]:
https://github.com/yozorajs/yozora-react/tree/main/packages/thematic-break#readme
[doc-live-examples/gfm]: https://yozora.guanghechen.com/docs/example/gfm
[doc-@yozora/ast]: https://yozora.guanghechen.com/docs/package/ast
[doc-@yozora/ast-util]: https://yozora.guanghechen.com/docs/package/ast-util
[doc-@yozora/core-parser]: https://yozora.guanghechen.com/docs/package/core-parser
[doc-@yozora/core-tokenizer]: https://yozora.guanghechen.com/docs/package/core-tokenizer
[doc-@yozora/parser]: https://yozora.guanghechen.com/docs/package/parser
[doc-@yozora/parser-gfm]: https://yozora.guanghechen.com/docs/package/parser-gfm
[doc-@yozora/parser-gfm-ex]: https://yozora.guanghechen.com/docs/package/parser-gfm-ex
[doc-@yozora/tokenizer-admonition]: https://yozora.guanghechen.com/docs/package/tokenizer-admonition
[doc-@yozora/tokenizer-autolink]: https://yozora.guanghechen.com/docs/package/tokenizer-autolink
[doc-@yozora/tokenizer-autolink-extension]:
https://yozora.guanghechen.com/docs/package/tokenizer-autolink-extension
[doc-@yozora/tokenizer-blockquote]: https://yozora.guanghechen.com/docs/package/tokenizer-blockquote
[doc-@yozora/tokenizer-break]: https://yozora.guanghechen.com/docs/package/tokenizer-break
[doc-@yozora/tokenizer-delete]: https://yozora.guanghechen.com/docs/package/tokenizer-delete
[doc-@yozora/tokenizer-emphasis]: https://yozora.guanghechen.com/docs/package/tokenizer-emphasis
[doc-@yozora/tokenizer-fenced-code]:
https://yozora.guanghechen.com/docs/package/tokenizer-fenced-code
[doc-@yozora/tokenizer-heading]: https://yozora.guanghechen.com/docs/package/tokenizer-heading
[doc-@yozora/tokenizer-html-block]: https://yozora.guanghechen.com/docs/package/tokenizer-html-block
[doc-@yozora/tokenizer-html-inline]:
https://yozora.guanghechen.com/docs/package/tokenizer-html-inline
[doc-@yozora/tokenizer-image]: https://yozora.guanghechen.com/docs/package/tokenizer-image
[doc-@yozora/tokenizer-image-reference]:
https://yozora.guanghechen.com/docs/package/tokenizer-image-reference
[doc-@yozora/tokenizer-indented-code]:
https://yozora.guanghechen.com/docs/package/tokenizer-indented-code
[doc-@yozora/tokenizer-inline-code]:
https://yozora.guanghechen.com/docs/package/tokenizer-inline-code
[doc-@yozora/tokenizer-inline-math]:
https://yozora.guanghechen.com/docs/package/tokenizer-inline-math
[doc-@yozora/tokenizer-link]: https://yozora.guanghechen.com/docs/package/tokenizer-link
[doc-@yozora/tokenizer-definition]: https://yozora.guanghechen.com/docs/package/tokenizer-definition
[doc-@yozora/tokenizer-link-reference]:
https://yozora.guanghechen.com/docs/package/tokenizer-link-reference
[doc-@yozora/tokenizer-list]: https://yozora.guanghechen.com/docs/package/tokenizer-list
[doc-@yozora/tokenizer-math]: https://yozora.guanghechen.com/docs/package/tokenizer-math
[doc-@yozora/tokenizer-paragraph]: https://yozora.guanghechen.com/docs/package/tokenizer-paragraph
[doc-@yozora/tokenizer-setext-heading]:
https://yozora.guanghechen.com/docs/package/tokenizer-setext-heading
[doc-@yozora/tokenizer-table]: https://yozora.guanghechen.com/docs/package/tokenizer-table
[doc-@yozora/tokenizer-text]: https://yozora.guanghechen.com/docs/package/tokenizer-text
[doc-@yozora/tokenizer-thematic-break]:
https://yozora.guanghechen.com/docs/package/tokenizer-thematic-break
[doc-@yozora/jest-for-tokenizer]: https://yozora.guanghechen.com/docs/package/jest-for-tokenizer
[doc-@yozora/parser-gfm]: https://yozora.guanghechen.com/docs/package/parser-gfm
[gfm-atx-heading]: https://github.github.com/gfm/#atx-heading
[gfm-autolink]: https://github.github.com/gfm/#autolinks
[gfm-autolink-extension]: https://github.github.com/gfm/#autolinks-extension-
[gfm-blockquote]: https://github.github.com/gfm/#block-quotes
[gfm-bullet-list]: https://github.github.com/gfm/#bullet-list
[gfm-delete]: https://github.github.com/gfm/#strikethrough-extension-
[gfm-emphasis]: https://github.github.com/gfm/#can-open-emphasis
[gfm-fenced-code]: https://github.github.com/gfm/#fenced-code-block
[gfm-hard-line-break]: https://github.github.com/gfm/#hard-line-break
[gfm-html-block]: https://github.github.com/gfm/#html-block
[gfm-html-inline]: https://github.github.com/gfm/#raw-html
[gfm-image]: https://github.github.com/gfm/#images
[gfm-image-reference]: https://github.github.com/gfm/#example-590
[gfm-indented-code]: https://github.github.com/gfm/#indented-code-block
[gfm-inline-code]: https://github.github.com/gfm/#code-span
[gfm-link]: https://github.github.com/gfm/#inline-link
[gfm-definition]: https://github.github.com/gfm/#link-reference-definition
[gfm-link-reference]: https://github.github.com/gfm/#reference-link
[gfm-list]: https://github.github.com/gfm/#lists
[gfm-list-item]: https://github.github.com/gfm/#list-items
[gfm-list-task-item]: https://github.github.com/gfm/#task-list-items-extension-
[gfm-paragraph]: https://github.github.com/gfm/#paragraph
[gfm-setext-heading]: https://github.github.com/gfm/#setext-heading
[gfm-soft-line-break]: https://github.github.com/gfm/#soft-line-breaks
[gfm-strong]: https://github.github.com/gfm/#can-open-strong-emphasis
[gfm-tab]: https://github.github.com/gfm/#tabs
[gfm-table]: https://github.github.com/gfm/#table
[gfm-text]: https://github.github.com/gfm/#soft-line-breaks
[gfm-thematic-break]: https://github.github.com/gfm/#thematic-break