[web-devel] Runtime Hamlet template parsing/rendering

Michael Snoyman michael at snoyman.com
Sat Jul 31 15:34:35 EDT 2010


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/web-devel/attachments/20100731/c905e23e/attachment.html


More information about the web-devel mailing list