Yozora
logo.png

License Package Version Github Top Language Node.js Version CI Workflow Tested with Jest Code Style: prettier

> 参见 [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