如何在 Hakyll/Pandoc 中添加标题链接

问题描述 投票:0回答:1

我有一个博客,使用 Hakyll 静态站点生成器生成。

Hakyll 使用 Pandoc 的 markdown 解析器,默认情况下,它根据每个标题元素的内容生成 ID。 通过将带有 ID 的锚点附加到页面 URL,这些 ID 可用于链接到各个部分。

但是,如果不检查页面源代码,就很难判断给定标题的 ID 是什么。 我想为每个标题添加一个自链接,以便博客的访问者可以使用每个标题作为帖子中该部分的链接。

haskell pandoc hakyll
1个回答
0
投票

这就是我实现这一目标的方法。 首先,一些进口:

import Text.Pandoc ( Pandoc, Inline(Link), Block(Header) )
import Text.Pandoc.Walk (walk)
import Text.Pandoc.Shared (stringify)

我们想要一个能够转换 Pandoc 的

Block
s 的函数。

我们想要匹配级别大于 1 的标题(因为

h1
元素仅出现在博客文章的顶部,因此链接到它们是没有意义的)。

对于这些标题,我们要对其进行转换,插入链接。 该链接将具有根据标头 ID 生成的目的地(前置

#
以使其成为锚点),以及根据标头内容生成的标题。

我们还为链接分配一个类,以帮助设置其样式,并使用原始标头的内容设置链接的内容。

transformHeader :: Block -> Block
transformHeader header@(Header level attr@(identifier, _, _) contents) | level > 1 = 
    let linkClass = "headerLink"
        linkAttr = ("", [linkClass], [])
        linkDestination = "#" <> identifier
        linkTitle = stringify contents
    in Header level attr 
            [ Link linkAttr contents (linkDestination, linkTitle)
            ]
transformHeader block = block 

我们可以使用

walk
将其提升为 Pandoc 文档的函数。

buildHeaderLinks :: Pandoc -> Pandoc
buildHeaderLinks = walk transformHeader

然后可以使用

pandocCompilerWithTransform
或其他方式将其集成到 Hakyll 应用程序中。

我已经使用

pandoc-2.14.0.3
对此进行了测试,但它应该相对灵活。

© www.soinside.com 2019 - 2024. All rights reserved.