Как применить 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
в модуле, отличном от того, где вы его используете.