gomarkdown/markdown
GitHub: gomarkdown/markdown
一个快速且高度可扩展的 Go 语言 Markdown 解析器与 HTML 渲染库,支持丰富的语法扩展和自定义 AST 处理。
Stars: 1724 | Forks: 192
# Go 的 Markdown 解析器和 HTML 渲染器
[](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`
会变成 `4⁄5`,渲染为
4⁄5。
- **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
将转换为 ` 。
## 用户
使用此包的一些工具: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)
Header 1
`。 - **Mmark 支持**,有关此功能添加的所有新语法元素,请参见标签:EVTX分析, Go, HTML渲染, Markdown, Ruby工具, SOC Prime, 开发工具, 日志审计, 解析器