
It looks good. Instead of the mkSize TH function, if you just define
an IsString instance, then anyone using OverloadedStrings will be able
to use string literals. I haven't confirmed this yet, but it might
even be possible to embed those string literals inside Cassius and GHC
will still apply fromString appropriately.
As far as variables inside templates: I personally think that's
crossing the line again into stuff templates shouldn't be dealing
with, but I'm open for discussions. Since templates tie in so well
with Haskell, I just don't think it's worth adding a whole bunch of
extra code and syntax to make it work.
Michael
On Tue, Feb 15, 2011 at 10:55 PM, Dmitry Kurochkin
Hi Yesod developers.
Attached are two modules to implement CSS size wrappers for Hamlet. It implements several types for different CSS units:
* em - EmSize * ex - ExSize * px - PixelSize * % - PercentageSize * cm, in, mm, pc, pt - AbsoluteSize
You can create them using an mkSize Template Haskell function, e.g.
let size = $(mkSize "100%")
All types are instances of Show, Eq, Ord, Num, Fractional and ToCss. This allows you to do math and interpolate it to Hamlet.
Ideally, I wanted to have only one type and make an implicit conversion from string literals. But I do not know how to forbid mixing of incompatible units in math (e.g. 10px + 10cm) with a single type. And I do not know how to make implicit conversion from string literals with multiple types.
I would appreciate any comments. Including on naming style, type design, API and overall usefulness. Keep in mind that this is the first time I use Template Haskell, so the code may be not optimal and plain ugly (e.g. can we use quasi quotes instead of directly messing with TH?)
BTW Michael, one more thing I miss in Hamlet is defining variables in templates. I would prefer to put simple CSS-related constants directly in Cassius instead of a dedicated module. Is it possible to implement?
Regards, Dmitry