Search code examples
haskellhamlet

Using Hamlet in Haskell without Yesod


Can anyone point me to an example of how to use Hamlet without Yesod? http://www.yesodweb.com/book/templates is a great bit of documentation, but I can't get my ghci session to render even a simple hamlet template without crashing.


Solution

  • Here's an example showing most of the basic stuff, including rendering of typed URLs.

    {-# LANGUAGE TemplateHaskell, QuasiQuotes #-}
    
    import Data.Text
    import Text.Blaze.Html.Renderer.String (renderHtml)
    import Text.Hamlet hiding (renderHtml)
    
    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
    

    Output:

    <html><head>This is in scope of the template below</head>
    <body><p><a href="http://haskell.org">Haskell</a>
    <a href="http://www.yesodweb.com">Yesod</a>
    </p>
    </body>
    </html>