Go template.ExecuteTemplate include html
Convert your []byte
or string
to type template.HTML
(documented here)
p.Body = template.HTML(s) // where s is a string or []byte
Then, in your template, just:
{{.Body}}
It will be printed without escaping.
EDIT
In order to be able to include HTML in you page's body you need to change the Page
type declaration:
type Page struct {
Title string
Body template.HTML
}
then assign to it.
I created a custom function for the template as follows:
func noescape(str string) template.HTML {
return template.HTML(str)
}
var fn = template.FuncMap{
"noescape": noescape,
}
Then on your template:
{{ noescape $x.Body }}
Take a look at the template.HTML type. It can be used to encapsulate a known safe fragment of HTML (like the output from Markdown). The "html/template" package will not escape this this type.
type Page struct {
Title string
Body template.HTML
}
page := &Page{
Title: "Example",
Body: template.HTML(blackfriday.MarkdownCommon([]byte("foo bar")),
}
I usually write my own func Markdown(text string) html.Template
method that calls blackfriday with the appropriate config and does some type conversions. Another alternative might be also to register a "html" func in the template parser, that allows you to output any value without any escaping by doing something like {{html .MySafeStr}}
. The code might look like:
var tmpl = template.Must(template.New("").Funcs(template.FuncMap{
"html": func(value interface{}) template.HTML {
return template.HTML(fmt.Sprint(value))
},
}).ParseFiles("file1.html", "file2.html"))