Использование Hamlet в Haskell без Yesod

Может ли кто-нибудь указать мне пример того, как использовать Гамлета без Йесод? http://www.yesodweb.com/book/templates — отличная документация, но я не могу получить мой сеанс ghci для рендеринга даже простого шаблона деревушки без сбоев.


person singpolyma    schedule 15.07.2011    source источник
comment
Было бы полезно, если бы вы показали, что вы делаете в GHCi, и как он падает.   -  person C. A. McCann    schedule 16.07.2011


Ответы (2)


Вот пример, показывающий большинство основных вещей, включая рендеринг введенных URL-адресов.

{-# 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

Выход:

<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>
person hammar    schedule 15.07.2011
comment
Попытка сделать это как есть приводит к ошибке компиляции ghc: pastie.org/2220259, если я изменю @{} на #{} я получаю: pastie.org/2220261 - person singpolyma; 16.07.2011
comment
Здесь он отлично работает, запуская его с runghc, используя ghc 7.0.2 и hamlet 0.8.2. Как ты это делаешь? Первая ошибка выглядит очень странно. Как языковые прагмы оказались в HTML? Второй выглядит так, как будто вам просто нужно удалить некоторые из pack вызовов. - person hammar; 16.07.2011
comment
который пытался запустить ghc --make, пытаясь запустить ghc, я получаю pastie.org/2220468 ghc 7.0.3 hamlet 0.6.1.2 -- о, моя версия немного старше вашей. возможно, синтаксис был изменен :( - person singpolyma; 16.07.2011
comment
А, я обнаружил это. По-видимому, hamlet был больше похож на haml, и моя версия имеет старый синтаксис. - person singpolyma; 16.07.2011

Что ж, вручную махая рендерингом URL и делая вещи самым глупым способом, который работает, мы можем использовать это:

hamVal = [$hamlet| 
<html>
    <head>
        <title>Test page
    <body>Testing
|]

test :: ByteString
test = renderHamlet (\_ _ -> "") hamVal

Что работает, как ожидалось. Я предполагаю, что вы хотите сделать что-то немного более полезное, но тривиальный пример здесь работает нормально, поэтому трудно сказать больше, не зная, где у вас возникли проблемы.

person C. A. McCann    schedule 15.07.2011
comment
Итак, я получил это для компиляции, но, как ни странно, он выводит ‹html›‹head›‹title›Test page‹body›Testing вместо ожидаемого convert-to-proper-html - person singpolyma; 16.07.2011
comment
А, я обнаружил это. По-видимому, hamlet был больше похож на haml, и моя версия имеет старый синтаксис. - person singpolyma; 16.07.2011