9

我是一名 Rails 开发人员,在 Clojure 中涉足。我正在尝试用 ERB 做一些非常简单的事情,但我一生都无法在 enlive 中弄清楚。

假设我在 layout.html 中有一个网站的简单布局文件:

<!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 返回一个字符串向量,因此通常在 deftemplate 中使用 defsnippet。

为了让您了解片段(或选择器)返回的数据是什么样的:

(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))

片段中使用的标识函数返回它的参数,在本例中是由 :#my-header-root 选择器选择的数据结构(我们不进行任何转换)。如果你想在head.html 中包含所有内容,你可以使用enlive 附带的根选择器步骤。

您可以使用以下方式查看从 defsnippet 生成的 html:

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

我还推荐教程:https ://github.com/swannodette/enlive-tutorial/ 和 Brian Marick 的教程,了解更多关于 defsnippet 和 deftemplate 宏如何工作的细节。

最后一个提示,您可以使用 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 教程中有很好的示例答案。

警告。所有源文件链接似乎都已损坏。您需要在所有链接enlive-tutorial/blob/master/之后插入,https://github.com/swannodette/或者直接从教程项目中打开它们。

于 2013-01-21T04:12:35.487 回答