sofのコードは動かなかった
- Text.Blaze.Renderer.Stringは廃止なのでText.Blaze.Html.Renderer.String
- HamletじゃなくてHtmlUrl
この二点を直したら動いた
{-# LANGUAGE TemplateHaskell, QuasiQuotes #-} import Data.Text import Text.Blaze.Html.Renderer.String (renderHtml) import Text.Hamlet data Url = Haskell | Yesod renderUrl Haskell _ = pack "http://haskell.org" renderUrl Yesod _ = pack "http://www.yesodweb.com" title = pack "This is in scope of the template below" template :: HtmlUrl Url template = [hamlet| <html> <head> #{title} <body> <p> <a href=@{Haskell}>Haskell <a href=@{Yesod}>Yesod |] main = do let html = template renderUrl putStrLn $ renderHtml html
hamletのシンタックスは先頭がタグなので、普段Jade使っている僕にとっては似てるけどなんか変だなという印象だ。しかし、Jadeは先頭の文字列の区別が予約語(ifとか)、それ以外の記号で始まらない文字列はタグになるので、込み入ったテンプレートは結構読みにくい。
なので、タグで区別できるHamletのほうが可読性がいいのかな。
インラインのタグを入れ子にしたい場合には、エスケープの処理とかしないといけないのはインデント系に共通の読みにくさかも。あと条件演算子を入れると同じレベルのliなんかでもインデントが1つ下がるので、ちょっと読みにくくなってしまうところも一緒かな。
Hamletでヨサゲなのはテンプレート中でMaybeとかCase式が使えるところかな。
なんか作ってみたくなってきた。
Developing Web Applications With Haskell and Yesod
Michael Snoyman
Oreilly & Associates Inc / 2805円 ( 2012-05-04 )
Michael Snoyman
Oreilly & Associates Inc / 2805円 ( 2012-05-04 )