Как применить HamletSettings к квазицитате в Hamlet?

Справочная информация: я изучаю, как работает Гамлет, с WAI, но без Йесода. Я не разбираюсь в Template Haskell, но прежде чем углубиться в него, мне интересно, есть ли известное / быстрое решение для этой задачи.

Особенности: я хотел бы знать, как изменить 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>
|]
-------------------------------------------------------------------------------

Заранее благодарим за любую помощь, оскорбления или другие комментарии.

1 ответ

Решение

Основная идея заключается в создании нового идентификатора, например:

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

Тогда используйте myHamlet на месте hamletНапример:

htmlDoc = [myHamlet|...|]

Из-за ограничения этапа вам, вероятно, потребуется объявить myHamlet в модуле, отличном от того, где вы его используете.

Другие вопросы по тегам