0

我正在玩 Haskell 和 Happstack,我正在尝试直接输出基于字符串的 HTML,而不使用正式的 Happstack 函数。具体来说,我正在尝试将 SVG 直接输出到<svg> ... </svg>来自另一个模块的页面(带有 ),该模块已经完全生成为字符串。

这只是一个小玩具程序,所以我试图避免重构 SVG 生成器模块。

所以我的问题是,如下:

(f "<b> test </b>")

什么是f这样的测试会在我的浏览器中以粗体显示?

如果这不可能,那么更有条理的方法是什么?

4

1 回答 1

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但后者不能很好地与非 SVG 处理程序通过msum...


编辑:以上内容与从处理程序提供 SVG 文件有关,但您实际上要求将 SVG 嵌入我第一次错过的 HTML 中。

答案取决于您如何生成 HTML。

如果您正在使用blaze-html您想使用该preEscapedToHtml功能:

preEscapedToHtml $ "<svg>" ++ svg ++ "</svg>"

如果您使用的是 HSP,您想使用cdataorpcdata函数(我不记得是哪个,所以尝试两者):

<svg><% cdata svg %></svg>

希望有帮助!

于 2012-12-12T17:52:54.767 回答