0

私はHaskellとHappstackで遊んでいて、正式なHappstack関数を使用せずに文字列ベースのHTMLを直接出力しようとしています。<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ファイルを提供することに関連していますが、実際には私が最初に見逃したHTMLにSVGを埋め込むように要求しました。

答えは、HTMLをどのように生成しているかによって異なります。

使用している場合は、次の関数blaze-htmlを使用します。preEscapedToHtml

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

HSPを使用している場合は、cdataorpcdata関数を使用します(どちらを思い出せないので、両方を試してください)。

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

お役に立てば幸いです。

于 2012-12-12T17:52:54.767 に答える