【问题标题】:Enlive Predefined selector-steps启用预定义的选择器步骤
【发布时间】:2012-08-18 23:43:14
【问题描述】:

我正在尝试使用 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)

我有这个sn-p来转换整个头部实体:

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

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

谢谢!

【问题讨论】:

    标签: clojure enlive


    【解决方案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*来检查你的sn-ps是否产生了想要的结果:

      (apply println (h/emit* (head {:scripts [{:src "bar.js"}]})))
      

    【讨论】:

    • 那么我对 h/root 与 defsn-p 一起使用时的假设是否正确?
    • 是的,root 匹配由 sn-p 定义中指定的选择器匹配的元素。您可以使用匹配多个元素的选择器定义一个 sn-p;在这种情况下,每一个都会被root匹配。
    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多