select, snippet, at and template are macro sugar. If you _really_ want 
to use first-class selectors then you'll have to deal directly with 
states machines and use at*, select* and snippet* (I'm going to improve 
their usability).

While selectors aren't first class, they can be parametrized (as you did 
in [[:div (attr= :tiptree:widget (str widgetType))]]). You can play with 
compile-selector to see how selectors are expanded.

Regarding your code, I'd like to warn you against using snippet like 
that for performance reason (and it won't get any better when I make 
templates rendering faster).
It's better to extract snippets once for all:

(def snipgets
  (let [divs (mapcat #(select % [[:div (attr? :tiptree:widget)]])
               (html-resource "widget.html"))]
    (into {}
      (for [div divs]
        [(-> div :attrs :tiptree:widget)
         (snippet div [root]
          [widget]
           [:div.value] (content (if widget
                                   (:value widget)
                                   "foo")))))))

(deftemplate my-app6 "app2.html"
 [widgets]
  [[:div (attr? :tiptree:replace)]]
    (fn [node]
      (let [widgetType (:tiptree:replace (:attrs node))]
        ((snipgets widgetType) ((keyword widgetType) widgets)))))


David Nolen a écrit :
> On second thought, this is actually not that critical for what I'm 
> trying to accomplish, and I'm not sure yet if I'll ever use such a 
> feature. Macros that define snippets will probably suffice.
>
> (deftemplate my-app6 "app2.html"
>   [widgets]
>   [[:div (attr? :tiptree:replace)]] 
>     (fn [node]
>       (let [widgetType (:tiptree:replace (:attrs node))]
> ((snippet "widget.html" [[:div (attr= :tiptree:widget (str widgetType))]]
> [widget]
> [:div.value] (content (if widget
> (:value widget)
> "foo")))
> ((keyword widgetType) widgets)))))
>
> (apply str 
>        (my-app6 {:widgetA {:value "0"}, 
> :widgetB {:value "1"}}))
>
> Works for me, and this was in general the use case I was thinking of.
>
>
> On Thu, Apr 16, 2009 at 4:24 PM, David Nolen <dnolen.li...@gmail.com 
> <mailto:dnolen.li...@gmail.com>> wrote:
>
>     Because predicates in selectors no longer need to be quoted it
>     seems you can't use Enlive selectors in a first class way with
>     snippets:
>
>     (let [aselector [[:div (attr= :tiptree:widget "widgetA")]]]
>       ((snippet "widget.html" aselector
>        [some-map]
>        [:div.value] (content "foo")) {}))
>
>     I believe this might be one of my final big requests :) I
>     personally don't mind the quoted predicate forms, especially if
>     this would simplify making selectors first class.  This would
>     allow templates to dynamically generate snippets based on the
>     properties of a particular node.
>
>     There's been a wild flurry of updates to Enlive recently and I am
>     extremely excited about the possibilities.  Enlive is an idea
>     which should be ripped off by every web framework worth talking
>     about! ;) Thanks again for creating and maintaining it.
>
>     On Thu, Apr 16, 2009 at 7:15 AM, Christophe Grand
>     <christo...@cgrand.net <mailto:christo...@cgrand.net>> wrote:
>
>
>         Tom,
>
>         The redesign is nearly over (at least from a user standpoint),
>         you may
>         want to check it http://github.com/cgrand/enlive/tree/right
>
>         Christophe
>
>         Tom Hickey a écrit :
>         > Hi Christophe,
>         >
>         > I keep running into the same problem with elements getting
>         replaced.
>         > I'm trying to set the content of an element with raw html
>         (from a
>         > snippet) and  unable to avoid both 1) the html getting
>         escaped and 2)
>         > the element getting replaced. I can avoid one or the other, via
>         > escaped or text, just not both.
>         >
>         > I'm looking forward to see what you've got planned for the
>         redesign,
>         > as I'd really like to see this "feature" go away.
>         >
>         > Cheers,
>         > Tom
>         >
>         > On Mar 20, 3:59 am, Christophe Grand <christo...@cgrand.net
>         <mailto:christo...@cgrand.net>> wrote:
>         >
>         >> Phil Hagelberg a écrit :
>         >>
>         >>
>         >>> But I did notice you have the use test-is line commented
>         out in the
>         >>> implementation; it seems a bit unfortunate to have to
>         uncomment that to
>         >>> run the tests and hope you remember to re-comment it
>         before you commit.
>         >>>
>         >> The last commit was during the transition to lazy-seq and
>         test-is was
>         >> broken.
>         >> I'll fix that.
>         >>
>         >> --
>         >> Professional:http://cgrand.net/(fr)
>         <http://cgrand.net/%28fr%29>
>         >> On Clojure:http://clj-me.blogspot.com/(en)
>         <http://clj-me.blogspot.com/%28en%29>
>         >>
>         > >
>         >
>         >
>
>
>         --
>         Professional: http://cgrand.net/ (fr)
>         On Clojure: http://clj-me.blogspot.com/ (en)
>
>
>
>
>
>
>
> >


-- 
Professional: http://cgrand.net/ (fr)
On Clojure: http://clj-me.blogspot.com/ (en)



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to