enlive:将参数从选择器传递到转换

时间:2014-04-09 18:37:57

标签: clojure enlive

我在enlive中有一些变换:

(html/deftemplate tranforma-numero-template "public/index.html" [m]
              [:#portugues :.conteudo] (html/content (:portugues m))
              [:#ingles :.conteudo] (html/content (:ingles m))
              [:#espanhol :.conteudo] (html/content (:espanhol m)))

它遵循一种模式。所以我想以某种方式抽象出这种模式。我想如果这样的事情是可能的:

(html/deftemplate tranforma-numero-template "public/index.html" [m]
    [(html/pred (fn [node]
        (when (seq formatos)
           (-> node :attrs :id (set formatos)))))] (html/content ((keyword (-> node :attrs :id)) m))) 

我知道这对于这样一个简单的例子来说太过分了,但你有了这个概念。

1 个答案:

答案 0 :(得分:0)

编写常规选择器的一种替代方法,就像您上面已经做的那样,是动态生成对deftemplate的调用。在你的例子中编写一个智能选择器和变换器也是一个很好的方法。

因为deftemplate是一个宏,如果你的模板创建代码也是一个宏,它可能会更容易。这种宏观传染是使宏成为库的主要接口的一个缺点。不幸的是,这意味着这将更加困难。 Fortuneatly产生调用deftemplate的宏甚至比智能选择器方法更简单。只需要通过适当的选择器和转换序列来调用deftemplate即可。