2

我正在尝试构建一个有 7 页的网站。每个页面都使用 .markdown 输入定义。在每一页上,我想要一个带有指向所有其他页面的链接的标题。

现在,这似乎是不可能的,因为 Hakyll 告诉我我有递归依赖。

[ERROR] Hakyll.Core.Runtime.chase: Dependency cycle detected: posts/page1.markdown depends on posts/page1.markdown

我已经确定了这个片段的递归依赖。

match "posts/*" $ do
    route $ setExtension "html"
    compile $ do
        posts <- loadAll "posts/*"
        let indexCtx =
                listField "posts" postCtx (return posts) `mappend`
                constField "title" "Home"                `mappend`
                defaultContext

        pandocCompiler >>= loadAndApplyTemplate "templates/post.html" indexCtx
              >>= loadAndApplyTemplate "templates/default.html" indexCtx
              >>= relativizeUrls

我想问题是我不允许在加载的同一个模板上进行匹配。

那么如何为生成帖子时使用的所有帖子构建一个带有 listField 的上下文。

我想另一种方法是先生成链接,以某种方式存储它们,然后将它们包含在帖子中。但我该怎么做呢?

4

1 回答 1

3

通过调用loadAll "posts/*"您在编译当前帖子之前加载每个完全编译的帖子,因此这是一个循环依赖。

最直接的解决方案是定义帖子的另一个版本:

match "posts/*" $ version "titleLine" $ do
  -- route
  -- compiler, maybe generate a link to real page here from file path

然后你可以在不触发循环依赖的情况下加载它们:

match "posts/*" $ do
  -- route
  compile $ do
    postList <- loadAll ("posts/*" .&&. hasVersion "titleLine")
    -- render the page

但是您可能必须从文件路径手动生成正确的 url,毕竟不同的版本是具有不同 url 的不同页面。如果您为多个页面设置相同的路由,则最后编译的页面将覆盖所有其他页面。

在您的情况下没关系,因为非标记版本取决于“titleLine”版本,因此稍后编译,但通常对于不同页面具有相同路由是危险的,没有这种依赖version标记页面总是稍后编译。

于 2016-02-26T12:07:01.633 回答