您的两个选项似乎是使用 HTML <pre> 元素按原样呈现 ASCII 表以获得“老式”外观,或者使用 tabular 对 HTML 的支持重新呈现表,获取实际的 HTML <table> 元素。
最简单的方法是使用<pre> 元素进行渲染。在 whamlet 模板中,只需将 ASCII 表插入到模板中即可:
import Yesod
import qualified Text.Tabular as T
import qualified Text.Tabular.AsciiArt as TA
example = T.Table
(T.Group T.NoLine [T.Header "1", T.Header "2"])
(T.Group T.SingleLine [T.Header "Table Type", T.Header "HTML Element"])
[ ["ASCII art", "<pre>"], ["HTML", "<table>"] ]
asciiTable :: String
asciiTable = TA.render id id id example
getAsciiR :: Handler Html
getAsciiR = defaultLayout
[whamlet|
<p>My old-school table follows
<pre>#{asciiTable}
|]
使用tabular 的HTML 支持有点复杂,主要是因为它使用Text.Html 和手工构建的CSS,它们不直接与Yesod 的小部件和基于blaze 的标记交互。但是,您可以像这样从头开始构建一个小部件:
import Yesod
import qualified Data.Text.Lazy.Builder as B
import qualified Text.Tabular as T
import qualified Text.Tabular.AsciiArt as TA
import qualified Text.Tabular.Html as TH
import qualified Text.Html as H
htmlTable :: Widget
htmlTable = do
toWidget . preEscapedToMarkup . renderHtml $ tbl
toWidget . CssBuilder . B.fromString $ TH.defaultCss
where tbl = TH.render H.stringToHtml H.stringToHtml H.stringToHtml example
renderHtml h = foldr ($) "" [H.renderHtml' 0 e | e <- H.getHtmlElements h]
然后使用小部件插值 (^{...}) 将其插入到 whamlet 模板中:
getHtmlR :: Handler Html
getHtmlR = defaultLayout
[whamlet|
<p>My fancy table follows:
^{htmlTable}
|]
这将给出类似的东西:
完整代码如下。您可以访问localhost:3000/ascii和localhost:3000/html查看结果:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module TableServer where
import qualified Data.Text.Lazy.Builder as B
import qualified Text.Tabular as T
import qualified Text.Tabular.AsciiArt as TA
import qualified Text.Tabular.Html as TH
import qualified Text.Html as H
import Yesod
data Site = Site
mkYesod "Site" [parseRoutes|
/ascii AsciiR GET
/html HtmlR GET
|]
instance Yesod Site
example = T.Table
(T.Group T.NoLine [T.Header "1", T.Header "2"])
(T.Group T.SingleLine [T.Header "Table Type", T.Header "HTML Element"])
[ ["ASCII art", "<pre>"], ["HTML", "<table>"] ]
asciiTable :: String
asciiTable = TA.render id id id example
getAsciiR :: Handler Html
getAsciiR = defaultLayout
[whamlet|
<p>My old-school table follows
<pre>#{asciiTable}
|]
htmlTable :: Widget
htmlTable = do
toWidget . preEscapedToMarkup . renderHtml $ tbl
toWidget . CssBuilder . B.fromString $ TH.defaultCss
where tbl = TH.render H.stringToHtml H.stringToHtml H.stringToHtml example
renderHtml h = foldr ($) "" [H.renderHtml' 0 e | e <- H.getHtmlElements h]
getHtmlR :: Handler Html
getHtmlR = defaultLayout
[whamlet|
<p>My fancy table follows:
^{htmlTable}
|]
main :: IO ()
main = warp 3000 Site