修改Hakyll示例站点

时间:2013-04-07 08:32:50

标签: haskell web blogs hakyll

我希望修改以下代码,以便不是生成网站上最新三个帖子的链接,而是完全重现帖子的正文,就像在传统博客中一样。我在理解下面发生的事情时遇到了一些困难,以及必要的改变是什么。

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

2 个答案:

答案 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)$的值只是每个帖子模板的内容,而不会应用默认模板。