0

我正在尝试使用 Enlive 克隆此 html 中的 replace-me 脚本标记。

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

这是根选择器步骤的正确用法吗?我假设在 defsnippet 的上下文中,root 引用了 [:head] 选择器,对吗?

谢谢!

4

1 回答 1

1
  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))))
    
  2. 您可以使用它emit*来检查您的代码片段是否产生了预期的结果:

    (apply println (h/emit* (head {:scripts [{:src "bar.js"}]})))
    
于 2012-08-18T15:43:14.543 回答