gpt4 book ai didi

clojure - 如何生动地使用摘要?

转载 作者:行者123 更新时间:2023-12-04 03:44:51 26 4
gpt4 key购买 nike

我是一名Rails开发人员,在Clojure中弄湿了我的脚。我正在尝试使用ERB做一些非常简单的事情,但是我无法终生生动地了解它。

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

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

我有这些片段,例如header.html和footer.html以及此简单的路由。
(deftemplate layout "layout.html" [])

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

每当请求转到“/”时,如何转换布局并在其中插入页眉和页脚代码段?

最佳答案

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

片段中使用的identity函数返回其参数,在这种情况下,该参数是由:#my-header-root选择器选择的数据结构(我们不进行任何转换)。如果您想将所有内容都包含在head.html中,则可以使用enlive附带的根选择器步骤。

您可以使用以下内容查看从defsnippet生成的html:
(print (apply str (enlive/emit* (my-snippet))))

我也推荐该教程: https://github.com/swannodette/enlive-tutorial/
还有Brian Brian的文章,详细介绍了defsnippet和deftemplate宏的工作原理。

最后一个技巧是,您可以使用enlive附带的sniptest宏尝试选择器和转换:
(enlive/sniptest "<p>Replace me</p>"
[:p] (enlive/content "Hello world!"))
;= "<p>Hello world!</p>"

关于clojure - 如何生动地使用摘要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com