简单的方法是使用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
但后者不能很好地与非 SVG 处理程序通过msum
...
编辑:以上内容与从处理程序提供 SVG 文件有关,但您实际上要求将 SVG 嵌入我第一次错过的 HTML 中。
答案取决于您如何生成 HTML。
如果您正在使用blaze-html
您想使用该preEscapedToHtml
功能:
preEscapedToHtml $ "<svg>" ++ svg ++ "</svg>"
如果您使用的是 HSP,您想使用cdata
orpcdata
函数(我不记得是哪个,所以尝试两者):
<svg><% cdata svg %></svg>
希望有帮助!