你可以使用blackfriday将Markdown渲染为Golang模板(html或tmpl)。

huangapple go评论117阅读模式
英文:

How can I render markdown to a golang template(html or tmpl) with blackfriday?

问题

我使用Martini框架,我有一些Markdown文件,并且我想在tmpl/html模板中将其呈现为HTML。

Markdown文件的内容如下:

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文件渲染到这个模板中,并将每个块放置在正确的位置,那么我应该如何正确地做到这一点?或者有没有更好的方法来实现这个?

英文:

I use the Martini framework,I have some markdown file and I want render it as HTML in tmpl/html template.

The markdown file like this:

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

And the template file like this:

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

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

I use the blackfriday parse the markdown and return []byte type,next step I wanna render the markdown file to this template and make each block to the right place,so how can I do this right way? Or use any way to do this better?

答案1

得分: 25

一种实现这个的方法是使用Funcs方法将自定义函数添加到模板函数映射中。请参阅模板包文档中的Functions部分获取更多信息。

假设有一个模板文件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}}

它将通过你的markDowner函数处理Body字段。

Playground

英文:

One way to achieve this is to use the Funcs method to add a custom function to the template function map. See the Functions section of the template package docs for more info.

Given a template file page.html, some writer w (probably an http.ResponseWriter), and some struct p with a field Body containing data to be put into a template field, you can do something like:

Define a function:

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

Add it to the template function map:

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

Execute the template:

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

Then, in your template file, you can put something like:

{{.Body | markDown}}

And it will pass the Body through your markDowner function.

Playground

huangapple
  • 本文由 发表于 2014年4月17日 11:18:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/23124008.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定