我正在玩Haskell和Happstack,我正在尝试直接输出基于字符串的HTML而不使用正式的Happstack函数。具体来说,我正在尝试将SVG直接输出到页面(<svg> ... </svg>
),该页面来自另一个已完全生成为字符串的模块。
这只是一个小玩具程序,所以我试图避免重构SVG生成器模块。
所以我的问题是,在下面:
(f "<b> test </b>")
什么是f
,以便测试在我的浏览器中以粗体显示?
如果这是不合理的,那么更有条理的方法是什么?
答案 0 :(得分:2)
简单的方法是使用toResponseBS
:
import Data.ByteString.Char8 as C
import Data.ByteString.Lazy.Char8 as L
svgToResponse svg = toResponseBS (C.pack "image/svg+xml") (L.pack $ "<svg>" ++ svg ++ "</svg>")
另一种选择是制作ToMessage
实例:
newtype SVG = SVG String
instance ToMessage SVG where
toContentType _ = C.pack "image/svg+xml"
toMessage (SVG svg) = L.pack $ "<svg>" ++ svg ++ "</svg>"
现在你可以toResponse (SVG svg)
甚至ok $ SVG svg
,但后者不能通过msum
与非SVG处理程序很好地合作...
编辑:以上内容与从处理程序提供SVG文件相关,但实际上您要求我首先错过了在HTML中嵌入SVG。
答案取决于您如何生成HTML。
如果您使用的是blaze-html
,则需要使用preEscapedToHtml
功能:
preEscapedToHtml $ "<svg>" ++ svg ++ "</svg>"
如果你正在使用HSP,你想使用cdata
或pcdata
功能(我永远不记得哪个,所以请尝试两者):
<svg><% cdata svg %></svg>
希望有所帮助!