我希望修改以下代码,以便不是生成网站上最新三个帖子的链接,而是完全重现帖子的正文,就像在传统博客中一样。我在理解下面发生的事情时遇到了一些困难,以及必要的改变是什么。
match "index.html" $ do
route idRoute
compile $ do
let indexCtx = field "posts" $ \_ ->
postList $ fmap (take 3) . recentFirst
getResourceBody
>>= applyAsTemplate indexCtx
>>= loadAndApplyTemplate "templates/default.html" postCtx
>>= relativizeUrls
答案 0 :(得分:3)
这并非完全无足轻重。第一步是介绍snapshots。
正如本教程中所解释的,这可以确保您可以在索引上包含博客帖子,而无需首先将模板应用于HTML。所以你会得到类似的东西:
match "posts/*" $ do
route $ setExtension "html"
compile $ pandocCompiler
>>= loadAndApplyTemplate "templates/post.html" postCtx
>>= saveSnapshot "content"
>>= loadAndApplyTemplate "templates/default.html" postCtx
>>= relativizeUrls
现在,为了在索引页面上显示帖子,您将能够使用帖子的整个$body$
。为此,您只需将templates/post-item.html
更新为:
<div>
<a href="$url$"><h2>$title$</h2></a>
$body$
</div>
答案 1 :(得分:1)
我知道这篇文章有点陈旧但是因为它似乎没有得到解决,所以我去了解它。
首先按照@jaspervdj:
的描述保存快照match "posts/*" $ do
route $ setExtension "html"
compile $ pandocCompiler
>>= loadAndApplyTemplate "templates/post.html" postCtx
>>= saveSnapshot "content"
>>= loadAndApplyTemplate "templates/default.html" postCtx
>>= relativizeUrls
然后index.html
加载loadAllSnapshots
的所有帖子快照:
match "index.html" $ do
route idRoute
compile $ do
posts <- recentFirst =<< loadAllSnapshots "posts/*" "content"
let indexCtx = listField "posts" postCtx (return posts) `mappend`
defaultContext
由于在应用default
模板之前拍摄了快照,因此$body$
中$for(posts)$
的值只是每个帖子模板的内容,而不会应用默认模板。