提问背景 Question:
你刚才的代码中 highlighting.WithFormatters 这句有错误。提示 undefined: highlighting.WithFormatters [linux]
解决 Goldmark 高亮未定义错误
这个错误是因为在 github.com/yuin/goldmark-highlighting/v2 库中,并没有 WithFormatters 这个函数。正确的配置选项函数应当是 WithFormatOptions,并且它接收的是底层高亮渲染器 chroma/v2/formatters/html 的配置参数。
另外,请确保你引入的是最新的 v2 版本。下面是完整的排查与修复方案。
1. 更新与安装正确的依赖包
请在你的项目根目录下执行以下命令,确保引入的是 v2 版本的 Goldmark 高亮插件和 Chroma 渲染器:
go get github.com/yuin/goldmark
go get github.com/yuin/goldmark-highlighting/v2
go get github.com/alecthomas/chroma/v2
2. 修复后的 Go 代码
请将你的后端代码中的 ConvertMarkdown 函数及 import 部分修改为如下内容。注意看 highlighting.WithFormatOptions 的正确写法:
package main
import (
"bytes"
"html/template"
// 1. 引入 chroma 的 html 格式化器
"github.com/alecthomas/chroma/v2/formatters/html"
"github.com/yuin/goldmark"
// 2. 引入 v2 版本的 goldmark-highlighting
highlighting "github.com/yuin/goldmark-highlighting/v2"
)
func ConvertMarkdown(mdContent string) template.HTML {
// 初始化高亮插件
hl := highlighting.NewHighlighting(
highlighting.WithStyle("monokai"), // 常用主题:monokai, github, dracula, pygments
highlighting.WithFormatOptions(
html.WithLineNumbers(true), // 是否显示行号
// 【重要提示】
// html.WithClasses(false) 表示使用内联样式(Style="color:#fff"),无需前端引入 CSS,开箱即用。
// 如果你希望通过外部 CSS 控制样式,可以设为 true,但前端需要引入对应的 CSS 类名定义。
html.WithClasses(false),
),
)
// 注册高亮插件到 goldmark 中
md := goldmark.New(
goldmark.WithExtensions(hl),
)
var buf bytes.Buffer
if err := md.Convert([]byte(mdContent), &buf); err != nil {
// 如果解析失败,进行降级,直接返回原始文本
return template.HTML(mdContent)
}
return template.HTML(buf.String())
}
3. 为什么会出现这个报错?
- API 变动与误读:在旧版本的
goldmark-highlighting中,底层配置较为混乱。在v2版本中,官方将底层格式化参数完全托管给了chroma本身,通过highlighting.WithFormatOptions(...)统一透传。 - 包路径不匹配:如果你在
import中混用了v1和v2的包,或者拼写成了WithFormatters,Go 编译器在编译期就会直接报出undefined错误。
现在使用上面的代码重新运行 go run 或 go build,编译即可顺利通过,且 Markdown 中的代码块会被自动转换为带有 Monokai 配色的 HTML 代码。