9

私はClojureに足を踏み入れているRails開発者です。私はERBで非常に単純なことをしようとしていますが、私の人生ではenliveでそれを理解することはできません.

layout.html に Web サイトの単純なレイアウト ファイルがあるとします。

<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>

そして、これらのスニペット、たとえば、header.html と footer.html と、この単純なルートがあります。

(deftemplate layout "layout.html" [])

(defroutes home-routes
  (GET "/" [] layout))

リクエストが「/」に送信されるたびに、レイアウトが変換され、ヘッダーとフッターのスニペットが挿入されるようにするにはどうすればよいですか?

4

2 に答える 2

11

defsnippet は、html の特定の部分にのみ一致し (これがセレクターを引数として取る理由です)、それを変換します。deftemplate は、html 全体を取得して変換します。また、defsnippet は Clojure データ構造を返しますが、deftemplates は文字列のベクトルを返します。そのため、defsnippet は通常、deftemplate 内で使用されます。

スニペット (またはセレクター) によって返されるデータがどのようなものかを理解するには、次のようにします。

(enlive/html-snippet "<div id='foo'><p>Hello there</p></div>")
;=({:tag :div, :attrs {:id "foo"}, :content ({:tag :p, :attrs nil, :content ("Hello there")})})

あなたの場合、次のようなものが必要です:

header.html:

<div id="my-header-root">
...
</div>

Clojure コード:

(enlive/defsnippet header "path/to/header.html" [:#my-header-root] []
identity)

(enlive/defsnippet footer "path/to/footer.html" [enlive/root] []
identity)

(enlive/deftemplate layout "layout.html" [header footer]
[:head] (enlive/content header)
[:body] (enlive/append footer))

(defroutes home-routes
  (GET "/" [] (layout (header) (footer))

スニペットで使用される ID 関数は、その引数を返します。この場合、:#my-header-root セレクターによって選択されたデータ構造です (変換は行いません)。head.html にすべてを含めたい場合は、enlive に付属のルート セレクター ステップを使用できます。

次のようなものを使用して、defsnippet から生成された html を表示できます。

(print (apply str (enlive/emit* (my-snippet))))

また、 https ://github.com/swannodette/enlive-tutorial/ のチュートリアル と、defsnippet マクロと deftemplate マクロがどのように機能するかについての詳細については、Brian Marick によるチュートリアルもお勧めします。

最後のヒントとして、enlive に付属の sniptest マクロを使用して、セレクターと変換を試すことができます。

(enlive/sniptest "<p>Replace me</p>"
[:p] (enlive/content "Hello world!"))
;= "<p>Hello world!</p>"
于 2013-01-21T10:08:44.183 に答える
0

enlive tutorialの例には素晴らしい答えがあります。

警告。すべてのソース ファイルのリンクが壊れているようです。enlive-tutorial/blob/master/すべてのリンクの後に挿入するhttps://github.com/swannodette/か、チュートリアル プロジェクトから直接開く必要があります。

于 2013-01-21T04:12:35.487 に答える