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

  • 本文关键字:HTML 输出 Happstack happstack
  • 更新时间 :
  • 英文 :


我正在使用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,则要使用cdatapcdata功能(我永远不记得是哪个,所以请尝试两者):

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

希望对您有所帮助!

相关内容

  • 没有找到相关文章

最新更新