2

我有这个test.html文件,其中包含:

<div class="clj-test class1 class2 col-sm-4 class3">content</div>

想要定义一个仅更改 html attr 值的一部分的模板:

(deftemplate test "public/templates/test.html" []
  [:.clj-test] (enlive/set-attr :class (partly-change-attr #"col*" "col-sm-8")))

这将呈现:

...
<div class="clj-test class1 class2 col-sm-8 class3">content</div>
...

谢谢你的帮助!

4

2 回答 2

3

刚刚在另一个线程中update-attr找到了Christophe Grand 建议的 fn :

(defn update-attr [attr f & args]
  (fn [node] (apply update-in node [:attrs attr] f args)))

很酷!我们可以直接使用它:

(enlive/deftemplate test-template "templates/test.html" []
  [:.clj-test] (update-attr :class clojure.string/replace #"col-.*?(?=\s)" "col-sm-8"))

或者从中构建一个更具体的 fn:

(defn replace-attr [attr pattern s]
      (update-attr attr clojure.string/replace pattern s))

(enlive/deftemplate test-template "templates/test.html" []
      [:.clj-test] (replace-attr :class #"col-.*?(?=\s)" "col-sm-8"))
于 2015-06-11T00:54:49.750 回答
2

我不知道这是否适合你,但如果你知道你要删除的课程,你可以这样做。

(enlive/deftemplate test-template "templates/test.html" []
              [:.clj-test] (enlive/remove-class "col-sm-4")
              [:.clj-test] (enlive/add-class "col-sm-8"))

在repl中:

(apply str (test-template))
=> "<html><body><div class=\"class1 clj-test class2 col-sm-8 class3\">content</div></body></html>"
于 2015-06-11T00:12:36.557 回答