14

私は Martini フレームワークを使用しています。いくつかのマークダウン ファイルがあり、それを tmpl/html テンプレートで HTML としてレンダリングしたいと考えています。

このようなマークダウンファイル:

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

テンプレートファイルは次のようになります。

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

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

ブラックフライデーを使用してマークダウンを解析し、型を返し[]byteます。次のステップでは、マークダウン ファイルをこのテンプレートにレンダリングし、各ブロックを適切な場所に配置します。これを正しく行うにはどうすればよいでしょうか? または、これをより適切に行う方法を使用しますか?

4

1 に答える 1

25

これを実現する 1 つの方法は、Funcsメソッドを使用してカスタム関数をテンプレート関数マップに追加することです。詳細については、テンプレート パッケージ ドキュメントの関数セクションを参照してください。

テンプレート ファイル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}}

そして、それはBodyあなたのmarkDowner関数を通過します。

遊び場

于 2014-04-17T13:00:06.737 に答える