英文:
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
字段。
英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论