【发布时间】:2018-10-14 17:22:42
【问题描述】:
我正在尝试做类似what's described in this tutorial 的事情,即向我的 Hakyll 博客添加标签,但不是为每个标签生成一个页面,而是只有一个页面列出所有标签及其帖子。所以给Post1标记Tag1,和一个Post2标记Tag1, Tag2,和一个Post3标记Tag2,我的tags.html看起来像这样:
Tag1:
- Post1
- Post2
Tag2:
- Post2
- Post3
但我是 Haskell 初学者,我并不完全理解 Hakyll 的所有单子上下文。这是我到目前为止所拥有的:
create ["tags.html"] $ do
route idRoute
tags <- buildTags "posts/*" (fromCapture "tags.html")
compile $
makeItem ""
>>= applyTemplate tagListTemplate defaultContext
>>= applyTemplate defaultTemplate defaultContext
>>= relativizeUrls
>>= cleanIndexUrls
问题是,在我的博客中,我真的不知道Tags 是什么。我似乎无法将它们打印出来进行调试。 (我尝试添加print tags,但它不起作用。)所以我很难考虑如何进行此操作。
The complete file is here on GitHub.
非常感谢任何帮助。
更新:我离弄清楚这一点还差得远。这是我现在正在尝试的:
create ["tags.html"] $ do
route idRoute
tags <- buildTags "posts/*" (fromCapture "tags.html#")
let tagList = tagsMap tags
compile $ do
makeItem ""
>>= applyTemplate tagListTemplate (defaultCtxWithTags tags)
还有:
-- Add tags to default context, for tag listing
defaultCtxWithTags :: Tags -> Context String
defaultCtxWithTags tags = listField "tags" defaultContext (return (tagsMap tags)) `mappend` defaultContext
The full code, as it currently stands, is up here.
对此的任何帮助将不胜感激。我知道所有文档,但我似乎无法将其转换为工作代码。
【问题讨论】:
-
见the documentation on what
Tagsare。您将需要使用带有Tags参数并生成Compiler或更好的Context的函数之一,您可以使用它来代替(或一起使用)defaultContext。 -
该文档对我来说真的没有意义,作为一个初学者。我应该使用什么函数来获取我生成的
tags,并从中创建一个包含所有标签列表及其所有相关帖子的上下文? -
这是一个普通的algebraic
datatype。您可以使用tagsMap tags获取元组列表,每个元组都有一个标签名称和一个具有该标签的页面标识符列表。然后阅读Template和Contextdocumentation,了解如何从中构建listField,您应该能够使用它来呈现标签名称列表。 -
(渲染(标题等)相关帖子本身会更高级,因为标签列表将仅包含帖子标识符。您不会轻易获得该页面的元数据来渲染它,即'将需要额外的努力)。
-
这究竟会涉及什么?给定标识符,是否有获取页面标题的功能?