如何使用blackfriday为golang模板(html或tmpl)渲染markdown?

时间:2014-04-17 03:18:32

标签: html go render markdown martini

我使用Martini框架,我有一些markdown文件,我想在tmpl / html模板中将其渲染为HTML。

这样的降价文件:

title: A Test Demo
---
##ABC
> 123

模板文件如下:

<head>
  <title>{{name}}</title>
</head>

<body>
  <h2>{{abc}}</h2>
  <blockquote>
    <p>{{xyz}}</p>
  </blockquote>
</body>

我使用blackfriday解析markdown并返回[]byte类型,下一步我想将markdown文件渲染到此模板并将每个块放到正确的位置,那么我该如何正确地执行此操作?或者用任何方式更好地做到这一点?

1 个答案:

答案 0 :(得分:23)

实现此目的的一种方法是使用Funcs方法将自定义函数添加到模板函数映射中。有关详细信息,请参阅the template package docs功能部分。

给定模板文件page.html,某些作者w(可能是http.ResponseWriter),以及一些结构p,其中包含要包含数据的字段Body放入模板字段,您可以执行以下操作:

定义一个函数:

func markDowner(args ...interface{}) template.HTML {
    s := blackfriday.MarkdownCommon([]byte(fmt.Sprintf("%s", args...)))
    return template.HTML(s)
}

将其添加到模板功能图:

tmpl := template.Must(template.New("page.html").Funcs(template.FuncMap{"markDown": markDowner}).ParseFiles("page.html"))

执行模板:

err := tmpl.ExecuteTemplate(w, "page.html", p)
if err != nil {
    http.Error(w, err.Error(), http.StatusInternalServerError)
}

然后,在您的模板文件中,您可以输入以下内容:

{{.Body | markDown}}

它会通过Body函数传递markDowner

Playground