6

我希望修改以下代码,以便与其生成指向网站上最新三篇文章的链接,而是像在传统博客中一样完整地复制文章的正文。我有点难以理解下面发生了什么,以及必要的改变是什么。

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
4

2 回答 2

3

这并非完全无关紧要。第一步是引入快照

如教程中所述,这可确保您可以在索引中包含博客文章,而无需先将模板应用于 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>
于 2013-05-05T05:42:01.520 回答
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$within的值$for(posts)$将只是每个帖子模板的内容,而没有应用默认模板。

于 2013-12-07T22:21:00.213 回答