我正在尝试使用Enlive克隆此html中的替换脚本标记。
<!DOCTYPE html>
<html lang="en">
<head>
[...]
<script src="/js/libs/less.min.js"></script>
<script src="replace-me"></script>
</head>
[...]
问题1)
我正在努力弄清楚最后一个脚本元素的“惯用”选择器是什么。目前我正在使用
(h/select tpl [:head :> [h/last-of-type :script]])
是正确的吗?
问题2)
我有这个片段来转换整个头部实体:
(h/defsnippet head "templates/base.html" [:head]
[{:keys [scripts]}]
[h/root :> [h/last-of-type :script]]
(h/clone-for [script scripts]
(h/set-attr :src (:src script))))
这是root选择器步骤的正确用法吗?我假设在defsnippet的上下文中,root引用了[:head]选择器,这是正确的吗?
谢谢!
答案 0 :(得分:1)
这适用于这种情况,但您可能更喜欢attr-has
:
(h/select tpl [[:script (h/attr-has :src "replace-me")]])
(h/defsnippet head "templates/base.html" [:head]
[{:keys [scripts]}]
[h/root :> (h/attr-has :src "replace-me")]
(h/clone-for [script scripts]
(h/set-attr :src (:src script))))
在更复杂的情况下,您可以定义自己的选择器。这里没有必要因为attr-has
,但为了示例:
(def my-pred (h/pred #(= #{"replace.me"} (h/attr-values % :src))))
(h/defsnippet head "templates/base.html" [:head]
[{:keys [scripts]}]
[h/root :> my-pred]
(clone-for [script scripts]
(h/set-attr :src (:src script))))
您可以使用emit*
检查您的代码段是否产生了预期效果:
(apply println (h/emit* (head {:scripts [{:src "bar.js"}]})))