Sorry for banging on about this. I now have code that returns lists of nodes and starts by running the page shell template with Splice functions handling the rest. So far as I know, this is the "Heist way" to do things.
I am still running into the problem that renderTemplate returns a byte string and callTemplate returns some exotic complex type. Is there not a public template function that returns a list of nodes? Kevin --- On Thu, 6/17/10, MightyByte <[email protected]> wrote: > From: MightyByte <[email protected]> > Subject: Re: [Snap Framework] renderTemplate with XML fragments in Heist > To: "Kevin Jardine" <[email protected]> > Cc: [email protected] > Date: Thursday, June 17, 2010, 6:36 PM > Yes, that's correct. Just keep > in mind that one of our main goals is > to promote the clean separation between view and business > logic. > Heist was intentionally designed to discourage putting > business logic > in the templates (views). This is why we didn't make > any kind of loop > or conditional syntax available in the templates. > Similarly we want > to discourage putting views inside your Haskell code. > So while it > might be easy to make a splice like this: > > myArticle post = do > let body = [Element "span" [("class", "author")] > [Text (getAuthor post)] > > ,Element "div" [("class", "postbody")] (getBody > post) > > ] > return [Element "h1" [] [Text (getTitle post)] > ,Element > "div" [("class", "post")] body > ] > > ...we discourage this pattern of putting view details in > your code. > The preferred approach would be to implement this bit of > HTML as > another template that gets each of the individual pieces of > data from > bound splices. > > On Thu, Jun 17, 2010 at 12:13 PM, Kevin Jardine <[email protected]> > wrote: > > OK, thanks for the encouragement. > > > > I was looking at the definition of bindStrings itself > and it occurs to me that a trivial variant would be: > > > > bindNodes pairs ts = foldr add ts pairs > > where > > add (n,v) = bindSplice n (return v) > > > > So perhaps I'll start with that and see where it takes > me. > > > > That means that I would be rewriting my view system to > process lists of nodes rather than strings, but the same > flow structure would remain (at least for now). > > > > Kevin > > > > --- On Thu, 6/17/10, MightyByte <[email protected]> > wrote: > > > >> From: MightyByte <[email protected]> > >> Subject: Re: [Snap Framework] renderTemplate with > XML fragments in Heist > >> To: "Kevin Jardine" <[email protected]> > >> Date: Thursday, June 17, 2010, 6:05 PM > >> Yes, that is exactly the approach we > >> had in mind. You could even > >> eliminate nodeDict as a parameter and store it as > state in > >> MyMonad. > >> But you wouldn't have to do that. You can > organize it > >> in whatever way > >> works best for your application. > >> > >> On Thu, Jun 17, 2010 at 12:00 PM, Kevin Jardine > <[email protected]> > >> wrote: > >> > One experiment that I'm looking at is > defining: > >> > > >> > klugeSplice :: [(B.ByteString,[Node])] -> > Splice > >> MyMonad > >> > klugeSplice nodeDict = do > >> > input <- getParamNode > >> > let name = getName input > >> > return $ fromMaybe [Text (B.pack > "oops")] $ > >> lookup name nodeDict > >> > > >> > and passing > >> > > >> > (klugeSplice nodeDict) as the first parameter > to > >> bindSplice. > >> > > >> > At least that function compiles but I'm > afraid that > >> I'm still lost in a conceptual sea so I'm not sure > if this > >> is anything like the best approach. > >> > > >> > Kevin > >> > > >> > --- On Thu, 6/17/10, Kevin Jardine <[email protected]> > >> wrote: > >> > > >> >> From: Kevin Jardine <[email protected]> > >> >> Subject: Re: [Snap Framework] > renderTemplate with > >> XML fragments in Heist > >> >> To: [email protected] > >> >> Date: Thursday, June 17, 2010, 5:05 PM > >> >> To explain in more detail, I had > >> >> thought that Heist was a "slave" > template > >> library. > >> >> > >> >> You hand it some attributes (nodes or > strings) and > >> a > >> >> template name and it hands you back > something > >> (nodes or a > >> >> rendered string). > >> >> > >> >> Currently, however, it seems as though > Heist is > >> the master > >> >> app and mine ends up being the slave - > you hand > >> Heist a page > >> >> shell and define some hooks and it does > all the > >> work and > >> >> hands you the final string. > >> >> > >> >> Is that correct? > >> >> > >> >> If so, I'm still keen to use the library > but will > >> have to > >> >> rethink how I am doing things as the work > flow is > >> in essence > >> >> in the reverse order of what I am used > to. > >> >> > >> >> Kevin > >> >> > >> >> --- On Thu, 6/17/10, Kevin Jardine <[email protected]> > >> >> wrote: > >> >> > >> >> > From: Kevin Jardine <[email protected]> > >> >> > Subject: Re: [Snap Framework] > renderTemplate > >> with XML > >> >> fragments in Heist > >> >> > To: "MightyByte" <[email protected]> > >> >> > Date: Thursday, June 17, 2010, 4:34 > PM > >> >> > Thanks for your patience here! > >> >> > > >> >> > I am still running into a > conceptual > >> difficulty here > >> >> as I > >> >> > want to pass around a > dictionary/map > >> structure of some > >> >> kind > >> >> > of attribute value pairs. > >> >> > > >> >> > Eg. [(String, [Node])] or > [(String,String)] > >> which I > >> >> can > >> >> > manipulate in my own monad and then > pass to > >> Heist when > >> >> and > >> >> > if I choose. > >> >> > > >> >> > But bindSplice takes a function > where I would > >> want a > >> >> > dictionary. > >> >> > > >> >> > I am obviously lacking in > Heist-foo. > >> >> > > >> >> > What to do? > >> >> > > >> >> > Kevin > >> >> > > >> >> > --- On Thu, 6/17/10, MightyByte > <[email protected]> > >> >> > wrote: > >> >> > > >> >> > > From: MightyByte <[email protected]> > >> >> > > Subject: Re: [Snap Framework] > >> renderTemplate with > >> >> XML > >> >> > fragments in Heist > >> >> > > To: "Kevin Jardine" <[email protected]> > >> >> > > Date: Thursday, June 17, 2010, > 3:55 PM > >> >> > > Yeah, this was our intent. > >> >> > > renderTemplate is the only way > to get > >> >> > > things out of TemplateMonad. > By using > >> >> bindSplice as > >> >> > I > >> >> > > mentioned > >> >> > > above, you keep your data is > structured > >> nodes > >> >> when > >> >> > > possible. > >> >> > > bindStrings is only intended as > a > >> convenient way > >> >> to > >> >> > pass > >> >> > > strings into > >> >> > > templates. > >> >> > > > >> >> > > On Thu, Jun 17, 2010 at 9:47 > AM, Kevin > >> Jardine > >> >> <[email protected]> > >> >> > > wrote: > >> >> > > > Or am I making a > conceptual error > >> here? > >> >> > > > > >> >> > > > Perhaps I should be using > >> runTemplate to get > >> >> the > >> >> > XML > >> >> > > fragments and only use > renderTemplate at > >> the very > >> >> top > >> >> > > level? > >> >> > > > > >> >> > > > This would keep the input > as > >> structured > >> >> nodes > >> >> > and > >> >> > > convert to bytestrings only at > the last > >> step. > >> >> > > > > >> >> > > > Kevin > >> >> > > > > >> >> > > > --- On Thu, 6/17/10, Kevin > Jardine > >> <[email protected]> > >> >> > > wrote: > >> >> > > > > >> >> > > >> From: Kevin Jardine > <[email protected]> > >> >> > > >> Subject: > renderTemplate with > >> XML > >> >> fragments > >> >> > in > >> >> > > Heist > >> >> > > >> To: [email protected] > >> >> > > >> Date: Thursday, June > 17, 2010, > >> 3:38 PM > >> >> > > >> If I call > >> >> > > >> > >> >> > > >> renderTemplate > (bindStrings > >> dict > >> >> > > emptyTemplateState) > >> >> > > >> templateName > >> >> > > >> > >> >> > > >> this works fine if the > dict > >> values are > >> >> all > >> >> > > unstructured > >> >> > > >> data. > >> >> > > >> > >> >> > > >> However, if they are > XML > >> structures, > >> >> the > >> >> > resulting > >> >> > > HTML is > >> >> > > >> escaped, presumably > because > >> bindStrings > >> >> > inserts > >> >> > > them as Text > >> >> > > >> nodes. > >> >> > > >> > >> >> > > >> What function instead > of > >> bindStrings do > >> >> I > >> >> > call to > >> >> > > insert > >> >> > > >> XML fragments? > >> >> > > >> > >> >> > > >> Kevin > >> >> > > >> > >> >> > > >> > >> >> > > >> > >> >> > > >> > >> >> > > > > >> >> > > > > >> >> > > > > >> >> > > > > >> >> > _______________________________________________ > >> >> > > > Snap mailing list > >> >> > > > [email protected] > >> >> > > > http://mailman-mail5.webfaction.com/listinfo/snap > >> >> > > > > >> >> > > > >> >> > > >> >> > > >> >> > > >> >> > > >> >> > >> >> > >> >> > >> >> > >> > > >> > > >> > > >> > > _______________________________________________ > >> > Snap mailing list > >> > [email protected] > >> > http://mailman-mail5.webfaction.com/listinfo/snap > >> > > >> > > > > > > > > _______________________________________________ > > Snap mailing list > > [email protected] > > http://mailman-mail5.webfaction.com/listinfo/snap > > > _______________________________________________ Snap mailing list [email protected] http://mailman-mail5.webfaction.com/listinfo/snap
