使用 blaze-html 包,我想创建一些看起来像这样的 html
<p> Some indented text
我不知道如何创建不间断的空间。最好的方法是什么?
当然,一种方法是将包含该字符的 Haskell 编码版本的字符串提供给toHtml
. 另一种方法是使用preEscapedToMarkup
:
preEscapedToMarkup " "
按照 ertes 的建议,我尝试“给出一个包含字符的 Haskell 编码版本的字符串”。这段代码很冗长,所以我可以更好地理解这些类型是如何组合在一起的。
{-# LANGUAGE OverloadedStrings #-}
-- * base
import Data.Monoid ((<>))
import Data.Char (chr)
-- * text
import qualified Data.Text.Lazy as L (Text)
import Data.Text (Text, singleton)
import Data.Text.Lazy.Read (hexadecimal)
-- * blaze-html
import Text.Blaze.Html5
import qualified Text.Blaze.Html5 as H
import Text.Blaze.Renderer.String
nbspHex = "00A0" :: L.Text -- Unicode codepoint for nbsp
Right (nbspInt, _) = hexadecimal nbspHex
nbspChar = chr nbspInt :: Char
nbspTxt = singleton nbspChar :: Text
nbspHtml = toHtml nbspTxt :: Html
someHtml :: Html
someHtml = docTypeHtml $
body $ do
p "some text"
p (nbspHtml <> nbspHtml <> "some indented text")
main :: IO ()
main = do
let s = renderHtml $ someHtml
putStrLn s
正如我所希望的那样,这段代码在浏览器中显示了“一些缩进的文本”,但是查看 html,我没有看到任何“@nbsp;”,正如我所预料的那样。所以这不是我真正想要的答案。
感谢 Jukka 指出更好的解决方案。