我正在使用Haskell和Happstack,我正在尝试直接输出基于字符串的HTML,而无需使用正式的Happstack函数。具体来说,我正在尝试将 SVG 直接输出到页面(带有 <svg> ... </svg>
),该页面来自另一个已经完全生成为字符串的模块。
这只是一个小玩具程序,所以我试图避免重构 SVG 生成器模块。
所以我的问题是,在以下几点:
(f "<b> test </b>")
是什么f
测试会在我的浏览器中以粗体显示?
如果这在合理范围内不可行,那么更有条理的方法是什么?
简单的方法是使用 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>
希望对您有所帮助!