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易于扩展,可以添加:

  1. 定义AST节点(嵌入ast.BaseBlockast.BaseInline
  2. 实现parser.BlockParserparser.InlineParser
  3. 实现renderer.NodeRenderer
  4. 定义实现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

1 回复

更多关于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解析库,具有以下特点:

  1. 完全兼容CommonMark规范
  2. 丰富的扩展生态系统
  3. 高性能解析和渲染
  4. 灵活的AST操作接口
  5. 易于自定义渲染输出

通过合理使用Goldmark的扩展和自定义功能,你可以构建出满足各种需求的Markdown处理流水线。

回到顶部