提问背景 Question:
就算没有md语法,也得有换行吧。
Go后端Markdown渲染换行问题排查
针对你提到的“没有Markdown语法也无法换行”的问题,这通常是因为 Goldmark 渲染引擎默认遵循 CommonMark 规范,将单次换行视为空格,而不是 <br> 标签。即使你手动处理了 ,解析器在渲染时依然会忽略它。建议从以下三个维度排查并解决:
1. 开启 Goldmark 的硬换行支持(核心方案)
在 ConvertMarkdown 函数中,Goldmark 的默认解析是不支持 HardLineBreak 的。你需要显式配置它,使所有换行都渲染为 <br>。
func ConvertMarkdown(mdContent string) template.HTML {
// 初始化解析器时开启 HardLineBreak
md := goldmark.New(goldmark.WithExtensions(
extension.NewRenderer(extension.WithHardLineBreak()),
))
var buf bytes.Buffer
if err := md.Convert([]byte(mdContent), &buf); err != nil {
return template.HTML(mdContent)
}
return template.HTML(buf.String())
}
2. 检查 CSS 样式控制
即便渲染出了 <br> 标签,如果前端页面 CSS 对容器设置了 white-space: nowrap 或者容器没有触发自动折行,内容也会挤在一起。请检查渲染内容的容器是否包含以下样式:
.content-container {
white-space: pre-wrap; /* 强制保留换行并自动换行 */
word-wrap: break-word;
}
3. 模板输出方式
确保在 HTML 模板中,你是直接输出处理后的 template.HTML,而不是用 {{ .Content | text }} 这种可能导致二次转义的方式。标准写法应为:
<div>{{ .Article.Content }}</div>
排查步骤建议:
- 查看生成的源码:在浏览器按下 F12 查看渲染后的 HTML,确认数据库读出的内容中
是否真的被替换成了真实的换行符。 - 检查 Goldmark 版本:确认是否正确导入了
github.com/yuin/goldmark及相关的extension包。 - 空行测试:如果你在输入框中输入内容时用了两个换行(即空一行),Markdown 语法会自动识别为
<p>标签。如果只有单行换行不生效,说明必须开启上述WithHardLineBreak()选项。