使用Happstack直接输出预生成的HTML

时间:2012-12-11 20:12:24

标签: happstack

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

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

所以我的问题是,在下面:

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

什么是f,以便测试在我的浏览器中以粗体显示?

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

1 个答案:

答案 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,你想使用cdatapcdata功能(我永远不记得哪个,所以请尝试两者):

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

希望有所帮助!