Haskell Yesod:如何从文件中读取文本并对其内容应用变量插值?

时间:2015-05-18 16:55:13

标签: haskell markdown interpolation yesod

我目前在处理程序功能中有一个非常大的降价文本。为了呈现它,我使用了来自whamlet包的Text.Markdown.markdown quasiquoter和markdown

let md :: L.Text
    md = "#Some markdown stuff"
authLayout $
    [whamlet|
        <div .StaticContent>
            #{markdown def md}
        |]

文本中有一些硬编码链接,但我宁愿使用变量插值 我想把这个大文本放到外部文件中,读取它的内容(这是一个带占位符的降价),应用插值(最终降价转换为HTML),最后输出结果。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

好吧,最后我找到了非常简单的解决方案。

任何准引用都可以轻松切换到文件输入,而不是来自quoteFile模块 1 Language.Haskell.TH.Quote函数的内联文本。让我们在Foundation模块中描述以下函数:

import           Language.Haskell.TH.Quote (QuasiQuoter, quoteFile)
import           Text.Shakespeare.Text     (st)

stFile :: QuasiQuoter
stFile = quoteFile st

现在我们可以在处理程序模块中使用这个新的准引号:

-- file: Handler.SomeHandler.hs
import           Foundation       (stFile)
import           Text.Markdown    (markdown)
import qualified Data.Text.Lazy   as L

getSomeHandlerR :: Handler Html
getSomeHandlerR =
  do let userName = "Guest" :: Text
         -- | `interpolated` is a strict `Text`
         interpolated = [stFile|text-input.md|]
         md           = markdown def (L.fromStrict interpolated)
     defaultLayout [whamlet|<div .static-content>#{md}|]

-- file: text-input.md
# Welcome!
Hello, **#{userName}**!

这将产生以下内容:

<div class="static-content">
    <h1>Welcome!</h1>
    <p>Hello, <b>Guest</b>!</p>

这就是全部!

答案 1 :(得分:0)