2

背景: 私はハムレットが 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>
|]
-------------------------------------------------------------------------------

支援、侮辱、またはその他のコメントを事前に感謝します。

4

1 に答える 1

3

基本的な考え方は、新しい識別子を作成することです。たとえば、次のようになります。

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

次にmyHamlet、の代わりに使用しますhamlet。例:

htmlDoc = [myHamlet|...|]

myHamletステージの制限により、使用するモジュールとは別のモジュールで宣言する必要がある可能性があります。

于 2012-12-03T08:39:45.847 に答える