2

使用 blaze-html 包,我想创建一些看起来像这样的 html

<p>&nbsp;&nbsp;Some indented text

我不知道如何创建不间断的空间。最好的方法是什么?

4

2 回答 2

1

当然,一种方法是将包含该字符的 Haskell 编码版本的字符串提供给toHtml. 另一种方法是使用preEscapedToMarkup

preEscapedToMarkup "&nbsp;"
于 2013-01-11T06:30:40.243 回答
0

按照 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 指出更好的解决方案。

于 2013-01-12T06:44:25.453 回答