【问题标题】:Using Hamlet in Haskell without Yesod在没有 Yesod 的情况下在 Haskell 中使用 Hamlet
【发布时间】:2011-10-06 11:29:35
【问题描述】:

谁能给我举个例子,说明如何在没有 Yesod 的情况下使用 Hamlet? http://www.yesodweb.com/book/templates 是一个很棒的文档,但是我无法让我的 ghci 会话在不崩溃的情况下渲染一个简单的小村庄模板。

【问题讨论】:

  • 如果您展示您在 GHCi 中所做的事情以及它是如何崩溃的,这可能会有所帮助。

标签: haskell hamlet


【解决方案1】:

这是一个展示大部分基本内容的示例,包括呈现键入的 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>

【讨论】:

  • 按原样尝试会给我这个 ghc 编译错误:pastie.org/2220259 如果我将 @{} 更改为 #{},我会得到:pastie.org/2220261
  • 这里运行良好,使用runghc 使用ghc 7.0.2hamlet 0.8.2。你怎么运行这个?第一个错误看起来很奇怪。语言编译指示是如何最终出现在 HTML 中的?第二个看起来你只需要删除一些pack 调用。
  • 尝试运行 ghc --make,尝试 runghc 我得到 pastie.org/2220468 ghc 7.0.3 hamlet 0.6.1.2 -- 哦,我的版本比你的要老一点。也许语法已经改变:(
  • 啊,我发现了。显然 hamlet 过去更像是 haml,而我的版本是旧语法
【解决方案2】:

好吧,手动渲染 URL 并以最愚蠢的方式做事,我们可以使用这个:

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

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

按预期工作。我想你想做一些更有用的事情,但这里的简单示例效果很好,所以如果不知道你在哪里遇到问题,很难说更多。

【讨论】:

  • 所以,我得到了这个编译,但令人惊讶的是它输出 Test pageTesting 而不是预期的 convert-to-proper-html
  • 啊,我发现了。显然 hamlet 过去更像是 haml,而我的版本是旧语法
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2010-12-09
相关资源
最近更新 更多