【问题标题】:How does one apply HamletSettings to a quasiquote in Hamlet?如何将 HamletSettings 应用于 Hamlet 中的 quasiquote?
【发布时间】:2012-12-03 08:17:59
【问题描述】:

背景:我正在研究哈姆雷特是如何工作的,有 WAI,但没有 Yesod。我没有掌握 Template Haskell,但在深入研究之前,我想知道是否有针对此任务的已知/快速解决方案。

具体说明:我想知道如何在 Hamlet quasiquote 的上下文中更改 NewlineStyle

探索:我相信这与看起来像这样的函数调用有关

hamletWithSettings 
htmlRules 
HamletSettings 
  {
      hamletDoctype             = "<!DOCTYPE html>"
     ,hamletNewlines            = DefaultNewlineStyle
     ,Hamlet.hamletCloseStyle   = htmlCloseStyle -- this fn is in a hidden module 
     ,Hamlet.hamletDoctypeNames = []
  }   

...但是,在准引用的上下文中,我不知道如何编写执行此操作的代码。

这是工作代码,我希望修改:

{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE QuasiQuotes #-}

import Control.Monad.Trans.Resource
import Text.Hamlet                                  as Hamlet
import qualified Data.ByteString.Lazy.Char8         as ByteString
import qualified Network.Wai                        as Wai
import qualified Network.HTTP.Types                 as Http
import qualified Network.Wai.Handler.Warp           as Warp
import qualified Text.Blaze                         as Blaze 
import qualified Text.Blaze.Html.Renderer.String    as Blaze
-------------------------------------------------------------------------------
main :: IO ()
main = Warp.run 3000 application
-------------------------------------------------------------------------------
application :: Wai.Request -> ResourceT IO Wai.Response
application request = return $
    case (head $ Wai.pathInfo request) of
        "html" ->   
            Wai.responseLBS Http.status200  []  $ ByteString.pack 
                                                $ Blaze.renderHtml 
                                                $ htmlDoc -- defined below
        "d3" ->     
            Wai.ResponseFile Http.status200 [] "./d3.v2.min.js" Nothing
        _ ->        
            Wai.responseLBS Http.status400  [] "" 
-------------------------------------------------------------------------------
htmlDoc :: Hamlet.Html
htmlDoc = [shamlet|
!!!
<html>
    <head>
        <title>Study Graph
        <!-- <link rel="stylesheet" type="text/css" href="/css"> -->
        <script type="text/javascript" src="/d3" />
        <style>
        <script>
            window.onload = function()
            {
                svg = 
                    d3  .select("body")
                        .append("svg")
                        .attr("width", "100%")
                        .attr("height", "100%")
                /* SOLUTION to strawman: a solitary "\" on this code row, will render a single newline character; i.e. "\n\\\n" renders as "\n" */
                svg .selectAll("circle")
                    .data([ {"cx": 1.0, "cy": 1.1, "r":1}, 
                            {"cx": 2.0, "cy": 2.5, "r":0.9} ])

            }
    <body>
|]
-------------------------------------------------------------------------------

感谢提供任何帮助、侮辱或其他评论。

【问题讨论】:

    标签: haskell template-haskell hamlet


    【解决方案1】:

    基本思想是创建一个新的标识符,例如:

    myHamlet = hamletWithSettings 
      htmlRules 
      (   HamletSettings 
        "<!DOCTYPE html>" 
        DefaultNewlineStyle htmlCloseStyle doctypeNames )
    

    然后使用myHamlet 代替hamlet,例如:

    htmlDoc = [myHamlet|...|]
    

    由于阶段限制,您可能需要在与您使用它的模块不同的模块中声明myHamlet

    【讨论】:

    • 谢谢,这让我们深入了解应该做什么。不幸的是,我似乎不走运。 type CloseStyle 隐藏在隐藏模块 Text.Hamlet.Parse 中,因此我无法破解任何调用 type CloseStyle 数据构造函数的内容,除非我将 Text.Hamlet 的源代码修改为不隐藏 Text.Hamlet.Parse。我开始明白为什么他们说 Yesod 的《哈姆雷特》是“基于”Text.Hamlet
    • 啊,这只是导出列表中的一个错误。我可以在今天晚些时候发布一个新版本。
    • 我已经发布了 hamlet 1.1.2,它公开了 CloseStyle。
    • 非常感谢!我会试一试。
    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多