2013-04-07 92 views
6

我希望修改以下代碼,以便與其生成站點上最新的三個帖子的鏈接,而不是在傳統博客中完全複製帖子的正文。我在理解下面發生的事情方面有點困難,以及必要的改變是什麼。修改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 

回答

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

這樣做似乎重現除了每篇文章的內容之外的所有標題。 – pgay 2013-07-12 04:01:59

1

我知道這個帖子是有點老,但因爲它似乎並不在這裏解決的是怎麼去了。

首先保存快照通過@jaspervdj描述:用於index.html負載

match "posts/*" $ do 
    route $ setExtension "html" 
    compile $ pandocCompiler 
    >>= loadAndApplyTemplate "templates/post.html" postCtx 
    >>= saveSnapshot "content" 
    >>= loadAndApplyTemplate "templates/default.html" postCtx 
    >>= relativizeUrls 

然後將所有交快照與loadAllSnapshots:施加default模板之前

match "index.html" $ do 
    route idRoute 
    compile $ do 
    posts <- recentFirst =<< loadAllSnapshots "posts/*" "content" 
    let indexCtx = listField "posts" postCtx (return posts) `mappend` 
        defaultContext 

由於拍攝快照,該$for(posts)$內的$body$的值將只是每個帖子模板的內容,而不應用默認模板。