[web-devel] Runtime Hamlet template parsing/rendering

Alexander Dunlap alexander.dunlap at gmail.com
Mon Aug 2 16:58:53 EDT 2010


On Sat, Jul 31, 2010 at 12:34 PM, Michael Snoyman <michael at snoyman.com> wrote:
> Hey all,
> An often-mentioned "cool feature" for Hamlet would be to support runtime
> parsing/rendering of templates. Currently, the only supported method is
> quasi-quoting a template and thereby have it parsed into Haskell code at
> compile time. In my opinion, this is definitely the preferred way of using
> Hamlet, as it gives you very solid compile-time guarantees of correct syntax
> and type safety. Nonetheless, there are some use cases (static site
> generation via Hakyll, a hamlet-to-html tool, etc) that would really benefit
> from runtime parsing.
> It turns out this is pretty simple to add, except for one thing: I can't
> figure out a good API for passing in variables for a template. Hamlet
> templates have essentially four different datatypes they recognize:
> * Html
> * Some URL data type
> * That same URL datatype along with a [(String, String)] to represent
> query-string parameters
> * A Hamlet template
> In addition, $forall and $maybe need lists and Maybe values, respectively.
> Variable lookup is handled by a tree, which allows you to express arbitrary
> function application. $if requires Bools.
> So the question is, what should an API look like? The parse function is
> fairly straight-forward:
> parseHamletRT :: HamletSettings -> String -> Either HamletException HamletRT
> However, the render function is more complicated. I've toyed with a few
> possible ideas:
> * Use the data-object package with some complicated HamletData datatype.
> * Just do the complicated HamletData datatype.
> * Type lookup functions as parameters.
> * Disallow most of the more complicated features in Hamlet, like URL and
> subtemplates, and just allow dollar-sign interpolation with $forall and $if.
> That tree datatype for variable names could be collapsed into a [String].
> Thoughts on the matter are welcome, as well as sample use cases you have for
> such a function.
> Michael
> _______________________________________________
> web-devel mailing list
> web-devel at haskell.org
> http://www.haskell.org/mailman/listinfo/web-devel
>
>

My biggest sample use case would be rendering URLs. For a simple
blog/CMS type application that I have, I'm using Pandoc to render the
posts themselves and Hamlet for templating the rest of the page. The
disadvantage is that I have to hard-code URLs inside posts. So it
would be good to have some access to the URL rendering function at
runtime.

Alex


More information about the web-devel mailing list