我有一个博客,使用 Hakyll 静态站点生成器生成。
Hakyll 使用 Pandoc 的 markdown 解析器,默认情况下,它根据每个标题元素的内容生成 ID。 通过将带有 ID 的锚点附加到页面 URL,这些 ID 可用于链接到各个部分。
但是,如果不检查页面源代码,就很难判断给定标头的 ID 是什么。 我想为每个标题添加一个自链接,以便博客的访问者可以使用每个标题作为帖子中该部分的链接。
这就是我实现这一目标的方法。 首先,一些进口:
import Text.Pandoc ( Pandoc, Inline(Link), Block(Header) )
import Text.Pandoc.Walk (walk)
import Text.Pandoc.Shared (stringify)
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
对此进行了测试,但它应该相对灵活。