Haskell Yesod:如何从文件中读取文本并将变量插值应用于其内容?
Haskell Yesod: How to read text from file and apply variable interpolation to its content?
我目前在我的处理程序函数中硬编码了相当大的降价文本。为了渲染它,我使用 whamlet
quasiquoter 和 markdown
包中的 Text.Markdown.markdown
:
let md :: L.Text
md = "#Some markdown stuff"
authLayout $
[whamlet|
<div .StaticContent>
#{markdown def md}
|]
文本中有一些硬编码链接,但我宁愿使用变量插值。
我想把这个大文本放到外部文件中,读取它的内容(这是一个带占位符的降价),应用插值(最终降价转换为 HTML),最后输出结果。我怎样才能做到这一点?
有一个名为 whamletFile 的函数 (http://hackage.haskell.org/package/yesod-core-1.4.9.1/docs/Yesod-Core-Widget.html#v:whamletFile) that does exactly what you want, I think. See some more info at https://www.safaribooksonline.com/library/view/developing-web-applications/9781449336868/ch05s06.html.
好吧,我终于找到了非常简单的解决方案。
任何准引用器都可以轻松切换到文件输入,而不是使用 Language.Haskell.TH.Quote
模块 1 中的 quoteFile
函数的内联文本。让我们在 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>
就这些了!
我目前在我的处理程序函数中硬编码了相当大的降价文本。为了渲染它,我使用 whamlet
quasiquoter 和 markdown
包中的 Text.Markdown.markdown
:
let md :: L.Text
md = "#Some markdown stuff"
authLayout $
[whamlet|
<div .StaticContent>
#{markdown def md}
|]
文本中有一些硬编码链接,但我宁愿使用变量插值。
我想把这个大文本放到外部文件中,读取它的内容(这是一个带占位符的降价),应用插值(最终降价转换为 HTML),最后输出结果。我怎样才能做到这一点?
有一个名为 whamletFile 的函数 (http://hackage.haskell.org/package/yesod-core-1.4.9.1/docs/Yesod-Core-Widget.html#v:whamletFile) that does exactly what you want, I think. See some more info at https://www.safaribooksonline.com/library/view/developing-web-applications/9781449336868/ch05s06.html.
好吧,我终于找到了非常简单的解决方案。
任何准引用器都可以轻松切换到文件输入,而不是使用 Language.Haskell.TH.Quote
模块 1 中的 quoteFile
函数的内联文本。让我们在 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>
就这些了!