Как я могу отдать уценку шаблону golang (html или tmpl) с помощью blackfriday?

Я использую структуру Martini, у меня есть файл с разметкой, и я хочу отобразить его как HTML в шаблоне tmpl/html.

Уценка файла выглядит следующим образом:

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

И файл шаблона, подобный этому:

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

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

Я использую blackfriday для разбора уценки и возврата типа []byte, следующий шаг Я хочу отобразить файл уценки в этот шаблон и сделать каждый блок в нужном месте, так как я могу сделать это правильно? Или использовать любой способ сделать это лучше?

Ответ 1

Один из способов добиться этого - использовать метод Funcs, чтобы добавить пользовательскую функцию к карте функций шаблона. Подробнее см. В разделе "Функции" документы пакета шаблонов.

Учитывая шаблонный файл page.html, некоторый писатель w (возможно, http.ResponseWriter) и некоторая struct 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.

Игровая площадка