1

这是enlive 1.1.5(为清楚起见添加了源格式/空白更改。):

blogen.core> (html/sniptest "<html><head>
                                <title><span id=\"foo\"/></title>
                              </head></html>"
                            [:#foo] (html/substitute "f"))
"<html><head><title></title></head></html>f"

blogen.core> (html/sniptest "<html><head>
                                <title><span id=\"foo\"/></title>
                              </head></html>"
                            [:#foo] (constantly "f"))
"<html><head><title></title></head></html>f"

我想在 HTML 源代码中编写一个常量前缀,这样我的 clojure 代码就不会从我的最终内容中饱和。但正如上面的 sniptest 所示,我不能spantitle. 使用核心函数的第二个测试constantly表明,任何更多的自定义编写的转换都不太可能取得更好的成功。

我不想使用,${vars}因为它们在模板中看起来很愚蠢。我更喜欢在模板中编写体面的示例,然后可以在没有损坏的情况下进行替换。

动机

基本上,我会喜欢将模板编写为 HTML 并使用已span定义的元素id作为变量占位符。但是 enlive 不会根据需要解析'sspan内的那些标签。title为了让事情不那么复杂。例子:

<title><span id="article-name"/> - <span id="my-site" /></title>

或者

<p>Welcome, <span id="visitor-ip" /></p>
4

1 回答 1

1

根据HTML5 规范<title>标签的 ContentModel 是 Text,这意味着其中不允许有 HTML 元素。

解析 HTML 的 Enlive 部分可能只能处理有效的 HTML,因此它不能很好地与<span>标签内的<title>标签配合使用。

你有几个选择。

可以只设置<title>标签的内容而不是完全替换它,如下所示:

(html/sniptest "<html><head><title>Placeholder</title></head></html>"
               [:title] (html/content "foo"))

;; => <title>foo</title>

或者,如果您想保持标题的一部分不变,您可以使用appendprepend

(html/sniptest "<html><head><title>Some Title</title></head></html>"
                [:title] (html/append " - sub page"))

;; => <title>Some Title - sub page</title>

编辑

我知道你说你想避免${vars},但在这种情况下,他们恰好做了你正在寻找的事情......

(html/sniptest "<html><head><title>${my-site} - ${article-name}</title></head></html>"
               [:title] (html/transform-content
                          (html/replace-vars
                             {:article-name "Using Enlive for good and evil"
                              :my-site "Clojure Weekly"})))

;; =>  <title>Clojure Weekly - Using Enlive for good and evil</title>
于 2014-01-21T12:43:20.573 回答