Go Markdown 解析库介绍
Blackfriday 是目前Go用的比较多的MD解析库:
import (
"github.com/microcosm-cc/bluemonday"
"github.com/russross/blackfriday"
)
// ...
unsafe := blackfriday.Run(input)
html := bluemonday.UGCPolicy().SanitizeBytes(unsafe)
优点是简单,不过比较难以扩展,有一个需求是对markdown文本中的图片节点的链接进行修复,通过对原有的渲染器进行封装,从而实现修复图片地址:
type HTMLRenderer struct {
PathRepair func([]byte) []byte
*blackfriday.HTMLRenderer
}
func (r *HTMLRenderer) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus {
if node.Type == blackfriday.Image {
node.LinkData.Destination = r.PathRepair(node.LinkData.Destination)
}
return r.HTMLRenderer.RenderNode(w, node, entering)
}
// repair是路径修复函数
r := &HTMLRenderer{PathRepair: repair, HTMLRenderer: blackfriday.NewHTMLRenderer(blackfriday.HTMLRendererParameters{
Flags: blackfriday.CommonHTMLFlags,
})}
html := blackfriday.Run(mdContent, blackfriday.WithRenderer(r))
另外一个库是goldmark,将渲染器和解析器分开来,先解析成AST树,然后在渲染,能很好的扩展和定制,还有一些比较棒的插件,比如代码高亮或是数学公式支持,比较推荐使用这个库。
要实现对图片节点进行拦截,修改图片地址的方法是用一个新的行内解析器代替原有的解析器:
type ImageParser struct {
parser.InlineParser
}
func (i *ImageParser) Parse(parent ast.Node, block text.Reader, pc parser.Context) (node ast.Node) {
node = i.InlineParser.Parse(parent, block, pc)
img, ok := node.(*ast.Image)
if !ok {
return
}
// 此处对图片地址处理
return img
}
var md = goldmark.New(goldmark.WithParserOptions(parser.WithInlineParsers(util.Prioritized(&ImageParser{parser.NewLinkParser()}, 199)),
),
)
原有的链接解析器优先权是200,这里插入一个199的解析器代替原有解析器,新的链接解析器对原有解析器结果进行处理。