golang 如何自定义解析 markdown to html ?
输出 HTML 模板内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Markdown</title>
<link rel="stylesheet" href="markdown.css"/>
</head>
<body>
{{ . }}
</body>
</html>
golang 程序如下
安装依赖 go get -u github.com/gomarkdown/markdown
package main
import (
"bufio"
"github.com/gomarkdown/markdown"
"github.com/gomarkdown/markdown/ast"
"github.com/gomarkdown/markdown/html"
"html/template"
"io"
"log"
"os"
)
// return (ast.GoToNext, true) to tell html renderer to skip rendering this node
// (because you've rendered it)
func renderHookCodeBlock(w io.Writer, node ast.Node, entering bool) (ast.WalkStatus, bool) {
// skip all nodes that are not CodeBlock nodes
if _, ok := node.(*ast.CodeBlock); !ok {
return ast.GoToNext, false
}
// custom rendering logic for ast.CodeBlock. By doing nothing it won't be
// 写入自定义数据
w.Write([]byte(`<span>Hello World</span>`))
return ast.GoToNext, false
}
func main() {
inputFile := "markdown.md" // 输入 md 文件
inputTemplateFile := "template.html" // 模板文件
outputFile := "markdown.html" // 输出 html 文件
opts := html.RendererOptions{
Flags: html.CommonFlags,
RenderNodeHook: renderHookCodeBlock, // 设置自定义处理钩子
}
renderer := html.NewRenderer(opts)
// 打开 md 文件
fs, err := os.Open(inputFile)
if err != nil {
return
}
// 读取 md 内容
var md string
scanner := bufio.NewScanner(fs)
for scanner.Scan() {
md += scanner.Text() + "\n"
}
if scanner.Err() != nil {
log.Panicln(err)
}
// md to html
html := markdown.ToHTML([]byte(md), nil, renderer)
tp, err := template.ParseFiles(inputTemplateFile)
if err != nil {
return
}
// 写入输出文件
f, err := os.Create(outputFile)
if err != nil {
return
}
tp.Execute(f, template.HTML(html))
print(string(html))
}