golang标准兼容且易扩展的Markdown解析插件库goldmark的使用
golang标准兼容且易扩展的Markdown解析插件库goldmark的使用
goldmark是一个用Go编写的Markdown解析器,具有以下特点:
- 易于扩展
- 符合CommonMark 0.31.2标准
- 结构良好
- 纯Go实现
安装
$ go get github.com/yuin/goldmark
基本用法
import (
"bytes"
"github.com/yuin/goldmark"
)
// 转换Markdown文档
var buf bytes.Buffer
if err := goldmark.Convert(source, &buf); err != nil {
panic(err)
}
自定义解析器和渲染器
import (
"bytes"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer/html"
)
// 创建自定义的goldmark实例
md := goldmark.New(
goldmark.WithExtensions(extension.GFM), // 启用GitHub Flavored Markdown扩展
goldmark.WithParserOptions(
parser.WithAutoHeadingID(), // 自动生成标题ID
),
goldmark.WithRendererOptions(
html.WithHardWraps(), // 将换行符渲染为<br>
html.WithXHTML(), // 渲染为XHTML
),
)
// 转换Markdown
var buf bytes.Buffer
if err := md.Convert(source, &buf); err != nil {
panic(err)
}
内置扩展
goldmark提供了一些常见的内置扩展:
extension.Table
- GitHub风格的表格extension.Strikethrough
- 删除线extension.TaskList
- 任务列表extension.DefinitionList
- 定义列表extension.Footnote
- 脚注extension.Typographer
- 智能标点符号替换extension.CJK
- 中日韩语言相关功能
属性支持
goldmark支持为某些元素添加属性,目前仅支持标题:
heading ## {#id .className attrName=attrValue class=“class1 class2”}
heading {#id .className attrName=attrValue class=“class1 class2”}
## 表格扩展
表格扩展实现了GitHub风格的表格:
| Syntax | Description |
| ----------- | ----------- |
| Header | Title |
| Paragraph | Text |
性能
goldmark的性能与CommonMark参考实现cmark相当,同时构建了干净、可扩展的AST结构,并消耗更少的内存。
安全考虑
默认情况下,goldmark不会渲染原始HTML或潜在危险的URL。如果需要处理不受信任的内容,建议使用HTML清理器如bluemonday。
扩展开发
goldmark易于扩展,可以添加:
- 定义AST节点(嵌入
ast.BaseBlock
或ast.BaseInline
) - 实现
parser.BlockParser
或parser.InlineParser
- 实现
renderer.NodeRenderer
- 定义实现
goldmark.Extender
的扩展
示例扩展
goldmark有许多第三方扩展可用,例如:
- goldmark-meta - YAML元数据支持
- goldmark-highlighting - 语法高亮
- goldmark-emoji - 表情符号支持
- goldmark-mermaid - Mermaid图表支持
总结
goldmark是一个功能强大、性能优异且易于扩展的Markdown解析器,特别适合需要自定义Markdown语法或需要严格遵循CommonMark标准的项目。
更多关于golang标准兼容且易扩展的Markdown解析插件库goldmark的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang标准兼容且易扩展的Markdown解析插件库goldmark的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Goldmark解析和处理Markdown文档
Goldmark是一个用Go编写的标准兼容且高度可扩展的Markdown解析器。它完全遵循CommonMark规范,同时提供了丰富的扩展机制。下面我将详细介绍如何使用Goldmark。
基本使用
首先安装Goldmark:
go get github.com/yuin/goldmark
基础解析示例
package main
import (
"fmt"
"os"
"github.com/yuin/goldmark"
)
func main() {
markdown := `# Hello Goldmark
This is a **Markdown** document.`
md := goldmark.New()
err := md.Convert([]byte(markdown), os.Stdout)
if err != nil {
fmt.Println("Error converting markdown:", err)
}
}
扩展功能
Goldmark的强大之处在于它的可扩展性。下面是一些常见扩展的使用方式。
添加扩展
package main
import (
"fmt"
"os"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer/html"
)
func main() {
markdown := `# Extended Features
- [x] Task list item
- [ ] Another task
| Tables | Are | Cool |
|----------|---------|-------|
| col 1 is | left-aligned | $1600 |
| col 2 is | centered | $12 |
`
md := goldmark.New(
goldmark.WithExtensions(
extension.GFM, // GitHub Flavored Markdown
extension.Table,
extension.TaskList,
),
goldmark.WithParserOptions(
parser.WithAutoHeadingID(),
),
goldmark.WithRendererOptions(
html.WithHardWraps(),
html.WithXHTML(),
),
)
err := md.Convert([]byte(markdown), os.Stdout)
if err != nil {
fmt.Println("Error converting markdown:", err)
}
}
自定义渲染
你可以自定义HTML渲染方式:
package main
import (
"fmt"
"os"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/renderer/html"
"github.com/yuin/goldmark/util"
)
type customHTMLRenderer struct {
html.Config
}
// 自定义段落渲染
func (r *customHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
reg.Register(ast.KindParagraph, r.renderParagraph)
}
func (r *customHTMLRenderer) renderParagraph(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
if entering {
_, _ = w.WriteString(`<p class="my-paragraph">`)
} else {
_, _ = w.WriteString(`</p>`)
}
return ast.WalkContinue, nil
}
func main() {
markdown := `This is a custom rendered paragraph.`
md := goldmark.New(
goldmark.WithRendererOptions(
html.WithWriter(w),
),
goldmark.WithRenderer(
renderer.NewRenderer(
renderer.WithNodeRenderers(
util.Prioritized(&customHTMLRenderer{}, 1000),
),
),
),
)
err := md.Convert([]byte(markdown), os.Stdout)
if err != nil {
fmt.Println("Error converting markdown:", err)
}
}
解析为AST
Goldmark允许你将Markdown解析为抽象语法树(AST),然后进行自定义处理:
package main
import (
"fmt"
"os"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/text"
)
func printAST(node ast.Node, source []byte, level int) {
for n := node.FirstChild(); n != nil; n = n.NextSibling() {
fmt.Printf("%s%v\n", indent(level), n.Kind())
printAST(n, source, level+1)
}
}
func indent(level int) string {
s := ""
for i := 0; i < level; i++ {
s += " "
}
return s
}
func main() {
markdown := `# AST Example
This demonstrates parsing to AST.`
md := goldmark.New()
doc := md.Parser().Parse(text.NewReader([]byte(markdown)))
printAST(doc, []byte(markdown), 0)
}
性能优化
对于高性能场景,可以重用解析器和渲染器:
package main
import (
"fmt"
"os"
"sync"
"github.com/yuin/goldmark"
)
var (
md goldmark.Markdown
mdOnce sync.Once
)
func getMarkdownParser() goldmark.Markdown {
mdOnce.Do(func() {
md = goldmark.New(
// 你的配置选项
)
})
return md
}
func main() {
markdown := `# Performance optimized
This uses a singleton parser.`
md := getMarkdownParser()
err := md.Convert([]byte(markdown), os.Stdout)
if err != nil {
fmt.Println("Error converting markdown:", err)
}
}
总结
Goldmark是一个功能强大且灵活的Markdown解析库,具有以下特点:
- 完全兼容CommonMark规范
- 丰富的扩展生态系统
- 高性能解析和渲染
- 灵活的AST操作接口
- 易于自定义渲染输出
通过合理使用Goldmark的扩展和自定义功能,你可以构建出满足各种需求的Markdown处理流水线。