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 -~----------~----~----~----~------~----~------~--~---