Haskell 如何在YesSOD中呈现格式正确的字符串?

Haskell 如何在YesSOD中呈现格式正确的字符串?,haskell,yesod,Haskell,Yesod,我用这张桌子做了一张桌子。我用这个库制作的桌子真的只是一个有很多换行符的花式字符串。我知道如何正确格式化此表的唯一方法是在repl中使用putStr 如果我只是显示字符串,返回的结果将是一团混乱,如下所示: "+-----++-----------+-----------++-------------+-------------+\n| || memtest 1 | memtest 2 || time test 1 | time test 2 |\n+=====++= 我想做

我用这张桌子做了一张桌子。我用这个库制作的桌子真的只是一个有很多换行符的花式字符串。我知道如何正确格式化此表的唯一方法是在repl中使用putStr

如果我只是显示字符串,返回的结果将是一团混乱,如下所示:

"+-----++-----------+-----------++-------------+-------------+\n|     || memtest 1 | memtest 2 || time test 1 | time test 2 |\n+=====++=
我想做的是能够在Yesod
处理程序Html
中以正确的格式呈现此表。更具体地说,我想从whamlet模板中呈现这个表


我曾尝试通过使用
pShow
等函数来合并,但没有成功。我浏览了各种YesSOD库,但似乎无法确定任何有帮助的函数。

您的两个选项似乎是使用HTML
呈现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,而这些CSS不直接与Yesod的小部件和基于blaze的标记交互。但是,您可以从头开始构建小部件,如下所示:

这将产生类似于:

完整代码如下。您可以访问
localhost:3000/ascii
localhost:3000/html
查看结果:

{-#语言重载字符串}
{-#语言准语言}
{-#语言模板haskell}
{-#语言类型族{-}
模块表服务器在哪里
将限定的Data.Text.Lazy.Builder作为B导入
导入限定文本。表格格式为T
将限定的Text.Tabular.asciart作为TA导入
将限定的Text.Tabular.Html作为
将限定文本.Html导入为H
进口紫草
数据站点=站点
mkYesod“站点”[解析路径]|
/ascii-AsciiR-GET
/HtmlR获取
|]
实例站点
示例=T.表格
(T.Group T.NoLine[T.Header“1”,T.Header“2”])
(T.Group T.SingleLine[T.Header“Table Type”,T.Header“HTML元素”])
[[“ASCII艺术”、“”]、[“HTML”、“”]]
asciiTable::字符串
asciiTable=TA.render id示例
getAsciiR::处理程序Html
getAsciiR=defaultLayout
[whamlet|
我的旧桌子如下
#{asciiTable}
|]
htmlTable::小部件
htmlTable=do
托维杰。预售商品。renderHtml$tbl
托维杰。CssBuilder。B.fromString$TH.defaultCss
其中tbl=TH.render H.stringToHtml H.stringToHtml H.stringToHtml示例

renderHtml h=foldr($)“”[H.renderHtml'0 e | e为什么不使用适当的HTML工具来生成表,而不是通过单空间纯文本?-一个简单的方法是使用

对字符串进行排序,并将结果作为一个参数。阅读
表格
说明:
它还附带一些默认呈现用于将这些表转换为…HTML的函数。因此,不要将表转换为ASCII,只需将其转换为正确的HTML即可。
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]
getHtmlR :: Handler Html
getHtmlR = defaultLayout
  [whamlet|
    <p>My fancy table follows:
    ^{htmlTable}
    |]
{-# 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