私はEnliveが好きですが、次のことを観察すると多少混乱します。Enliveはどのようにルール/変換を評価しますか?
は(also available on github)次Clojureのコードを考えてみましょう:
ここ(ns enlivetest.core
(:require [net.cgrand.enlive-html :refer [deftemplate defsnippet] :as html]))
(deftemplate page "index.html"
[ctx]
[:.foobar] (html/content (do (println "GENERATING FOOBAR")
"===FOOBAR===")))
このHTMLテンプレート(リソース/ index.htmlを):
<!DOCTYPE html>
<html>
<body>
</body>
</html>
page
テンプレートを呼び出すとき、私は期待したいですルールのセレクタ:.foobar
に一致するHTMLタグがないため、ルールの右側(変換)を完全に無視します。
結局のところしかし、ルールの右手側は、実際に評価を受けるん:
user=> (require '[enlivetest.core :as c])
nil
user=> (c/page {})
GENERATING FOOBAR
GENERATING FOOBAR
("<!DOCTYPE html>\n" "<" "html" ">" "\n " "<" "body" ">" "\n " "</" "body" ">" "\n\n" "</" "html" ">")
(もちろん、それも二回評価されます - テンプレート内の各ルートHTML要素のためとして、いったんそうみたいです)。
しかし、セレクタに一致する要素はありませんが、なぜ評価されていますか?これは正しい動作ですか?私はここで何かを見逃していますか?
この例では、READMEに示されているように、Enlive 1.1.6を使用しています。
明確にされています。
EDIT#1:
それは(おかげで@leetwinskiする)結局のところ、どのように物事の仕事の私の仮定が間違っていました:
私はdeftemplate
マクロは右のみを評価することを想定しましたそのルールのセレクタが指定されたHTML内の要素と一致するとき、ルールの変換側(変換部分)に渡されます。
しかし、正しいはこれです:
ルールの右手側は常に定義されたテンプレート関数の呼び出し(例えばpage
)中に評価されますし、そのターンにする関数に評価することが期待されています呼び出されたときに望ましいコンテンツ(この例では "=== FOOBAR ===")に評価します。セレクタと一致する要素に対してのみ呼び出されるのはこの関数です。
これは、 html/content
はそのような関数を評価します(直接的には目的のコンテンツではありません)。
(deftemplate page "index.html"
[ctx]
[:.foobar] #((html/content (do (println "GENERATING FOOBAR")
"===FOOBAR===")) %))
次のような出力になりますどの:物事は私が当初の予想通り、私はこのようにそれを書くことができます動作させるためには
user=> (c/page {})
("<!DOCTYPE html>\n" "<" "html" ">" "\n " "<" "body" ">" "\n " "</" "body" ">" "\n\n" "</" "html" ">")
または<div class="foobar"></div>
への追加HTMLテンプレート:
user=> (c/page {})
GENERATING FOOBAR
("<!DOCTYPE html>\n" "<" "html" ">" "\n " "<" "body" ">" "\n\t\t" "<" "div" " " "class" "=\"" "foobar" "\"" ">" "===FOOBAR===" "</" "div" ">" "\n " "</" "body" ">" "\n\n" "</" "html" ">")
EDIT#2:
これは数週間経っていますが、私はまだこれがEnliveでどのように実装されているのか苦労しています。私はルールの変形部分を#((html/content ...) %)
に何度も繰り返しラップしています。
現在のレンダリングプロセスにも関係しない場合でも、Enliveが変換を(すべてまたは複数回)評価する理由について誰かが説明していますか?
これは私以外の誰かに迷惑をかけていないと私は本当に驚いているので、私は何かを見落としているかもしれません。
それはセレクタ・ツー・機能のペアを取る:
感謝を!私は今、なぜそれがそれと同じように動作するのか理解しています。 – Oliver
しかし、ルールの変換部分が同じルールのセレクタが一致するときだけ評価されると誤解される可能性があるので、動作する方法は可能な限り直感的な方法ではないと思います。 私はおそらく、この事実を少なくともEnliveのdocs/READMEに明示的にするプルリクエストを提出するでしょう。 – Oliver