Я следовал этому руководству: http://golang.org/doc/articles/wiki/final.go и немного изменил его для моих потребностей/желаний. Проблема в том, что я хочу поддерживать HTML в шаблонах. Я понимаю, что это риск для безопасности, но это не проблема на данный момент.
Результат рендеринга страницы:
<h1>this<strong>is</strong>a test</h1>
Позвольте мне немного пояснить код:
type Page struct {
Title string
Body []byte
}
Данные, которые я хотел бы иметь HTML, хранятся в Page.Body
. Это тип []byte
, который означает, что я не могу (или могу?) Запустить html/template.HTML(Page.Body)
, поскольку эта функция ожидает строку.
У меня есть это, которое предварительно отображает шаблоны:
var (
templates = template.Must(template.ParseFiles("tmpl/edit.html", "tmpl/view.html"))
)
И фактическое ExecuteTemplate
выглядит так:
err := templates.ExecuteTemplate(w, tmpl+".html", p)
Где w w http.ResponseWriter
, tmpl tmpl string
, а p - p *Page
Наконец, мой 'view.html'
(шаблон) выглядит следующим образом:
<h1>{{.Title}}</h1>
<p>[<a href="/edit/{{.Title}}">edit</a>]</p>
<div>{{printf "%s" .Body}}</div>
Что я пробовал:
-
{{printf "%s" .Body | html}}
ничего не делает - Я включил
github.com/russross/blackfriday
(процессор Markdown) и запустилp.Body = blackfriday.MarkdownCommon(p.Body)
, который корректно преобразует Markdown в HTML, но HTML все равно выводится как объекты. -
EDIT: Я попытался выполнить следующий бит кода (я не знаю, почему формат испорчен), и он все равно выводит то же самое.
var s template.HTML
s = template.HTML(p.Body)
p.Body = []byte(s)
Любые рекомендации приветствуются. Если я запутаюсь, спросите меня, и я могу изменить свой вопрос.