gomarkdown/markdown

GitHub: gomarkdown/markdown

一个快速且高度可扩展的 Go 语言 Markdown 解析器与 HTML 渲染库,支持丰富的语法扩展和自定义 AST 处理。

Stars: 1724 | Forks: 192

# Go 的 Markdown 解析器和 HTML 渲染器 [![pkg.go.dev](https://pkg.go.dev/badge/github.com/gomarkdown/markdown)](https://pkg.go.dev/github.com/gomarkdown/markdown) 包 `github.com/gomarkdown/markdown` 是一个 Go 库,用于解析 Markdown 文本并将其渲染为 HTML。 它非常快速,并且支持常见的扩展。 教程:https://blog.kowalczyk.info/article/cxn3/advanced-markdown-processing-in-go.html 代码示例: * https://tools.arslexis.io/goplayground/#txO7hJ-ibeU : 基础 markdown => HTML * https://tools.arslexis.io/goplayground/#yFRIWRiu-KL : 自定义 HTML 渲染器 * https://tools.arslexis.io/goplayground/#2yV5-HDKBUV : 修改 AST * https://tools.arslexis.io/goplayground/#9fqKwRbuJ04 : 自定义解析器 * https://tools.arslexis.io/goplayground/#Bk0zTvrzUDR : 语法高亮 这些示例也可以在 [示例](./examples) 目录中找到。 ## API 文档: - https://pkg.go.dev/github.com/gomarkdown/markdown : 顶层包 - https://pkg.go.dev/github.com/gomarkdown/markdown/ast : 定义解析后的 markdown 文档的抽象语法树 - https://pkg.go.dev/github.com/gomarkdown/markdown/parser : 解析器 - https://pkg.go.dev/github.com/gomarkdown/markdown/html : html 渲染器 ## 用法 使用合理的默认值将 markdown 文本转换为 HTML: ``` package main import ( "github.com/gomarkdown/markdown" "github.com/gomarkdown/markdown/html" "github.com/gomarkdown/markdown/parser" "fmt" ) var mds = `# header Sample text. [link](http://example.com) ` func mdToHTML(md []byte) []byte { // create markdown parser with extensions extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock p := parser.NewWithExtensions(extensions) doc := p.Parse(md) // create HTML renderer with extensions htmlFlags := html.CommonFlags | html.HrefTargetBlank opts := html.RendererOptions{Flags: htmlFlags} renderer := html.NewRenderer(opts) return markdown.Render(doc, renderer) } func main() { md := []byte(mds) html := mdToHTML(md) fmt.Printf("--- Markdown:\n%s\n\n--- HTML:\n%s\n", md, html) } ``` 示例源码:[examples/basic.go](examples/basic.go) 要获取更多文档,请阅读[此指南](https://blog.kowalczyk.info/article/cxn3/advanced-markdown-processing-in-go.html) 与其他 markdown 解析器的比较:https://babelmark.github.io/ ## 净化不受信任的内容 我们不提供针对恶意内容的防护。当处理用户提供的 markdown 时,请通过诸如 [Bluemonday](https://github.com/microcosm-cc/bluemonday) 之类的 HTML 净化器运行渲染后的 HTML。 以下是使用 Bluemonday 的简单示例: ``` import ( "github.com/microcosm-cc/bluemonday" "github.com/gomarkdown/markdown" ) // ... maybeUnsafeHTML := markdown.ToHTML(md, nil, nil) html := bluemonday.UGCPolicy().SanitizeBytes(maybeUnsafeHTML) ``` ## mdtohtml 命令行工具 https://github.com/gomarkdown/mdtoxml 是一个使用此库构建的命令行 markdown 到 HTML 的转换器。 你也可以将其作为如何使用该库的示例。 你可以通过以下方式安装它: ``` go get -u github.com/gomarkdown/mdtohtml ``` 运行方式:`mdtohtml input-file [output-file]` ## 特性 - **兼容性**。Markdown v1.0.3 测试套件在 使用 `--tidy` 选项时通过。如果不使用 `--tidy`,差异主要 在于空格和实体转义,而在这个包中,这些处理更加 一致和干净。 - **常见扩展**,包括表格支持、围栏代码 块、自动链接、删除线、非严格强调等。 - **安全性**。Markdown 在解析时非常谨慎,这使得 它可以安全地接收不受信任的用户输入,而不用担心 发生糟糕的事情。测试套件对此进行了压力测试,并且 目前没有已知会导致崩溃的输入。如果你发现了,请让 我知道,并将导致该问题的输入发送给我。 注意:此上下文中的“安全性”仅指 _runtime 安全性_。为了 保护自己免受不受信任内容中的 JavaScript 注入,请参见 [此示例](https://github.com/gomarkdown/markdown#sanitize-untrusted-content)。 - **快速**。它的速度足够快,可以在 大多数 Web 应用程序中按需渲染,而无需缓存输出。 - **线程安全**。你可以在不同的 goroutine 中运行多个解析器而不会产生不良影响。它不依赖 于全局共享状态。 - **最小依赖**。仅依赖 Go 的标准库包。 - **符合标准**。使用 W3C 验证工具(针对 HTML 4.01 和 XHTML 1.0 Transitional)成功验证了输出。 ## 扩展 除了标准的 markdown 语法外,此包 还实现了以下扩展: - **单词内强调抑制**。在讨论代码时,`_` 字符 通常在单词内部使用,因此将 markdown 解释为强调命令通常是 错误的。当这些标记出现在单词内部时,我们允许你将其 视为普通字符。 - **表格**。可以通过使用简单的语法在输入中绘制它们来创建表格: Name | Age --------|------ Bob | 27 Alice | 23 同时也支持表格页脚,可以使用等号 (`=`) 添加: Name | Age --------|------ Bob | 27 Alice | 23 ========|====== Total | 50 支持跨越多列的单元格(colspan),只需重复管道符号: Name | Age --------|------ Bob || Alice | 23 ========|====== Total | 23 - **围栏代码块**。除了使用普通的 4 空格 缩进来标记代码块之外,你还可以显式地标记它们 并指定一种语言(以简化语法高亮)。只需 像这样标记: ```go func getTrue() bool { return true } ``` 你可以使用 3 个或更多反引号来标记 代码块的开始,并使用相同数量的反引号标记代码块的结束。 - **定义列表**。一个简单的定义列表由一个单行 术语及其后跟的冒号和该术语的定义组成。 Cat : Fluffy animal everyone likes Internet : Vector of transmission for pictures of cats 术语必须通过空行与先前的定义分开。 - **脚注**。文本中的一个标记将成为上标数字; 而脚注定义将放置在 文档末尾的脚注列表中。脚注看起来像这样: This is a footnote.[^1] [^1]: the footnote text. - **自动链接**。我们可以找到那些没有被 显式标记为链接的 URL,并将它们转换为链接。 - **删除线**。使用两个波浪号 (`~~`) 来标记应该被划掉的文本。 - **硬换行**。启用此扩展后,输入中的换行符 将转换为输出中的换行符。默认情况下不启用此扩展。 - **不换行空格**。启用此扩展后,输入中反斜杠前置的空格 将在输出中转换为不换行空格。默认情况下不启用此扩展。 - **智能引号**。支持 Smartypants 风格的标点符号替换, 将普通的双引号和单引号转换为 弯引号等。 - **LaTeX 风格的破折号解析**是一个附加选项,其中 `--` 被转换为 `–`,而 `---` 被转换为 `—`。这与大多数 smartypants 处理器不同,后者 将单个连字符转换为 ndash,将双连字符转换为 mdash。 - **智能分数**,任何看起来像分数的内容 都会被转换为合适的 HTML(而不是像大多数 smartypants 处理器那样仅处理少数特殊情况)。例如,`4/5` 会变成 `45`,渲染为 45。 - **MathJaX 支持**是一项附加功能,受 许多 markdown 编辑器支持。它将 `$` 引用的内联数学方程式进行转换, 并将 `$$` 引用的数学块转换为 MathJax 兼容格式。 数学元素中的连字符 (`_`) 不会再破坏 LaTeX 渲染。 $$ \left[ \begin{array}{a} a^l_1 \\ ⋮ \\ a^l_{d_l} \end{array}\right] = \sigma( \left[ \begin{matrix} w^l_{1,1} & ⋯ & w^l_{1,d_{l-1}} \\ ⋮ & ⋱ & ⋮ \\ w^l_{d_l,1} & ⋯ & w^l_{d_l,d_{l-1}} \\ \end{matrix}\right] · \left[ \begin{array}{x} a^{l-1}_1 \\ ⋮ \\ ⋮ \\ a^{l-1}_{d_{l-1}} \end{array}\right] + \left[ \begin{array}{b} b^l_1 \\ ⋮ \\ b^l_{d_l} \end{array}\right]) $$ - **有序列表起始编号**。启用此扩展后,有序列表将使用 启动它的编号作为起始数字。 - **上标和下标**。启用此扩展后,`^` 之间的序列将表示 上标,而 `~` 将变为下标。例如:H~2~O is a liquid, 2^10^ is 1024。 - **块级属性**允许在块级元素上设置属性(ID、类和键/值对)。 属性必须用大括号括起来,并放在该 元素之前的一行。 {#id3 .myclass fontsize="tiny"} # Header 1 将转换为 `

Header 1

`。 - **Mmark 支持**,有关此功能添加的所有新语法元素,请参见 。 ## 用户 使用此包的一些工具:https://pkg.go.dev/github.com/gomarkdown/markdown?tab=importedby ## 历史 markdown 是 https://github.com/russross/blackfriday 的 v2 版本的一个分支。 我重构了 API(拆分为 ast/parser/html 子包)。 Blackfriday 本身基于 C 语言实现 [sundown](https://github.com/vmg/sundown),而后者又基于 [libsoldout](http://fossil.instinctive.eu/libsoldout/home)。 ## 许可证 [Simplified BSD License](LICENSE.txt)
标签:EVTX分析, Go, HTML渲染, Markdown, Ruby工具, SOC Prime, 开发工具, 日志审计, 解析器